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,108 @@
1
+ /**
2
+ * Process Manager Client - Drop-in replacement for ClaudeProcessManager
3
+ *
4
+ * This client connects to the process daemon via Unix socket and provides
5
+ * the same interface as ClaudeProcessManager, so cui-server can swap them
6
+ * with minimal code changes.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ import { ConversationConfig, SystemInitMessage } from '../types/index.js';
10
+ /**
11
+ * Client that talks to the process daemon via Unix socket.
12
+ * Implements the same interface as ClaudeProcessManager.
13
+ */
14
+ export declare class ProcessManagerClient extends EventEmitter {
15
+ private socket;
16
+ private socketPath;
17
+ private logger;
18
+ private connected;
19
+ private reconnecting;
20
+ private shuttingDown;
21
+ private reconnectTimer;
22
+ private requestId;
23
+ private pendingRequests;
24
+ private buffer;
25
+ constructor(socketPath?: string);
26
+ /**
27
+ * Connect to the process daemon
28
+ */
29
+ connect(): Promise<void>;
30
+ /**
31
+ * Schedule a reconnection attempt
32
+ */
33
+ private scheduleReconnect;
34
+ /**
35
+ * Handle incoming data from the daemon
36
+ */
37
+ private handleData;
38
+ /**
39
+ * Handle a response to a request we made
40
+ */
41
+ private handleResponse;
42
+ /**
43
+ * Handle an event broadcast from the daemon
44
+ */
45
+ private handleEvent;
46
+ /**
47
+ * Send a request to the daemon and wait for response
48
+ */
49
+ private sendRequest;
50
+ /**
51
+ * Disconnect from the daemon
52
+ */
53
+ disconnect(): void;
54
+ /**
55
+ * Check if connected to daemon
56
+ */
57
+ isConnected(): boolean;
58
+ /**
59
+ * Start a new conversation (or resume if resumedSessionId is provided)
60
+ */
61
+ startConversation(config: ConversationConfig & {
62
+ resumedSessionId?: string;
63
+ }): Promise<{
64
+ streamingId: string;
65
+ systemInit: SystemInitMessage;
66
+ }>;
67
+ /**
68
+ * Stop a conversation
69
+ */
70
+ stopConversation(streamingId: string): Promise<boolean>;
71
+ /**
72
+ * Force kill a conversation immediately
73
+ */
74
+ forceKillConversation(streamingId: string): Promise<boolean>;
75
+ /**
76
+ * Get active sessions
77
+ */
78
+ getActiveSessions(): Promise<string[]>;
79
+ /**
80
+ * Check if a session is active
81
+ */
82
+ isSessionActive(streamingId: string): Promise<boolean>;
83
+ /**
84
+ * Send an answer to an AskUserQuestion tool
85
+ */
86
+ sendQuestionAnswer(streamingId: string, answer: string): Promise<boolean>;
87
+ /**
88
+ * Send a raw stdin message to a Claude process
89
+ */
90
+ sendStdinMessage(streamingId: string, message: string): Promise<boolean>;
91
+ /**
92
+ * No-op: MCP config is handled by the daemon
93
+ */
94
+ setMCPConfigPath(_path: string): void;
95
+ /**
96
+ * No-op: Status manager integration is handled by cui-server
97
+ */
98
+ setConversationStatusManager(_service: unknown): void;
99
+ /**
100
+ * No-op: Notification service integration is handled by cui-server
101
+ */
102
+ setNotificationService(_service: unknown): void;
103
+ /**
104
+ * No-op: Router service is not used in daemon mode yet
105
+ */
106
+ setRouterService(_service: unknown): void;
107
+ }
108
+ //# sourceMappingURL=process-manager-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager-client.d.ts","sourceRoot":"","sources":["../../src/process-daemon/process-manager-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAY,MAAM,mBAAmB,CAAC;AAapF;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAAkG;IACzH,OAAO,CAAC,MAAM,CAAM;gBAER,UAAU,GAAE,MAA4B;IAMpD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsBnB;;OAEG;YACW,WAAW;IA+BzB;;OAEG;IACH,UAAU,IAAI,IAAI;IAmBlB;;OAEG;IACH,WAAW,IAAI,OAAO;IAQtB;;OAEG;IACG,iBAAiB,CACrB,MAAM,EAAE,kBAAkB,GAAG;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAWlE;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO7D;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOlE;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5C;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;OAEG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU/E;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc9E;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,4BAA4B,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIrD;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAI/C;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;CAG1C"}
@@ -0,0 +1,314 @@
1
+ /**
2
+ * Process Manager Client - Drop-in replacement for ClaudeProcessManager
3
+ *
4
+ * This client connects to the process daemon via Unix socket and provides
5
+ * the same interface as ClaudeProcessManager, so cui-server can swap them
6
+ * with minimal code changes.
7
+ */
8
+ import * as net from 'net';
9
+ import { EventEmitter } from 'events';
10
+ import { CUIError } from '../types/index.js';
11
+ import { DEFAULT_SOCKET_PATH, } from './types.js';
12
+ import { createLogger } from '../services/logger.js';
13
+ /**
14
+ * Client that talks to the process daemon via Unix socket.
15
+ * Implements the same interface as ClaudeProcessManager.
16
+ */
17
+ export class ProcessManagerClient extends EventEmitter {
18
+ socket = null;
19
+ socketPath;
20
+ logger;
21
+ connected = false;
22
+ reconnecting = false;
23
+ shuttingDown = false; // Prevents reconnection during shutdown
24
+ reconnectTimer = null;
25
+ requestId = 0;
26
+ pendingRequests = new Map();
27
+ buffer = '';
28
+ constructor(socketPath = DEFAULT_SOCKET_PATH) {
29
+ super();
30
+ this.socketPath = socketPath;
31
+ this.logger = createLogger('ProcessManagerClient');
32
+ }
33
+ /**
34
+ * Connect to the process daemon
35
+ */
36
+ async connect() {
37
+ if (this.connected) {
38
+ this.logger.debug('Already connected to daemon');
39
+ return;
40
+ }
41
+ return new Promise((resolve, reject) => {
42
+ this.socket = net.createConnection(this.socketPath, () => {
43
+ this.connected = true;
44
+ this.logger.info('Connected to process daemon', { socketPath: this.socketPath });
45
+ resolve();
46
+ });
47
+ this.socket.on('data', (data) => {
48
+ this.handleData(data);
49
+ });
50
+ this.socket.on('close', () => {
51
+ this.connected = false;
52
+ this.logger.warn('Disconnected from process daemon');
53
+ // Reject all pending requests
54
+ for (const [id, { reject }] of this.pendingRequests) {
55
+ reject(new CUIError('DAEMON_DISCONNECTED', 'Disconnected from process daemon', 503));
56
+ this.pendingRequests.delete(id);
57
+ }
58
+ // Attempt reconnection if not intentionally closed
59
+ if (!this.reconnecting) {
60
+ this.scheduleReconnect();
61
+ }
62
+ });
63
+ this.socket.on('error', (err) => {
64
+ this.logger.error('Socket error', err);
65
+ if (!this.connected) {
66
+ reject(new CUIError('DAEMON_CONNECTION_FAILED', `Failed to connect to process daemon: ${err.message}`, 503));
67
+ }
68
+ });
69
+ });
70
+ }
71
+ /**
72
+ * Schedule a reconnection attempt
73
+ */
74
+ scheduleReconnect() {
75
+ if (this.reconnecting || this.shuttingDown)
76
+ return;
77
+ this.reconnecting = true;
78
+ this.logger.info('Scheduling reconnection in 2 seconds...');
79
+ this.reconnectTimer = setTimeout(async () => {
80
+ this.reconnectTimer = null;
81
+ // Check shutdown flag before attempting reconnect
82
+ if (this.shuttingDown) {
83
+ this.reconnecting = false;
84
+ return;
85
+ }
86
+ try {
87
+ await this.connect();
88
+ this.reconnecting = false;
89
+ this.logger.info('Reconnected to process daemon');
90
+ }
91
+ catch (error) {
92
+ this.reconnecting = false;
93
+ if (!this.shuttingDown) {
94
+ this.logger.error('Reconnection failed', error);
95
+ this.scheduleReconnect();
96
+ }
97
+ }
98
+ }, 2000);
99
+ }
100
+ /**
101
+ * Handle incoming data from the daemon
102
+ */
103
+ handleData(data) {
104
+ this.buffer += data.toString();
105
+ const lines = this.buffer.split('\n');
106
+ this.buffer = lines.pop() || '';
107
+ for (const line of lines) {
108
+ if (!line.trim())
109
+ continue;
110
+ try {
111
+ const message = JSON.parse(line);
112
+ // Check if it's a response (has id) or an event
113
+ if ('id' in message) {
114
+ this.handleResponse(message);
115
+ }
116
+ else if ('event' in message) {
117
+ this.handleEvent(message);
118
+ }
119
+ }
120
+ catch (err) {
121
+ this.logger.error('Failed to parse daemon message', err, { line });
122
+ }
123
+ }
124
+ }
125
+ /**
126
+ * Handle a response to a request we made
127
+ */
128
+ handleResponse(response) {
129
+ const pending = this.pendingRequests.get(response.id);
130
+ if (!pending) {
131
+ this.logger.warn('Received response for unknown request', { id: response.id });
132
+ return;
133
+ }
134
+ this.pendingRequests.delete(response.id);
135
+ if (response.error) {
136
+ pending.reject(new CUIError(response.error.code, response.error.message, 500));
137
+ }
138
+ else {
139
+ pending.resolve(response.result);
140
+ }
141
+ }
142
+ /**
143
+ * Handle an event broadcast from the daemon
144
+ */
145
+ handleEvent(event) {
146
+ switch (event.event) {
147
+ case 'claude-message': {
148
+ const data = event.data;
149
+ this.emit('claude-message', data);
150
+ break;
151
+ }
152
+ case 'process-closed': {
153
+ const data = event.data;
154
+ this.emit('process-closed', data);
155
+ break;
156
+ }
157
+ case 'process-error': {
158
+ const data = event.data;
159
+ this.emit('process-error', data);
160
+ break;
161
+ }
162
+ default:
163
+ this.logger.warn('Unknown event type', { event: event.event });
164
+ }
165
+ }
166
+ /**
167
+ * Send a request to the daemon and wait for response
168
+ */
169
+ async sendRequest(method, params = {}) {
170
+ if (!this.connected || !this.socket) {
171
+ throw new CUIError('DAEMON_NOT_CONNECTED', 'Not connected to process daemon', 503);
172
+ }
173
+ const id = ++this.requestId;
174
+ const request = { id, method, params };
175
+ return new Promise((resolve, reject) => {
176
+ this.pendingRequests.set(id, {
177
+ resolve: resolve,
178
+ reject,
179
+ });
180
+ this.socket.write(JSON.stringify(request) + '\n', (err) => {
181
+ if (err) {
182
+ this.pendingRequests.delete(id);
183
+ reject(new CUIError('DAEMON_WRITE_FAILED', `Failed to send request: ${err.message}`, 500));
184
+ }
185
+ });
186
+ // Timeout after 120 seconds (spawn can take a while)
187
+ setTimeout(() => {
188
+ if (this.pendingRequests.has(id)) {
189
+ this.pendingRequests.delete(id);
190
+ reject(new CUIError('DAEMON_REQUEST_TIMEOUT', 'Request to process daemon timed out', 504));
191
+ }
192
+ }, 120000);
193
+ });
194
+ }
195
+ /**
196
+ * Disconnect from the daemon
197
+ */
198
+ disconnect() {
199
+ this.shuttingDown = true; // Permanently stop reconnection attempts
200
+ this.reconnecting = true; // Also set this for backwards compatibility
201
+ // Clear any pending reconnect timer
202
+ if (this.reconnectTimer) {
203
+ clearTimeout(this.reconnectTimer);
204
+ this.reconnectTimer = null;
205
+ }
206
+ if (this.socket) {
207
+ this.socket.destroy();
208
+ this.socket = null;
209
+ this.connected = false;
210
+ }
211
+ this.logger.info('Client disconnected and shutdown');
212
+ }
213
+ /**
214
+ * Check if connected to daemon
215
+ */
216
+ isConnected() {
217
+ return this.connected;
218
+ }
219
+ // ============================================================================
220
+ // ClaudeProcessManager-compatible Interface
221
+ // ============================================================================
222
+ /**
223
+ * Start a new conversation (or resume if resumedSessionId is provided)
224
+ */
225
+ async startConversation(config) {
226
+ this.logger.debug('Starting conversation via daemon', {
227
+ hasInitialPrompt: !!config.initialPrompt,
228
+ workingDirectory: config.workingDirectory,
229
+ isResume: !!config.resumedSessionId,
230
+ });
231
+ const result = await this.sendRequest('spawn', { config });
232
+ return result;
233
+ }
234
+ /**
235
+ * Stop a conversation
236
+ */
237
+ async stopConversation(streamingId) {
238
+ this.logger.debug('Stopping conversation via daemon', { streamingId });
239
+ const result = await this.sendRequest('stop', { streamingId });
240
+ return result.success;
241
+ }
242
+ /**
243
+ * Force kill a conversation immediately
244
+ */
245
+ async forceKillConversation(streamingId) {
246
+ this.logger.debug('Force killing conversation via daemon', { streamingId });
247
+ const result = await this.sendRequest('forceKill', { streamingId });
248
+ return result.success;
249
+ }
250
+ /**
251
+ * Get active sessions
252
+ */
253
+ async getActiveSessions() {
254
+ const result = await this.sendRequest('list');
255
+ return result.sessions;
256
+ }
257
+ /**
258
+ * Check if a session is active
259
+ */
260
+ async isSessionActive(streamingId) {
261
+ const result = await this.sendRequest('isActive', { streamingId });
262
+ return result.active;
263
+ }
264
+ /**
265
+ * Send an answer to an AskUserQuestion tool
266
+ */
267
+ async sendQuestionAnswer(streamingId, answer) {
268
+ this.logger.debug('Sending question answer via daemon', { streamingId });
269
+ const result = await this.sendRequest('sendQuestionAnswer', {
270
+ streamingId,
271
+ answer,
272
+ });
273
+ return result.success;
274
+ }
275
+ /**
276
+ * Send a raw stdin message to a Claude process
277
+ */
278
+ async sendStdinMessage(streamingId, message) {
279
+ this.logger.debug('Sending stdin message via daemon', { streamingId });
280
+ const result = await this.sendRequest('write', {
281
+ streamingId,
282
+ message,
283
+ });
284
+ return result.success;
285
+ }
286
+ // ============================================================================
287
+ // Stubs for methods that are no longer needed (they're in the daemon now)
288
+ // ============================================================================
289
+ /**
290
+ * No-op: MCP config is handled by the daemon
291
+ */
292
+ setMCPConfigPath(_path) {
293
+ this.logger.debug('setMCPConfigPath called (no-op in client mode)');
294
+ }
295
+ /**
296
+ * No-op: Status manager integration is handled by cui-server
297
+ */
298
+ setConversationStatusManager(_service) {
299
+ this.logger.debug('setConversationStatusManager called (no-op in client mode)');
300
+ }
301
+ /**
302
+ * No-op: Notification service integration is handled by cui-server
303
+ */
304
+ setNotificationService(_service) {
305
+ this.logger.debug('setNotificationService called (no-op in client mode)');
306
+ }
307
+ /**
308
+ * No-op: Router service is not used in daemon mode yet
309
+ */
310
+ setRouterService(_service) {
311
+ this.logger.debug('setRouterService called (no-op in client mode)');
312
+ }
313
+ }
314
+ //# sourceMappingURL=process-manager-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager-client.js","sourceRoot":"","sources":["../../src/process-daemon/process-manager-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Process Manager Interface
3
+ *
4
+ * Common interface for both ClaudeProcessManager (direct) and ProcessManagerClient (daemon).
5
+ * This allows cui-server to work with either implementation.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { ConversationConfig, SystemInitMessage } from '../types/index.js';
9
+ /**
10
+ * Interface for process management - implemented by both direct and client modes
11
+ */
12
+ export interface IProcessManager extends EventEmitter {
13
+ startConversation(config: ConversationConfig & {
14
+ resumedSessionId?: string;
15
+ }): Promise<{
16
+ streamingId: string;
17
+ systemInit: SystemInitMessage;
18
+ }>;
19
+ stopConversation(streamingId: string): Promise<boolean>;
20
+ forceKillConversation(streamingId: string): boolean | Promise<boolean>;
21
+ getActiveSessions(): string[] | Promise<string[]>;
22
+ isSessionActive(streamingId: string): boolean | Promise<boolean>;
23
+ sendQuestionAnswer(streamingId: string, answer: string): boolean | Promise<boolean>;
24
+ sendStdinMessage(streamingId: string, message: string): boolean | Promise<boolean>;
25
+ setMCPConfigPath(path: string): void;
26
+ setConversationStatusManager(service: unknown): void;
27
+ setNotificationService(service: unknown): void;
28
+ setRouterService(service: unknown): void;
29
+ }
30
+ /**
31
+ * Events emitted by process managers
32
+ */
33
+ export interface ProcessManagerEvents {
34
+ 'claude-message': {
35
+ streamingId: string;
36
+ message: unknown;
37
+ };
38
+ 'process-closed': {
39
+ streamingId: string;
40
+ code: number | null;
41
+ };
42
+ 'process-error': {
43
+ streamingId: string;
44
+ error: string;
45
+ };
46
+ }
47
+ //# sourceMappingURL=process-manager-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager-interface.d.ts","sourceRoot":"","sources":["../../src/process-daemon/process-manager-interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IAEnD,iBAAiB,CACf,MAAM,EAAE,kBAAkB,GAAG;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAEnE,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGvE,iBAAiB,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGjE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGnF,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5D,gBAAgB,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC/D,eAAe,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Process Manager Interface
3
+ *
4
+ * Common interface for both ClaudeProcessManager (direct) and ProcessManagerClient (daemon).
5
+ * This allows cui-server to work with either implementation.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=process-manager-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager-interface.js","sourceRoot":"","sources":["../../src/process-daemon/process-manager-interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Test script for process daemon
4
+ *
5
+ * Run the daemon first in another terminal:
6
+ * npm run daemon
7
+ *
8
+ * Then run this test:
9
+ * npx tsx src/process-daemon/test-daemon.ts
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=test-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-daemon.d.ts","sourceRoot":"","sources":["../../src/process-daemon/test-daemon.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env npx tsx
2
+ /**
3
+ * Test script for process daemon
4
+ *
5
+ * Run the daemon first in another terminal:
6
+ * npm run daemon
7
+ *
8
+ * Then run this test:
9
+ * npx tsx src/process-daemon/test-daemon.ts
10
+ */
11
+ import { ProcessManagerClient } from './process-manager-client.js';
12
+ async function test() {
13
+ console.log('=== Process Daemon Test ===\n');
14
+ const client = new ProcessManagerClient();
15
+ // Test 1: Connect
16
+ console.log('1. Connecting to daemon...');
17
+ try {
18
+ await client.connect();
19
+ console.log(' ✓ Connected successfully\n');
20
+ }
21
+ catch (error) {
22
+ console.error(' ✗ Connection failed:', error);
23
+ console.log('\n Make sure the daemon is running: npm run daemon\n');
24
+ process.exit(1);
25
+ }
26
+ // Test 2: List sessions (should be empty)
27
+ console.log('2. Listing active sessions...');
28
+ try {
29
+ const sessions = await client.getActiveSessions();
30
+ console.log(` ✓ Got ${sessions.length} active sessions\n`);
31
+ }
32
+ catch (error) {
33
+ console.error(' ✗ List failed:', error);
34
+ }
35
+ // Test 3: Spawn a conversation
36
+ console.log('3. Spawning test conversation...');
37
+ console.log(' (This will run "claude -p" with a simple prompt)\n');
38
+ // Set up event listeners before spawning
39
+ client.on('claude-message', ({ streamingId, message }) => {
40
+ const msgType = message?.type || 'unknown';
41
+ const msgSubtype = message?.subtype;
42
+ console.log(` [EVENT] claude-message: type=${msgType}${msgSubtype ? `, subtype=${msgSubtype}` : ''}`);
43
+ });
44
+ client.on('process-closed', ({ streamingId, code }) => {
45
+ console.log(` [EVENT] process-closed: streamingId=${streamingId.slice(0, 8)}..., code=${code}`);
46
+ });
47
+ client.on('process-error', ({ streamingId, error }) => {
48
+ console.log(` [EVENT] process-error: ${error}`);
49
+ });
50
+ try {
51
+ const { streamingId, systemInit } = await client.startConversation({
52
+ workingDirectory: process.cwd(),
53
+ initialPrompt: 'Say "Hello from daemon test!" and nothing else.',
54
+ model: 'sonnet',
55
+ });
56
+ console.log(` ✓ Conversation started!`);
57
+ console.log(` streamingId: ${streamingId.slice(0, 8)}...`);
58
+ console.log(` sessionId: ${systemInit.session_id}`);
59
+ console.log(` model: ${systemInit.model}`);
60
+ console.log(` cwd: ${systemInit.cwd}\n`);
61
+ // Test 4: Verify session is active
62
+ console.log('4. Checking if session is active...');
63
+ const isActive = await client.isSessionActive(streamingId);
64
+ console.log(` ✓ Session active: ${isActive}\n`);
65
+ // Wait for the conversation to complete
66
+ console.log('5. Waiting for conversation to complete...');
67
+ console.log(' (Watch for claude-message and process-closed events above)\n');
68
+ // Give it time to run
69
+ await new Promise(resolve => setTimeout(resolve, 30000));
70
+ }
71
+ catch (error) {
72
+ console.error(' ✗ Spawn failed:', error);
73
+ }
74
+ // Clean up
75
+ console.log('\n6. Disconnecting...');
76
+ client.disconnect();
77
+ console.log(' ✓ Done\n');
78
+ process.exit(0);
79
+ }
80
+ test().catch(console.error);
81
+ //# sourceMappingURL=test-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-daemon.js","sourceRoot":"","sources":["../../src/process-daemon/test-daemon.ts"],"names":[],"mappings":"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"}