@kaitranntt/ccs 5.9.0-dev.3 → 5.9.0-dev.5

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 (53) 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/web-server/file-watcher.d.ts +15 -0
  20. package/dist/web-server/file-watcher.d.ts.map +1 -0
  21. package/dist/web-server/file-watcher.js +88 -0
  22. package/dist/web-server/file-watcher.js.map +1 -0
  23. package/dist/web-server/health-service.d.ts +35 -0
  24. package/dist/web-server/health-service.d.ts.map +1 -0
  25. package/dist/web-server/health-service.js +223 -0
  26. package/dist/web-server/health-service.js.map +1 -0
  27. package/dist/web-server/index.d.ts +25 -0
  28. package/dist/web-server/index.d.ts.map +1 -0
  29. package/dist/web-server/index.js +89 -0
  30. package/dist/web-server/index.js.map +1 -0
  31. package/dist/web-server/overview-routes.d.ts +7 -0
  32. package/dist/web-server/overview-routes.d.ts.map +1 -0
  33. package/dist/web-server/overview-routes.js +80 -0
  34. package/dist/web-server/overview-routes.js.map +1 -0
  35. package/dist/web-server/routes.d.ts +7 -0
  36. package/dist/web-server/routes.d.ts.map +1 -0
  37. package/dist/web-server/routes.js +444 -0
  38. package/dist/web-server/routes.js.map +1 -0
  39. package/dist/web-server/shared-routes.d.ts +7 -0
  40. package/dist/web-server/shared-routes.d.ts.map +1 -0
  41. package/dist/web-server/shared-routes.js +167 -0
  42. package/dist/web-server/shared-routes.js.map +1 -0
  43. package/dist/web-server/shutdown.d.ts +14 -0
  44. package/dist/web-server/shutdown.d.ts.map +1 -0
  45. package/dist/web-server/shutdown.js +36 -0
  46. package/dist/web-server/shutdown.js.map +1 -0
  47. package/dist/web-server/websocket.d.ts +14 -0
  48. package/dist/web-server/websocket.d.ts.map +1 -0
  49. package/dist/web-server/websocket.js +82 -0
  50. package/dist/web-server/websocket.js.map +1 -0
  51. package/package.json +25 -5
  52. package/scripts/pre-release.sh +39 -0
  53. package/scripts/verify-bundle.js +49 -0
