claudia-orchestrator 0.1.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.
Files changed (296) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +109 -0
  3. package/dist/cli-parser.d.ts +11 -0
  4. package/dist/cli-parser.d.ts.map +1 -0
  5. package/dist/cli-parser.js +57 -0
  6. package/dist/cli-parser.js.map +1 -0
  7. package/dist/cui-server.d.ts +69 -0
  8. package/dist/cui-server.d.ts.map +1 -0
  9. package/dist/cui-server.js +705 -0
  10. package/dist/cui-server.js.map +1 -0
  11. package/dist/mcp-server/claudia-tools.d.ts +15 -0
  12. package/dist/mcp-server/claudia-tools.d.ts.map +1 -0
  13. package/dist/mcp-server/claudia-tools.js +366 -0
  14. package/dist/mcp-server/claudia-tools.js.map +1 -0
  15. package/dist/mcp-server/index.d.ts +3 -0
  16. package/dist/mcp-server/index.d.ts.map +1 -0
  17. package/dist/mcp-server/index.js +176 -0
  18. package/dist/mcp-server/index.js.map +1 -0
  19. package/dist/middleware/auth.d.ts +18 -0
  20. package/dist/middleware/auth.d.ts.map +1 -0
  21. package/dist/middleware/auth.js +136 -0
  22. package/dist/middleware/auth.js.map +1 -0
  23. package/dist/middleware/cors-setup.d.ts +7 -0
  24. package/dist/middleware/cors-setup.d.ts.map +1 -0
  25. package/dist/middleware/cors-setup.js +8 -0
  26. package/dist/middleware/cors-setup.js.map +1 -0
  27. package/dist/middleware/error-handler.d.ts +4 -0
  28. package/dist/middleware/error-handler.d.ts.map +1 -0
  29. package/dist/middleware/error-handler.js +27 -0
  30. package/dist/middleware/error-handler.js.map +1 -0
  31. package/dist/middleware/query-parser.d.ts +11 -0
  32. package/dist/middleware/query-parser.d.ts.map +1 -0
  33. package/dist/middleware/query-parser.js +68 -0
  34. package/dist/middleware/query-parser.js.map +1 -0
  35. package/dist/middleware/request-logger.d.ts +4 -0
  36. package/dist/middleware/request-logger.d.ts.map +1 -0
  37. package/dist/middleware/request-logger.js +29 -0
  38. package/dist/middleware/request-logger.js.map +1 -0
  39. package/dist/process-daemon/index.d.ts +14 -0
  40. package/dist/process-daemon/index.d.ts.map +1 -0
  41. package/dist/process-daemon/index.js +51 -0
  42. package/dist/process-daemon/index.js.map +1 -0
  43. package/dist/process-daemon/process-daemon.d.ts +78 -0
  44. package/dist/process-daemon/process-daemon.d.ts.map +1 -0
  45. package/dist/process-daemon/process-daemon.js +568 -0
  46. package/dist/process-daemon/process-daemon.js.map +1 -0
  47. package/dist/process-daemon/process-manager-client.d.ts +108 -0
  48. package/dist/process-daemon/process-manager-client.d.ts.map +1 -0
  49. package/dist/process-daemon/process-manager-client.js +314 -0
  50. package/dist/process-daemon/process-manager-client.js.map +1 -0
  51. package/dist/process-daemon/process-manager-interface.d.ts +47 -0
  52. package/dist/process-daemon/process-manager-interface.d.ts.map +1 -0
  53. package/dist/process-daemon/process-manager-interface.js +8 -0
  54. package/dist/process-daemon/process-manager-interface.js.map +1 -0
  55. package/dist/process-daemon/test-daemon.d.ts +12 -0
  56. package/dist/process-daemon/test-daemon.d.ts.map +1 -0
  57. package/dist/process-daemon/test-daemon.js +81 -0
  58. package/dist/process-daemon/test-daemon.js.map +1 -0
  59. package/dist/process-daemon/types.d.ts +85 -0
  60. package/dist/process-daemon/types.d.ts.map +1 -0
  61. package/dist/process-daemon/types.js +8 -0
  62. package/dist/process-daemon/types.js.map +1 -0
  63. package/dist/routes/claudia.routes.d.ts +10 -0
  64. package/dist/routes/claudia.routes.d.ts.map +1 -0
  65. package/dist/routes/claudia.routes.js +123 -0
  66. package/dist/routes/claudia.routes.js.map +1 -0
  67. package/dist/routes/config.routes.d.ts +4 -0
  68. package/dist/routes/config.routes.d.ts.map +1 -0
  69. package/dist/routes/config.routes.js +27 -0
  70. package/dist/routes/config.routes.js.map +1 -0
  71. package/dist/routes/conversation.routes.d.ts +8 -0
  72. package/dist/routes/conversation.routes.d.ts.map +1 -0
  73. package/dist/routes/conversation.routes.js +870 -0
  74. package/dist/routes/conversation.routes.js.map +1 -0
  75. package/dist/routes/filesystem.routes.d.ts +4 -0
  76. package/dist/routes/filesystem.routes.d.ts.map +1 -0
  77. package/dist/routes/filesystem.routes.js +86 -0
  78. package/dist/routes/filesystem.routes.js.map +1 -0
  79. package/dist/routes/gemini.routes.d.ts +4 -0
  80. package/dist/routes/gemini.routes.d.ts.map +1 -0
  81. package/dist/routes/gemini.routes.js +93 -0
  82. package/dist/routes/gemini.routes.js.map +1 -0
  83. package/dist/routes/insights.routes.d.ts +17 -0
  84. package/dist/routes/insights.routes.d.ts.map +1 -0
  85. package/dist/routes/insights.routes.js +417 -0
  86. package/dist/routes/insights.routes.js.map +1 -0
  87. package/dist/routes/license.routes.d.ts +3 -0
  88. package/dist/routes/license.routes.d.ts.map +1 -0
  89. package/dist/routes/license.routes.js +111 -0
  90. package/dist/routes/license.routes.js.map +1 -0
  91. package/dist/routes/log.routes.d.ts +3 -0
  92. package/dist/routes/log.routes.d.ts.map +1 -0
  93. package/dist/routes/log.routes.js +65 -0
  94. package/dist/routes/log.routes.js.map +1 -0
  95. package/dist/routes/notifications.routes.d.ts +4 -0
  96. package/dist/routes/notifications.routes.d.ts.map +1 -0
  97. package/dist/routes/notifications.routes.js +71 -0
  98. package/dist/routes/notifications.routes.js.map +1 -0
  99. package/dist/routes/permission.routes.d.ts +4 -0
  100. package/dist/routes/permission.routes.d.ts.map +1 -0
  101. package/dist/routes/permission.routes.js +116 -0
  102. package/dist/routes/permission.routes.js.map +1 -0
  103. package/dist/routes/question.routes.d.ts +8 -0
  104. package/dist/routes/question.routes.d.ts.map +1 -0
  105. package/dist/routes/question.routes.js +82 -0
  106. package/dist/routes/question.routes.js.map +1 -0
  107. package/dist/routes/streaming.routes.d.ts +4 -0
  108. package/dist/routes/streaming.routes.d.ts.map +1 -0
  109. package/dist/routes/streaming.routes.js +28 -0
  110. package/dist/routes/streaming.routes.js.map +1 -0
  111. package/dist/routes/system.routes.d.ts +5 -0
  112. package/dist/routes/system.routes.d.ts.map +1 -0
  113. package/dist/routes/system.routes.js +103 -0
  114. package/dist/routes/system.routes.js.map +1 -0
  115. package/dist/routes/working-directories.routes.d.ts +4 -0
  116. package/dist/routes/working-directories.routes.d.ts.map +1 -0
  117. package/dist/routes/working-directories.routes.js +25 -0
  118. package/dist/routes/working-directories.routes.js.map +1 -0
  119. package/dist/server.d.ts +3 -0
  120. package/dist/server.d.ts.map +1 -0
  121. package/dist/server.js +34 -0
  122. package/dist/server.js.map +1 -0
  123. package/dist/services/ToolMetricsService.d.ts +53 -0
  124. package/dist/services/ToolMetricsService.d.ts.map +1 -0
  125. package/dist/services/ToolMetricsService.js +230 -0
  126. package/dist/services/ToolMetricsService.js.map +1 -0
  127. package/dist/services/anthropic-service.d.ts +186 -0
  128. package/dist/services/anthropic-service.d.ts.map +1 -0
  129. package/dist/services/anthropic-service.js +1132 -0
  130. package/dist/services/anthropic-service.js.map +1 -0
  131. package/dist/services/claude-history-reader.d.ts +126 -0
  132. package/dist/services/claude-history-reader.d.ts.map +1 -0
  133. package/dist/services/claude-history-reader.js +717 -0
  134. package/dist/services/claude-history-reader.js.map +1 -0
  135. package/dist/services/claude-process-manager.d.ts +108 -0
  136. package/dist/services/claude-process-manager.d.ts.map +1 -0
  137. package/dist/services/claude-process-manager.js +909 -0
  138. package/dist/services/claude-process-manager.js.map +1 -0
  139. package/dist/services/claude-router-service.d.ts +19 -0
  140. package/dist/services/claude-router-service.d.ts.map +1 -0
  141. package/dist/services/claude-router-service.js +160 -0
  142. package/dist/services/claude-router-service.js.map +1 -0
  143. package/dist/services/claudia-service.d.ts +77 -0
  144. package/dist/services/claudia-service.d.ts.map +1 -0
  145. package/dist/services/claudia-service.js +194 -0
  146. package/dist/services/claudia-service.js.map +1 -0
  147. package/dist/services/commands-service.d.ts +18 -0
  148. package/dist/services/commands-service.d.ts.map +1 -0
  149. package/dist/services/commands-service.js +76 -0
  150. package/dist/services/commands-service.js.map +1 -0
  151. package/dist/services/config-service.d.ts +68 -0
  152. package/dist/services/config-service.d.ts.map +1 -0
  153. package/dist/services/config-service.js +429 -0
  154. package/dist/services/config-service.js.map +1 -0
  155. package/dist/services/conversation-cache.d.ts +86 -0
  156. package/dist/services/conversation-cache.d.ts.map +1 -0
  157. package/dist/services/conversation-cache.js +235 -0
  158. package/dist/services/conversation-cache.js.map +1 -0
  159. package/dist/services/conversation-status-manager.d.ts +98 -0
  160. package/dist/services/conversation-status-manager.d.ts.map +1 -0
  161. package/dist/services/conversation-status-manager.js +295 -0
  162. package/dist/services/conversation-status-manager.js.map +1 -0
  163. package/dist/services/cost-tracker.d.ts +87 -0
  164. package/dist/services/cost-tracker.d.ts.map +1 -0
  165. package/dist/services/cost-tracker.js +335 -0
  166. package/dist/services/cost-tracker.js.map +1 -0
  167. package/dist/services/file-system-service.d.ts +61 -0
  168. package/dist/services/file-system-service.d.ts.map +1 -0
  169. package/dist/services/file-system-service.js +348 -0
  170. package/dist/services/file-system-service.js.map +1 -0
  171. package/dist/services/gemini-service.d.ts +72 -0
  172. package/dist/services/gemini-service.d.ts.map +1 -0
  173. package/dist/services/gemini-service.js +431 -0
  174. package/dist/services/gemini-service.js.map +1 -0
  175. package/dist/services/insight-queue.d.ts +99 -0
  176. package/dist/services/insight-queue.d.ts.map +1 -0
  177. package/dist/services/insight-queue.js +277 -0
  178. package/dist/services/insight-queue.js.map +1 -0
  179. package/dist/services/insights-service.d.ts +102 -0
  180. package/dist/services/insights-service.d.ts.map +1 -0
  181. package/dist/services/insights-service.js +1152 -0
  182. package/dist/services/insights-service.js.map +1 -0
  183. package/dist/services/json-lines-parser.d.ts +19 -0
  184. package/dist/services/json-lines-parser.d.ts.map +1 -0
  185. package/dist/services/json-lines-parser.js +56 -0
  186. package/dist/services/json-lines-parser.js.map +1 -0
  187. package/dist/services/license-service.d.ts +69 -0
  188. package/dist/services/license-service.d.ts.map +1 -0
  189. package/dist/services/license-service.js +330 -0
  190. package/dist/services/license-service.js.map +1 -0
  191. package/dist/services/log-formatter.d.ts +5 -0
  192. package/dist/services/log-formatter.d.ts.map +1 -0
  193. package/dist/services/log-formatter.js +77 -0
  194. package/dist/services/log-formatter.js.map +1 -0
  195. package/dist/services/log-stream-buffer.d.ts +11 -0
  196. package/dist/services/log-stream-buffer.d.ts.map +1 -0
  197. package/dist/services/log-stream-buffer.js +36 -0
  198. package/dist/services/log-stream-buffer.js.map +1 -0
  199. package/dist/services/logger.d.ts +71 -0
  200. package/dist/services/logger.d.ts.map +1 -0
  201. package/dist/services/logger.js +215 -0
  202. package/dist/services/logger.js.map +1 -0
  203. package/dist/services/mcp-config-generator.d.ts +32 -0
  204. package/dist/services/mcp-config-generator.d.ts.map +1 -0
  205. package/dist/services/mcp-config-generator.js +126 -0
  206. package/dist/services/mcp-config-generator.js.map +1 -0
  207. package/dist/services/message-filter.d.ts +22 -0
  208. package/dist/services/message-filter.d.ts.map +1 -0
  209. package/dist/services/message-filter.js +57 -0
  210. package/dist/services/message-filter.js.map +1 -0
  211. package/dist/services/notification-service.d.ts +45 -0
  212. package/dist/services/notification-service.d.ts.map +1 -0
  213. package/dist/services/notification-service.js +184 -0
  214. package/dist/services/notification-service.js.map +1 -0
  215. package/dist/services/permission-tracker.d.ts +67 -0
  216. package/dist/services/permission-tracker.d.ts.map +1 -0
  217. package/dist/services/permission-tracker.js +161 -0
  218. package/dist/services/permission-tracker.js.map +1 -0
  219. package/dist/services/process-manager-factory.d.ts +81 -0
  220. package/dist/services/process-manager-factory.d.ts.map +1 -0
  221. package/dist/services/process-manager-factory.js +211 -0
  222. package/dist/services/process-manager-factory.js.map +1 -0
  223. package/dist/services/question-tracker.d.ts +47 -0
  224. package/dist/services/question-tracker.d.ts.map +1 -0
  225. package/dist/services/question-tracker.js +105 -0
  226. package/dist/services/question-tracker.js.map +1 -0
  227. package/dist/services/session-activity-watcher.d.ts +33 -0
  228. package/dist/services/session-activity-watcher.d.ts.map +1 -0
  229. package/dist/services/session-activity-watcher.js +194 -0
  230. package/dist/services/session-activity-watcher.js.map +1 -0
  231. package/dist/services/session-info-service.d.ts +228 -0
  232. package/dist/services/session-info-service.d.ts.map +1 -0
  233. package/dist/services/session-info-service.js +920 -0
  234. package/dist/services/session-info-service.js.map +1 -0
  235. package/dist/services/session-insights-service.d.ts +119 -0
  236. package/dist/services/session-insights-service.d.ts.map +1 -0
  237. package/dist/services/session-insights-service.js +889 -0
  238. package/dist/services/session-insights-service.js.map +1 -0
  239. package/dist/services/stream-manager.d.ts +62 -0
  240. package/dist/services/stream-manager.d.ts.map +1 -0
  241. package/dist/services/stream-manager.js +239 -0
  242. package/dist/services/stream-manager.js.map +1 -0
  243. package/dist/services/web-push-service.d.ts +48 -0
  244. package/dist/services/web-push-service.d.ts.map +1 -0
  245. package/dist/services/web-push-service.js +186 -0
  246. package/dist/services/web-push-service.js.map +1 -0
  247. package/dist/services/working-directories-service.d.ts +19 -0
  248. package/dist/services/working-directories-service.d.ts.map +1 -0
  249. package/dist/services/working-directories-service.js +103 -0
  250. package/dist/services/working-directories-service.js.map +1 -0
  251. package/dist/types/config.d.ts +111 -0
  252. package/dist/types/config.d.ts.map +1 -0
  253. package/dist/types/config.js +14 -0
  254. package/dist/types/config.js.map +1 -0
  255. package/dist/types/express.d.ts +5 -0
  256. package/dist/types/express.d.ts.map +1 -0
  257. package/dist/types/express.js +2 -0
  258. package/dist/types/express.js.map +1 -0
  259. package/dist/types/index.d.ts +325 -0
  260. package/dist/types/index.d.ts.map +1 -0
  261. package/dist/types/index.js +18 -0
  262. package/dist/types/index.js.map +1 -0
  263. package/dist/types/insights.d.ts +99 -0
  264. package/dist/types/insights.d.ts.map +1 -0
  265. package/dist/types/insights.js +7 -0
  266. package/dist/types/insights.js.map +1 -0
  267. package/dist/types/license.d.ts +70 -0
  268. package/dist/types/license.d.ts.map +1 -0
  269. package/dist/types/license.js +5 -0
  270. package/dist/types/license.js.map +1 -0
  271. package/dist/types/router-config.d.ts +13 -0
  272. package/dist/types/router-config.d.ts.map +1 -0
  273. package/dist/types/router-config.js +2 -0
  274. package/dist/types/router-config.js.map +1 -0
  275. package/dist/utils/constants.d.ts +26 -0
  276. package/dist/utils/constants.d.ts.map +1 -0
  277. package/dist/utils/constants.js +28 -0
  278. package/dist/utils/constants.js.map +1 -0
  279. package/dist/utils/machine-id.d.ts +7 -0
  280. package/dist/utils/machine-id.d.ts.map +1 -0
  281. package/dist/utils/machine-id.js +76 -0
  282. package/dist/utils/machine-id.js.map +1 -0
  283. package/dist/utils/server-startup.d.ts +13 -0
  284. package/dist/utils/server-startup.d.ts.map +1 -0
  285. package/dist/utils/server-startup.js +20 -0
  286. package/dist/utils/server-startup.js.map +1 -0
  287. package/dist/web/assets/main-DAc2rjJ2.css +1 -0
  288. package/dist/web/assets/main-DvlZ02mT.js +137 -0
  289. package/dist/web/favicon.png +0 -0
  290. package/dist/web/favicon.svg +22 -0
  291. package/dist/web/icon-192x192.png +0 -0
  292. package/dist/web/icon-512x512.png +0 -0
  293. package/dist/web/index.html +36 -0
  294. package/dist/web/manifest.json +61 -0
  295. package/package.json +174 -0
  296. package/scripts/postinstall.js +30 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.routes.d.ts","sourceRoot":"","sources":["../../src/routes/notifications.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAqEzE"}
