@kaitranntt/ccs 5.9.0 → 5.10.0-dev.1

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 (107) hide show
  1. package/README.md +30 -2
  2. package/VERSION +1 -1
  3. package/dist/ccs.js +12 -0
  4. package/dist/ccs.js.map +1 -1
  5. package/dist/cliproxy/account-manager.d.ts +97 -0
  6. package/dist/cliproxy/account-manager.d.ts.map +1 -0
  7. package/dist/cliproxy/account-manager.js +314 -0
  8. package/dist/cliproxy/account-manager.js.map +1 -0
  9. package/dist/cliproxy/auth-handler.d.ts +19 -1
  10. package/dist/cliproxy/auth-handler.d.ts.map +1 -1
  11. package/dist/cliproxy/auth-handler.js +71 -7
  12. package/dist/cliproxy/auth-handler.js.map +1 -1
  13. package/dist/cliproxy/binary-manager.d.ts +2 -2
  14. package/dist/cliproxy/binary-manager.js +2 -2
  15. package/dist/cliproxy/model-catalog.d.ts +12 -0
  16. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  17. package/dist/cliproxy/model-catalog.js +31 -11
  18. package/dist/cliproxy/model-catalog.js.map +1 -1
  19. package/dist/cliproxy/model-config.d.ts.map +1 -1
  20. package/dist/cliproxy/model-config.js +14 -2
  21. package/dist/cliproxy/model-config.js.map +1 -1
  22. package/dist/cliproxy/platform-detector.d.ts +2 -2
  23. package/dist/cliproxy/platform-detector.js +1 -1
  24. package/dist/commands/cliproxy-command.d.ts.map +1 -1
  25. package/dist/commands/cliproxy-command.js +92 -54
  26. package/dist/commands/cliproxy-command.js.map +1 -1
  27. package/dist/commands/config-command.d.ts +11 -0
  28. package/dist/commands/config-command.d.ts.map +1 -0
  29. package/dist/commands/config-command.js +111 -0
  30. package/dist/commands/config-command.js.map +1 -0
  31. package/dist/commands/help-command.d.ts.map +1 -1
  32. package/dist/commands/help-command.js +4 -1
  33. package/dist/commands/help-command.js.map +1 -1
  34. package/dist/glmt/glmt-proxy.d.ts +6 -0
  35. package/dist/glmt/glmt-proxy.d.ts.map +1 -1
  36. package/dist/glmt/glmt-proxy.js +23 -2
  37. package/dist/glmt/glmt-proxy.js.map +1 -1
  38. package/dist/management/doctor.d.ts.map +1 -1
  39. package/dist/management/doctor.js +19 -7
  40. package/dist/management/doctor.js.map +1 -1
  41. package/dist/types/config.d.ts +2 -0
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/dist/types/config.js.map +1 -1
  44. package/dist/ui/assets/form-utils-Bjfa1DVH.js +20 -0
  45. package/dist/ui/assets/icons-D-Y22K9Z.js +1 -0
  46. package/dist/ui/assets/index-M5ru6OPu.js +9 -0
  47. package/dist/ui/assets/index-ZXu5MvSE.css +1 -0
  48. package/dist/ui/assets/radix-ui-Ba6LUgyw.js +51 -0
  49. package/dist/ui/assets/react-vendor-CW-MU7-e.js +3 -0
  50. package/dist/ui/assets/tanstack-MD0629v8.js +4 -0
  51. package/dist/ui/favicon.ico +0 -0
  52. package/dist/ui/favicons/android-chrome-192x192.png +0 -0
  53. package/dist/ui/favicons/android-chrome-512x512.png +0 -0
  54. package/dist/ui/favicons/android-chrome-512x512.webp +0 -0
  55. package/dist/ui/favicons/apple-touch-icon.png +0 -0
  56. package/dist/ui/favicons/favicon-16x16.png +0 -0
  57. package/dist/ui/favicons/favicon-32x32.png +0 -0
  58. package/dist/ui/favicons/favicon.ico +0 -0
  59. package/dist/ui/index.html +30 -0
  60. package/dist/ui/logo/ccs-logo-256.png +0 -0
  61. package/dist/ui/logo/ccs-logo-zoomed-web.png +0 -0
  62. package/dist/ui/logo/ccs-social-media.png +0 -0
  63. package/dist/ui/logo/ccs-social-media.webp +0 -0
  64. package/dist/utils/port-utils.d.ts +19 -0
  65. package/dist/utils/port-utils.d.ts.map +1 -0
  66. package/dist/utils/port-utils.js +113 -0
  67. package/dist/utils/port-utils.js.map +1 -0
  68. package/dist/web-server/file-watcher.d.ts +15 -0
  69. package/dist/web-server/file-watcher.d.ts.map +1 -0
  70. package/dist/web-server/file-watcher.js +88 -0
  71. package/dist/web-server/file-watcher.js.map +1 -0
  72. package/dist/web-server/health-service.d.ts +35 -0
  73. package/dist/web-server/health-service.d.ts.map +1 -0
  74. package/dist/web-server/health-service.js +223 -0
  75. package/dist/web-server/health-service.js.map +1 -0
  76. package/dist/web-server/index.d.ts +25 -0
  77. package/dist/web-server/index.d.ts.map +1 -0
  78. package/dist/web-server/index.js +89 -0
  79. package/dist/web-server/index.js.map +1 -0
  80. package/dist/web-server/overview-routes.d.ts +7 -0
  81. package/dist/web-server/overview-routes.d.ts.map +1 -0
  82. package/dist/web-server/overview-routes.js +80 -0
  83. package/dist/web-server/overview-routes.js.map +1 -0
  84. package/dist/web-server/routes.d.ts +7 -0
  85. package/dist/web-server/routes.d.ts.map +1 -0
  86. package/dist/web-server/routes.js +570 -0
  87. package/dist/web-server/routes.js.map +1 -0
  88. package/dist/web-server/shared-routes.d.ts +7 -0
  89. package/dist/web-server/shared-routes.d.ts.map +1 -0
  90. package/dist/web-server/shared-routes.js +167 -0
  91. package/dist/web-server/shared-routes.js.map +1 -0
  92. package/dist/web-server/shutdown.d.ts +14 -0
  93. package/dist/web-server/shutdown.d.ts.map +1 -0
  94. package/dist/web-server/shutdown.js +36 -0
  95. package/dist/web-server/shutdown.js.map +1 -0
  96. package/dist/web-server/websocket.d.ts +14 -0
  97. package/dist/web-server/websocket.d.ts.map +1 -0
  98. package/dist/web-server/websocket.js +82 -0
  99. package/dist/web-server/websocket.js.map +1 -0
  100. package/package.json +26 -6
  101. package/scripts/clean-dist.js +46 -0
  102. package/scripts/completion/ccs.bash +69 -10
  103. package/scripts/completion/ccs.fish +128 -47
  104. package/scripts/completion/ccs.ps1 +179 -14
  105. package/scripts/completion/ccs.zsh +107 -28
  106. package/scripts/pre-release.sh +39 -0
  107. package/scripts/verify-bundle.js +49 -0
