agentstudio 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.
- package/.env +15 -0
- package/README.md +85 -0
- package/dist/bin/agentstudio.d.ts +3 -0
- package/dist/bin/agentstudio.d.ts.map +1 -0
- package/dist/bin/agentstudio.js +141 -0
- package/dist/bin/agentstudio.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +7 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +21 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/routes/agents.d.ts +4 -0
- package/dist/routes/agents.d.ts.map +1 -0
- package/dist/routes/agents.js +804 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/auth.d.ts +4 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +60 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/files.d.ts +4 -0
- package/dist/routes/files.d.ts.map +1 -0
- package/dist/routes/files.js +301 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/mcp.d.ts +4 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +652 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/media.d.ts +5 -0
- package/dist/routes/media.d.ts.map +1 -0
- package/dist/routes/media.js +117 -0
- package/dist/routes/media.js.map +1 -0
- package/dist/routes/slides.d.ts +4 -0
- package/dist/routes/slides.d.ts.map +1 -0
- package/dist/routes/slides.js +146 -0
- package/dist/routes/slides.js.map +1 -0
- package/dist/services/claudeSession.d.ts +83 -0
- package/dist/services/claudeSession.d.ts.map +1 -0
- package/dist/services/claudeSession.js +255 -0
- package/dist/services/claudeSession.js.map +1 -0
- package/dist/services/messageQueue.d.ts +31 -0
- package/dist/services/messageQueue.d.ts.map +1 -0
- package/dist/services/messageQueue.js +67 -0
- package/dist/services/messageQueue.js.map +1 -0
- package/dist/services/sessionManager.d.ts +132 -0
- package/dist/services/sessionManager.d.ts.map +1 -0
- package/dist/services/sessionManager.js +439 -0
- package/dist/services/sessionManager.js.map +1 -0
- package/dist/types/claude-history.d.ts +48 -0
- package/dist/types/claude-history.d.ts.map +1 -0
- package/dist/types/claude-history.js +2 -0
- package/dist/types/claude-history.js.map +1 -0
- package/dist/types/claude-versions.d.ts +31 -0
- package/dist/types/claude-versions.d.ts.map +1 -0
- package/dist/types/claude-versions.js +2 -0
- package/dist/types/claude-versions.js.map +1 -0
- package/dist/types/commands.d.ts +32 -0
- package/dist/types/commands.d.ts.map +1 -0
- package/dist/types/commands.js +2 -0
- package/dist/types/commands.js.map +1 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +150 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/subagents.d.ts +88 -0
- package/dist/types/subagents.d.ts.map +1 -0
- package/dist/types/subagents.js +2 -0
- package/dist/types/subagents.js.map +1 -0
- package/dist/utils/agentStorage.d.ts +19 -0
- package/dist/utils/agentStorage.d.ts.map +1 -0
- package/dist/utils/agentStorage.js +110 -0
- package/dist/utils/agentStorage.js.map +1 -0
- package/dist/utils/claudeVersionStorage.d.ts +33 -0
- package/dist/utils/claudeVersionStorage.d.ts.map +1 -0
- package/dist/utils/claudeVersionStorage.js +168 -0
- package/dist/utils/claudeVersionStorage.js.map +1 -0
- package/dist/utils/jwt.d.ts +15 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +28 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/projectMetadataStorage.d.ts +21 -0
- package/dist/utils/projectMetadataStorage.d.ts.map +1 -0
- package/dist/utils/projectMetadataStorage.js +68 -0
- package/dist/utils/projectMetadataStorage.js.map +1 -0
- package/frontend/dist/index.html +86 -0
- package/package.json +66 -0
- package/src/bin/agentstudio.ts +161 -0
- package/src/index.ts +100 -0
- package/src/middleware/auth.ts +26 -0
- package/src/routes/agents.ts +885 -0
- package/src/routes/auth.ts +73 -0
- package/src/routes/commands.ts.bak +441 -0
- package/src/routes/files.ts +352 -0
- package/src/routes/mcp.ts +751 -0
- package/src/routes/media.ts +140 -0
- package/src/routes/projects.ts.bak +601 -0
- package/src/routes/sessions.ts.bak +809 -0
- package/src/routes/settings.ts.bak +718 -0
- package/src/routes/slides.ts +170 -0
- package/src/routes/subagents.ts.bak +364 -0
- package/src/services/claudeSession.ts +293 -0
- package/src/services/messageQueue.ts +71 -0
- package/src/services/sessionManager.ts +532 -0
- package/src/types/claude-history.ts +50 -0
- package/src/types/claude-versions.ts +33 -0
- package/src/types/commands.ts +35 -0
- package/src/types/index.ts +248 -0
- package/src/types/subagents.ts +106 -0
- package/src/utils/agentStorage.ts +126 -0
- package/src/utils/claudeVersionStorage.ts +199 -0
- package/src/utils/jwt.ts +36 -0
- package/src/utils/projectMetadataStorage.ts +86 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-code';
|
|
2
|
+
import { MessageQueue } from './messageQueue.js';
|
|
3
|
+
/**
|
|
4
|
+
* Claude 会话包装器 - 使用 Streaming Input Mode
|
|
5
|
+
* 一次构造 query,通过 async generator 持续提供用户输入
|
|
6
|
+
*/
|
|
7
|
+
export class ClaudeSession {
|
|
8
|
+
agentId;
|
|
9
|
+
claudeSessionId = null;
|
|
10
|
+
messageQueue;
|
|
11
|
+
queryStream = null;
|
|
12
|
+
queryObject = null; // 保存 query 对象(带有 interrupt 方法)
|
|
13
|
+
isActive = true;
|
|
14
|
+
lastActivity = Date.now();
|
|
15
|
+
options;
|
|
16
|
+
isInitialized = false;
|
|
17
|
+
resumeSessionId = null;
|
|
18
|
+
projectPath = null;
|
|
19
|
+
claudeVersionId = undefined;
|
|
20
|
+
// 响应分发器相关
|
|
21
|
+
responseCallbacks = new Map();
|
|
22
|
+
nextRequestId = 0;
|
|
23
|
+
isBackgroundRunning = false;
|
|
24
|
+
constructor(agentId, options, resumeSessionId, claudeVersionId) {
|
|
25
|
+
console.log(`🔧 [DEBUG] ClaudeSession constructor started for agent: ${agentId}, resumeSessionId: ${resumeSessionId}, claudeVersionId: ${claudeVersionId}`);
|
|
26
|
+
this.agentId = agentId;
|
|
27
|
+
this.options = { ...options };
|
|
28
|
+
this.messageQueue = new MessageQueue();
|
|
29
|
+
this.resumeSessionId = resumeSessionId || null;
|
|
30
|
+
this.claudeVersionId = claudeVersionId;
|
|
31
|
+
// 从 options.cwd 获取项目路径
|
|
32
|
+
this.projectPath = options.cwd || null;
|
|
33
|
+
// 如果提供了 resumeSessionId,设置为当前 claudeSessionId
|
|
34
|
+
if (this.resumeSessionId) {
|
|
35
|
+
this.claudeSessionId = this.resumeSessionId;
|
|
36
|
+
console.log(`🔧 [DEBUG] Set claudeSessionId to resumeSessionId: ${this.claudeSessionId}`);
|
|
37
|
+
}
|
|
38
|
+
console.log(`🔧 [DEBUG] About to call initializeClaudeStream for agent: ${agentId}`);
|
|
39
|
+
// 立即初始化 Claude 流(Streaming Input Mode)
|
|
40
|
+
this.initializeClaudeStream();
|
|
41
|
+
console.log(`🔧 [DEBUG] ClaudeSession constructor completed for agent: ${agentId}`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 获取 Claude SDK 返回的真实 sessionId
|
|
45
|
+
*/
|
|
46
|
+
getClaudeSessionId() {
|
|
47
|
+
return this.claudeSessionId;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 设置 Claude sessionId
|
|
51
|
+
*/
|
|
52
|
+
setClaudeSessionId(sessionId) {
|
|
53
|
+
this.claudeSessionId = sessionId;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 获取 agentId
|
|
57
|
+
*/
|
|
58
|
+
getAgentId() {
|
|
59
|
+
return this.agentId;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 获取项目路径
|
|
63
|
+
*/
|
|
64
|
+
getProjectPath() {
|
|
65
|
+
return this.projectPath;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 获取 Claude 版本ID
|
|
69
|
+
*/
|
|
70
|
+
getClaudeVersionId() {
|
|
71
|
+
return this.claudeVersionId;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 检查会话是否活跃
|
|
75
|
+
*/
|
|
76
|
+
isSessionActive() {
|
|
77
|
+
return this.isActive;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 初始化 Claude 流 - 只调用一次,启动持续会话
|
|
81
|
+
*/
|
|
82
|
+
initializeClaudeStream() {
|
|
83
|
+
if (this.isInitialized) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
if (this.resumeSessionId) {
|
|
88
|
+
console.log(`🔄 Resuming persistent Claude session ${this.resumeSessionId} for agent: ${this.agentId}`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
console.log(`🆕 Starting new persistent Claude session for agent: ${this.agentId}`);
|
|
92
|
+
}
|
|
93
|
+
// 如果有 resumeSessionId,添加到 options 中
|
|
94
|
+
const queryOptions = { ...this.options };
|
|
95
|
+
if (this.resumeSessionId) {
|
|
96
|
+
queryOptions.resume = this.resumeSessionId;
|
|
97
|
+
console.log(`🔄 Setting resume parameter: ${this.resumeSessionId} for agent: ${this.agentId}`);
|
|
98
|
+
console.log(`📋 Full queryOptions for resume:`, JSON.stringify({
|
|
99
|
+
...queryOptions,
|
|
100
|
+
customSystemPrompt: queryOptions.customSystemPrompt ? `${queryOptions.customSystemPrompt.substring(0, 100)}...` : 'none'
|
|
101
|
+
}, null, 2));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.log(`🆕 No resume parameter, starting fresh session for agent: ${this.agentId}`);
|
|
105
|
+
}
|
|
106
|
+
// 使用 Streaming Input Mode - 只构造一次 query
|
|
107
|
+
// 这个 query 对象会持续运行,通过 messageQueue 接收新的用户输入
|
|
108
|
+
console.log(`🔧 [DEBUG] About to call query() for agent: ${this.agentId}`);
|
|
109
|
+
console.log(`🔧 [DEBUG] MessageQueue ready: ${!!this.messageQueue}, queryOptions ready: ${!!queryOptions}`);
|
|
110
|
+
// query 返回的对象既是 AsyncGenerator 又有 interrupt() 等方法
|
|
111
|
+
this.queryObject = query({
|
|
112
|
+
prompt: this.messageQueue, // messageQueue 实现了 AsyncIterable
|
|
113
|
+
options: queryOptions
|
|
114
|
+
});
|
|
115
|
+
// queryObject 本身就是 AsyncIterable,可以直接赋值给 queryStream
|
|
116
|
+
this.queryStream = this.queryObject;
|
|
117
|
+
console.log(`🔧 [DEBUG] query() called, queryObject created: ${!!this.queryObject}, has interrupt: ${typeof this.queryObject?.interrupt === 'function'} for agent: ${this.agentId}`);
|
|
118
|
+
this.isInitialized = true;
|
|
119
|
+
const action = this.resumeSessionId ? 'Resumed' : 'Initialized';
|
|
120
|
+
console.log(`✨ ${action} persistent Claude streaming session for agent: ${this.agentId}`);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error(`Failed to initialize Claude session for agent ${this.agentId}:`, error);
|
|
124
|
+
this.isActive = false;
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 发送消息到 Claude 会话,返回请求ID用于响应分发
|
|
130
|
+
* @param message 要发送的消息
|
|
131
|
+
* @param responseCallback 响应回调函数
|
|
132
|
+
*/
|
|
133
|
+
async sendMessage(message, responseCallback) {
|
|
134
|
+
console.log(`🔧 [DEBUG] sendMessage called for agent: ${this.agentId}, isActive: ${this.isActive}, isBackgroundRunning: ${this.isBackgroundRunning}`);
|
|
135
|
+
if (!this.isActive) {
|
|
136
|
+
throw new Error('Session is not active');
|
|
137
|
+
}
|
|
138
|
+
this.lastActivity = Date.now();
|
|
139
|
+
// 生成唯一的请求ID
|
|
140
|
+
const requestId = `req_${this.nextRequestId++}_${Date.now()}`;
|
|
141
|
+
console.log(`🔧 [DEBUG] Generated requestId: ${requestId} for agent: ${this.agentId}`);
|
|
142
|
+
// 注册响应回调
|
|
143
|
+
this.responseCallbacks.set(requestId, responseCallback);
|
|
144
|
+
console.log(`🔧 [DEBUG] Registered callback for requestId: ${requestId}, total callbacks: ${this.responseCallbacks.size}`);
|
|
145
|
+
// 启动后台响应处理器(如果还没有启动)
|
|
146
|
+
if (!this.isBackgroundRunning) {
|
|
147
|
+
console.log(`🔧 [DEBUG] Starting background response handler for agent: ${this.agentId}`);
|
|
148
|
+
this.startBackgroundResponseHandler();
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
console.log(`🔧 [DEBUG] Background response handler already running for agent: ${this.agentId}`);
|
|
152
|
+
}
|
|
153
|
+
// 将消息推送到队列中,Claude 会通过 async generator 接收
|
|
154
|
+
console.log(`🔧 [DEBUG] About to push message to queue for agent: ${this.agentId}, queueSize before: ${this.messageQueue.size()}`);
|
|
155
|
+
this.messageQueue.push(message);
|
|
156
|
+
console.log(`📨 Queued message for agent: ${this.agentId}, requestId: ${requestId}, queueSize: ${this.messageQueue.size()}`);
|
|
157
|
+
return requestId;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 启动后台响应处理器,按顺序分发响应给各个请求
|
|
161
|
+
*/
|
|
162
|
+
async startBackgroundResponseHandler() {
|
|
163
|
+
if (this.isBackgroundRunning || !this.queryStream) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
this.isBackgroundRunning = true;
|
|
167
|
+
console.log(`🚀 Starting background response handler for agent: ${this.agentId}`);
|
|
168
|
+
try {
|
|
169
|
+
console.log(`🔧 [DEBUG] About to start for-await loop for agent: ${this.agentId}, queryStream: ${!!this.queryStream}`);
|
|
170
|
+
for await (const response of this.queryStream) {
|
|
171
|
+
console.log(`🔧 [DEBUG] Received response in background handler for agent: ${this.agentId}, type: ${response.type}`);
|
|
172
|
+
this.lastActivity = Date.now();
|
|
173
|
+
// 捕获 SDK 返回的 sessionId
|
|
174
|
+
const sessionId = response.session_id || response.sessionId;
|
|
175
|
+
if (response.type === 'system' && response.subtype === 'init' && sessionId) {
|
|
176
|
+
this.claudeSessionId = sessionId;
|
|
177
|
+
console.log(`📝 Captured Claude sessionId: ${this.claudeSessionId} for agent: ${this.agentId}`);
|
|
178
|
+
}
|
|
179
|
+
// 获取当前最早的请求ID(FIFO队列)
|
|
180
|
+
const requestIds = Array.from(this.responseCallbacks.keys());
|
|
181
|
+
const currentRequestId = requestIds.length > 0 ? requestIds[0] : null;
|
|
182
|
+
console.log(`🔧 [DEBUG] Current pending requests: ${requestIds.length}, processing: ${currentRequestId}`);
|
|
183
|
+
// 分发响应给对应的请求
|
|
184
|
+
if (currentRequestId && this.responseCallbacks.has(currentRequestId)) {
|
|
185
|
+
const callback = this.responseCallbacks.get(currentRequestId);
|
|
186
|
+
callback(response);
|
|
187
|
+
// 如果是 result 事件,该请求完成,从队列中移除
|
|
188
|
+
if (response.type === 'result') {
|
|
189
|
+
console.log(`✅ Request ${currentRequestId} completed, removing from queue`);
|
|
190
|
+
this.responseCallbacks.delete(currentRequestId);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
console.log(`⚠️ No callback found for current request: ${currentRequestId}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
console.log(`🔧 [DEBUG] For-await loop ended for agent: ${this.agentId}`);
|
|
198
|
+
this.isBackgroundRunning = false; // 重要:循环结束时重置状态
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
console.error(`Error in background response handler for agent ${this.agentId}:`, error);
|
|
202
|
+
this.isActive = false;
|
|
203
|
+
this.isBackgroundRunning = false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* 取消指定请求的回调
|
|
208
|
+
*/
|
|
209
|
+
cancelRequest(requestId) {
|
|
210
|
+
if (this.responseCallbacks.has(requestId)) {
|
|
211
|
+
this.responseCallbacks.delete(requestId);
|
|
212
|
+
console.log(`🧹 Cleaned up request callback: ${requestId}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* 检查会话是否空闲
|
|
217
|
+
*/
|
|
218
|
+
isIdle(idleTimeoutMs = 30 * 60 * 1000) {
|
|
219
|
+
return Date.now() - this.lastActivity > idleTimeoutMs;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* 获取最后活动时间
|
|
223
|
+
*/
|
|
224
|
+
getLastActivity() {
|
|
225
|
+
return this.lastActivity;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* 中断当前正在执行的 Claude 请求
|
|
229
|
+
* 调用 query 对象的 interrupt() 方法停止当前任务
|
|
230
|
+
*/
|
|
231
|
+
async interrupt() {
|
|
232
|
+
console.log(`🛑 Interrupting Claude session for agent: ${this.agentId}, sessionId: ${this.claudeSessionId}`);
|
|
233
|
+
if (!this.queryObject || typeof this.queryObject.interrupt !== 'function') {
|
|
234
|
+
throw new Error('Query object does not support interrupt');
|
|
235
|
+
}
|
|
236
|
+
try {
|
|
237
|
+
await this.queryObject.interrupt();
|
|
238
|
+
console.log(`✅ Successfully interrupted Claude session for agent: ${this.agentId}, sessionId: ${this.claudeSessionId}`);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
console.error(`❌ Failed to interrupt Claude session for agent ${this.agentId}:`, error);
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* 关闭会话
|
|
247
|
+
*/
|
|
248
|
+
async close() {
|
|
249
|
+
console.log(`🔚 Closing Claude session for agent: ${this.agentId}, sessionId: ${this.claudeSessionId}`);
|
|
250
|
+
this.isActive = false;
|
|
251
|
+
// 结束消息队列,这会让 async generator 完成
|
|
252
|
+
this.messageQueue.end();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=claudeSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claudeSession.js","sourceRoot":"","sources":["../../src/services/claudeSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 异步消息队列,用于持续向 Claude 提供用户输入
|
|
3
|
+
* 实现 Streaming Input Mode 的核心组件
|
|
4
|
+
*/
|
|
5
|
+
export declare class MessageQueue {
|
|
6
|
+
private queue;
|
|
7
|
+
private resolvers;
|
|
8
|
+
private isEnded;
|
|
9
|
+
/**
|
|
10
|
+
* 异步迭代器实现,用于 Claude SDK 的 streaming input
|
|
11
|
+
*/
|
|
12
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<any>;
|
|
13
|
+
/**
|
|
14
|
+
* 向队列中添加消息
|
|
15
|
+
* @param message 要添加的消息
|
|
16
|
+
*/
|
|
17
|
+
push(message: any): void;
|
|
18
|
+
/**
|
|
19
|
+
* 结束队列,不再接收新消息
|
|
20
|
+
*/
|
|
21
|
+
end(): void;
|
|
22
|
+
/**
|
|
23
|
+
* 检查队列是否已结束
|
|
24
|
+
*/
|
|
25
|
+
isFinished(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* 获取当前队列长度
|
|
28
|
+
*/
|
|
29
|
+
size(): number;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=messageQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageQueue.d.ts","sourceRoot":"","sources":["../../src/services/messageQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,OAAO,CAAS;IAExB;;OAEG;IACI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,qBAAqB,CAAC,GAAG,CAAC;IAW3D;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAoBxB;;OAEG;IACH,GAAG,IAAI,IAAI;IAOX;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 异步消息队列,用于持续向 Claude 提供用户输入
|
|
3
|
+
* 实现 Streaming Input Mode 的核心组件
|
|
4
|
+
*/
|
|
5
|
+
export class MessageQueue {
|
|
6
|
+
queue = [];
|
|
7
|
+
resolvers = [];
|
|
8
|
+
isEnded = false;
|
|
9
|
+
/**
|
|
10
|
+
* 异步迭代器实现,用于 Claude SDK 的 streaming input
|
|
11
|
+
*/
|
|
12
|
+
async *[Symbol.asyncIterator]() {
|
|
13
|
+
while (!this.isEnded || this.queue.length > 0) {
|
|
14
|
+
if (this.queue.length > 0) {
|
|
15
|
+
yield this.queue.shift();
|
|
16
|
+
}
|
|
17
|
+
else if (!this.isEnded) {
|
|
18
|
+
// 等待新消息
|
|
19
|
+
yield new Promise(resolve => this.resolvers.push(resolve));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 向队列中添加消息
|
|
25
|
+
* @param message 要添加的消息
|
|
26
|
+
*/
|
|
27
|
+
push(message) {
|
|
28
|
+
console.log(`🔧 [QUEUE] push called, isEnded: ${this.isEnded}, resolvers: ${this.resolvers.length}, queue: ${this.queue.length}`);
|
|
29
|
+
if (this.isEnded) {
|
|
30
|
+
console.warn('Cannot push to ended message queue');
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (this.resolvers.length > 0) {
|
|
34
|
+
// 有等待的消费者,直接解析
|
|
35
|
+
console.log(`🔧 [QUEUE] Resolving waiting consumer`);
|
|
36
|
+
const resolve = this.resolvers.shift();
|
|
37
|
+
resolve(message);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// 没有等待的消费者,加入队列
|
|
41
|
+
console.log(`🔧 [QUEUE] Adding to queue`);
|
|
42
|
+
this.queue.push(message);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 结束队列,不再接收新消息
|
|
47
|
+
*/
|
|
48
|
+
end() {
|
|
49
|
+
this.isEnded = true;
|
|
50
|
+
// 解析所有等待的 promise
|
|
51
|
+
this.resolvers.forEach(resolve => resolve(null));
|
|
52
|
+
this.resolvers = [];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 检查队列是否已结束
|
|
56
|
+
*/
|
|
57
|
+
isFinished() {
|
|
58
|
+
return this.isEnded;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 获取当前队列长度
|
|
62
|
+
*/
|
|
63
|
+
size() {
|
|
64
|
+
return this.queue.length;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=messageQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageQueue.js","sourceRoot":"","sources":["../../src/services/messageQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACf,KAAK,GAAU,EAAE,CAAC;IAClB,SAAS,GAAgC,EAAE,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC3B,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACzB,QAAQ;gBACR,MAAM,IAAI,OAAO,CAAM,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,OAAY;QACf,OAAO,CAAC,GAAG,CAAC,oCAAoC,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,YAAY,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAElI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,eAAe;YACf,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAG,CAAC;YACxC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,gBAAgB;YAChB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,kBAAkB;QAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Options } from '@anthropic-ai/claude-code';
|
|
2
|
+
import { ClaudeSession } from './claudeSession.js';
|
|
3
|
+
/**
|
|
4
|
+
* Claude 会话管理器
|
|
5
|
+
* 负责管理所有 Claude 会话的生命周期
|
|
6
|
+
*/
|
|
7
|
+
export declare class SessionManager {
|
|
8
|
+
private sessions;
|
|
9
|
+
private agentSessions;
|
|
10
|
+
private tempSessions;
|
|
11
|
+
private sessionHeartbeats;
|
|
12
|
+
private cleanupInterval;
|
|
13
|
+
private readonly cleanupIntervalMs;
|
|
14
|
+
private readonly defaultIdleTimeoutMs;
|
|
15
|
+
private readonly heartbeatTimeoutMs;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* 根据 sessionId 获取会话
|
|
19
|
+
* @param sessionId Claude SDK 返回的 sessionId
|
|
20
|
+
*/
|
|
21
|
+
getSession(sessionId: string): ClaudeSession | null;
|
|
22
|
+
/**
|
|
23
|
+
* 获取指定agent的最新活跃会话
|
|
24
|
+
* @param agentId Agent ID
|
|
25
|
+
*/
|
|
26
|
+
getLatestSessionForAgent(agentId: string): ClaudeSession | null;
|
|
27
|
+
/**
|
|
28
|
+
* 检查Claude用户目录中是否存在会话历史
|
|
29
|
+
* @param sessionId 要查找的会话ID
|
|
30
|
+
* @param projectPath 项目路径
|
|
31
|
+
*/
|
|
32
|
+
checkSessionExists(sessionId: string, projectPath?: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 将项目路径转换为Claude格式
|
|
35
|
+
* 复用sessions.ts中的逻辑
|
|
36
|
+
*/
|
|
37
|
+
private convertProjectPathToClaudeFormat;
|
|
38
|
+
/**
|
|
39
|
+
* 创建新会话(还没有 sessionId)
|
|
40
|
+
* @param agentId Agent ID
|
|
41
|
+
* @param options Claude 查询选项
|
|
42
|
+
* @param resumeSessionId 可选的恢复会话ID
|
|
43
|
+
* @param claudeVersionId 可选的 Claude 版本ID
|
|
44
|
+
*/
|
|
45
|
+
createNewSession(agentId: string, options: Options, resumeSessionId?: string, claudeVersionId?: string): ClaudeSession;
|
|
46
|
+
/**
|
|
47
|
+
* 确认会话的真实 sessionId,更新索引
|
|
48
|
+
* @param session 会话实例
|
|
49
|
+
* @param sessionId Claude SDK 返回的真实 sessionId
|
|
50
|
+
*/
|
|
51
|
+
confirmSessionId(session: ClaudeSession, sessionId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* 替换会话ID(用于resume时Claude SDK返回新的sessionId的情况)
|
|
54
|
+
* @param session 会话实例
|
|
55
|
+
* @param oldSessionId 原始的sessionId
|
|
56
|
+
* @param newSessionId Claude SDK返回的新sessionId
|
|
57
|
+
*/
|
|
58
|
+
replaceSessionId(session: ClaudeSession, oldSessionId: string, newSessionId: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* 更新会话心跳时间
|
|
61
|
+
* @param sessionId 会话ID
|
|
62
|
+
* @returns 是否成功更新
|
|
63
|
+
*/
|
|
64
|
+
updateHeartbeat(sessionId: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* 获取会话的最后心跳时间
|
|
67
|
+
* @param sessionId 会话ID
|
|
68
|
+
* @returns 最后心跳时间,如果不存在返回null
|
|
69
|
+
*/
|
|
70
|
+
getLastHeartbeat(sessionId: string): number | null;
|
|
71
|
+
/**
|
|
72
|
+
* 检查会话是否心跳超时
|
|
73
|
+
* @param sessionId 会话ID
|
|
74
|
+
* @returns 是否超时
|
|
75
|
+
*/
|
|
76
|
+
isHeartbeatTimedOut(sessionId: string): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* 检查会话是否在 SessionManager 中存在
|
|
79
|
+
* @param sessionId 会话ID
|
|
80
|
+
* @returns 是否存在
|
|
81
|
+
*/
|
|
82
|
+
hasActiveSession(sessionId: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* 移除指定会话
|
|
85
|
+
* @param sessionId Claude SDK 返回的 sessionId
|
|
86
|
+
*/
|
|
87
|
+
removeSession(sessionId: string): Promise<boolean>;
|
|
88
|
+
/**
|
|
89
|
+
* 手动清理指定会话(提供给前端使用)
|
|
90
|
+
* @param sessionId 会话ID
|
|
91
|
+
* @returns 是否成功清理
|
|
92
|
+
*/
|
|
93
|
+
manualCleanupSession(sessionId: string): Promise<boolean>;
|
|
94
|
+
/**
|
|
95
|
+
* 中断指定会话的当前请求
|
|
96
|
+
* @param sessionId 会话ID
|
|
97
|
+
* @returns 是否成功中断
|
|
98
|
+
*/
|
|
99
|
+
interruptSession(sessionId: string): Promise<{
|
|
100
|
+
success: boolean;
|
|
101
|
+
error?: string;
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* 清理空闲会话和心跳超时会话
|
|
105
|
+
*/
|
|
106
|
+
private cleanupIdleSessions;
|
|
107
|
+
/**
|
|
108
|
+
* 获取活跃会话数量
|
|
109
|
+
*/
|
|
110
|
+
getActiveSessionCount(): number;
|
|
111
|
+
/**
|
|
112
|
+
* 获取所有会话信息(用于调试和监控)
|
|
113
|
+
*/
|
|
114
|
+
getSessionsInfo(): Array<{
|
|
115
|
+
sessionId: string;
|
|
116
|
+
agentId: string;
|
|
117
|
+
isActive: boolean;
|
|
118
|
+
lastActivity: number;
|
|
119
|
+
idleTimeMs: number;
|
|
120
|
+
lastHeartbeat: number | null;
|
|
121
|
+
heartbeatTimedOut: boolean;
|
|
122
|
+
status: 'confirmed' | 'pending';
|
|
123
|
+
projectPath: string | null;
|
|
124
|
+
claudeVersionId?: string;
|
|
125
|
+
}>;
|
|
126
|
+
/**
|
|
127
|
+
* 关闭所有会话并清理资源
|
|
128
|
+
*/
|
|
129
|
+
shutdown(): Promise<void>;
|
|
130
|
+
}
|
|
131
|
+
export declare const sessionManager: SessionManager;
|
|
132
|
+
//# sourceMappingURL=sessionManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionManager.d.ts","sourceRoot":"","sources":["../../src/services/sessionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD;;;GAGG;AACH,qBAAa,cAAc;IAEzB,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,CAAC,aAAa,CAAuC;IAE5D,OAAO,CAAC,YAAY,CAAyC;IAE7D,OAAO,CAAC,iBAAiB,CAAkC;IAE3D,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IACnD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAY;;IAW/C;;;OAGG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAInD;;;OAGG;IACH,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAwB/D;;;;OAIG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IA8BpE;;;OAGG;IACH,OAAO,CAAC,gCAAgC;IAMxC;;;;;;OAMG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,aAAa;IAqBtH;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAgCjE;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAqC1F;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAS3C;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIlD;;;;OAIG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAQ/C;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BxD;;;;OAIG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;;;OAIG;IACG,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBxF;;OAEG;YACW,mBAAmB;IA8FjC;;OAEG;IACH,qBAAqB,IAAI,MAAM;IAI/B;;OAEG;IACH,eAAe,IAAI,KAAK,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,iBAAiB,EAAE,OAAO,CAAC;QAC3B,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;QAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IAmDF;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAoBhC;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|