@epiphytic/claudecodeui 1.0.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 (142) hide show
  1. package/LICENSE +675 -0
  2. package/README.md +414 -0
  3. package/dist/api-docs.html +879 -0
  4. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  5. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  6. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  7. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  8. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  13. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  14. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  19. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  20. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  21. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  22. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  23. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  24. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  25. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  26. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  28. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  29. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  30. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  31. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  32. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  33. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  34. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  35. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  36. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  37. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  38. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  46. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  47. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  48. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  49. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  50. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  51. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  52. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  53. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  54. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  55. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  56. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  57. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  58. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  59. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  60. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  61. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  62. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  63. package/dist/assets/index-DfR9xEkp.css +32 -0
  64. package/dist/assets/index-DvlVn6Eb.js +1231 -0
  65. package/dist/assets/vendor-codemirror-CJLzwpLB.js +39 -0
  66. package/dist/assets/vendor-react-DcyRfQm3.js +59 -0
  67. package/dist/assets/vendor-xterm-DfaPXD3y.js +66 -0
  68. package/dist/clear-cache.html +85 -0
  69. package/dist/convert-icons.md +53 -0
  70. package/dist/favicon.png +0 -0
  71. package/dist/favicon.svg +9 -0
  72. package/dist/generate-icons.js +49 -0
  73. package/dist/icons/claude-ai-icon.svg +1 -0
  74. package/dist/icons/codex-white.svg +3 -0
  75. package/dist/icons/codex.svg +3 -0
  76. package/dist/icons/cursor-white.svg +12 -0
  77. package/dist/icons/cursor.svg +1 -0
  78. package/dist/icons/generate-icons.md +19 -0
  79. package/dist/icons/icon-128x128.png +0 -0
  80. package/dist/icons/icon-128x128.svg +12 -0
  81. package/dist/icons/icon-144x144.png +0 -0
  82. package/dist/icons/icon-144x144.svg +12 -0
  83. package/dist/icons/icon-152x152.png +0 -0
  84. package/dist/icons/icon-152x152.svg +12 -0
  85. package/dist/icons/icon-192x192.png +0 -0
  86. package/dist/icons/icon-192x192.svg +12 -0
  87. package/dist/icons/icon-384x384.png +0 -0
  88. package/dist/icons/icon-384x384.svg +12 -0
  89. package/dist/icons/icon-512x512.png +0 -0
  90. package/dist/icons/icon-512x512.svg +12 -0
  91. package/dist/icons/icon-72x72.png +0 -0
  92. package/dist/icons/icon-72x72.svg +12 -0
  93. package/dist/icons/icon-96x96.png +0 -0
  94. package/dist/icons/icon-96x96.svg +12 -0
  95. package/dist/icons/icon-template.svg +12 -0
  96. package/dist/index.html +52 -0
  97. package/dist/logo-128.png +0 -0
  98. package/dist/logo-256.png +0 -0
  99. package/dist/logo-32.png +0 -0
  100. package/dist/logo-512.png +0 -0
  101. package/dist/logo-64.png +0 -0
  102. package/dist/logo.svg +17 -0
  103. package/dist/manifest.json +61 -0
  104. package/dist/screenshots/cli-selection.png +0 -0
  105. package/dist/screenshots/desktop-main.png +0 -0
  106. package/dist/screenshots/mobile-chat.png +0 -0
  107. package/dist/screenshots/tools-modal.png +0 -0
  108. package/dist/sw.js +107 -0
  109. package/package.json +120 -0
  110. package/server/claude-sdk.js +721 -0
  111. package/server/cli.js +469 -0
  112. package/server/cursor-cli.js +267 -0
  113. package/server/database/db.js +554 -0
  114. package/server/database/init.sql +54 -0
  115. package/server/index.js +2120 -0
  116. package/server/middleware/auth.js +161 -0
  117. package/server/openai-codex.js +389 -0
  118. package/server/orchestrator/client.js +989 -0
  119. package/server/orchestrator/github-auth.js +308 -0
  120. package/server/orchestrator/index.js +216 -0
  121. package/server/orchestrator/protocol.js +299 -0
  122. package/server/orchestrator/proxy.js +364 -0
  123. package/server/orchestrator/status-tracker.js +226 -0
  124. package/server/projects.js +1604 -0
  125. package/server/routes/agent.js +1230 -0
  126. package/server/routes/auth.js +135 -0
  127. package/server/routes/cli-auth.js +341 -0
  128. package/server/routes/codex.js +345 -0
  129. package/server/routes/commands.js +521 -0
  130. package/server/routes/cursor.js +795 -0
  131. package/server/routes/git.js +1128 -0
  132. package/server/routes/mcp-utils.js +48 -0
  133. package/server/routes/mcp.js +650 -0
  134. package/server/routes/projects.js +378 -0
  135. package/server/routes/settings.js +178 -0
  136. package/server/routes/taskmaster.js +1963 -0
  137. package/server/routes/user.js +106 -0
  138. package/server/utils/commandParser.js +303 -0
  139. package/server/utils/gitConfig.js +24 -0
  140. package/server/utils/mcp-detector.js +198 -0
  141. package/server/utils/taskmaster-websocket.js +129 -0
  142. package/shared/modelConstants.js +65 -0
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Status Tracker
3
+ *
4
+ * Tracks the status of Claude sessions and reports changes to the orchestrator.
5
+ * Status values:
6
+ * - idle: No active Claude sessions
7
+ * - active: User connected (WebSocket open) but not currently generating
8
+ * - busy: Claude is generating a response
9
+ */
10
+
11
+ import { EventEmitter } from "events";
12
+ import { StatusValues } from "./protocol.js";
13
+
14
+ /**
15
+ * StatusTracker class
16
+ *
17
+ * Tracks active connections and Claude processing state to determine
18
+ * the overall status of the claudecodeui instance.
19
+ */
20
+ export class StatusTracker extends EventEmitter {
21
+ constructor() {
22
+ super();
23
+
24
+ // Track active WebSocket connections
25
+ this.activeConnections = new Set();
26
+
27
+ // Track busy sessions (actively generating)
28
+ this.busySessions = new Set();
29
+
30
+ // Current status
31
+ this.currentStatus = StatusValues.IDLE;
32
+ }
33
+
34
+ /**
35
+ * Registers a new WebSocket connection
36
+ * @param {string} connectionId - Unique connection identifier
37
+ */
38
+ addConnection(connectionId) {
39
+ this.activeConnections.add(connectionId);
40
+ this.updateStatus();
41
+ }
42
+
43
+ /**
44
+ * Removes a WebSocket connection
45
+ * @param {string} connectionId - Unique connection identifier
46
+ */
47
+ removeConnection(connectionId) {
48
+ this.activeConnections.delete(connectionId);
49
+ this.updateStatus();
50
+ }
51
+
52
+ /**
53
+ * Marks a session as busy (Claude is generating)
54
+ * @param {string} sessionId - Session identifier
55
+ */
56
+ markBusy(sessionId) {
57
+ this.busySessions.add(sessionId);
58
+ this.updateStatus();
59
+ }
60
+
61
+ /**
62
+ * Marks a session as no longer busy
63
+ * @param {string} sessionId - Session identifier
64
+ */
65
+ markIdle(sessionId) {
66
+ this.busySessions.delete(sessionId);
67
+ this.updateStatus();
68
+ }
69
+
70
+ /**
71
+ * Updates the current status based on active connections and busy sessions
72
+ */
73
+ updateStatus() {
74
+ let newStatus;
75
+
76
+ if (this.busySessions.size > 0) {
77
+ // If any session is generating, we're busy
78
+ newStatus = StatusValues.BUSY;
79
+ } else if (this.activeConnections.size > 0) {
80
+ // If we have connections but nothing generating, we're active
81
+ newStatus = StatusValues.ACTIVE;
82
+ } else {
83
+ // No connections, we're idle
84
+ newStatus = StatusValues.IDLE;
85
+ }
86
+
87
+ if (newStatus !== this.currentStatus) {
88
+ const previousStatus = this.currentStatus;
89
+ this.currentStatus = newStatus;
90
+ this.emit("status_change", {
91
+ status: newStatus,
92
+ previousStatus,
93
+ activeConnections: this.activeConnections.size,
94
+ busySessions: this.busySessions.size,
95
+ });
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Gets the current status
101
+ * @returns {string} Current status value
102
+ */
103
+ getStatus() {
104
+ return this.currentStatus;
105
+ }
106
+
107
+ /**
108
+ * Gets detailed state information
109
+ * @returns {Object} State details
110
+ */
111
+ getState() {
112
+ return {
113
+ status: this.currentStatus,
114
+ activeConnections: this.activeConnections.size,
115
+ busySessions: this.busySessions.size,
116
+ connectionIds: Array.from(this.activeConnections),
117
+ busySessionIds: Array.from(this.busySessions),
118
+ };
119
+ }
120
+
121
+ /**
122
+ * Resets all tracking state
123
+ */
124
+ reset() {
125
+ this.activeConnections.clear();
126
+ this.busySessions.clear();
127
+ this.currentStatus = StatusValues.IDLE;
128
+ }
129
+ }
130
+
131
+ // Singleton instance for use across the application
132
+ let statusTrackerInstance = null;
133
+
134
+ /**
135
+ * Gets the singleton StatusTracker instance
136
+ * @returns {StatusTracker} The status tracker instance
137
+ */
138
+ export function getStatusTracker() {
139
+ if (!statusTrackerInstance) {
140
+ statusTrackerInstance = new StatusTracker();
141
+ }
142
+ return statusTrackerInstance;
143
+ }
144
+
145
+ /**
146
+ * Creates status tracking hooks for existing handlers
147
+ *
148
+ * Usage in server/index.js:
149
+ * ```javascript
150
+ * const { createStatusHooks } = require('./orchestrator/status-tracker');
151
+ * const statusHooks = createStatusHooks(orchestratorClient);
152
+ *
153
+ * // Wrap queryClaudeSDK
154
+ * const originalQueryClaudeSDK = queryClaudeSDK;
155
+ * const wrappedQueryClaudeSDK = async (command, options, ws) => {
156
+ * const sessionId = options.sessionId || 'new-session';
157
+ * statusHooks.onQueryStart(sessionId);
158
+ * try {
159
+ * await originalQueryClaudeSDK(command, options, ws);
160
+ * } finally {
161
+ * statusHooks.onQueryEnd(sessionId);
162
+ * }
163
+ * };
164
+ * ```
165
+ *
166
+ * @param {OrchestratorClient} orchestratorClient - The orchestrator client
167
+ * @returns {Object} Hook functions
168
+ */
169
+ export function createStatusHooks(orchestratorClient) {
170
+ const tracker = getStatusTracker();
171
+
172
+ // Forward status changes to orchestrator
173
+ tracker.on("status_change", ({ status }) => {
174
+ if (orchestratorClient && orchestratorClient.isConnected) {
175
+ orchestratorClient.sendStatusUpdate(status);
176
+ }
177
+ });
178
+
179
+ return {
180
+ /**
181
+ * Call when a WebSocket connection is established
182
+ * @param {string} connectionId - Unique connection ID (e.g., ws object reference)
183
+ */
184
+ onConnectionOpen: (connectionId) => {
185
+ tracker.addConnection(connectionId);
186
+ },
187
+
188
+ /**
189
+ * Call when a WebSocket connection is closed
190
+ * @param {string} connectionId - Unique connection ID
191
+ */
192
+ onConnectionClose: (connectionId) => {
193
+ tracker.removeConnection(connectionId);
194
+ },
195
+
196
+ /**
197
+ * Call when a Claude query starts processing
198
+ * @param {string} sessionId - Session identifier
199
+ */
200
+ onQueryStart: (sessionId) => {
201
+ tracker.markBusy(sessionId);
202
+ },
203
+
204
+ /**
205
+ * Call when a Claude query finishes (success or error)
206
+ * @param {string} sessionId - Session identifier
207
+ */
208
+ onQueryEnd: (sessionId) => {
209
+ tracker.markIdle(sessionId);
210
+ },
211
+
212
+ /**
213
+ * Gets the current status
214
+ * @returns {string} Current status
215
+ */
216
+ getStatus: () => tracker.getStatus(),
217
+
218
+ /**
219
+ * Gets detailed state
220
+ * @returns {Object} State details
221
+ */
222
+ getState: () => tracker.getState(),
223
+ };
224
+ }
225
+
226
+ export default StatusTracker;