@@ -0,0 +1,444 @@
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
+ exports.apiRoutes = (0, express_1.Router)();
40
+ /**
41
+ * Helper: Read config safely with fallback
42
+ */
43
+ function readConfigSafe() {
44
+ try {
45
+ return (0, config_manager_1.loadConfig)();
46
+ }
47
+ catch {
48
+ return { profiles: {} };
49
+ }
50
+ }
51
+ /**
52
+ * Helper: Write config atomically
53
+ */
54
+ function writeConfig(config) {
55
+ const configPath = (0, config_manager_1.getConfigPath)();
56
+ const tempPath = configPath + '.tmp';
57
+ fs.writeFileSync(tempPath, JSON.stringify(config, null, 2) + '\n');
58
+ fs.renameSync(tempPath, configPath);
59
+ }
60
+ /**
61
+ * Helper: Check if profile is configured (has valid settings file)
62
+ */
63
+ function isConfigured(profileName, config) {
64
+ const settingsPath = config.profiles[profileName];
65
+ if (!settingsPath)
66
+ return false;
67
+ try {
68
+ const expandedPath = (0, helpers_1.expandPath)(settingsPath);
69
+ if (!fs.existsSync(expandedPath))
70
+ return false;
71
+ const settings = (0, config_manager_1.loadSettings)(expandedPath);
72
+ return !!(settings.env?.ANTHROPIC_BASE_URL && settings.env?.ANTHROPIC_AUTH_TOKEN);
73
+ }
74
+ catch {
75
+ return false;
76
+ }
77
+ }
78
+ /**
79
+ * Helper: Create settings file for profile
80
+ */
81
+ function createSettingsFile(name, baseUrl, apiKey, model) {
82
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
83
+ const settings = {
84
+ env: {
85
+ ANTHROPIC_BASE_URL: baseUrl,
86
+ ANTHROPIC_AUTH_TOKEN: apiKey,
87
+ ...(model && { ANTHROPIC_MODEL: model }),
88
+ },
89
+ };
90
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
91
+ return `~/.ccs/${name}.settings.json`;
92
+ }
93
+ /**
94
+ * Helper: Update settings file
95
+ */
96
+ function updateSettingsFile(name, updates) {
97
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
98
+ if (!fs.existsSync(settingsPath)) {
99
+ throw new Error('Settings file not found');
100
+ }
101
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
102
+ if (updates.baseUrl) {
103
+ settings.env = settings.env || {};
104
+ settings.env.ANTHROPIC_BASE_URL = updates.baseUrl;
105
+ }
106
+ if (updates.apiKey) {
107
+ settings.env = settings.env || {};
108
+ settings.env.ANTHROPIC_AUTH_TOKEN = updates.apiKey;
109
+ }
110
+ if (updates.model !== undefined) {
111
+ settings.env = settings.env || {};
112
+ if (updates.model) {
113
+ settings.env.ANTHROPIC_MODEL = updates.model;
114
+ }
115
+ else {
116
+ delete settings.env.ANTHROPIC_MODEL;
117
+ }
118
+ }
119
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
120
+ }
121
+ /**
122
+ * Helper: Create cliproxy variant settings
123
+ */
124
+ function createCliproxySettings(name, model) {
125
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
126
+ const settings = {
127
+ env: model ? { ANTHROPIC_MODEL: model } : {},
128
+ };
129
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
130
+ return `~/.ccs/${name}.settings.json`;
131
+ }
132
+ // ==================== Profile CRUD ====================
133
+ /**
134
+ * GET /api/profiles - List all profiles
135
+ */
136
+ exports.apiRoutes.get('/profiles', (_req, res) => {
137
+ const config = readConfigSafe();
138
+ const profiles = Object.entries(config.profiles).map(([name, settingsPath]) => ({
139
+ name,
140
+ settingsPath,
141
+ configured: isConfigured(name, config),
142
+ }));
143
+ res.json({ profiles });
144
+ });
145
+ /**
146
+ * POST /api/profiles - Create new profile
147
+ */
148
+ exports.apiRoutes.post('/profiles', (req, res) => {
149
+ const { name, baseUrl, apiKey, model } = req.body;
150
+ if (!name || !baseUrl || !apiKey) {
151
+ res.status(400).json({ error: 'Missing required fields: name, baseUrl, apiKey' });
152
+ return;
153
+ }
154
+ const config = readConfigSafe();
155
+ if (config.profiles[name]) {
156
+ res.status(409).json({ error: 'Profile already exists' });
157
+ return;
158
+ }
159
+ // Ensure .ccs directory exists
160
+ if (!fs.existsSync((0, config_manager_1.getCcsDir)())) {
161
+ fs.mkdirSync((0, config_manager_1.getCcsDir)(), { recursive: true });
162
+ }
163
+ // Create settings file
164
+ const settingsPath = createSettingsFile(name, baseUrl, apiKey, model);
165
+ // Update config
166
+ config.profiles[name] = settingsPath;
167
+ writeConfig(config);
168
+ res.status(201).json({ name, settingsPath });
169
+ });
170
+ /**
171
+ * PUT /api/profiles/:name - Update profile
172
+ */
173
+ exports.apiRoutes.put('/profiles/:name', (req, res) => {
174
+ const { name } = req.params;
175
+ const { baseUrl, apiKey, model } = req.body;
176
+ const config = readConfigSafe();
177
+ if (!config.profiles[name]) {
178
+ res.status(404).json({ error: 'Profile not found' });
179
+ return;
180
+ }
181
+ try {
182
+ updateSettingsFile(name, { baseUrl, apiKey, model });
183
+ res.json({ name, updated: true });
184
+ }
185
+ catch (error) {
186
+ res.status(500).json({ error: error.message });
187
+ }
188
+ });
189
+ /**
190
+ * DELETE /api/profiles/:name - Delete profile
191
+ */
192
+ exports.apiRoutes.delete('/profiles/:name', (req, res) => {
193
+ const { name } = req.params;
194
+ const config = readConfigSafe();
195
+ if (!config.profiles[name]) {
196
+ res.status(404).json({ error: 'Profile not found' });
197
+ return;
198
+ }
199
+ // Delete settings file
200
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
201
+ if (fs.existsSync(settingsPath)) {
202
+ fs.unlinkSync(settingsPath);
203
+ }
204
+ // Remove from config
205
+ delete config.profiles[name];
206
+ writeConfig(config);
207
+ res.json({ name, deleted: true });
208
+ });
209
+ // ==================== CLIProxy CRUD ====================
210
+ /**
211
+ * GET /api/cliproxy - List cliproxy variants
212
+ */
213
+ exports.apiRoutes.get('/cliproxy', (_req, res) => {
214
+ const config = readConfigSafe();
215
+ const variants = Object.entries(config.cliproxy || {}).map(([name, variant]) => ({
216
+ name,
217
+ provider: variant.provider,
218
+ settings: variant.settings,
219
+ }));
220
+ res.json({ variants });
221
+ });
222
+ /**
223
+ * POST /api/cliproxy - Create cliproxy variant
224
+ */
225
+ exports.apiRoutes.post('/cliproxy', (req, res) => {
226
+ const { name, provider, model } = req.body;
227
+ if (!name || !provider) {
228
+ res.status(400).json({ error: 'Missing required fields: name, provider' });
229
+ return;
230
+ }
231
+ const config = readConfigSafe();
232
+ config.cliproxy = config.cliproxy || {};
233
+ if (config.cliproxy[name]) {
234
+ res.status(409).json({ error: 'Variant already exists' });
235
+ return;
236
+ }
237
+ // Ensure .ccs directory exists
238
+ if (!fs.existsSync((0, config_manager_1.getCcsDir)())) {
239
+ fs.mkdirSync((0, config_manager_1.getCcsDir)(), { recursive: true });
240
+ }
241
+ // Create settings file for variant
242
+ const settingsPath = createCliproxySettings(name, model);
243
+ config.cliproxy[name] = { provider, settings: settingsPath };
244
+ writeConfig(config);
245
+ res.status(201).json({ name, provider, settings: settingsPath });
246
+ });
247
+ /**
248
+ * DELETE /api/cliproxy/:name - Delete cliproxy variant
249
+ */
250
+ exports.apiRoutes.delete('/cliproxy/:name', (req, res) => {
251
+ const { name } = req.params;
252
+ const config = readConfigSafe();
253
+ if (!config.cliproxy?.[name]) {
254
+ res.status(404).json({ error: 'Variant not found' });
255
+ return;
256
+ }
257
+ // Delete settings file
258
+ const settingsPath = path.join((0, config_manager_1.getCcsDir)(), `${name}.settings.json`);
259
+ if (fs.existsSync(settingsPath)) {
260
+ fs.unlinkSync(settingsPath);
261
+ }
262
+ delete config.cliproxy[name];
263
+ writeConfig(config);
264
+ res.json({ name, deleted: true });
265
+ });
266
+ /**
267
+ * GET /api/cliproxy/auth - Get auth status for built-in CLIProxy profiles
268
+ */
269
+ exports.apiRoutes.get('/cliproxy/auth', (_req, res) => {
270
+ const statuses = (0, auth_handler_1.getAllAuthStatus)();
271
+ const authStatus = statuses.map((status) => {
272
+ const oauthConfig = (0, auth_handler_1.getOAuthConfig)(status.provider);
273
+ return {
274
+ provider: status.provider,
275
+ displayName: oauthConfig.displayName,
276
+ authenticated: status.authenticated,
277
+ lastAuth: status.lastAuth?.toISOString() || null,
278
+ tokenFiles: status.tokenFiles.length,
279
+ };
280
+ });
281
+ res.json({ authStatus });
282
+ });
283
+ // ==================== Settings (Phase 05) ====================
284
+ /**
285
+ * Helper: Mask API keys in settings
286
+ */
287
+ function maskApiKeys(settings) {
288
+ if (!settings.env)
289
+ return settings;
290
+ const masked = { ...settings, env: { ...settings.env } };
291
+ const sensitiveKeys = ['ANTHROPIC_AUTH_TOKEN', 'API_KEY', 'AUTH_TOKEN'];
292
+ for (const key of Object.keys(masked.env)) {
293
+ if (sensitiveKeys.some((sensitive) => key.includes(sensitive))) {
294
+ const value = masked.env[key];
295
+ if (value && value.length > 8) {
296
+ masked.env[key] =
297
+ value.slice(0, 4) + '*'.repeat(Math.max(0, value.length - 8)) + value.slice(-4);
298
+ }
299
+ }
300
+ }
301
+ return masked;
302
+ }
303
+ /**
304
+ * GET /api/settings/:profile - Get settings with masked API keys
305
+ */
306
+ exports.apiRoutes.get('/settings/:profile', (req, res) => {
307
+ const { profile } = req.params;
308
+ const ccsDir = (0, config_manager_1.getCcsDir)();
309
+ const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
310
+ if (!fs.existsSync(settingsPath)) {
311
+ res.status(404).json({ error: 'Settings not found' });
312
+ return;
313
+ }
314
+ const stat = fs.statSync(settingsPath);
315
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
316
+ // Mask API keys in response
317
+ const masked = maskApiKeys(settings);
318
+ res.json({
319
+ profile,
320
+ settings: masked,
321
+ mtime: stat.mtime.getTime(),
322
+ path: settingsPath,
323
+ });
324
+ });
325
+ /**
326
+ * GET /api/settings/:profile/raw - Get full settings (for editing)
327
+ */
328
+ exports.apiRoutes.get('/settings/:profile/raw', (req, res) => {
329
+ const { profile } = req.params;
330
+ const ccsDir = (0, config_manager_1.getCcsDir)();
331
+ const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
332
+ if (!fs.existsSync(settingsPath)) {
333
+ res.status(404).json({ error: 'Settings not found' });
334
+ return;
335
+ }
336
+ const stat = fs.statSync(settingsPath);
337
+ const settings = (0, config_manager_1.loadSettings)(settingsPath);
338
+ res.json({
339
+ profile,
340
+ settings,
341
+ mtime: stat.mtime.getTime(),
342
+ path: settingsPath,
343
+ });
344
+ });
345
+ /**
346
+ * PUT /api/settings/:profile - Update settings with conflict detection and backup
347
+ */
348
+ exports.apiRoutes.put('/settings/:profile', (req, res) => {
349
+ const { profile } = req.params;
350
+ const { settings, expectedMtime } = req.body;
351
+ const ccsDir = (0, config_manager_1.getCcsDir)();
352
+ const settingsPath = path.join(ccsDir, `${profile}.settings.json`);
353
+ if (!fs.existsSync(settingsPath)) {
354
+ res.status(404).json({ error: 'Settings not found' });
355
+ return;
356
+ }
357
+ // Conflict detection
358
+ const stat = fs.statSync(settingsPath);
359
+ if (expectedMtime && stat.mtime.getTime() !== expectedMtime) {
360
+ res.status(409).json({
361
+ error: 'File modified externally',
362
+ currentMtime: stat.mtime.getTime(),
363
+ });
364
+ return;
365
+ }
366
+ // Create backup
367
+ const backupDir = path.join(ccsDir, 'backups');
368
+ if (!fs.existsSync(backupDir)) {
369
+ fs.mkdirSync(backupDir, { recursive: true });
370
+ }
371
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
372
+ const backupPath = path.join(backupDir, `${profile}.${timestamp}.settings.json`);
373
+ fs.copyFileSync(settingsPath, backupPath);
374
+ // Write new settings atomically
375
+ const tempPath = settingsPath + '.tmp';
376
+ fs.writeFileSync(tempPath, JSON.stringify(settings, null, 2) + '\n');
377
+ fs.renameSync(tempPath, settingsPath);
378
+ const newStat = fs.statSync(settingsPath);
379
+ res.json({
380
+ profile,
381
+ mtime: newStat.mtime.getTime(),
382
+ backupPath,
383
+ });
384
+ });
385
+ // ==================== Accounts ====================
386
+ /**
387
+ * GET /api/accounts - List accounts from profiles.json
388
+ */
389
+ exports.apiRoutes.get('/accounts', (_req, res) => {
390
+ const profilesPath = path.join((0, config_manager_1.getCcsDir)(), 'profiles.json');
391
+ if (!fs.existsSync(profilesPath)) {
392
+ res.json({ accounts: [], default: null });
393
+ return;
394
+ }
395
+ const data = JSON.parse(fs.readFileSync(profilesPath, 'utf8'));
396
+ const accounts = Object.entries(data.profiles || {}).map(([name, meta]) => {
397
+ // Type-safe handling of metadata
398
+ const metadata = meta;
399
+ return {
400
+ name,
401
+ ...metadata,
402
+ };
403
+ });
404
+ res.json({ accounts, default: data.default || null });
405
+ });
406
+ /**
407
+ * POST /api/accounts/default - Set default account
408
+ */
409
+ exports.apiRoutes.post('/accounts/default', (req, res) => {
410
+ const { name } = req.body;
411
+ if (!name) {
412
+ res.status(400).json({ error: 'Missing required field: name' });
413
+ return;
414
+ }
415
+ const profilesPath = path.join((0, config_manager_1.getCcsDir)(), 'profiles.json');
416
+ const data = fs.existsSync(profilesPath)
417
+ ? JSON.parse(fs.readFileSync(profilesPath, 'utf8'))
418
+ : { profiles: {} };
419
+ data.default = name;
420
+ fs.writeFileSync(profilesPath, JSON.stringify(data, null, 2) + '\n');
421
+ res.json({ default: name });
422
+ });
423
+ // ==================== Health (Phase 06) ====================
424
+ /**
425
+ * GET /api/health - Run health checks
426
+ */
427
+ exports.apiRoutes.get('/health', (_req, res) => {
428
+ const report = (0, health_service_1.runHealthChecks)();
429
+ res.json(report);
430
+ });
431
+ /**
432
+ * POST /api/health/fix/:checkId - Fix a health issue
433
+ */
434
+ exports.apiRoutes.post('/health/fix/:checkId', (req, res) => {
435
+ const { checkId } = req.params;
436
+ const result = (0, health_service_1.fixHealthIssue)(checkId);
437
+ if (result.success) {
438
+ res.json({ success: true, message: result.message });
439
+ }
440
+ else {
441
+ res.status(400).json({ success: false, message: result.message });
442
+ }
443
+ });
444
+ //# 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"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ /**
3
+ * Shared Data Routes (Phase 07)
4
+ *
5
+ * API routes for commands, skills, agents from ~/.ccs/shared/
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.sharedRoutes = void 0;
32
+ const express_1 = require("express");
33
+ const fs = __importStar(require("fs"));
34
+ const path = __importStar(require("path"));
35
+ const os = __importStar(require("os"));
36
+ const config_manager_1 = require("../utils/config-manager");
37
+ exports.sharedRoutes = (0, express_1.Router)();
38
+ /**
39
+ * GET /api/shared/commands
40
+ */
41
+ exports.sharedRoutes.get('/commands', (_req, res) => {
42
+ const items = getSharedItems('commands');
43
+ res.json({ items });
44
+ });
45
+ /**
46
+ * GET /api/shared/skills
47
+ */
48
+ exports.sharedRoutes.get('/skills', (_req, res) => {
49
+ const items = getSharedItems('skills');
50
+ res.json({ items });
51
+ });
52
+ /**
53
+ * GET /api/shared/agents
54
+ */
55
+ exports.sharedRoutes.get('/agents', (_req, res) => {
56
+ const items = getSharedItems('agents');
57
+ res.json({ items });
58
+ });
59
+ /**
60
+ * GET /api/shared/summary
61
+ */
62
+ exports.sharedRoutes.get('/summary', (_req, res) => {
63
+ const commands = getSharedItems('commands').length;
64
+ const skills = getSharedItems('skills').length;
65
+ const agents = getSharedItems('agents').length;
66
+ res.json({
67
+ commands,
68
+ skills,
69
+ agents,
70
+ total: commands + skills + agents,
71
+ symlinkStatus: checkSymlinkStatus(),
72
+ });
73
+ });
74
+ function getSharedItems(type) {
75
+ const ccsDir = (0, config_manager_1.getCcsDir)();
76
+ const sharedDir = path.join(ccsDir, 'shared', type);
77
+ if (!fs.existsSync(sharedDir)) {
78
+ return [];
79
+ }
80
+ const items = [];
81
+ try {
82
+ const entries = fs.readdirSync(sharedDir, { withFileTypes: true });
83
+ for (const entry of entries) {
84
+ if (entry.isDirectory()) {
85
+ // Skill/Agent: look for prompt.md
86
+ const promptPath = path.join(sharedDir, entry.name, 'prompt.md');
87
+ if (fs.existsSync(promptPath)) {
88
+ const content = fs.readFileSync(promptPath, 'utf8');
89
+ const description = extractDescription(content);
90
+ items.push({
91
+ name: entry.name,
92
+ description,
93
+ path: path.join(sharedDir, entry.name),
94
+ type: type === 'commands' ? 'command' : type.slice(0, -1),
95
+ });
96
+ }
97
+ }
98
+ else if (entry.name.endsWith('.md')) {
99
+ // Command: .md file
100
+ const filePath = path.join(sharedDir, entry.name);
101
+ const content = fs.readFileSync(filePath, 'utf8');
102
+ const description = extractDescription(content);
103
+ items.push({
104
+ name: entry.name.replace('.md', ''),
105
+ description,
106
+ path: filePath,
107
+ type: 'command',
108
+ });
109
+ }
110
+ }
111
+ }
112
+ catch {
113
+ // Directory read failed
114
+ }
115
+ return items.sort((a, b) => a.name.localeCompare(b.name));
116
+ }
117
+ function extractDescription(content) {
118
+ // Extract first non-empty, non-heading line
119
+ const lines = content.split('\n');
120
+ for (const line of lines) {
121
+ const trimmed = line.trim();
122
+ if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('---')) {
123
+ return trimmed.slice(0, 100);
124
+ }
125
+ }
126
+ return 'No description';
127
+ }
128
+ function checkSymlinkStatus() {
129
+ const ccsDir = (0, config_manager_1.getCcsDir)();
130
+ const sharedDir = path.join(ccsDir, 'shared');
131
+ if (!fs.existsSync(sharedDir)) {
132
+ return { valid: false, message: 'Shared directory not found' };
133
+ }
134
+ // Check all three symlinks: commands, skills, agents
135
+ const linkTypes = ['commands', 'skills', 'agents'];
136
+ let validLinks = 0;
137
+ for (const linkType of linkTypes) {
138
+ const linkPath = path.join(sharedDir, linkType);
139
+ try {
140
+ if (fs.existsSync(linkPath)) {
141
+ const stats = fs.lstatSync(linkPath);
142
+ if (stats.isSymbolicLink()) {
143
+ const target = fs.readlinkSync(linkPath);
144
+ // Check if it points to ~/.claude/{linkType}
145
+ const expectedTarget = path.join(os.homedir(), '.claude', linkType);
146
+ if (path.resolve(path.dirname(linkPath), target) === path.resolve(expectedTarget)) {
147
+ validLinks++;
148
+ }
149
+ }
150
+ }
151
+ }
152
+ catch {
153
+ // Not a symlink or read error
154
+ }
155
+ }
156
+ if (validLinks === linkTypes.length) {
157
+ return { valid: true, message: 'Symlinks active' };
158
+ }
159
+ else if (validLinks > 0) {
160
+ return {
161
+ valid: false,
162
+ message: `Symlinks partially configured (${validLinks}/${linkTypes.length})`,
163
+ };
164
+ }
165
+ return { valid: false, message: 'Symlinks not configured' };
166
+ }
167
+ //# sourceMappingURL=shared-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-routes.js","sourceRoot":"","sources":["../../src/web-server/shared-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Graceful Shutdown Handler
3
+ *
4
+ * Handles SIGINT/SIGTERM signals to gracefully close WebSocket connections
5
+ * and HTTP server before process exit.
6
+ */
7
+ /// <reference types="node" />
8
+ import { Server as HTTPServer } from 'http';
9
+ import { WebSocketServer } from 'ws';
10
+ /**
11
+ * Setup graceful shutdown handlers for SIGINT and SIGTERM
12
+ */
13
+ export declare function setupGracefulShutdown(server: HTTPServer, _wss: WebSocketServer, cleanup?: () => void): void;
14
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../../src/web-server/shutdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAEH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAIrC;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,eAAe,EACrB,OAAO,CAAC,EAAE,MAAM,IAAI,GACnB,IAAI,CAwBN"}