@@ -0,0 +1,570 @@
1
+ "use strict";
2
+ /**
3
+ * REST API Routes (Phase 03)
4
+ *
5
+ * Implements CRUD operations for profiles, cliproxy variants, and accounts.
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.apiRoutes = 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 helpers_1 = require("../utils/helpers");
37
+ const health_service_1 = require("./health-service");
38
+ const auth_handler_1 = require("../cliproxy/auth-handler");
39
+ const account_manager_1 = require("../cliproxy/account-manager");
40
+ exports.apiRoutes = (0, express_1.Router)();
41
+ /**
42
+ * Helper: Read config safely with fallback
43
+ */
44
+ function readConfigSafe() {
45
+ try {
46
+ return (0, config_manager_1.loadConfig)();
47
+ }
48
+ catch {
49
+ return { profiles: {} };
50
+ }
51
+ }
52
+ /**
53
+ * Helper: Write config atomically
54
+ */
55
+ function writeConfig(config) {
56
+ const configPath = (0, config_manager_1.getConfigPath)();
57
+ const tempPath = configPath + '.tmp';
58
+ fs.writeFileSync(tempPath, JSON.stringify(config, null, 2) + '\n');
59
+ fs.renameSync(tempPath, configPath);
60
+ }
61
+ /**
62
+ * Helper: Check if profile is configured (has valid settings file)
63
+ */
64
+ function isConfigured(profileName, config) {
65
+ const settingsPath = config.profiles[profileName];
66
+ if (!settingsPath)
67
+ return false;
68
+ try {
69
+ const expandedPath = (0, helpers_1.expandPath)(settingsPath);
70
+ if (!fs.existsSync(expandedPath))
71
+ return false;
72
+ const settings = (0, config_manager_1.loadSettings)(expandedPath);
73
+ return !!(settings.env?.ANTHROPIC_BASE_URL && settings.env?.ANTHROPIC_AUTH_TOKEN);
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ /**
80
+ * Helper: Create settings file for profile
81
+ */
82
+ function createSettingsFile(name, baseUrl, apiKey, model) {
83
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
84
+ const settings = {
85
+ env: {
86
+ ANTHROPIC_BASE_URL: baseUrl,
87
+ ANTHROPIC_AUTH_TOKEN: apiKey,
88
+ ...(model && { ANTHROPIC_MODEL: model }),
89
+ },
90
+ };
91
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
92
+ return `~/.ccs/${name}.settings.json`;
93
+ }
94
+ /**
95
+ * Helper: Update settings file
96
+ */
97
+ function updateSettingsFile(name, updates) {
98
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
99
+ if (!fs.existsSync(settingsPath)) {
100
+ throw new Error('Settings file not found');
101
+ }
102
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
103
+ if (updates.baseUrl) {
104
+ settings.env = settings.env || {};
105
+ settings.env.ANTHROPIC_BASE_URL = updates.baseUrl;
106
+ }
107
+ if (updates.apiKey) {
108
+ settings.env = settings.env || {};
109
+ settings.env.ANTHROPIC_AUTH_TOKEN = updates.apiKey;
110
+ }
111
+ if (updates.model !== undefined) {
112
+ settings.env = settings.env || {};
113
+ if (updates.model) {
114
+ settings.env.ANTHROPIC_MODEL = updates.model;
115
+ }
116
+ else {
117
+ delete settings.env.ANTHROPIC_MODEL;
118
+ }
119
+ }
120
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
121
+ }
122
+ /**
123
+ * Helper: Create cliproxy variant settings
124
+ */
125
+ function createCliproxySettings(name, model) {
126
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
127
+ const settings = {
128
+ env: model ? { ANTHROPIC_MODEL: model } : {},
129
+ };
130
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
131
+ return `~/.ccs/${name}.settings.json`;
132
+ }
133
+ // ==================== Profile CRUD ====================
134
+ /**
135
+ * GET /api/profiles - List all profiles
136
+ */
137
+ exports.apiRoutes.get('/profiles', (_req, res) => {
138
+ const config = readConfigSafe();
139
+ const profiles = Object.entries(config.profiles).map(([name, settingsPath]) => ({
140
+ name,
141
+ settingsPath,
142
+ configured: isConfigured(name, config),
143
+ }));
144
+ res.json({ profiles });
145
+ });
146
+ /**
147
+ * POST /api/profiles - Create new profile
148
+ */
149
+ exports.apiRoutes.post('/profiles', (req, res) => {
150
+ const { name, baseUrl, apiKey, model } = req.body;
151
+ if (!name || !baseUrl || !apiKey) {
152
+ res.status(400).json({ error: 'Missing required fields: name, baseUrl, apiKey' });
153
+ return;
154
+ }
155
+ const config = readConfigSafe();
156
+ if (config.profiles[name]) {
157
+ res.status(409).json({ error: 'Profile already exists' });
158
+ return;
159
+ }
160
+ // Ensure .ccs directory exists
161
+ if (!fs.existsSync((0, config_manager_1.getCcsDir)())) {
162
+ fs.mkdirSync((0, config_manager_1.getCcsDir)(), { recursive: true });
163
+ }
164
+ // Create settings file
165
+ const settingsPath = createSettingsFile(name, baseUrl, apiKey, model);
166
+ // Update config
167
+ config.profiles[name] = settingsPath;
168
+ writeConfig(config);
169
+ res.status(201).json({ name, settingsPath });
170
+ });
171
+ /**
172
+ * PUT /api/profiles/:name - Update profile
173
+ */
174
+ exports.apiRoutes.put('/profiles/:name', (req, res) => {
175
+ const { name } = req.params;
176
+ const { baseUrl, apiKey, model } = req.body;
177
+ const config = readConfigSafe();
178
+ if (!config.profiles[name]) {
179
+ res.status(404).json({ error: 'Profile not found' });
180
+ return;
181
+ }
182
+ try {
183
+ updateSettingsFile(name, { baseUrl, apiKey, model });
184
+ res.json({ name, updated: true });
185
+ }
186
+ catch (error) {
187
+ res.status(500).json({ error: error.message });
188
+ }
189
+ });
190
+ /**
191
+ * DELETE /api/profiles/:name - Delete profile
192
+ */
193
+ exports.apiRoutes.delete('/profiles/:name', (req, res) => {
194
+ const { name } = req.params;
195
+ const config = readConfigSafe();
196
+ if (!config.profiles[name]) {
197
+ res.status(404).json({ error: 'Profile not found' });
198
+ return;
199
+ }
200
+ // Delete settings file
201
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
202
+ if (fs.existsSync(settingsPath)) {
203
+ fs.unlinkSync(settingsPath);
204
+ }
205
+ // Remove from config
206
+ delete config.profiles[name];
207
+ writeConfig(config);
208
+ res.json({ name, deleted: true });
209
+ });
210
+ // ==================== CLIProxy CRUD ====================
211
+ /**
212
+ * GET /api/cliproxy - List cliproxy variants
213
+ */
214
+ exports.apiRoutes.get('/cliproxy', (_req, res) => {
215
+ const config = readConfigSafe();
216
+ const variants = Object.entries(config.cliproxy || {}).map(([name, variant]) => ({
217
+ name,
218
+ provider: variant.provider,
219
+ settings: variant.settings,
220
+ account: variant.account || 'default', // Include account field
221
+ }));
222
+ res.json({ variants });
223
+ });
224
+ /**
225
+ * POST /api/cliproxy - Create cliproxy variant
226
+ */
227
+ exports.apiRoutes.post('/cliproxy', (req, res) => {
228
+ const { name, provider, model, account } = req.body;
229
+ if (!name || !provider) {
230
+ res.status(400).json({ error: 'Missing required fields: name, provider' });
231
+ return;
232
+ }
233
+ const config = readConfigSafe();
234
+ config.cliproxy = config.cliproxy || {};
235
+ if (config.cliproxy[name]) {
236
+ res.status(409).json({ error: 'Variant already exists' });
237
+ return;
238
+ }
239
+ // Ensure .ccs directory exists
240
+ if (!fs.existsSync((0, config_manager_1.getCcsDir)())) {
241
+ fs.mkdirSync((0, config_manager_1.getCcsDir)(), { recursive: true });
242
+ }
243
+ // Create settings file for variant
244
+ const settingsPath = createCliproxySettings(name, model);
245
+ // Include account if specified (defaults to 'default' if not provided)
246
+ config.cliproxy[name] = {
247
+ provider,
248
+ settings: settingsPath,
249
+ ...(account && { account }),
250
+ };
251
+ writeConfig(config);
252
+ res.status(201).json({ name, provider, settings: settingsPath, account: account || 'default' });
253
+ });
254
+ /**
255
+ * PUT /api/cliproxy/:name - Update cliproxy variant
256
+ */
257
+ exports.apiRoutes.put('/cliproxy/:name', (req, res) => {
258
+ const { name } = req.params;
259
+ const { provider, account, model } = req.body;
260
+ const config = readConfigSafe();
261
+ if (!config.cliproxy?.[name]) {
262
+ res.status(404).json({ error: 'Variant not found' });
263
+ return;
264
+ }
265
+ const variant = config.cliproxy[name];
266
+ // Update fields if provided
267
+ if (provider) {
268
+ variant.provider = provider;
269
+ }
270
+ if (account !== undefined) {
271
+ if (account) {
272
+ variant.account = account;
273
+ }
274
+ else {
275
+ delete variant.account; // Remove account to use default
276
+ }
277
+ }
278
+ // Update model in settings file if provided
279
+ if (model !== undefined) {
280
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
281
+ if (fs.existsSync(settingsPath)) {
282
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
283
+ if (model) {
284
+ settings.env = settings.env || {};
285
+ settings.env.ANTHROPIC_MODEL = model;
286
+ }
287
+ else if (settings.env) {
288
+ delete settings.env.ANTHROPIC_MODEL;
289
+ }
290
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
291
+ }
292
+ }
293
+ writeConfig(config);
294
+ res.json({
295
+ name,
296
+ provider: variant.provider,
297
+ account: variant.account || 'default',
298
+ settings: variant.settings,
299
+ updated: true,
300
+ });
301
+ });
302
+ /**
303
+ * DELETE /api/cliproxy/:name - Delete cliproxy variant
304
+ */
305
+ exports.apiRoutes.delete('/cliproxy/:name', (req, res) => {
306
+ const { name } = req.params;
307
+ const config = readConfigSafe();
308
+ if (!config.cliproxy?.[name]) {
309
+ res.status(404).json({ error: 'Variant not found' });
310
+ return;
311
+ }
312
+ // Delete settings file
313
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
314
+ if (fs.existsSync(settingsPath)) {
315
+ fs.unlinkSync(settingsPath);
316
+ }
317
+ delete config.cliproxy[name];
318
+ writeConfig(config);
319
+ res.json({ name, deleted: true });
320
+ });
321
+ /**
322
+ * GET /api/cliproxy/auth - Get auth status for built-in CLIProxy profiles
323
+ */
324
+ exports.apiRoutes.get('/cliproxy/auth', (_req, res) => {
325
+ // Initialize accounts from existing tokens on first request
326
+ (0, auth_handler_1.initializeAccounts)();
327
+ const statuses = (0, auth_handler_1.getAllAuthStatus)();
328
+ const authStatus = statuses.map((status) => {
329
+ const oauthConfig = (0, auth_handler_1.getOAuthConfig)(status.provider);
330
+ return {
331
+ provider: status.provider,
332
+ displayName: oauthConfig.displayName,
333
+ authenticated: status.authenticated,
334
+ lastAuth: status.lastAuth?.toISOString() || null,
335
+ tokenFiles: status.tokenFiles.length,
336
+ accounts: status.accounts,
337
+ defaultAccount: status.defaultAccount,
338
+ };
339
+ });
340
+ res.json({ authStatus });
341
+ });
342
+ // ==================== Account Management (Multi-Account Support) ====================
343
+ /**
344
+ * GET /api/cliproxy/accounts - Get all accounts across all providers
345
+ */
346
+ exports.apiRoutes.get('/cliproxy/accounts', (_req, res) => {
347
+ // Initialize accounts from existing tokens
348
+ (0, auth_handler_1.initializeAccounts)();
349
+ const accounts = (0, account_manager_1.getAllAccountsSummary)();
350
+ res.json({ accounts });
351
+ });
352
+ /**
353
+ * GET /api/cliproxy/accounts/:provider - Get accounts for a specific provider
354
+ */
355
+ exports.apiRoutes.get('/cliproxy/accounts/:provider', (req, res) => {
356
+ const { provider } = req.params;
357
+ // Validate provider
358
+ const validProviders = ['gemini', 'codex', 'agy', 'qwen', 'iflow'];
359
+ if (!validProviders.includes(provider)) {
360
+ res.status(400).json({ error: `Invalid provider: ${provider}` });
361
+ return;
362
+ }
363
+ const accounts = (0, account_manager_1.getProviderAccounts)(provider);
364
+ res.json({ provider, accounts });
365
+ });
366
+ /**
367
+ * POST /api/cliproxy/accounts/:provider/default - Set default account for provider
368
+ */
369
+ exports.apiRoutes.post('/cliproxy/accounts/:provider/default', (req, res) => {
370
+ const { provider } = req.params;
371
+ const { accountId } = req.body;
372
+ if (!accountId) {
373
+ res.status(400).json({ error: 'Missing required field: accountId' });
374
+ return;
375
+ }
376
+ // Validate provider
377
+ const validProviders = ['gemini', 'codex', 'agy', 'qwen', 'iflow'];
378
+ if (!validProviders.includes(provider)) {
379
+ res.status(400).json({ error: `Invalid provider: ${provider}` });
380
+ return;
381
+ }
382
+ const success = (0, account_manager_1.setDefaultAccount)(provider, accountId);
383
+ if (success) {
384
+ res.json({ provider, defaultAccount: accountId });
385
+ }
386
+ else {
387
+ res.status(404).json({ error: 'Account not found' });
388
+ }
389
+ });
390
+ /**
391
+ * DELETE /api/cliproxy/accounts/:provider/:accountId - Remove an account
392
+ */
393
+ exports.apiRoutes.delete('/api/cliproxy/accounts/:provider/:accountId', (req, res) => {
394
+ const { provider, accountId } = req.params;
395
+ // Validate provider
396
+ const validProviders = ['gemini', 'codex', 'agy', 'qwen', 'iflow'];
397
+ if (!validProviders.includes(provider)) {
398
+ res.status(400).json({ error: `Invalid provider: ${provider}` });
399
+ return;
400
+ }
401
+ const success = (0, account_manager_1.removeAccount)(provider, accountId);
402
+ if (success) {
403
+ res.json({ provider, accountId, deleted: true });
404
+ }
405
+ else {
406
+ res.status(404).json({ error: 'Account not found' });
407
+ }
408
+ });
409
+ // ==================== Settings (Phase 05) ====================
410
+ /**
411
+ * Helper: Mask API keys in settings
412
+ */
413
+ function maskApiKeys(settings) {
414
+ if (!settings.env)
415
+ return settings;
416
+ const masked = { ...settings, env: { ...settings.env } };
417
+ const sensitiveKeys = ['ANTHROPIC_AUTH_TOKEN', 'API_KEY', 'AUTH_TOKEN'];
418
+ for (const key of Object.keys(masked.env)) {
419
+ if (sensitiveKeys.some((sensitive) => key.includes(sensitive))) {
420
+ const value = masked.env[key];
421
+ if (value && value.length > 8) {
422
+ masked.env[key] =
423
+ value.slice(0, 4) + '*'.repeat(Math.max(0, value.length - 8)) + value.slice(-4);
424
+ }
425
+ }
426
+ }
427
+ return masked;
428
+ }
429
+ /**
430
+ * GET /api/settings/:profile - Get settings with masked API keys
431
+ */
432
+ exports.apiRoutes.get('/settings/:profile', (req, res) => {
433
+ const { profile } = req.params;
434
+ const ccsDir = (0, config_manager_1.getCcsDir)();
435
+ const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
436
+ if (!fs.existsSync(settingsPath)) {
437
+ res.status(404).json({ error: 'Settings not found' });
438
+ return;
439
+ }
440
+ const stat = fs.statSync(settingsPath);
441
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
442
+ // Mask API keys in response
443
+ const masked = maskApiKeys(settings);
444
+ res.json({
445
+ profile,
446
+ settings: masked,
447
+ mtime: stat.mtime.getTime(),
448
+ path: settingsPath,
449
+ });
450
+ });
451
+ /**
452
+ * GET /api/settings/:profile/raw - Get full settings (for editing)
453
+ */
454
+ exports.apiRoutes.get('/settings/:profile/raw', (req, res) => {
455
+ const { profile } = req.params;
456
+ const ccsDir = (0, config_manager_1.getCcsDir)();
457
+ const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
458
+ if (!fs.existsSync(settingsPath)) {
459
+ res.status(404).json({ error: 'Settings not found' });
460
+ return;
461
+ }
462
+ const stat = fs.statSync(settingsPath);
463
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
464
+ res.json({
465
+ profile,
466
+ settings,
467
+ mtime: stat.mtime.getTime(),
468
+ path: settingsPath,
469
+ });
470
+ });
471
+ /**
472
+ * PUT /api/settings/:profile - Update settings with conflict detection and backup
473
+ */
474
+ exports.apiRoutes.put('/settings/:profile', (req, res) => {
475
+ const { profile } = req.params;
476
+ const { settings, expectedMtime } = req.body;
477
+ const ccsDir = (0, config_manager_1.getCcsDir)();
478
+ const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
479
+ if (!fs.existsSync(settingsPath)) {
480
+ res.status(404).json({ error: 'Settings not found' });
481
+ return;
482
+ }
483
+ // Conflict detection
484
+ const stat = fs.statSync(settingsPath);
485
+ if (expectedMtime && stat.mtime.getTime() !== expectedMtime) {
486
+ res.status(409).json({
487
+ error: 'File modified externally',
488
+ currentMtime: stat.mtime.getTime(),
489
+ });
490
+ return;
491
+ }
492
+ // Create backup
493
+ const backupDir = path.join(ccsDir, 'backups');
494
+ if (!fs.existsSync(backupDir)) {
495
+ fs.mkdirSync(backupDir, { recursive: true });
496
+ }
497
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
498
+ const backupPath = path.join(backupDir, `${profile}.${timestamp}.settings.json`);
499
+ fs.copyFileSync(settingsPath, backupPath);
500
+ // Write new settings atomically
501
+ const tempPath = settingsPath + '.tmp';
502
+ fs.writeFileSync(tempPath, JSON.stringify(settings, null, 2) + '\n');
503
+ fs.renameSync(tempPath, settingsPath);
504
+ const newStat = fs.statSync(settingsPath);
505
+ res.json({
506
+ profile,
507
+ mtime: newStat.mtime.getTime(),
508
+ backupPath,
509
+ });
510
+ });
511
+ // ==================== Accounts ====================
512
+ /**
513
+ * GET /api/accounts - List accounts from profiles.json
514
+ */
515
+ exports.apiRoutes.get('/accounts', (_req, res) => {
516
+ const profilesPath = path.join((0, config_manager_1.getCcsDir)(), 'profiles.json');
517
+ if (!fs.existsSync(profilesPath)) {
518
+ res.json({ accounts: [], default: null });
519
+ return;
520
+ }
521
+ const data = JSON.parse(fs.readFileSync(profilesPath, 'utf8'));
522
+ const accounts = Object.entries(data.profiles || {}).map(([name, meta]) => {
523
+ // Type-safe handling of metadata
524
+ const metadata = meta;
525
+ return {
526
+ name,
527
+ ...metadata,
528
+ };
529
+ });
530
+ res.json({ accounts, default: data.default || null });
531
+ });
532
+ /**
533
+ * POST /api/accounts/default - Set default account
534
+ */
535
+ exports.apiRoutes.post('/accounts/default', (req, res) => {
536
+ const { name } = req.body;
537
+ if (!name) {
538
+ res.status(400).json({ error: 'Missing required field: name' });
539
+ return;
540
+ }
541
+ const profilesPath = path.join((0, config_manager_1.getCcsDir)(), 'profiles.json');
542
+ const data = fs.existsSync(profilesPath)
543
+ ? JSON.parse(fs.readFileSync(profilesPath, 'utf8'))
544
+ : { profiles: {} };
545
+ data.default = name;
546
+ fs.writeFileSync(profilesPath, JSON.stringify(data, null, 2) + '\n');
547
+ res.json({ default: name });
548
+ });
549
+ // ==================== Health (Phase 06) ====================
550
+ /**
551
+ * GET /api/health - Run health checks
552
+ */
553
+ exports.apiRoutes.get('/health', (_req, res) => {
554
+ const report = (0, health_service_1.runHealthChecks)();
555
+ res.json(report);
556
+ });
557
+ /**
558
+ * POST /api/health/fix/:checkId - Fix a health issue
559
+ */
560
+ exports.apiRoutes.post('/health/fix/:checkId', (req, res) => {
561
+ const { checkId } = req.params;
562
+ const result = (0, health_service_1.fixHealthIssue)(checkId);
563
+ if (result.success) {
564
+ res.json({ success: true, message: result.message });
565
+ }
566
+ else {
567
+ res.status(400).json({ success: false, message: result.message });
568
+ }
569
+ });
570
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/web-server/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shared Data Routes (Phase 07)
3
+ *
4
+ * API routes for commands, skills, agents from ~/.ccs/shared/
5
+ */
6
+ export declare const sharedRoutes: import("express-serve-static-core").Router;
7
+ //# sourceMappingURL=shared-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-routes.d.ts","sourceRoot":"","sources":["../../src/web-server/shared-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,eAAO,MAAM,YAAY,4CAAW,CAAC"}