@@ -0,0 +1,71 @@
1
+ import { Router } from 'express';
2
+ import { createLogger } from '../services/logger.js';
3
+ export function createNotificationsRoutes(webPush) {
4
+ const router = Router();
5
+ const logger = createLogger('NotificationsRoutes');
6
+ // Status: enabled, subscriptionCount, publicKey presence
7
+ router.get('/status', async (req, res) => {
8
+ await webPush.initialize();
9
+ res.json({
10
+ enabled: webPush.getEnabled(),
11
+ subscriptionCount: webPush.getSubscriptionCount(),
12
+ hasPublicKey: !!webPush.getPublicKey(),
13
+ publicKey: webPush.getPublicKey() || undefined,
14
+ });
15
+ });
16
+ // Register a subscription
17
+ router.post('/register', async (req, res, next) => {
18
+ try {
19
+ await webPush.initialize();
20
+ const subscription = req.body;
21
+ if (!subscription || !subscription.endpoint) {
22
+ res.status(400).json({ error: 'Invalid subscription' });
23
+ return;
24
+ }
25
+ const userAgent = req.get('user-agent') || '';
26
+ webPush.addOrUpdateSubscription(subscription, userAgent);
27
+ res.json({ success: true });
28
+ }
29
+ catch (error) {
30
+ logger.error('Failed to register subscription', error);
31
+ next(error);
32
+ }
33
+ });
34
+ // Unregister by endpoint
35
+ router.post('/unregister', async (req, res, next) => {
36
+ try {
37
+ await webPush.initialize();
38
+ const { endpoint } = req.body || {};
39
+ if (!endpoint) {
40
+ res.status(400).json({ error: 'endpoint is required' });
41
+ return;
42
+ }
43
+ webPush.removeSubscriptionByEndpoint(endpoint);
44
+ res.json({ success: true });
45
+ }
46
+ catch (error) {
47
+ logger.error('Failed to unregister subscription', error);
48
+ next(error);
49
+ }
50
+ });
51
+ // Send test notification
52
+ router.post('/test', async (req, res, next) => {
53
+ try {
54
+ await webPush.initialize();
55
+ const { title, message, tag, data } = req.body || {};
56
+ const result = await webPush.broadcast({
57
+ title: title || 'Claudia Test',
58
+ message: message || 'This is a test notification',
59
+ tag: tag || 'claudia-test',
60
+ data: data || {},
61
+ });
62
+ res.json({ success: true, ...result });
63
+ }
64
+ catch (error) {
65
+ logger.error('Failed to send test notification', error);
66
+ next(error);
67
+ }
68
+ });
69
+ return router;
70
+ }
71
+ //# sourceMappingURL=notifications.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.routes.js","sourceRoot":"","sources":["../../src/routes/notifications.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import { PermissionTracker } from '../services/permission-tracker.js';
3
+ export declare function createPermissionRoutes(permissionTracker: PermissionTracker): Router;
4
+ //# sourceMappingURL=permission.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.routes.d.ts","sourceRoot":"","sources":["../../src/routes/permission.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,wBAAgB,sBAAsB,CACpC,iBAAiB,EAAE,iBAAiB,GACnC,MAAM,CAyIR"}
@@ -0,0 +1,116 @@
1
+ import { Router } from 'express';
2
+ import { CUIError } from '../types/index.js';
3
+ import { createLogger } from '../services/logger.js';
4
+ export function createPermissionRoutes(permissionTracker) {
5
+ const router = Router();
6
+ const logger = createLogger('PermissionRoutes');
7
+ // Notify endpoint - called by MCP server when permission is requested
8
+ router.post('/notify', async (req, res, next) => {
9
+ const requestId = req.requestId;
10
+ logger.debug('Permission notification received', {
11
+ requestId,
12
+ body: req.body
13
+ });
14
+ try {
15
+ const { toolName, toolInput, streamingId } = req.body;
16
+ if (!toolName) {
17
+ throw new CUIError('MISSING_TOOL_NAME', 'toolName is required', 400);
18
+ }
19
+ // Add permission request with the provided streamingId
20
+ const request = permissionTracker.addPermissionRequest(toolName, toolInput, streamingId);
21
+ logger.debug('Permission request tracked', {
22
+ requestId,
23
+ permissionId: request.id,
24
+ toolName,
25
+ streamingId: request.streamingId
26
+ });
27
+ res.json({ success: true, id: request.id });
28
+ }
29
+ catch (error) {
30
+ logger.debug('Permission notification failed', {
31
+ requestId,
32
+ error: error instanceof Error ? error.message : String(error)
33
+ });
34
+ next(error);
35
+ }
36
+ });
37
+ // List permissions
38
+ router.get('/', async (req, res, next) => {
39
+ const requestId = req.requestId;
40
+ logger.debug('List permissions request', {
41
+ requestId,
42
+ query: req.query
43
+ });
44
+ try {
45
+ const { streamingId, status } = req.query;
46
+ const permissions = permissionTracker.getPermissionRequests({ streamingId, status });
47
+ logger.debug('Permissions listed successfully', {
48
+ requestId,
49
+ count: permissions.length,
50
+ filter: { streamingId, status }
51
+ });
52
+ res.json({ permissions });
53
+ }
54
+ catch (error) {
55
+ logger.debug('List permissions failed', {
56
+ requestId,
57
+ error: error instanceof Error ? error.message : String(error)
58
+ });
59
+ next(error);
60
+ }
61
+ });
62
+ // Permission decision endpoint - called by frontend to approve/deny permissions
63
+ router.post('/:requestId/decision', async (req, res, next) => {
64
+ const requestIdHeader = req.requestId;
65
+ const { requestId } = req.params;
66
+ const decisionRequest = req.body;
67
+ logger.debug('Permission decision request', {
68
+ requestId: requestIdHeader,
69
+ permissionRequestId: requestId,
70
+ decision: decisionRequest
71
+ });
72
+ try {
73
+ // Validate request body
74
+ if (!decisionRequest.action || !['approve', 'deny'].includes(decisionRequest.action)) {
75
+ throw new CUIError('INVALID_ACTION', 'Action must be either "approve" or "deny"', 400);
76
+ }
77
+ // Get the permission request to validate it exists and is pending
78
+ const permissions = permissionTracker.getPermissionRequests({ status: 'pending' });
79
+ const permission = permissions.find(p => p.id === requestId);
80
+ if (!permission) {
81
+ throw new CUIError('PERMISSION_NOT_FOUND', 'Permission request not found or not pending', 404);
82
+ }
83
+ // Update permission status
84
+ let updated;
85
+ if (decisionRequest.action === 'approve') {
86
+ updated = permissionTracker.updatePermissionStatus(requestId, 'approved', { modifiedInput: decisionRequest.modifiedInput });
87
+ }
88
+ else {
89
+ updated = permissionTracker.updatePermissionStatus(requestId, 'denied', { denyReason: decisionRequest.denyReason });
90
+ }
91
+ if (!updated) {
92
+ throw new CUIError('UPDATE_FAILED', 'Failed to update permission status', 500);
93
+ }
94
+ logger.debug('Permission decision processed', {
95
+ requestId: requestIdHeader,
96
+ permissionRequestId: requestId,
97
+ action: decisionRequest.action
98
+ });
99
+ const response = {
100
+ success: true,
101
+ message: `Permission ${decisionRequest.action === 'approve' ? 'approved' : 'denied'} successfully`
102
+ };
103
+ res.json(response);
104
+ }
105
+ catch (error) {
106
+ logger.debug('Permission decision failed', {
107
+ requestId: requestIdHeader,
108
+ permissionRequestId: requestId,
109
+ error: error instanceof Error ? error.message : String(error)
110
+ });
111
+ next(error);
112
+ }
113
+ });
114
+ return router;
115
+ }
116
+ //# sourceMappingURL=permission.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.routes.js","sourceRoot":"","sources":["../../src/routes/permission.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAyD,MAAM,kBAAkB,CAAC;AAGnG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,UAAU,sBAAsB,CACpC,iBAAoC;IAEpC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAEhD,sEAAsE;IACtE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACpE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;YAC/C,SAAS;YACT,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAEtD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;YACvE,CAAC;YAED,uDAAuD;YACvD,MAAM,OAAO,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;YAEzF,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;gBACzC,SAAS;gBACT,YAAY,EAAE,OAAO,CAAC,EAAE;gBACxB,QAAQ;gBACR,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC7C,SAAS;gBACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,mBAAmB;IACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;YACvC,SAAS;YACT,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAA6E,CAAC;YAElH,MAAM,WAAW,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;YAErF,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC9C,SAAS;gBACT,KAAK,EAAE,WAAW,CAAC,MAAM;gBACzB,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;aAChC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACtC,SAAS;gBACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,gFAAgF;IAChF,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACjF,MAAM,eAAe,GAAG,GAAG,CAAC,SAAS,CAAC;QACtC,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACjC,MAAM,eAAe,GAA8B,GAAG,CAAC,IAAI,CAAC;QAE5D,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;YAC1C,SAAS,EAAE,eAAe;YAC1B,mBAAmB,EAAE,SAAS;YAC9B,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,wBAAwB;YACxB,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrF,MAAM,IAAI,QAAQ,CAAC,gBAAgB,EAAE,2CAA2C,EAAE,GAAG,CAAC,CAAC;YACzF,CAAC;YAED,kEAAkE;YAClE,MAAM,WAAW,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACnF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YAE7D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,6CAA6C,EAAE,GAAG,CAAC,CAAC;YACjG,CAAC;YAED,2BAA2B;YAC3B,IAAI,OAAgB,CAAC;YACrB,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzC,OAAO,GAAG,iBAAiB,CAAC,sBAAsB,CAChD,SAAS,EACT,UAAU,EACV,EAAE,aAAa,EAAE,eAAe,CAAC,aAAa,EAAE,CACjD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,iBAAiB,CAAC,sBAAsB,CAChD,SAAS,EACT,QAAQ,EACR,EAAE,UAAU,EAAE,eAAe,CAAC,UAAU,EAAE,CAC3C,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,oCAAoC,EAAE,GAAG,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBAC5C,SAAS,EAAE,eAAe;gBAC1B,mBAAmB,EAAE,SAAS;gBAC9B,MAAM,EAAE,eAAe,CAAC,MAAM;aAC/B,CAAC,CAAC;YAEH,MAAM,QAAQ,GAA+B;gBAC3C,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,cAAc,eAAe,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,eAAe;aACnG,CAAC;YAEF,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;gBACzC,SAAS,EAAE,eAAe;gBAC1B,mBAAmB,EAAE,SAAS;gBAC9B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Router } from 'express';
2
+ import { QuestionTracker } from '../services/question-tracker.js';
3
+ import { UnifiedProcessManager } from '../services/process-manager-factory.js';
4
+ export interface QuestionAnswerRequest {
5
+ answer: string;
6
+ }
7
+ export declare function createQuestionRoutes(questionTracker: QuestionTracker, processManager: UnifiedProcessManager): Router;
8
+ //# sourceMappingURL=question.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question.routes.d.ts","sourceRoot":"","sources":["../../src/routes/question.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAG9E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,eAAe,EAChC,cAAc,EAAE,qBAAqB,GACpC,MAAM,CA0FR"}
@@ -0,0 +1,82 @@
1
+ import { Router } from 'express';
2
+ import { CUIError } from '../types/index.js';
3
+ import { createLogger } from '../services/logger.js';
4
+ export function createQuestionRoutes(questionTracker, processManager) {
5
+ const router = Router();
6
+ const logger = createLogger('QuestionRoutes');
7
+ // List questions (optionally filtered)
8
+ router.get('/', async (req, res, next) => {
9
+ const requestId = req.requestId;
10
+ logger.debug('List questions request', {
11
+ requestId,
12
+ query: req.query
13
+ });
14
+ try {
15
+ const { streamingId, status } = req.query;
16
+ const questions = questionTracker.getQuestionRequests({ streamingId, status });
17
+ logger.debug('Questions listed successfully', {
18
+ requestId,
19
+ count: questions.length,
20
+ filter: { streamingId, status }
21
+ });
22
+ res.json({ questions });
23
+ }
24
+ catch (error) {
25
+ logger.debug('List questions failed', {
26
+ requestId,
27
+ error: error instanceof Error ? error.message : String(error)
28
+ });
29
+ next(error);
30
+ }
31
+ });
32
+ // Answer a question - sends response via stdin to Claude CLI
33
+ router.post('/:questionId/answer', async (req, res, next) => {
34
+ const requestIdHeader = req.requestId;
35
+ const { questionId } = req.params;
36
+ const { answer } = req.body;
37
+ logger.debug('Question answer request', {
38
+ requestId: requestIdHeader,
39
+ questionId,
40
+ answerLength: answer?.length
41
+ });
42
+ try {
43
+ if (!answer || typeof answer !== 'string') {
44
+ throw new CUIError('INVALID_ANSWER', 'Answer must be a non-empty string', 400);
45
+ }
46
+ // Get the question request
47
+ const question = questionTracker.getQuestionRequest(questionId);
48
+ if (!question) {
49
+ throw new CUIError('QUESTION_NOT_FOUND', 'Question request not found', 404);
50
+ }
51
+ if (question.status === 'answered') {
52
+ throw new CUIError('ALREADY_ANSWERED', 'Question has already been answered', 400);
53
+ }
54
+ // Send answer via stdin to the Claude process
55
+ const sent = processManager.sendQuestionAnswer(question.streamingId, answer);
56
+ if (!sent) {
57
+ throw new CUIError('SEND_FAILED', 'Failed to send answer to Claude process', 500);
58
+ }
59
+ // Mark question as answered
60
+ questionTracker.markAnswered(questionId, { response: answer });
61
+ logger.info('Question answered successfully', {
62
+ requestId: requestIdHeader,
63
+ questionId,
64
+ streamingId: question.streamingId
65
+ });
66
+ res.json({
67
+ success: true,
68
+ message: 'Answer sent to Claude'
69
+ });
70
+ }
71
+ catch (error) {
72
+ logger.debug('Question answer failed', {
73
+ requestId: requestIdHeader,
74
+ questionId,
75
+ error: error instanceof Error ? error.message : String(error)
76
+ });
77
+ next(error);
78
+ }
79
+ });
80
+ return router;
81
+ }
82
+ //# sourceMappingURL=question.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question.routes.js","sourceRoot":"","sources":["../../src/routes/question.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import { StreamManager } from '../services/stream-manager.js';
3
+ export declare function createStreamingRoutes(streamManager: StreamManager): Router;
4
+ //# sourceMappingURL=streaming.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.routes.d.ts","sourceRoot":"","sources":["../../src/routes/streaming.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAI7D,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,GAAG,MAAM,CA6B1E"}
@@ -0,0 +1,28 @@
1
+ import { Router } from 'express';
2
+ import { createLogger } from '../services/logger.js';
3
+ export function createStreamingRoutes(streamManager) {
4
+ const router = Router();
5
+ const logger = createLogger('StreamingRoutes');
6
+ router.get('/:streamingId', (req, res) => {
7
+ const { streamingId } = req.params;
8
+ const requestId = req.requestId;
9
+ logger.debug('Stream connection request', {
10
+ requestId,
11
+ streamingId,
12
+ headers: {
13
+ 'accept': req.headers.accept,
14
+ 'user-agent': req.headers['user-agent']
15
+ }
16
+ });
17
+ streamManager.addClient(streamingId, res);
18
+ // Log when stream closes
19
+ res.on('close', () => {
20
+ logger.debug('Stream connection closed', {
21
+ requestId,
22
+ streamingId
23
+ });
24
+ });
25
+ });
26
+ return router;
27
+ }
28
+ //# sourceMappingURL=streaming.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.routes.js","sourceRoot":"","sources":["../../src/routes/streaming.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,UAAU,qBAAqB,CAAC,aAA4B;IAChE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAE/C,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,GAAyB,EAAE,GAAG,EAAE,EAAE;QAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;YACxC,SAAS;YACT,WAAW;YACX,OAAO,EAAE;gBACP,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC5B,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;aACxC;SACF,CAAC,CAAC;QAEH,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAE1C,yBAAyB;QACzB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;gBACvC,SAAS;gBACT,WAAW;aACZ,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Router } from 'express';
2
+ import { UnifiedProcessManager } from '../services/process-manager-factory.js';
3
+ import { ClaudeHistoryReader } from '../services/claude-history-reader.js';
4
+ export declare function createSystemRoutes(processManager: UnifiedProcessManager, historyReader: ClaudeHistoryReader): Router;
5
+ //# sourceMappingURL=system.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.routes.d.ts","sourceRoot":"","sources":["../../src/routes/system.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAM1E,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,EACrC,aAAa,EAAE,mBAAmB,GACjC,MAAM,CAoER"}
@@ -0,0 +1,103 @@
1
+ import { Router } from 'express';
2
+ import { CUIError } from '../types/index.js';
3
+ import { createLogger } from '../services/logger.js';
4
+ import { getAvailableCommands } from '../services/commands-service.js';
5
+ import { ConfigService } from '../services/config-service.js';
6
+ import { execSync } from 'child_process';
7
+ export function createSystemRoutes(processManager, historyReader) {
8
+ const router = Router();
9
+ const logger = createLogger('SystemRoutes');
10
+ // Health check
11
+ router.get('/health', (req, res) => {
12
+ res.json({ status: 'ok' });
13
+ });
14
+ // Hello endpoint
15
+ router.get('/hello', (req, res) => {
16
+ res.json({ message: 'Hello from Claudia!' });
17
+ });
18
+ // Get system status
19
+ router.get('/status', async (req, res, next) => {
20
+ const requestId = req.requestId;
21
+ logger.debug('Get system status request', { requestId });
22
+ try {
23
+ const systemStatus = await getSystemStatus(processManager, historyReader, logger);
24
+ logger.debug('System status retrieved', {
25
+ requestId,
26
+ ...systemStatus
27
+ });
28
+ res.json(systemStatus);
29
+ }
30
+ catch (error) {
31
+ logger.debug('Get system status failed', {
32
+ requestId,
33
+ error: error instanceof Error ? error.message : String(error)
34
+ });
35
+ next(error);
36
+ }
37
+ });
38
+ // Get available commands
39
+ router.get('/commands', async (req, res, next) => {
40
+ const requestId = req.requestId;
41
+ const workingDirectory = req.query.workingDirectory;
42
+ logger.debug('Get commands request', { requestId, workingDirectory });
43
+ try {
44
+ const commands = getAvailableCommands(workingDirectory);
45
+ const response = {
46
+ commands
47
+ };
48
+ logger.debug('Commands retrieved', {
49
+ requestId,
50
+ commandCount: commands.length,
51
+ workingDirectory
52
+ });
53
+ res.json(response);
54
+ }
55
+ catch (error) {
56
+ logger.debug('Get commands failed', {
57
+ requestId,
58
+ error: error instanceof Error ? error.message : String(error)
59
+ });
60
+ next(error);
61
+ }
62
+ });
63
+ return router;
64
+ }
65
+ /**
66
+ * Get system status including Claude version and active conversations
67
+ */
68
+ async function getSystemStatus(processManager, historyReader, logger) {
69
+ try {
70
+ // Get Claude version
71
+ let claudeVersion = 'unknown';
72
+ let claudePath = 'unknown';
73
+ try {
74
+ claudePath = execSync('which claude', { encoding: 'utf-8' }).trim();
75
+ claudeVersion = execSync('claude --version', { encoding: 'utf-8' }).trim();
76
+ logger.debug('Claude version info retrieved', {
77
+ version: claudeVersion,
78
+ path: claudePath
79
+ });
80
+ }
81
+ catch (error) {
82
+ logger.warn('Failed to get Claude version information', {
83
+ error: error instanceof Error ? error.message : String(error),
84
+ errorCode: error instanceof Error && 'code' in error ? error.code : undefined
85
+ });
86
+ }
87
+ // Get machine ID from config
88
+ const configService = ConfigService.getInstance();
89
+ const config = configService.getConfig();
90
+ const machineId = config.machine_id;
91
+ return {
92
+ claudeVersion,
93
+ claudePath,
94
+ configPath: historyReader.homePath,
95
+ activeConversations: processManager.getActiveSessions().length,
96
+ machineId
97
+ };
98
+ }
99
+ catch (_error) {
100
+ throw new CUIError('SYSTEM_STATUS_ERROR', 'Failed to get system status', 500);
101
+ }
102
+ }
103
+ //# sourceMappingURL=system.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.routes.js","sourceRoot":"","sources":["../../src/routes/system.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAwB,QAAQ,EAAoB,MAAM,kBAAkB,CAAC;AAIpF,OAAO,EAAE,YAAY,EAAe,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,kBAAkB,CAChC,cAAqC,EACrC,aAAkC;IAElC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAE5C,eAAe;IACf,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACjC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAChC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACnE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,cAAc,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;YAElF,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;gBACtC,SAAS;gBACT,GAAG,YAAY;aAChB,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;gBACvC,SAAS;gBACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,GAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACrE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAChC,MAAM,gBAAgB,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAsC,CAAC;QAE1E,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;YAExD,MAAM,QAAQ,GAAqB;gBACjC,QAAQ;aACT,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACjC,SAAS;gBACT,YAAY,EAAE,QAAQ,CAAC,MAAM;gBAC7B,gBAAgB;aACjB,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;gBAClC,SAAS;gBACT,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,cAAqC,EACrC,aAAkC,EAClC,MAAc;IAEd,IAAI,CAAC;QACH,qBAAqB;QACrB,IAAI,aAAa,GAAG,SAAS,CAAC;QAC9B,IAAI,UAAU,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC;YACH,UAAU,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACpE,aAAa,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3E,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBAC5C,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;gBACtD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,SAAS,EAAE,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aACzG,CAAC,CAAC;QACL,CAAC;QAED,6BAA6B;QAC7B,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;QAEpC,OAAO;YACL,aAAa;YACb,UAAU;YACV,UAAU,EAAE,aAAa,CAAC,QAAQ;YAClC,mBAAmB,EAAE,cAAc,CAAC,iBAAiB,EAAE,CAAC,MAAM;YAC9D,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Router } from 'express';
2
+ import { WorkingDirectoriesService } from '../services/working-directories-service.js';
3
+ export declare function createWorkingDirectoriesRoutes(workingDirectoriesService: WorkingDirectoriesService): Router;
4
+ //# sourceMappingURL=working-directories.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-directories.routes.d.ts","sourceRoot":"","sources":["../../src/routes/working-directories.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAGtF,wBAAgB,8BAA8B,CAC5C,yBAAyB,EAAE,yBAAyB,GACnD,MAAM,CAyBR"}
@@ -0,0 +1,25 @@
1
+ import { Router } from 'express';
2
+ import { createLogger } from '../services/logger.js';
3
+ export function createWorkingDirectoriesRoutes(workingDirectoriesService) {
4
+ const router = Router();
5
+ const logger = createLogger('WorkingDirectoriesRoutes');
6
+ // Get all working directories with smart suffixes
7
+ router.get('/', async (req, res, next) => {
8
+ const requestId = req.headers['x-request-id'] || 'unknown';
9
+ logger.debug('Getting working directories', { requestId });
10
+ try {
11
+ const result = await workingDirectoriesService.getWorkingDirectories();
12
+ logger.debug('Retrieved working directories', {
13
+ requestId,
14
+ totalDirectories: result.totalCount
15
+ });
16
+ res.json(result);
17
+ }
18
+ catch (error) {
19
+ logger.error('Failed to get working directories', error, { requestId });
20
+ next(error);
21
+ }
22
+ });
23
+ return router;
24
+ }
25
+ //# sourceMappingURL=working-directories.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-directories.routes.js","sourceRoot":"","sources":["../../src/routes/working-directories.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAW,MAAM,SAAS,CAAC;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,UAAU,8BAA8B,CAC5C,yBAAoD;IAEpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,0BAA0B,CAAC,CAAC;IAExD,kDAAkD;IAClD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAA+D,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACnG,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,qBAAqB,EAAE,CAAC;YAEvE,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBAC5C,SAAS;gBACT,gBAAgB,EAAE,MAAM,CAAC,UAAU;aACpC,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import { CUIServer } from './cui-server.js';
3
+ import { createLogger } from './services/logger.js';
4
+ import { parseArgs } from './cli-parser.js';
5
+ const logger = createLogger('Server');
6
+ let globalServer = null;
7
+ async function main() {
8
+ const cliConfig = parseArgs(process.argv);
9
+ globalServer = new CUIServer(cliConfig);
10
+ // Handle graceful shutdown
11
+ const shutdown = async (signal) => {
12
+ logger.info(`Received ${signal}, shutting down...`);
13
+ if (globalServer) {
14
+ await globalServer.stop();
15
+ }
16
+ process.exit(0);
17
+ };
18
+ // Set up signal handlers before starting server
19
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
20
+ process.on('SIGINT', () => shutdown('SIGINT'));
21
+ try {
22
+ await globalServer.start();
23
+ }
24
+ catch (error) {
25
+ logger.error('Failed to start server:', error);
26
+ process.exit(1);
27
+ }
28
+ }
29
+ // Start the server
30
+ main().catch((error) => {
31
+ console.error('Unhandled error:', error);
32
+ process.exit(1);
33
+ });
34
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEtC,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,YAAY,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;IAExC,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,oBAAoB,CAAC,CAAC;QACpD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { EventEmitter } from 'events';
2
+ import { ToolMetrics } from '../types/index.js';
3
+ import Anthropic from '@anthropic-ai/sdk';
4
+ /**
5
+ * Service for tracking tool usage metrics from Claude CLI conversations
6
+ * Listens to 'claude-message' events and calculates line diff statistics
7
+ */
8
+ export declare class ToolMetricsService extends EventEmitter {
9
+ private metrics;
10
+ private logger;
11
+ constructor();
12
+ /**
13
+ * Start listening to messages from ClaudeProcessManager
14
+ */
15
+ listenToClaudeMessages(processManager: EventEmitter): void;
16
+ /**
17
+ * Get metrics for a specific session
18
+ */
19
+ getMetrics(sessionId: string): ToolMetrics | undefined;
20
+ /**
21
+ * Handle Claude messages to extract tool use data
22
+ */
23
+ private handleClaudeMessage;
24
+ /**
25
+ * Process assistant messages to find tool use blocks
26
+ */
27
+ private processAssistantMessage;
28
+ /**
29
+ * Process a tool use block to calculate line diffs
30
+ */
31
+ private processToolUse;
32
+ /**
33
+ * Calculate line diff for an edit operation using proper diff algorithm
34
+ */
35
+ private calculateEditLineDiff;
36
+ /**
37
+ * Count lines in a string
38
+ */
39
+ private countLines;
40
+ /**
41
+ * Calculate metrics from historical conversation messages
42
+ * This is used by ClaudeHistoryReader for past conversations
43
+ */
44
+ calculateMetricsFromMessages(messages: Array<{
45
+ type: string;
46
+ message?: Anthropic.Message | Anthropic.MessageParam;
47
+ }>): ToolMetrics;
48
+ /**
49
+ * Process tool use for direct metrics calculation (used for historical data)
50
+ */
51
+ private processToolUseForMetrics;
52
+ }
53
+ //# sourceMappingURL=ToolMetricsService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolMetricsService.d.ts","sourceRoot":"","sources":["../../src/services/ToolMetricsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAuC,MAAM,kBAAkB,CAAC;AAEpF,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,MAAM,CAAS;;IAOvB;;OAEG;IACH,sBAAsB,CAAC,cAAc,EAAE,YAAY,GAAG,IAAI;IAa1D;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAMtD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAQ3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+B/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAyDtB;;OAEG;IAEH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;;OAGG;IACH,4BAA4B,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC3C,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,YAAY,CAAA;KACrD,CAAC,GAAG,WAAW;IAwBhB;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAwBjC"}