@kaitranntt/ccs 5.9.0-dev.2 → 5.9.0-dev.4

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 (60) hide show
  1. package/README.md +30 -2
  2. package/VERSION +1 -1
  3. package/dist/ccs.js +6 -0
  4. package/dist/ccs.js.map +1 -1
  5. package/dist/cliproxy/binary-manager.d.ts +2 -2
  6. package/dist/cliproxy/binary-manager.js +2 -2
  7. package/dist/cliproxy/platform-detector.d.ts +2 -2
  8. package/dist/cliproxy/platform-detector.js +1 -1
  9. package/dist/commands/cliproxy-command.d.ts.map +1 -1
  10. package/dist/commands/cliproxy-command.js +37 -28
  11. package/dist/commands/cliproxy-command.js.map +1 -1
  12. package/dist/commands/config-command.d.ts +11 -0
  13. package/dist/commands/config-command.d.ts.map +1 -0
  14. package/dist/commands/config-command.js +111 -0
  15. package/dist/commands/config-command.js.map +1 -0
  16. package/dist/commands/help-command.d.ts.map +1 -1
  17. package/dist/commands/help-command.js +3 -1
  18. package/dist/commands/help-command.js.map +1 -1
  19. package/dist/management/doctor.d.ts.map +1 -1
  20. package/dist/management/doctor.js +19 -7
  21. package/dist/management/doctor.js.map +1 -1
  22. package/dist/utils/port-utils.d.ts +19 -0
  23. package/dist/utils/port-utils.d.ts.map +1 -0
  24. package/dist/utils/port-utils.js +113 -0
  25. package/dist/utils/port-utils.js.map +1 -0
  26. package/dist/web-server/file-watcher.d.ts +15 -0
  27. package/dist/web-server/file-watcher.d.ts.map +1 -0
  28. package/dist/web-server/file-watcher.js +88 -0
  29. package/dist/web-server/file-watcher.js.map +1 -0
  30. package/dist/web-server/health-service.d.ts +35 -0
  31. package/dist/web-server/health-service.d.ts.map +1 -0
  32. package/dist/web-server/health-service.js +223 -0
  33. package/dist/web-server/health-service.js.map +1 -0
  34. package/dist/web-server/index.d.ts +25 -0
  35. package/dist/web-server/index.d.ts.map +1 -0
  36. package/dist/web-server/index.js +89 -0
  37. package/dist/web-server/index.js.map +1 -0
  38. package/dist/web-server/overview-routes.d.ts +7 -0
  39. package/dist/web-server/overview-routes.d.ts.map +1 -0
  40. package/dist/web-server/overview-routes.js +80 -0
  41. package/dist/web-server/overview-routes.js.map +1 -0
  42. package/dist/web-server/routes.d.ts +7 -0
  43. package/dist/web-server/routes.d.ts.map +1 -0
  44. package/dist/web-server/routes.js +444 -0
  45. package/dist/web-server/routes.js.map +1 -0
  46. package/dist/web-server/shared-routes.d.ts +7 -0
  47. package/dist/web-server/shared-routes.d.ts.map +1 -0
  48. package/dist/web-server/shared-routes.js +167 -0
  49. package/dist/web-server/shared-routes.js.map +1 -0
  50. package/dist/web-server/shutdown.d.ts +14 -0
  51. package/dist/web-server/shutdown.d.ts.map +1 -0
  52. package/dist/web-server/shutdown.js +36 -0
  53. package/dist/web-server/shutdown.js.map +1 -0
  54. package/dist/web-server/websocket.d.ts +14 -0
  55. package/dist/web-server/websocket.d.ts.map +1 -0
  56. package/dist/web-server/websocket.js +82 -0
  57. package/dist/web-server/websocket.js.map +1 -0
  58. package/package.json +25 -5
  59. package/scripts/pre-release.sh +39 -0
  60. package/scripts/verify-bundle.js +48 -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,7 @@
1
+ /**
2
+ * Overview Routes (Phase 07)
3
+ *
4
+ * Dashboard overview API for counts and health summary.
5
+ */
6
+ export declare const overviewRoutes: import("express-serve-static-core").Router;
7
+ //# sourceMappingURL=overview-routes.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * REST API Routes (Phase 03)
3
+ *
4
+ * Implements CRUD operations for profiles, cliproxy variants, and accounts.
5
+ */
6
+ export declare const apiRoutes: import("express-serve-static-core").Router;
7
+ //# sourceMappingURL=routes.d.ts.map
@@ -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"}