@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.
- package/LICENSE +675 -0
- package/README.md +414 -0
- package/dist/api-docs.html +879 -0
- package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/assets/index-DfR9xEkp.css +32 -0
- package/dist/assets/index-DvlVn6Eb.js +1231 -0
- package/dist/assets/vendor-codemirror-CJLzwpLB.js +39 -0
- package/dist/assets/vendor-react-DcyRfQm3.js +59 -0
- package/dist/assets/vendor-xterm-DfaPXD3y.js +66 -0
- package/dist/clear-cache.html +85 -0
- package/dist/convert-icons.md +53 -0
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +9 -0
- package/dist/generate-icons.js +49 -0
- package/dist/icons/claude-ai-icon.svg +1 -0
- package/dist/icons/codex-white.svg +3 -0
- package/dist/icons/codex.svg +3 -0
- package/dist/icons/cursor-white.svg +12 -0
- package/dist/icons/cursor.svg +1 -0
- package/dist/icons/generate-icons.md +19 -0
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-128x128.svg +12 -0
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-144x144.svg +12 -0
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-152x152.svg +12 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-192x192.svg +12 -0
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-384x384.svg +12 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-512x512.svg +12 -0
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-72x72.svg +12 -0
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/icons/icon-96x96.svg +12 -0
- package/dist/icons/icon-template.svg +12 -0
- package/dist/index.html +52 -0
- package/dist/logo-128.png +0 -0
- package/dist/logo-256.png +0 -0
- package/dist/logo-32.png +0 -0
- package/dist/logo-512.png +0 -0
- package/dist/logo-64.png +0 -0
- package/dist/logo.svg +17 -0
- package/dist/manifest.json +61 -0
- package/dist/screenshots/cli-selection.png +0 -0
- package/dist/screenshots/desktop-main.png +0 -0
- package/dist/screenshots/mobile-chat.png +0 -0
- package/dist/screenshots/tools-modal.png +0 -0
- package/dist/sw.js +107 -0
- package/package.json +120 -0
- package/server/claude-sdk.js +721 -0
- package/server/cli.js +469 -0
- package/server/cursor-cli.js +267 -0
- package/server/database/db.js +554 -0
- package/server/database/init.sql +54 -0
- package/server/index.js +2120 -0
- package/server/middleware/auth.js +161 -0
- package/server/openai-codex.js +389 -0
- package/server/orchestrator/client.js +989 -0
- package/server/orchestrator/github-auth.js +308 -0
- package/server/orchestrator/index.js +216 -0
- package/server/orchestrator/protocol.js +299 -0
- package/server/orchestrator/proxy.js +364 -0
- package/server/orchestrator/status-tracker.js +226 -0
- package/server/projects.js +1604 -0
- package/server/routes/agent.js +1230 -0
- package/server/routes/auth.js +135 -0
- package/server/routes/cli-auth.js +341 -0
- package/server/routes/codex.js +345 -0
- package/server/routes/commands.js +521 -0
- package/server/routes/cursor.js +795 -0
- package/server/routes/git.js +1128 -0
- package/server/routes/mcp-utils.js +48 -0
- package/server/routes/mcp.js +650 -0
- package/server/routes/projects.js +378 -0
- package/server/routes/settings.js +178 -0
- package/server/routes/taskmaster.js +1963 -0
- package/server/routes/user.js +106 -0
- package/server/utils/commandParser.js +303 -0
- package/server/utils/gitConfig.js +24 -0
- package/server/utils/mcp-detector.js +198 -0
- package/server/utils/taskmaster-websocket.js +129 -0
- 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;
|