@bytespell/amux 0.0.11 → 0.0.13
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/.claude/settings.local.json +11 -0
- package/CLAUDE.md +104 -0
- package/LICENSE +21 -0
- package/README.md +215 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +118 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +68 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +135 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/{lib/mentions.d.ts → message-parser.d.ts} +3 -5
- package/dist/message-parser.d.ts.map +1 -0
- package/dist/message-parser.js +45 -0
- package/dist/message-parser.js.map +1 -0
- package/dist/message-parser.test.d.ts +2 -0
- package/dist/message-parser.test.d.ts.map +1 -0
- package/dist/message-parser.test.js +188 -0
- package/dist/message-parser.test.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +356 -0
- package/dist/server.js.map +1 -0
- package/dist/session-updates.d.ts +26 -0
- package/dist/session-updates.d.ts.map +1 -0
- package/dist/session-updates.js +68 -0
- package/dist/session-updates.js.map +1 -0
- package/dist/session-updates.test.d.ts +2 -0
- package/dist/session-updates.test.d.ts.map +1 -0
- package/dist/session-updates.test.js +223 -0
- package/dist/session-updates.test.js.map +1 -0
- package/dist/session.d.ts +208 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +580 -0
- package/dist/session.js.map +1 -0
- package/dist/state.d.ts +74 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +250 -0
- package/dist/state.js.map +1 -0
- package/dist/terminal.d.ts +47 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +137 -0
- package/dist/terminal.js.map +1 -0
- package/dist/types.d.ts +64 -2
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -31
- package/dist/types.js.map +1 -1
- package/dist/ws-adapter.d.ts +39 -0
- package/dist/ws-adapter.d.ts.map +1 -0
- package/dist/ws-adapter.js +198 -0
- package/dist/ws-adapter.js.map +1 -0
- package/package.json +47 -24
- package/src/client.ts +162 -0
- package/src/index.ts +66 -0
- package/src/message-parser.test.ts +207 -0
- package/src/message-parser.ts +54 -0
- package/src/session-updates.test.ts +265 -0
- package/src/session-updates.ts +87 -0
- package/src/session.ts +737 -0
- package/src/state.ts +287 -0
- package/src/terminal.ts +164 -0
- package/src/types.ts +88 -0
- package/src/ws-adapter.ts +245 -0
- package/tsconfig.json +22 -0
- package/vitest.config.ts +7 -0
- package/dist/chunk-5IPYOXBE.js +0 -32
- package/dist/chunk-5IPYOXBE.js.map +0 -1
- package/dist/chunk-C73RKCTS.js +0 -36
- package/dist/chunk-C73RKCTS.js.map +0 -1
- package/dist/chunk-VVXT4HQM.js +0 -779
- package/dist/chunk-VVXT4HQM.js.map +0 -1
- package/dist/lib/logger.d.ts +0 -24
- package/dist/lib/logger.js +0 -17
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/mentions.js +0 -7
- package/dist/lib/mentions.js.map +0 -1
- package/dist/streams/backends/index.d.ts +0 -88
- package/dist/streams/backends/index.js +0 -13
- package/dist/streams/backends/index.js.map +0 -1
- package/dist/streams/manager.d.ts +0 -55
- package/dist/streams/manager.js +0 -248
- package/dist/streams/manager.js.map +0 -1
- package/dist/types-DCRtrjjj.d.ts +0 -192
- package/scripts/fix-pty.cjs +0 -21
package/dist/session.js
ADDED
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { Writable, Readable } from 'stream';
|
|
6
|
+
import * as acp from '@agentclientprotocol/sdk';
|
|
7
|
+
import { AmuxClient } from './client.js';
|
|
8
|
+
import { TerminalManager } from './terminal.js';
|
|
9
|
+
import { StateManager } from './state.js';
|
|
10
|
+
import { parseMessageToContentBlocks } from './message-parser.js';
|
|
11
|
+
import { AGENTS as DEFAULT_AGENTS } from './types.js';
|
|
12
|
+
const INIT_TIMEOUT_MS = 90000;
|
|
13
|
+
/**
|
|
14
|
+
* Helper to wrap promises with timeout
|
|
15
|
+
*/
|
|
16
|
+
function withTimeout(promise, ms, operation) {
|
|
17
|
+
return Promise.race([
|
|
18
|
+
promise,
|
|
19
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error(`${operation} timed out after ${ms}ms`)), ms)),
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* AgentSession - Core ACP session management with EventEmitter interface.
|
|
24
|
+
*
|
|
25
|
+
* Emits events for all session activity. Transport-agnostic - wire up
|
|
26
|
+
* to WebSocket, HTTP, IPC, or anything else.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const session = new AgentSession({
|
|
31
|
+
* instanceId: 'my-instance',
|
|
32
|
+
* basePath: __dirname,
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* session.on('ready', (data) => console.log('Ready:', data));
|
|
36
|
+
* session.on('update', (data) => console.log('Update:', data));
|
|
37
|
+
*
|
|
38
|
+
* await session.spawnAgent();
|
|
39
|
+
* await session.prompt('Hello!');
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class AgentSession extends EventEmitter {
|
|
43
|
+
// Session state
|
|
44
|
+
_cwd;
|
|
45
|
+
_sessionId;
|
|
46
|
+
_agentType;
|
|
47
|
+
_systemContext;
|
|
48
|
+
// Agent process state
|
|
49
|
+
agentProcess = null;
|
|
50
|
+
acpConnection = null;
|
|
51
|
+
_agentCapabilities = null;
|
|
52
|
+
_changingCwd = false;
|
|
53
|
+
// Components
|
|
54
|
+
terminalManager;
|
|
55
|
+
amuxClient = null;
|
|
56
|
+
stateManager;
|
|
57
|
+
// Config
|
|
58
|
+
instanceId;
|
|
59
|
+
basePath;
|
|
60
|
+
fixedCwd;
|
|
61
|
+
agents;
|
|
62
|
+
constructor(config) {
|
|
63
|
+
super();
|
|
64
|
+
this.instanceId = config.instanceId;
|
|
65
|
+
this.basePath = config.basePath;
|
|
66
|
+
this.fixedCwd = config.fixedCwd;
|
|
67
|
+
this._systemContext = config.systemContext;
|
|
68
|
+
this.agents = DEFAULT_AGENTS;
|
|
69
|
+
// Create state manager
|
|
70
|
+
this.stateManager = new StateManager(config.stateDir);
|
|
71
|
+
// Load persisted state
|
|
72
|
+
const persistedState = this.stateManager.loadState(this.instanceId);
|
|
73
|
+
this._cwd = config.fixedCwd ?? persistedState.cwd ?? os.homedir();
|
|
74
|
+
this._sessionId = persistedState.sessionId ?? null;
|
|
75
|
+
this._agentType = config.agentType ?? persistedState.agentType ?? 'claude-code';
|
|
76
|
+
// Create terminal manager with cwd getter
|
|
77
|
+
this.terminalManager = new TerminalManager(() => this._cwd);
|
|
78
|
+
}
|
|
79
|
+
// Type-safe event emitter methods
|
|
80
|
+
emit(event, data) {
|
|
81
|
+
return super.emit(event, data);
|
|
82
|
+
}
|
|
83
|
+
on(event, listener) {
|
|
84
|
+
return super.on(event, listener);
|
|
85
|
+
}
|
|
86
|
+
once(event, listener) {
|
|
87
|
+
return super.once(event, listener);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Emit update and store to history
|
|
91
|
+
*/
|
|
92
|
+
emitUpdate(update) {
|
|
93
|
+
this.emit('update', update);
|
|
94
|
+
this.stateManager.storeEvent(this._sessionId, { type: 'session_update', update });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Emit turn marker and store to history
|
|
98
|
+
*/
|
|
99
|
+
emitTurnMarker(event) {
|
|
100
|
+
this.emit(event, {});
|
|
101
|
+
this.stateManager.storeEvent(this._sessionId, { type: event });
|
|
102
|
+
}
|
|
103
|
+
// Getters for read-only access
|
|
104
|
+
get cwd() { return this._cwd; }
|
|
105
|
+
get sessionId() { return this._sessionId; }
|
|
106
|
+
get agentType() { return this._agentType; }
|
|
107
|
+
get agentCapabilities() { return this._agentCapabilities; }
|
|
108
|
+
get isConnected() { return this.acpConnection !== null; }
|
|
109
|
+
get systemContext() { return this._systemContext; }
|
|
110
|
+
/**
|
|
111
|
+
* Get current agent info
|
|
112
|
+
*/
|
|
113
|
+
getAgentInfo() {
|
|
114
|
+
return {
|
|
115
|
+
type: this._agentType,
|
|
116
|
+
name: this.agents[this._agentType]?.name ?? 'Unknown',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get available agents list
|
|
121
|
+
*/
|
|
122
|
+
getAvailableAgents() {
|
|
123
|
+
return Object.entries(this.agents).map(([id, a]) => ({ id, name: a.name }));
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Save current state to disk
|
|
127
|
+
*/
|
|
128
|
+
saveState() {
|
|
129
|
+
this.stateManager.saveState(this.instanceId, {
|
|
130
|
+
cwd: this._cwd,
|
|
131
|
+
sessionId: this._sessionId,
|
|
132
|
+
agentType: this._agentType,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Name the session after the first user message
|
|
137
|
+
*/
|
|
138
|
+
maybeNameSession(userMessage) {
|
|
139
|
+
if (!this._sessionId)
|
|
140
|
+
return;
|
|
141
|
+
const session = this.stateManager.getSession(this._sessionId);
|
|
142
|
+
if (!session)
|
|
143
|
+
return;
|
|
144
|
+
const isDefaultName = session.name.startsWith('Session ') && session.name.length <= 16;
|
|
145
|
+
if (!isDefaultName)
|
|
146
|
+
return;
|
|
147
|
+
let displayName = userMessage.trim();
|
|
148
|
+
if (displayName.length > 50) {
|
|
149
|
+
displayName = displayName.slice(0, 50);
|
|
150
|
+
const lastSpace = displayName.lastIndexOf(' ');
|
|
151
|
+
if (lastSpace > 30) {
|
|
152
|
+
displayName = displayName.slice(0, lastSpace);
|
|
153
|
+
}
|
|
154
|
+
displayName += '...';
|
|
155
|
+
}
|
|
156
|
+
this.stateManager.updateSessionMetadata(this._sessionId, { name: displayName });
|
|
157
|
+
console.log(`[amux] Named session: "${displayName}"`);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Spawn and initialize the ACP agent
|
|
161
|
+
*/
|
|
162
|
+
async spawnAgent() {
|
|
163
|
+
if (this.agentProcess)
|
|
164
|
+
return;
|
|
165
|
+
const agent = this.agents[this._agentType];
|
|
166
|
+
if (!agent) {
|
|
167
|
+
console.error('[amux] Unknown agent type:', this._agentType);
|
|
168
|
+
this.emit('error', { message: `Unknown agent type: ${this._agentType}` });
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
console.log(`[amux] Spawning ${agent.name} agent in cwd:`, this._cwd);
|
|
172
|
+
this.emit('connecting', {});
|
|
173
|
+
const agentBin = path.join(this.basePath, 'node_modules', '.bin', agent.bin);
|
|
174
|
+
const newProcess = spawn(agentBin, [], {
|
|
175
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
176
|
+
env: { ...process.env },
|
|
177
|
+
cwd: this._cwd,
|
|
178
|
+
});
|
|
179
|
+
this.agentProcess = newProcess;
|
|
180
|
+
newProcess.stderr?.on('data', (data) => {
|
|
181
|
+
console.error('[amux] Agent stderr:', data.toString());
|
|
182
|
+
});
|
|
183
|
+
newProcess.on('error', (err) => {
|
|
184
|
+
console.error('[amux] Agent process error:', err);
|
|
185
|
+
if (this.agentProcess === newProcess) {
|
|
186
|
+
this.emit('error', { message: `Failed to start agent: ${err.message}` });
|
|
187
|
+
this.agentProcess = null;
|
|
188
|
+
this.acpConnection = null;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
newProcess.on('exit', (code, signal) => {
|
|
192
|
+
console.log(`[amux] Agent exited: code=${code}, signal=${signal}`);
|
|
193
|
+
if (this.agentProcess === newProcess) {
|
|
194
|
+
this.agentProcess = null;
|
|
195
|
+
this.acpConnection = null;
|
|
196
|
+
this.emit('agent_exit', { code, signal });
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
// Create ACP streams
|
|
200
|
+
const input = Writable.toWeb(newProcess.stdin);
|
|
201
|
+
const output = Readable.toWeb(newProcess.stdout);
|
|
202
|
+
// Create the ACP client connection
|
|
203
|
+
this.amuxClient = new AmuxClient(this.terminalManager, (event) => {
|
|
204
|
+
// Route client events through our emitter
|
|
205
|
+
if (event.type === 'session_update' && event.update) {
|
|
206
|
+
this.emitUpdate(event.update);
|
|
207
|
+
}
|
|
208
|
+
else if (event.type === 'permission_request') {
|
|
209
|
+
this.emit('permission_request', {
|
|
210
|
+
requestId: event.requestId,
|
|
211
|
+
toolCall: event.toolCall,
|
|
212
|
+
options: event.options,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
const stream = acp.ndJsonStream(input, output);
|
|
217
|
+
this.acpConnection = new acp.ClientSideConnection(() => this.amuxClient, stream);
|
|
218
|
+
try {
|
|
219
|
+
const initResult = await withTimeout(this.acpConnection.initialize({
|
|
220
|
+
protocolVersion: acp.PROTOCOL_VERSION,
|
|
221
|
+
clientCapabilities: {
|
|
222
|
+
fs: {
|
|
223
|
+
readTextFile: true,
|
|
224
|
+
writeTextFile: true,
|
|
225
|
+
},
|
|
226
|
+
terminal: true,
|
|
227
|
+
},
|
|
228
|
+
}), INIT_TIMEOUT_MS, 'Agent initialization');
|
|
229
|
+
console.log(`[amux] Connected to agent (protocol v${initResult.protocolVersion})`);
|
|
230
|
+
this._agentCapabilities = initResult.agentCapabilities ?? null;
|
|
231
|
+
const sessionRestore = await this.initializeSession(initResult.agentCapabilities);
|
|
232
|
+
this.emit('ready', {
|
|
233
|
+
cwd: this._cwd,
|
|
234
|
+
sessionId: this._sessionId,
|
|
235
|
+
sessionRestore,
|
|
236
|
+
capabilities: this._agentCapabilities,
|
|
237
|
+
agent: this.getAgentInfo(),
|
|
238
|
+
availableAgents: this.getAvailableAgents(),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
console.error('[amux] Failed to initialize agent:', err);
|
|
243
|
+
this.emit('error', { message: `Failed to initialize agent: ${err.message}` });
|
|
244
|
+
newProcess.kill();
|
|
245
|
+
if (this.agentProcess === newProcess) {
|
|
246
|
+
this.agentProcess = null;
|
|
247
|
+
this.acpConnection = null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Initialize or restore session
|
|
253
|
+
*/
|
|
254
|
+
async initializeSession(capabilities) {
|
|
255
|
+
if (!this.acpConnection)
|
|
256
|
+
return undefined;
|
|
257
|
+
const canLoadSession = capabilities?.loadSession === true;
|
|
258
|
+
const hasExistingSession = Boolean(this._sessionId);
|
|
259
|
+
const previousSessionId = this._sessionId;
|
|
260
|
+
let sessionRestore = undefined;
|
|
261
|
+
if (this._sessionId && canLoadSession) {
|
|
262
|
+
let loadSucceeded = false;
|
|
263
|
+
try {
|
|
264
|
+
await withTimeout(this.acpConnection.loadSession({
|
|
265
|
+
sessionId: this._sessionId,
|
|
266
|
+
cwd: this._cwd,
|
|
267
|
+
mcpServers: [],
|
|
268
|
+
}), INIT_TIMEOUT_MS, 'Session load');
|
|
269
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
270
|
+
sessionRestore = { restored: true };
|
|
271
|
+
loadSucceeded = true;
|
|
272
|
+
if (this._sessionId) {
|
|
273
|
+
this.stateManager.registerSession(this._sessionId, this._cwd, this._agentType);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch (loadErr) {
|
|
277
|
+
console.log(`[amux] Session load failed: ${loadErr.message}`);
|
|
278
|
+
}
|
|
279
|
+
if (!loadSucceeded) {
|
|
280
|
+
const sessionResult = await this.createNewSession();
|
|
281
|
+
sessionRestore = await this.replayHistoryFromPreviousSession(previousSessionId);
|
|
282
|
+
this.broadcastModeInfo(sessionResult);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
const sessionResult = await this.createNewSession();
|
|
287
|
+
if (hasExistingSession && previousSessionId) {
|
|
288
|
+
sessionRestore = await this.replayHistoryFromPreviousSession(previousSessionId);
|
|
289
|
+
}
|
|
290
|
+
this.broadcastModeInfo(sessionResult);
|
|
291
|
+
}
|
|
292
|
+
if (this._systemContext && sessionRestore?.restored !== true) {
|
|
293
|
+
await this.injectSystemContext();
|
|
294
|
+
}
|
|
295
|
+
return sessionRestore;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Inject system context as the first message
|
|
299
|
+
*/
|
|
300
|
+
async injectSystemContext() {
|
|
301
|
+
if (!this._systemContext || !this.acpConnection || !this._sessionId)
|
|
302
|
+
return;
|
|
303
|
+
console.log('[amux] Injecting system context');
|
|
304
|
+
const contextPrompt = `<system-context>\n${this._systemContext}\n</system-context>\n\nI understand. I'm ready to help based on the context provided above.`;
|
|
305
|
+
try {
|
|
306
|
+
await this.acpConnection.prompt({
|
|
307
|
+
sessionId: this._sessionId,
|
|
308
|
+
prompt: [{ type: 'text', text: contextPrompt }],
|
|
309
|
+
});
|
|
310
|
+
console.log('[amux] System context injected successfully');
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
console.error('[amux] Failed to inject system context:', err);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Replay history events from a previous session
|
|
318
|
+
*/
|
|
319
|
+
async replayHistoryFromPreviousSession(previousSessionId) {
|
|
320
|
+
if (!previousSessionId) {
|
|
321
|
+
return { restored: false, reason: 'No previous session to restore.' };
|
|
322
|
+
}
|
|
323
|
+
const history = this.stateManager.loadHistory(previousSessionId);
|
|
324
|
+
if (history.length === 0) {
|
|
325
|
+
return { restored: false, reason: 'No history found for previous session.' };
|
|
326
|
+
}
|
|
327
|
+
this.emit('history_replay', {
|
|
328
|
+
previousSessionId,
|
|
329
|
+
events: history,
|
|
330
|
+
eventCount: history.length,
|
|
331
|
+
});
|
|
332
|
+
return {
|
|
333
|
+
restored: true,
|
|
334
|
+
reason: `Restored ${history.length} events from previous session.`,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Create a new session
|
|
339
|
+
*/
|
|
340
|
+
async createNewSession() {
|
|
341
|
+
if (!this.acpConnection) {
|
|
342
|
+
throw new Error('No ACP connection');
|
|
343
|
+
}
|
|
344
|
+
const sessionResult = await withTimeout(this.acpConnection.newSession({ cwd: this._cwd, mcpServers: [] }), INIT_TIMEOUT_MS, 'New session creation');
|
|
345
|
+
this._sessionId = sessionResult.sessionId;
|
|
346
|
+
this.saveState();
|
|
347
|
+
if (this._sessionId) {
|
|
348
|
+
this.stateManager.registerSession(this._sessionId, this._cwd, this._agentType);
|
|
349
|
+
}
|
|
350
|
+
return sessionResult;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Broadcast mode info if available
|
|
354
|
+
*/
|
|
355
|
+
broadcastModeInfo(sessionResult) {
|
|
356
|
+
if (sessionResult?.modes) {
|
|
357
|
+
this.emit('update', {
|
|
358
|
+
sessionUpdate: 'current_mode_update',
|
|
359
|
+
currentModeId: sessionResult.modes.currentModeId,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Send a prompt to the agent
|
|
365
|
+
*/
|
|
366
|
+
async prompt(message) {
|
|
367
|
+
if (!this.acpConnection || !this._sessionId) {
|
|
368
|
+
throw new Error('Agent not ready');
|
|
369
|
+
}
|
|
370
|
+
console.log('[amux] Sending prompt:', message.slice(0, 100));
|
|
371
|
+
this.emitTurnMarker('turn_start');
|
|
372
|
+
this.stateManager.incrementSessionMessageCount(this._sessionId);
|
|
373
|
+
this.maybeNameSession(message);
|
|
374
|
+
// Emit and store user message
|
|
375
|
+
this.emitUpdate({
|
|
376
|
+
sessionUpdate: 'user_message_chunk',
|
|
377
|
+
content: { type: 'text', text: message },
|
|
378
|
+
});
|
|
379
|
+
try {
|
|
380
|
+
// Parse @mentions into resource_link blocks
|
|
381
|
+
const content = parseMessageToContentBlocks(message, this._cwd);
|
|
382
|
+
const result = await this.acpConnection.prompt({
|
|
383
|
+
sessionId: this._sessionId,
|
|
384
|
+
prompt: content,
|
|
385
|
+
});
|
|
386
|
+
this.emit('prompt_complete', { stopReason: result.stopReason });
|
|
387
|
+
return { stopReason: result.stopReason };
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
console.error('[amux] Prompt error:', err);
|
|
391
|
+
this.emit('error', { message: `Prompt failed: ${err.message}` });
|
|
392
|
+
throw err;
|
|
393
|
+
}
|
|
394
|
+
finally {
|
|
395
|
+
this.emitTurnMarker('turn_end');
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Cancel current operation
|
|
400
|
+
*/
|
|
401
|
+
async cancel() {
|
|
402
|
+
if (this.acpConnection && this._sessionId) {
|
|
403
|
+
await this.acpConnection.cancel({ sessionId: this._sessionId });
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Handle permission response from UI
|
|
408
|
+
*/
|
|
409
|
+
respondToPermission(requestId, optionId) {
|
|
410
|
+
this.amuxClient?.handlePermissionResponse(requestId, optionId);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* List available sessions
|
|
414
|
+
*/
|
|
415
|
+
listSessions() {
|
|
416
|
+
const sessions = this.stateManager.listSessions(this._cwd);
|
|
417
|
+
return sessions.map(s => ({
|
|
418
|
+
...s,
|
|
419
|
+
isCurrent: s.id === this._sessionId,
|
|
420
|
+
}));
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Load history for current session
|
|
424
|
+
*/
|
|
425
|
+
loadHistory() {
|
|
426
|
+
return this.stateManager.loadHistory(this._sessionId);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Switch to a different session
|
|
430
|
+
*/
|
|
431
|
+
async switchSession(sessionId) {
|
|
432
|
+
if (!this.acpConnection) {
|
|
433
|
+
throw new Error('Agent not ready');
|
|
434
|
+
}
|
|
435
|
+
const canLoadSession = this._agentCapabilities?.loadSession === true;
|
|
436
|
+
const canResume = this._agentCapabilities?.sessionCapabilities?.resume !== undefined;
|
|
437
|
+
if (!canLoadSession && !canResume) {
|
|
438
|
+
throw new Error('Agent does not support session switching');
|
|
439
|
+
}
|
|
440
|
+
try {
|
|
441
|
+
if (canLoadSession) {
|
|
442
|
+
await withTimeout(this.acpConnection.loadSession({
|
|
443
|
+
sessionId,
|
|
444
|
+
cwd: this._cwd,
|
|
445
|
+
mcpServers: [],
|
|
446
|
+
}), INIT_TIMEOUT_MS, 'Session load');
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
await withTimeout(this.acpConnection.unstable_resumeSession({
|
|
450
|
+
sessionId,
|
|
451
|
+
cwd: this._cwd,
|
|
452
|
+
mcpServers: [],
|
|
453
|
+
}), INIT_TIMEOUT_MS, 'Session resume');
|
|
454
|
+
}
|
|
455
|
+
this._sessionId = sessionId;
|
|
456
|
+
this.saveState();
|
|
457
|
+
this.emit('session_switched', { sessionId: this._sessionId });
|
|
458
|
+
const history = this.stateManager.loadHistory(sessionId);
|
|
459
|
+
if (history.length > 0) {
|
|
460
|
+
this.emit('history_replay', {
|
|
461
|
+
previousSessionId: sessionId,
|
|
462
|
+
events: history,
|
|
463
|
+
eventCount: history.length,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch (err) {
|
|
468
|
+
console.error(`[amux] Failed to switch session:`, err);
|
|
469
|
+
throw err;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Change working directory (requires agent restart)
|
|
474
|
+
*/
|
|
475
|
+
async changeCwd(newPath) {
|
|
476
|
+
if (this.fixedCwd) {
|
|
477
|
+
throw new Error('Working directory is fixed for this session');
|
|
478
|
+
}
|
|
479
|
+
// Prevent concurrent cwd changes
|
|
480
|
+
if (this._changingCwd) {
|
|
481
|
+
console.log('[amux] changeCwd already in progress, ignoring');
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
// Same path, nothing to do
|
|
485
|
+
if (newPath === this._cwd) {
|
|
486
|
+
console.log('[amux] changeCwd same path, ignoring');
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
this._changingCwd = true;
|
|
490
|
+
try {
|
|
491
|
+
this._cwd = newPath;
|
|
492
|
+
this._sessionId = null;
|
|
493
|
+
this.saveState();
|
|
494
|
+
await this.killAgent();
|
|
495
|
+
await this.spawnAgent();
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
this._changingCwd = false;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Create a new session
|
|
503
|
+
*/
|
|
504
|
+
async newSession() {
|
|
505
|
+
if (!this.acpConnection) {
|
|
506
|
+
throw new Error('No ACP connection');
|
|
507
|
+
}
|
|
508
|
+
const sessionResult = await this.acpConnection.newSession({
|
|
509
|
+
cwd: this._cwd,
|
|
510
|
+
mcpServers: [],
|
|
511
|
+
});
|
|
512
|
+
this._sessionId = sessionResult.sessionId;
|
|
513
|
+
this.saveState();
|
|
514
|
+
if (this._sessionId) {
|
|
515
|
+
this.stateManager.registerSession(this._sessionId, this._cwd, this._agentType);
|
|
516
|
+
}
|
|
517
|
+
this.emit('session_created', { sessionId: this._sessionId });
|
|
518
|
+
this.broadcastModeInfo(sessionResult);
|
|
519
|
+
if (this._systemContext) {
|
|
520
|
+
await this.injectSystemContext();
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Set session mode
|
|
525
|
+
*/
|
|
526
|
+
async setMode(modeId) {
|
|
527
|
+
if (!this.acpConnection || !this._sessionId) {
|
|
528
|
+
throw new Error('Agent not ready');
|
|
529
|
+
}
|
|
530
|
+
await this.acpConnection.setSessionMode({
|
|
531
|
+
sessionId: this._sessionId,
|
|
532
|
+
modeId,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Set session model
|
|
537
|
+
*/
|
|
538
|
+
async setModel(modelId) {
|
|
539
|
+
if (!this.acpConnection || !this._sessionId) {
|
|
540
|
+
throw new Error('Agent not ready');
|
|
541
|
+
}
|
|
542
|
+
await this.acpConnection.unstable_setSessionModel({
|
|
543
|
+
sessionId: this._sessionId,
|
|
544
|
+
modelId,
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Change agent type (requires agent restart)
|
|
549
|
+
*/
|
|
550
|
+
async changeAgent(agentType) {
|
|
551
|
+
if (!this.agents[agentType]) {
|
|
552
|
+
throw new Error(`Unknown agent type: ${agentType}`);
|
|
553
|
+
}
|
|
554
|
+
if (agentType !== this._agentType) {
|
|
555
|
+
this._agentType = agentType;
|
|
556
|
+
this._sessionId = null;
|
|
557
|
+
this.saveState();
|
|
558
|
+
await this.killAgent();
|
|
559
|
+
await this.spawnAgent();
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Kill the agent process
|
|
564
|
+
*/
|
|
565
|
+
async killAgent() {
|
|
566
|
+
if (this.agentProcess) {
|
|
567
|
+
this.agentProcess.kill();
|
|
568
|
+
this.agentProcess = null;
|
|
569
|
+
this.acpConnection = null;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* Shutdown (cleanup all resources)
|
|
574
|
+
*/
|
|
575
|
+
shutdown() {
|
|
576
|
+
this.terminalManager.killAll();
|
|
577
|
+
this.agentProcess?.kill();
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/state.d.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { SessionState, SessionMetadata, StoredEvent } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* State manager for amux sessions.
|
|
4
|
+
* Handles persistence of session state and history.
|
|
5
|
+
*/
|
|
6
|
+
export declare class StateManager {
|
|
7
|
+
private stateDir;
|
|
8
|
+
constructor(stateDir?: string);
|
|
9
|
+
/**
|
|
10
|
+
* Get the state file path for a specific instance
|
|
11
|
+
*/
|
|
12
|
+
private getStateFilePath;
|
|
13
|
+
/**
|
|
14
|
+
* Get history file path for a session
|
|
15
|
+
*/
|
|
16
|
+
private getHistoryPath;
|
|
17
|
+
/**
|
|
18
|
+
* Get sessions registry file path
|
|
19
|
+
*/
|
|
20
|
+
private getSessionsRegistryPath;
|
|
21
|
+
/**
|
|
22
|
+
* Load persisted session state
|
|
23
|
+
*/
|
|
24
|
+
loadState(instanceId: string): SessionState;
|
|
25
|
+
/**
|
|
26
|
+
* Save session state to disk
|
|
27
|
+
*/
|
|
28
|
+
saveState(instanceId: string, state: SessionState): void;
|
|
29
|
+
/**
|
|
30
|
+
* Store event to history for replay
|
|
31
|
+
*/
|
|
32
|
+
storeEvent(sessionId: string | null, event: StoredEvent): void;
|
|
33
|
+
/**
|
|
34
|
+
* Load history for replay
|
|
35
|
+
*/
|
|
36
|
+
loadHistory(sessionId: string | null): StoredEvent[];
|
|
37
|
+
/**
|
|
38
|
+
* Clear history for a session
|
|
39
|
+
*/
|
|
40
|
+
clearHistory(sessionId: string | null): void;
|
|
41
|
+
/**
|
|
42
|
+
* Load sessions registry
|
|
43
|
+
*/
|
|
44
|
+
private loadSessionsRegistry;
|
|
45
|
+
/**
|
|
46
|
+
* Save sessions registry
|
|
47
|
+
*/
|
|
48
|
+
private saveSessionsRegistry;
|
|
49
|
+
/**
|
|
50
|
+
* Register a new session or update existing one
|
|
51
|
+
*/
|
|
52
|
+
registerSession(sessionId: string, cwd: string, agentType: string, displayName?: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Update session metadata
|
|
55
|
+
*/
|
|
56
|
+
updateSessionMetadata(sessionId: string, updates: Partial<Pick<SessionMetadata, 'messageCount' | 'lastModified' | 'name'>>): void;
|
|
57
|
+
/**
|
|
58
|
+
* Increment message count for a session
|
|
59
|
+
*/
|
|
60
|
+
incrementSessionMessageCount(sessionId: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* List all sessions, optionally filtered by cwd
|
|
63
|
+
*/
|
|
64
|
+
listSessions(cwd?: string): SessionMetadata[];
|
|
65
|
+
/**
|
|
66
|
+
* Get a specific session by ID
|
|
67
|
+
*/
|
|
68
|
+
getSession(sessionId: string): SessionMetadata | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Delete a session from the registry and its history
|
|
71
|
+
*/
|
|
72
|
+
deleteSession(sessionId: string): void;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY7E;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,CAAC,EAAE,MAAM;IAI7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;IAe3C;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAUxD;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IA0B9D;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,EAAE;IAepD;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAa5C;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI;IA2BP;;OAEG;IACH,qBAAqB,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,GAAG,cAAc,GAAG,MAAM,CAAC,CAAC,GAChF,IAAI;IAkBP;;OAEG;IACH,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAWrD;;OAEG;IACH,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IAe7C;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAK1D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAavC"}
|