cyrus-edge-worker 0.0.17 → 0.0.18-alpha.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/dist/AgentSessionManager.d.ts +133 -0
- package/dist/AgentSessionManager.d.ts.map +1 -0
- package/dist/AgentSessionManager.js +613 -0
- package/dist/AgentSessionManager.js.map +1 -0
- package/dist/EdgeWorker.d.ts +56 -69
- package/dist/EdgeWorker.d.ts.map +1 -1
- package/dist/EdgeWorker.js +526 -698
- package/dist/EdgeWorker.js.map +1 -1
- package/dist/SharedApplicationServer.d.ts +2 -1
- package/dist/SharedApplicationServer.d.ts.map +1 -1
- package/dist/SharedApplicationServer.js +4 -2
- package/dist/SharedApplicationServer.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
import { LinearDocument } from '@linear/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Manages Linear Agent Sessions integration with Claude Code SDK
|
|
4
|
+
* Transforms Claude streaming messages into Agent Session format
|
|
5
|
+
* Handles session lifecycle: create → active → complete/error
|
|
6
|
+
*
|
|
7
|
+
* CURRENTLY BEING HANDLED 'per repository'
|
|
8
|
+
*/
|
|
9
|
+
export class AgentSessionManager {
|
|
10
|
+
linearClient;
|
|
11
|
+
sessions = new Map();
|
|
12
|
+
entries = new Map(); // Stores a list of session entries per each session by its linearAgentActivitySessionId
|
|
13
|
+
constructor(linearClient) {
|
|
14
|
+
this.linearClient = linearClient;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize a Linear agent session from webhook
|
|
18
|
+
* The session is already created by Linear, we just need to track it
|
|
19
|
+
*/
|
|
20
|
+
createLinearAgentSession(linearAgentActivitySessionId, issueId, issueMinimal, workspace) {
|
|
21
|
+
console.log(`[AgentSessionManager] Tracking Linear session ${linearAgentActivitySessionId} for issue ${issueId}`);
|
|
22
|
+
const agentSession = {
|
|
23
|
+
linearAgentActivitySessionId,
|
|
24
|
+
type: LinearDocument.AgentSessionType.CommentThread,
|
|
25
|
+
status: LinearDocument.AgentSessionStatus.Active,
|
|
26
|
+
context: LinearDocument.AgentSessionType.CommentThread,
|
|
27
|
+
createdAt: Date.now(),
|
|
28
|
+
updatedAt: Date.now(),
|
|
29
|
+
issueId,
|
|
30
|
+
issue: issueMinimal,
|
|
31
|
+
workspace: workspace
|
|
32
|
+
};
|
|
33
|
+
// Store locally
|
|
34
|
+
this.sessions.set(linearAgentActivitySessionId, agentSession);
|
|
35
|
+
this.entries.set(linearAgentActivitySessionId, []);
|
|
36
|
+
return agentSession;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a new Agent Session from Claude system initialization
|
|
40
|
+
*/
|
|
41
|
+
updateAgentSessionWithClaudeSessionId(linearAgentActivitySessionId, claudeSystemMessage) {
|
|
42
|
+
const linearSession = this.sessions.get(linearAgentActivitySessionId);
|
|
43
|
+
if (!linearSession) {
|
|
44
|
+
console.warn(`[AgentSessionManager] No Linear session found for linearAgentActivitySessionId ${linearAgentActivitySessionId}`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
linearSession.claudeSessionId = claudeSystemMessage.session_id;
|
|
48
|
+
linearSession.updatedAt = Date.now();
|
|
49
|
+
linearSession.metadata = {
|
|
50
|
+
model: claudeSystemMessage.model,
|
|
51
|
+
tools: claudeSystemMessage.tools,
|
|
52
|
+
permissionMode: claudeSystemMessage.permissionMode,
|
|
53
|
+
apiKeySource: claudeSystemMessage.apiKeySource,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create a session entry from Claude user/assistant message (without syncing to Linear)
|
|
58
|
+
*/
|
|
59
|
+
async createSessionEntry(_linearAgentActivitySessionId, sdkMessage) {
|
|
60
|
+
// Extract tool info if this is an assistant message
|
|
61
|
+
const toolInfo = sdkMessage.type === 'assistant' ? this.extractToolInfo(sdkMessage) : null;
|
|
62
|
+
const sessionEntry = {
|
|
63
|
+
claudeSessionId: sdkMessage.session_id,
|
|
64
|
+
type: sdkMessage.type,
|
|
65
|
+
content: this.extractContent(sdkMessage),
|
|
66
|
+
metadata: {
|
|
67
|
+
timestamp: Date.now(),
|
|
68
|
+
parentToolUseId: sdkMessage.parent_tool_use_id || undefined,
|
|
69
|
+
...(toolInfo && {
|
|
70
|
+
toolUseId: toolInfo.id,
|
|
71
|
+
toolName: toolInfo.name,
|
|
72
|
+
toolInput: toolInfo.input
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
// DON'T store locally yet - wait until we actually post to Linear
|
|
77
|
+
return sessionEntry;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Format TodoWrite tool parameter as a nice checklist
|
|
81
|
+
*/
|
|
82
|
+
formatTodoWriteParameter(jsonContent) {
|
|
83
|
+
try {
|
|
84
|
+
const data = JSON.parse(jsonContent);
|
|
85
|
+
if (!data.todos || !Array.isArray(data.todos)) {
|
|
86
|
+
return jsonContent;
|
|
87
|
+
}
|
|
88
|
+
const todos = data.todos;
|
|
89
|
+
// Keep original order but add status indicators
|
|
90
|
+
let formatted = '\n';
|
|
91
|
+
todos.forEach((todo, index) => {
|
|
92
|
+
let statusEmoji = '';
|
|
93
|
+
if (todo.status === 'completed') {
|
|
94
|
+
statusEmoji = '✅ ';
|
|
95
|
+
}
|
|
96
|
+
else if (todo.status === 'in_progress') {
|
|
97
|
+
statusEmoji = '🔄 ';
|
|
98
|
+
}
|
|
99
|
+
else if (todo.status === 'pending') {
|
|
100
|
+
statusEmoji = '⏳ ';
|
|
101
|
+
}
|
|
102
|
+
formatted += `${statusEmoji}${todo.content}`;
|
|
103
|
+
if (index < todos.length - 1) {
|
|
104
|
+
formatted += '\n';
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
return formatted;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error('[AgentSessionManager] Failed to format TodoWrite parameter:', error);
|
|
111
|
+
return jsonContent;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Complete a session from Claude result message
|
|
116
|
+
*/
|
|
117
|
+
async completeSession(linearAgentActivitySessionId, resultMessage) {
|
|
118
|
+
const session = this.sessions.get(linearAgentActivitySessionId);
|
|
119
|
+
if (!session) {
|
|
120
|
+
console.error(`[AgentSessionManager] No session found for linearAgentActivitySessionId: ${linearAgentActivitySessionId}`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const status = resultMessage.subtype === 'success'
|
|
124
|
+
? LinearDocument.AgentSessionStatus.Complete
|
|
125
|
+
: LinearDocument.AgentSessionStatus.Error;
|
|
126
|
+
// Update session status and metadata
|
|
127
|
+
await this.updateSessionStatus(linearAgentActivitySessionId, status, {
|
|
128
|
+
totalCostUsd: resultMessage.total_cost_usd,
|
|
129
|
+
usage: resultMessage.usage
|
|
130
|
+
});
|
|
131
|
+
// Add result entry if present
|
|
132
|
+
if ('result' in resultMessage && resultMessage.result) {
|
|
133
|
+
await this.addResultEntry(linearAgentActivitySessionId, resultMessage);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Handle streaming Claude messages and route to appropriate methods
|
|
138
|
+
*/
|
|
139
|
+
async handleClaudeMessage(linearAgentActivitySessionId, message) {
|
|
140
|
+
try {
|
|
141
|
+
switch (message.type) {
|
|
142
|
+
case 'system':
|
|
143
|
+
if (message.subtype === 'init') {
|
|
144
|
+
this.updateAgentSessionWithClaudeSessionId(linearAgentActivitySessionId, message);
|
|
145
|
+
}
|
|
146
|
+
break;
|
|
147
|
+
case 'user':
|
|
148
|
+
const userEntry = await this.createSessionEntry(linearAgentActivitySessionId, message);
|
|
149
|
+
await this.syncEntryToLinear(userEntry, linearAgentActivitySessionId);
|
|
150
|
+
break;
|
|
151
|
+
case 'assistant':
|
|
152
|
+
const assistantEntry = await this.createSessionEntry(linearAgentActivitySessionId, message);
|
|
153
|
+
await this.syncEntryToLinear(assistantEntry, linearAgentActivitySessionId);
|
|
154
|
+
break;
|
|
155
|
+
case 'result':
|
|
156
|
+
await this.completeSession(linearAgentActivitySessionId, message);
|
|
157
|
+
break;
|
|
158
|
+
default:
|
|
159
|
+
console.warn(`[AgentSessionManager] Unknown message type: ${message.type}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error(`[AgentSessionManager] Error handling message:`, error);
|
|
164
|
+
// Mark session as error state
|
|
165
|
+
await this.updateSessionStatus(linearAgentActivitySessionId, LinearDocument.AgentSessionStatus.Error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Update session status and metadata
|
|
170
|
+
*/
|
|
171
|
+
async updateSessionStatus(linearAgentActivitySessionId, status, additionalMetadata) {
|
|
172
|
+
const session = this.sessions.get(linearAgentActivitySessionId);
|
|
173
|
+
if (!session)
|
|
174
|
+
return;
|
|
175
|
+
session.status = status;
|
|
176
|
+
session.updatedAt = Date.now();
|
|
177
|
+
if (additionalMetadata) {
|
|
178
|
+
session.metadata = { ...session.metadata, ...additionalMetadata };
|
|
179
|
+
}
|
|
180
|
+
this.sessions.set(linearAgentActivitySessionId, session);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Add result entry from Claude result message
|
|
184
|
+
*/
|
|
185
|
+
async addResultEntry(linearAgentActivitySessionId, resultMessage) {
|
|
186
|
+
const resultEntry = {
|
|
187
|
+
claudeSessionId: resultMessage.session_id,
|
|
188
|
+
type: 'result',
|
|
189
|
+
content: 'result' in resultMessage ? resultMessage.result : '',
|
|
190
|
+
metadata: {
|
|
191
|
+
timestamp: Date.now(),
|
|
192
|
+
durationMs: resultMessage.duration_ms,
|
|
193
|
+
isError: resultMessage.is_error
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
// DON'T store locally - syncEntryToLinear will do it
|
|
197
|
+
// Sync to Linear
|
|
198
|
+
await this.syncEntryToLinear(resultEntry, linearAgentActivitySessionId);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Extract content from Claude message
|
|
202
|
+
*/
|
|
203
|
+
extractContent(sdkMessage) {
|
|
204
|
+
const message = sdkMessage.type === 'user'
|
|
205
|
+
? sdkMessage.message
|
|
206
|
+
: sdkMessage.message;
|
|
207
|
+
if (typeof message.content === 'string') {
|
|
208
|
+
return message.content;
|
|
209
|
+
}
|
|
210
|
+
if (Array.isArray(message.content)) {
|
|
211
|
+
return message.content
|
|
212
|
+
.map((block) => {
|
|
213
|
+
if (block.type === 'text') {
|
|
214
|
+
return block.text;
|
|
215
|
+
}
|
|
216
|
+
else if (block.type === 'tool_use') {
|
|
217
|
+
// For tool use blocks, return the input as JSON string
|
|
218
|
+
return JSON.stringify(block.input, null, 2);
|
|
219
|
+
}
|
|
220
|
+
return '';
|
|
221
|
+
})
|
|
222
|
+
.filter(Boolean)
|
|
223
|
+
.join('\n');
|
|
224
|
+
}
|
|
225
|
+
return '';
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Extract tool information from Claude assistant message
|
|
229
|
+
*/
|
|
230
|
+
extractToolInfo(sdkMessage) {
|
|
231
|
+
const message = sdkMessage.message;
|
|
232
|
+
if (Array.isArray(message.content)) {
|
|
233
|
+
const toolUse = message.content.find((block) => block.type === 'tool_use');
|
|
234
|
+
if (toolUse && 'id' in toolUse && 'name' in toolUse && 'input' in toolUse) {
|
|
235
|
+
return {
|
|
236
|
+
id: toolUse.id,
|
|
237
|
+
name: toolUse.name,
|
|
238
|
+
input: toolUse.input
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Sync Agent Session Entry to Linear (create AgentActivity)
|
|
246
|
+
*/
|
|
247
|
+
async syncEntryToLinear(entry, linearAgentActivitySessionId) {
|
|
248
|
+
try {
|
|
249
|
+
const session = this.sessions.get(linearAgentActivitySessionId);
|
|
250
|
+
if (!session) {
|
|
251
|
+
console.warn(`[AgentSessionManager] No Linear session for linearAgentActivitySessionId ${linearAgentActivitySessionId}`);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
// Store entry locally now that we're posting it
|
|
255
|
+
const entries = this.entries.get(linearAgentActivitySessionId) || [];
|
|
256
|
+
entries.push(entry);
|
|
257
|
+
this.entries.set(linearAgentActivitySessionId, entries);
|
|
258
|
+
// Build activity content based on entry type
|
|
259
|
+
let content;
|
|
260
|
+
switch (entry.type) {
|
|
261
|
+
case 'user':
|
|
262
|
+
// User messages are prompts - but we don't create these, Linear does
|
|
263
|
+
console.log(`[AgentSessionManager] Skipping user entry - prompts are created by Linear`);
|
|
264
|
+
return;
|
|
265
|
+
case 'assistant':
|
|
266
|
+
// Assistant messages can be thoughts or responses
|
|
267
|
+
if (entry.metadata?.toolUseId) {
|
|
268
|
+
const toolName = entry.metadata.toolName || 'Tool';
|
|
269
|
+
// Special handling for TodoWrite tool - treat as thought instead of action
|
|
270
|
+
if (toolName === 'TodoWrite') {
|
|
271
|
+
const formattedTodos = this.formatTodoWriteParameter(entry.content);
|
|
272
|
+
content = {
|
|
273
|
+
type: 'thought',
|
|
274
|
+
body: formattedTodos
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
// Other tools remain as actions
|
|
279
|
+
let parameter = entry.content;
|
|
280
|
+
let displayName = toolName;
|
|
281
|
+
content = {
|
|
282
|
+
type: 'action',
|
|
283
|
+
action: displayName,
|
|
284
|
+
parameter: parameter,
|
|
285
|
+
// result will be added later when we get tool result
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
// Regular assistant message - create a thought
|
|
291
|
+
content = {
|
|
292
|
+
type: 'thought',
|
|
293
|
+
body: entry.content
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
break;
|
|
297
|
+
case 'system':
|
|
298
|
+
// System messages are thoughts
|
|
299
|
+
content = {
|
|
300
|
+
type: 'thought',
|
|
301
|
+
body: entry.content
|
|
302
|
+
};
|
|
303
|
+
break;
|
|
304
|
+
case 'result':
|
|
305
|
+
// Result messages can be responses or errors
|
|
306
|
+
if (entry.metadata?.isError) {
|
|
307
|
+
content = {
|
|
308
|
+
type: 'error',
|
|
309
|
+
body: entry.content
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
content = {
|
|
314
|
+
type: 'response',
|
|
315
|
+
body: entry.content
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
break;
|
|
319
|
+
default:
|
|
320
|
+
// Default to thought
|
|
321
|
+
content = {
|
|
322
|
+
type: 'thought',
|
|
323
|
+
body: entry.content
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
const activityInput = {
|
|
327
|
+
agentSessionId: session.linearAgentActivitySessionId, // Use the Linear session ID
|
|
328
|
+
content
|
|
329
|
+
};
|
|
330
|
+
const result = await this.linearClient.createAgentActivity(activityInput);
|
|
331
|
+
if (result.success && result.agentActivity) {
|
|
332
|
+
const agentActivity = await result.agentActivity;
|
|
333
|
+
entry.linearAgentActivityId = agentActivity.id;
|
|
334
|
+
console.log(`[AgentSessionManager] Created ${content.type} activity ${entry.linearAgentActivityId}`);
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
console.error(`[AgentSessionManager] Failed to create Linear activity:`, result);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
console.error(`[AgentSessionManager] Failed to sync entry to Linear:`, error);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get session by ID
|
|
346
|
+
*/
|
|
347
|
+
getSession(linearAgentActivitySessionId) {
|
|
348
|
+
return this.sessions.get(linearAgentActivitySessionId);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get session entries by session ID
|
|
352
|
+
*/
|
|
353
|
+
getSessionEntries(linearAgentActivitySessionId) {
|
|
354
|
+
return this.entries.get(linearAgentActivitySessionId) || [];
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Get all active sessions
|
|
358
|
+
*/
|
|
359
|
+
getActiveSessions() {
|
|
360
|
+
return Array.from(this.sessions.values()).filter(session => session.status === LinearDocument.AgentSessionStatus.Active);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Add or update ClaudeRunner for a session
|
|
364
|
+
*/
|
|
365
|
+
addClaudeRunner(linearAgentActivitySessionId, claudeRunner) {
|
|
366
|
+
const session = this.sessions.get(linearAgentActivitySessionId);
|
|
367
|
+
if (!session) {
|
|
368
|
+
console.warn(`[AgentSessionManager] No session found for linearAgentActivitySessionId ${linearAgentActivitySessionId}`);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
session.claudeRunner = claudeRunner;
|
|
372
|
+
session.updatedAt = Date.now();
|
|
373
|
+
console.log(`[AgentSessionManager] Added ClaudeRunner to session ${linearAgentActivitySessionId}`);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Get all ClaudeRunners
|
|
377
|
+
*/
|
|
378
|
+
getAllClaudeRunners() {
|
|
379
|
+
return Array.from(this.sessions.values())
|
|
380
|
+
.map(session => session.claudeRunner)
|
|
381
|
+
.filter((runner) => runner !== undefined);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Get all ClaudeRunners for a specific issue
|
|
385
|
+
*/
|
|
386
|
+
getClaudeRunnersForIssue(issueId) {
|
|
387
|
+
return Array.from(this.sessions.values())
|
|
388
|
+
.filter(session => session.issueId === issueId)
|
|
389
|
+
.map(session => session.claudeRunner)
|
|
390
|
+
.filter((runner) => runner !== undefined);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Get sessions by issue ID
|
|
394
|
+
*/
|
|
395
|
+
getSessionsByIssueId(issueId) {
|
|
396
|
+
return Array.from(this.sessions.values()).filter(session => session.issueId === issueId);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Get active sessions by issue ID
|
|
400
|
+
*/
|
|
401
|
+
getActiveSessionsByIssueId(issueId) {
|
|
402
|
+
return Array.from(this.sessions.values()).filter(session => session.issueId === issueId && session.status === LinearDocument.AgentSessionStatus.Active);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Get all sessions
|
|
406
|
+
*/
|
|
407
|
+
getAllSessions() {
|
|
408
|
+
return Array.from(this.sessions.values());
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Create a thought activity
|
|
412
|
+
*/
|
|
413
|
+
async createThoughtActivity(sessionId, body) {
|
|
414
|
+
const session = this.sessions.get(sessionId);
|
|
415
|
+
if (!session || !session.linearAgentActivitySessionId) {
|
|
416
|
+
console.warn(`[AgentSessionManager] No Linear session ID for session ${sessionId}`);
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
try {
|
|
420
|
+
const result = await this.linearClient.createAgentActivity({
|
|
421
|
+
agentSessionId: session.linearAgentActivitySessionId,
|
|
422
|
+
content: {
|
|
423
|
+
type: 'thought',
|
|
424
|
+
body
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
if (result.success) {
|
|
428
|
+
console.log(`[AgentSessionManager] Created thought activity for session ${sessionId}`);
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
console.error(`[AgentSessionManager] Failed to create thought activity:`, result);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
catch (error) {
|
|
435
|
+
console.error(`[AgentSessionManager] Error creating thought activity:`, error);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Create an action activity
|
|
440
|
+
*/
|
|
441
|
+
async createActionActivity(sessionId, action, parameter, result) {
|
|
442
|
+
const session = this.sessions.get(sessionId);
|
|
443
|
+
if (!session || !session.linearAgentActivitySessionId) {
|
|
444
|
+
console.warn(`[AgentSessionManager] No Linear session ID for session ${sessionId}`);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
try {
|
|
448
|
+
const content = {
|
|
449
|
+
type: 'action',
|
|
450
|
+
action,
|
|
451
|
+
parameter
|
|
452
|
+
};
|
|
453
|
+
if (result !== undefined) {
|
|
454
|
+
content.result = result;
|
|
455
|
+
}
|
|
456
|
+
const response = await this.linearClient.createAgentActivity({
|
|
457
|
+
agentSessionId: session.linearAgentActivitySessionId,
|
|
458
|
+
content
|
|
459
|
+
});
|
|
460
|
+
if (response.success) {
|
|
461
|
+
console.log(`[AgentSessionManager] Created action activity for session ${sessionId}`);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
console.error(`[AgentSessionManager] Failed to create action activity:`, response);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
console.error(`[AgentSessionManager] Error creating action activity:`, error);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Create a response activity
|
|
473
|
+
*/
|
|
474
|
+
async createResponseActivity(sessionId, body) {
|
|
475
|
+
const session = this.sessions.get(sessionId);
|
|
476
|
+
if (!session || !session.linearAgentActivitySessionId) {
|
|
477
|
+
console.warn(`[AgentSessionManager] No Linear session ID for session ${sessionId}`);
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
try {
|
|
481
|
+
const result = await this.linearClient.createAgentActivity({
|
|
482
|
+
agentSessionId: session.linearAgentActivitySessionId,
|
|
483
|
+
content: {
|
|
484
|
+
type: 'response',
|
|
485
|
+
body
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
if (result.success) {
|
|
489
|
+
console.log(`[AgentSessionManager] Created response activity for session ${sessionId}`);
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
console.error(`[AgentSessionManager] Failed to create response activity:`, result);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
catch (error) {
|
|
496
|
+
console.error(`[AgentSessionManager] Error creating response activity:`, error);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Create an error activity
|
|
501
|
+
*/
|
|
502
|
+
async createErrorActivity(sessionId, body) {
|
|
503
|
+
const session = this.sessions.get(sessionId);
|
|
504
|
+
if (!session || !session.linearAgentActivitySessionId) {
|
|
505
|
+
console.warn(`[AgentSessionManager] No Linear session ID for session ${sessionId}`);
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
try {
|
|
509
|
+
const result = await this.linearClient.createAgentActivity({
|
|
510
|
+
agentSessionId: session.linearAgentActivitySessionId,
|
|
511
|
+
content: {
|
|
512
|
+
type: 'error',
|
|
513
|
+
body
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
if (result.success) {
|
|
517
|
+
console.log(`[AgentSessionManager] Created error activity for session ${sessionId}`);
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
console.error(`[AgentSessionManager] Failed to create error activity:`, result);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
catch (error) {
|
|
524
|
+
console.error(`[AgentSessionManager] Error creating error activity:`, error);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Create an elicitation activity
|
|
529
|
+
*/
|
|
530
|
+
async createElicitationActivity(sessionId, body) {
|
|
531
|
+
const session = this.sessions.get(sessionId);
|
|
532
|
+
if (!session || !session.linearAgentActivitySessionId) {
|
|
533
|
+
console.warn(`[AgentSessionManager] No Linear session ID for session ${sessionId}`);
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
try {
|
|
537
|
+
const result = await this.linearClient.createAgentActivity({
|
|
538
|
+
agentSessionId: session.linearAgentActivitySessionId,
|
|
539
|
+
content: {
|
|
540
|
+
type: 'elicitation',
|
|
541
|
+
body
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
if (result.success) {
|
|
545
|
+
console.log(`[AgentSessionManager] Created elicitation activity for session ${sessionId}`);
|
|
546
|
+
}
|
|
547
|
+
else {
|
|
548
|
+
console.error(`[AgentSessionManager] Failed to create elicitation activity:`, result);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
catch (error) {
|
|
552
|
+
console.error(`[AgentSessionManager] Error creating elicitation activity:`, error);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
/**
|
|
556
|
+
* Clear completed sessions older than specified time
|
|
557
|
+
*/
|
|
558
|
+
cleanup(olderThanMs = 24 * 60 * 60 * 1000) {
|
|
559
|
+
const cutoff = Date.now() - olderThanMs;
|
|
560
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
561
|
+
if ((session.status === 'complete' || session.status === 'error') &&
|
|
562
|
+
session.updatedAt < cutoff) {
|
|
563
|
+
this.sessions.delete(sessionId);
|
|
564
|
+
this.entries.delete(sessionId);
|
|
565
|
+
console.log(`[AgentSessionManager] Cleaned up session ${sessionId}`);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Serialize Agent Session state for persistence
|
|
571
|
+
*/
|
|
572
|
+
serializeState() {
|
|
573
|
+
const sessions = {};
|
|
574
|
+
const entries = {};
|
|
575
|
+
// Serialize sessions
|
|
576
|
+
for (const [sessionId, session] of this.sessions.entries()) {
|
|
577
|
+
// Exclude claudeRunner from serialization as it's not serializable
|
|
578
|
+
const { claudeRunner, ...serializableSession } = session;
|
|
579
|
+
sessions[sessionId] = serializableSession;
|
|
580
|
+
}
|
|
581
|
+
// Serialize entries
|
|
582
|
+
for (const [sessionId, sessionEntries] of this.entries.entries()) {
|
|
583
|
+
entries[sessionId] = sessionEntries.map(entry => ({
|
|
584
|
+
...entry,
|
|
585
|
+
}));
|
|
586
|
+
}
|
|
587
|
+
return { sessions, entries };
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Restore Agent Session state from serialized data
|
|
591
|
+
*/
|
|
592
|
+
restoreState(serializedSessions, serializedEntries) {
|
|
593
|
+
// Clear existing state
|
|
594
|
+
this.sessions.clear();
|
|
595
|
+
this.entries.clear();
|
|
596
|
+
// Restore sessions
|
|
597
|
+
for (const [sessionId, sessionData] of Object.entries(serializedSessions)) {
|
|
598
|
+
const session = {
|
|
599
|
+
...sessionData,
|
|
600
|
+
};
|
|
601
|
+
this.sessions.set(sessionId, session);
|
|
602
|
+
}
|
|
603
|
+
// Restore entries
|
|
604
|
+
for (const [sessionId, entriesData] of Object.entries(serializedEntries)) {
|
|
605
|
+
const sessionEntries = entriesData.map(entryData => ({
|
|
606
|
+
...entryData,
|
|
607
|
+
}));
|
|
608
|
+
this.entries.set(sessionId, sessionEntries);
|
|
609
|
+
}
|
|
610
|
+
console.log(`[AgentSessionManager] Restored ${this.sessions.size} sessions, ${Object.keys(serializedEntries).length} entry collections`);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
//# sourceMappingURL=AgentSessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentSessionManager.js","sourceRoot":"","sources":["../src/AgentSessionManager.ts"],"names":[],"mappings":"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"}
|