@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/server.js
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { createServer } from 'http';
|
|
3
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import { AgentSession } from './session.js';
|
|
8
|
+
import { StateManager } from './state.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create an amux server with full Express + WebSocket setup.
|
|
11
|
+
* This is the "batteries included" API for building agent-powered plugins.
|
|
12
|
+
*/
|
|
13
|
+
export function createAmuxServer(config = {}) {
|
|
14
|
+
const PORT = config.port ?? (process.env.PORT ? parseInt(process.env.PORT, 10) : 3000);
|
|
15
|
+
const INSTANCE_ID = process.env.INSTANCE_ID ?? 'default';
|
|
16
|
+
const basePath = config.basePath ?? process.cwd();
|
|
17
|
+
const isDev = config.dev ?? !config.staticDir;
|
|
18
|
+
const app = express();
|
|
19
|
+
const server = createServer(app);
|
|
20
|
+
const clients = new Set();
|
|
21
|
+
// State manager
|
|
22
|
+
const stateManager = new StateManager(config.stateDir);
|
|
23
|
+
// Broadcast function
|
|
24
|
+
function broadcast(message) {
|
|
25
|
+
const msgStr = JSON.stringify(message);
|
|
26
|
+
for (const client of clients) {
|
|
27
|
+
if (client.readyState === WebSocket.OPEN) {
|
|
28
|
+
client.send(msgStr);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Create agent session
|
|
33
|
+
const agentSession = new AgentSession({
|
|
34
|
+
instanceId: INSTANCE_ID,
|
|
35
|
+
basePath,
|
|
36
|
+
broadcast,
|
|
37
|
+
systemContext: config.systemContext,
|
|
38
|
+
fixedCwd: config.fixedCwd,
|
|
39
|
+
agentType: config.agentType,
|
|
40
|
+
stateDir: config.stateDir,
|
|
41
|
+
});
|
|
42
|
+
// Allow embedding in iframes
|
|
43
|
+
app.use((_req, res, next) => {
|
|
44
|
+
res.removeHeader('X-Frame-Options');
|
|
45
|
+
res.setHeader('Content-Security-Policy', 'frame-ancestors *');
|
|
46
|
+
next();
|
|
47
|
+
});
|
|
48
|
+
app.use(express.json());
|
|
49
|
+
// --- HTTP API Routes ---
|
|
50
|
+
// Health check
|
|
51
|
+
app.get('/api/health', (_req, res) => {
|
|
52
|
+
res.json({ status: 'ok' });
|
|
53
|
+
});
|
|
54
|
+
// List directories for picker
|
|
55
|
+
app.get('/api/directories', (req, res) => {
|
|
56
|
+
const dirPath = req.query.path || os.homedir();
|
|
57
|
+
try {
|
|
58
|
+
const stats = fs.statSync(dirPath);
|
|
59
|
+
if (!stats.isDirectory()) {
|
|
60
|
+
res.status(400).json({ error: 'Not a directory' });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
64
|
+
const directories = entries
|
|
65
|
+
.filter(e => e.isDirectory() && !e.name.startsWith('.'))
|
|
66
|
+
.map(e => e.name)
|
|
67
|
+
.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
|
68
|
+
const response = {
|
|
69
|
+
path: dirPath,
|
|
70
|
+
parent: path.dirname(dirPath),
|
|
71
|
+
directories,
|
|
72
|
+
isRoot: dirPath === '/' || dirPath === path.dirname(dirPath),
|
|
73
|
+
};
|
|
74
|
+
res.json(response);
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
res.status(400).json({ error: err.message });
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Get replay history
|
|
81
|
+
app.get('/api/history', (_req, res) => {
|
|
82
|
+
const history = stateManager.loadHistory(agentSession.sessionId);
|
|
83
|
+
res.json({ history, sessionId: agentSession.sessionId });
|
|
84
|
+
});
|
|
85
|
+
// Clear history
|
|
86
|
+
app.delete('/api/history', (_req, res) => {
|
|
87
|
+
stateManager.clearHistory(agentSession.sessionId);
|
|
88
|
+
res.json({ success: true });
|
|
89
|
+
});
|
|
90
|
+
// Get available agents
|
|
91
|
+
app.get('/api/agents', (_req, res) => {
|
|
92
|
+
const agents = agentSession.getAvailableAgents().map(a => ({
|
|
93
|
+
...a,
|
|
94
|
+
current: a.id === agentSession.agentType,
|
|
95
|
+
}));
|
|
96
|
+
res.json({ agents, currentAgent: agentSession.agentType });
|
|
97
|
+
});
|
|
98
|
+
// --- WebSocket Setup ---
|
|
99
|
+
const wss = new WebSocketServer({ server, path: '/ws' });
|
|
100
|
+
wss.on('connection', (ws) => {
|
|
101
|
+
console.log('[amux] Client connected');
|
|
102
|
+
clients.add(ws);
|
|
103
|
+
// Send current state to new client
|
|
104
|
+
if (agentSession.isConnected) {
|
|
105
|
+
ws.send(JSON.stringify({
|
|
106
|
+
type: 'ready',
|
|
107
|
+
cwd: agentSession.cwd,
|
|
108
|
+
sessionId: agentSession.sessionId,
|
|
109
|
+
capabilities: agentSession.agentCapabilities,
|
|
110
|
+
agent: agentSession.getAgentInfo(),
|
|
111
|
+
availableAgents: agentSession.getAvailableAgents(),
|
|
112
|
+
systemContext: agentSession.systemContext ? true : undefined,
|
|
113
|
+
}));
|
|
114
|
+
// Send history to hydrate the chat UI
|
|
115
|
+
const history = stateManager.loadHistory(agentSession.sessionId);
|
|
116
|
+
if (history.length > 0) {
|
|
117
|
+
ws.send(JSON.stringify({
|
|
118
|
+
type: 'history_replay',
|
|
119
|
+
previousSessionId: agentSession.sessionId,
|
|
120
|
+
events: history,
|
|
121
|
+
eventCount: history.length,
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
ws.send(JSON.stringify({ type: 'connecting' }));
|
|
127
|
+
}
|
|
128
|
+
ws.on('message', async (message) => {
|
|
129
|
+
try {
|
|
130
|
+
const msg = JSON.parse(message.toString());
|
|
131
|
+
await handleWsMessage(ws, msg, agentSession);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
console.error('[amux] Invalid message:', err);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
ws.on('close', () => {
|
|
138
|
+
console.log('[amux] Client disconnected');
|
|
139
|
+
clients.delete(ws);
|
|
140
|
+
});
|
|
141
|
+
ws.on('error', (err) => {
|
|
142
|
+
console.error('[amux] WebSocket error:', err);
|
|
143
|
+
clients.delete(ws);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
/**
|
|
147
|
+
* Handle WebSocket messages
|
|
148
|
+
*/
|
|
149
|
+
async function handleWsMessage(ws, msg, session) {
|
|
150
|
+
switch (msg.type) {
|
|
151
|
+
case 'prompt':
|
|
152
|
+
if (!session.isConnected || !session.sessionId) {
|
|
153
|
+
ws.send(JSON.stringify({ type: 'error', message: 'Agent not ready' }));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
await session.prompt(msg.message);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Error already broadcast by session
|
|
161
|
+
}
|
|
162
|
+
break;
|
|
163
|
+
case 'cancel':
|
|
164
|
+
await session.cancel();
|
|
165
|
+
break;
|
|
166
|
+
case 'permission_response':
|
|
167
|
+
session.handlePermissionResponse(msg.requestId, msg.optionId);
|
|
168
|
+
break;
|
|
169
|
+
case 'change_cwd':
|
|
170
|
+
if (msg.path) {
|
|
171
|
+
try {
|
|
172
|
+
const stats = fs.statSync(msg.path);
|
|
173
|
+
if (stats.isDirectory()) {
|
|
174
|
+
await session.changeCwd(msg.path);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
ws.send(JSON.stringify({ type: 'error', message: 'Path is not a directory' }));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
ws.send(JSON.stringify({ type: 'error', message: `Invalid path: ${err.message}` }));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
break;
|
|
185
|
+
case 'new_session':
|
|
186
|
+
try {
|
|
187
|
+
await session.newSession();
|
|
188
|
+
}
|
|
189
|
+
catch (err) {
|
|
190
|
+
ws.send(JSON.stringify({ type: 'error', message: `Failed to create session: ${err.message}` }));
|
|
191
|
+
}
|
|
192
|
+
break;
|
|
193
|
+
case 'set_mode':
|
|
194
|
+
if (msg.modeId) {
|
|
195
|
+
try {
|
|
196
|
+
await session.setMode(msg.modeId);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
ws.send(JSON.stringify({ type: 'error', message: `Failed to set mode: ${err.message}` }));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
break;
|
|
203
|
+
case 'set_model':
|
|
204
|
+
if (msg.modelId) {
|
|
205
|
+
try {
|
|
206
|
+
await session.setModel(msg.modelId);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
ws.send(JSON.stringify({ type: 'error', message: `Failed to set model: ${err.message}` }));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
break;
|
|
213
|
+
case 'change_agent':
|
|
214
|
+
if (msg.agentType) {
|
|
215
|
+
try {
|
|
216
|
+
await session.changeAgent(msg.agentType);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
ws.send(JSON.stringify({ type: 'error', message: `${err.message}` }));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
case 'get_history': {
|
|
224
|
+
const history = stateManager.loadHistory(session.sessionId);
|
|
225
|
+
ws.send(JSON.stringify({ type: 'history', events: history, sessionId: session.sessionId }));
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case 'list_sessions':
|
|
229
|
+
try {
|
|
230
|
+
const sessions = await session.listSessions();
|
|
231
|
+
ws.send(JSON.stringify({ type: 'sessions', sessions }));
|
|
232
|
+
}
|
|
233
|
+
catch (err) {
|
|
234
|
+
ws.send(JSON.stringify({ type: 'error', message: `Failed to list sessions: ${err.message}` }));
|
|
235
|
+
}
|
|
236
|
+
break;
|
|
237
|
+
case 'switch_session':
|
|
238
|
+
if (msg.sessionId) {
|
|
239
|
+
try {
|
|
240
|
+
await session.switchSession(msg.sessionId);
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
ws.send(JSON.stringify({ type: 'error', message: `Failed to switch session: ${err.message}` }));
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Start function
|
|
250
|
+
async function start() {
|
|
251
|
+
// Setup static serving
|
|
252
|
+
if (isDev && !config.staticDir) {
|
|
253
|
+
// In dev mode without static dir, just serve API
|
|
254
|
+
console.log('[amux] Running in API-only mode (no static files)');
|
|
255
|
+
}
|
|
256
|
+
else if (config.staticDir) {
|
|
257
|
+
app.use(express.static(config.staticDir));
|
|
258
|
+
app.get('/{*splat}', (_req, res) => {
|
|
259
|
+
res.sendFile(path.join(config.staticDir, 'index.html'));
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
// Start the agent
|
|
263
|
+
await agentSession.spawnAgent();
|
|
264
|
+
// Start HTTP server
|
|
265
|
+
server.listen(PORT, () => {
|
|
266
|
+
console.log(`[amux] Running on port ${PORT}`);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
// Shutdown function
|
|
270
|
+
function shutdown() {
|
|
271
|
+
console.log('[amux] Shutting down');
|
|
272
|
+
agentSession.shutdown();
|
|
273
|
+
for (const ws of clients)
|
|
274
|
+
ws.close();
|
|
275
|
+
wss.close();
|
|
276
|
+
server.close();
|
|
277
|
+
}
|
|
278
|
+
// Handle SIGTERM
|
|
279
|
+
process.on('SIGTERM', () => {
|
|
280
|
+
shutdown();
|
|
281
|
+
process.exit(0);
|
|
282
|
+
});
|
|
283
|
+
return { app, server, start, shutdown };
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Attach amux to an existing Express app and HTTP server.
|
|
287
|
+
* For when you want more control over the server setup.
|
|
288
|
+
*/
|
|
289
|
+
export function attachAmux(_app, server, config) {
|
|
290
|
+
const INSTANCE_ID = process.env.INSTANCE_ID ?? 'default';
|
|
291
|
+
const basePath = config.basePath ?? process.cwd();
|
|
292
|
+
const clients = new Set();
|
|
293
|
+
// State manager
|
|
294
|
+
const stateManager = new StateManager(config.stateDir);
|
|
295
|
+
// Broadcast function
|
|
296
|
+
function broadcast(message) {
|
|
297
|
+
const msgStr = JSON.stringify(message);
|
|
298
|
+
for (const client of clients) {
|
|
299
|
+
if (client.readyState === WebSocket.OPEN) {
|
|
300
|
+
client.send(msgStr);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Create agent session
|
|
305
|
+
const agentSession = new AgentSession({
|
|
306
|
+
instanceId: INSTANCE_ID,
|
|
307
|
+
basePath,
|
|
308
|
+
broadcast,
|
|
309
|
+
systemContext: config.systemContext,
|
|
310
|
+
fixedCwd: config.fixedCwd,
|
|
311
|
+
agentType: config.agentType,
|
|
312
|
+
stateDir: config.stateDir,
|
|
313
|
+
});
|
|
314
|
+
// WebSocket setup
|
|
315
|
+
const wss = new WebSocketServer({ server, path: '/ws' });
|
|
316
|
+
wss.on('connection', (ws) => {
|
|
317
|
+
console.log('[amux] Client connected');
|
|
318
|
+
clients.add(ws);
|
|
319
|
+
if (agentSession.isConnected) {
|
|
320
|
+
ws.send(JSON.stringify({
|
|
321
|
+
type: 'ready',
|
|
322
|
+
cwd: agentSession.cwd,
|
|
323
|
+
sessionId: agentSession.sessionId,
|
|
324
|
+
capabilities: agentSession.agentCapabilities,
|
|
325
|
+
agent: agentSession.getAgentInfo(),
|
|
326
|
+
availableAgents: agentSession.getAvailableAgents(),
|
|
327
|
+
}));
|
|
328
|
+
const history = stateManager.loadHistory(agentSession.sessionId);
|
|
329
|
+
if (history.length > 0) {
|
|
330
|
+
ws.send(JSON.stringify({
|
|
331
|
+
type: 'history_replay',
|
|
332
|
+
previousSessionId: agentSession.sessionId,
|
|
333
|
+
events: history,
|
|
334
|
+
eventCount: history.length,
|
|
335
|
+
}));
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
ws.send(JSON.stringify({ type: 'connecting' }));
|
|
340
|
+
}
|
|
341
|
+
ws.on('close', () => {
|
|
342
|
+
clients.delete(ws);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
async function start() {
|
|
346
|
+
await agentSession.spawnAgent();
|
|
347
|
+
}
|
|
348
|
+
function shutdown() {
|
|
349
|
+
agentSession.shutdown();
|
|
350
|
+
for (const ws of clients)
|
|
351
|
+
ws.close();
|
|
352
|
+
wss.close();
|
|
353
|
+
}
|
|
354
|
+
return { agentSession, start, shutdown };
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type * as acp from '@agentclientprotocol/sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Type guard for tool_call session updates
|
|
4
|
+
*/
|
|
5
|
+
export declare function isToolCallUpdate(update: acp.SessionUpdate): update is acp.ToolCall & {
|
|
6
|
+
sessionUpdate: 'tool_call';
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Type guard for tool_call_update session updates
|
|
10
|
+
*/
|
|
11
|
+
export declare function isToolCallUpdateMessage(update: acp.SessionUpdate): update is acp.ToolCallUpdate & {
|
|
12
|
+
sessionUpdate: 'tool_call_update';
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Type guard for diff content items
|
|
16
|
+
*/
|
|
17
|
+
export declare function isDiffContent(item: acp.ToolCallContent): item is acp.Diff & {
|
|
18
|
+
type: 'diff';
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Normalize ACP session updates.
|
|
22
|
+
* Claude sends Edit/Write diffs as {newText, oldText, path} instead of unified diff.
|
|
23
|
+
* We convert these to standard unified diff format so the UI doesn't need agent-specific logic.
|
|
24
|
+
*/
|
|
25
|
+
export declare function normalizeSessionUpdate(update: acp.SessionUpdate): acp.SessionUpdate;
|
|
26
|
+
//# sourceMappingURL=session-updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-updates.d.ts","sourceRoot":"","sources":["../src/session-updates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAErD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,MAAM,IAAI,GAAG,CAAC,QAAQ,GAAG;IAAE,aAAa,EAAE,WAAW,CAAA;CAAE,CAEzD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,MAAM,IAAI,GAAG,CAAC,cAAc,GAAG;IAAE,aAAa,EAAE,kBAAkB,CAAA;CAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,GAAG,CAAC,eAAe,GACxB,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAErC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,GAAG,CAAC,aAAa,CAkDnB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard for tool_call session updates
|
|
3
|
+
*/
|
|
4
|
+
export function isToolCallUpdate(update) {
|
|
5
|
+
return update.sessionUpdate === 'tool_call';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Type guard for tool_call_update session updates
|
|
9
|
+
*/
|
|
10
|
+
export function isToolCallUpdateMessage(update) {
|
|
11
|
+
return update.sessionUpdate === 'tool_call_update';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Type guard for diff content items
|
|
15
|
+
*/
|
|
16
|
+
export function isDiffContent(item) {
|
|
17
|
+
return item.type === 'diff';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Normalize ACP session updates.
|
|
21
|
+
* Claude sends Edit/Write diffs as {newText, oldText, path} instead of unified diff.
|
|
22
|
+
* We convert these to standard unified diff format so the UI doesn't need agent-specific logic.
|
|
23
|
+
*/
|
|
24
|
+
export function normalizeSessionUpdate(update) {
|
|
25
|
+
// Only process tool_call and tool_call_update events with content arrays
|
|
26
|
+
if (!isToolCallUpdate(update) && !isToolCallUpdateMessage(update)) {
|
|
27
|
+
return update;
|
|
28
|
+
}
|
|
29
|
+
const content = update.content;
|
|
30
|
+
if (!content || !Array.isArray(content)) {
|
|
31
|
+
return update;
|
|
32
|
+
}
|
|
33
|
+
// Check for diff items that need normalization
|
|
34
|
+
const normalizedContent = content.map((item) => {
|
|
35
|
+
if (!isDiffContent(item))
|
|
36
|
+
return item;
|
|
37
|
+
const diffItem = item;
|
|
38
|
+
const newText = diffItem.newText;
|
|
39
|
+
const oldText = diffItem.oldText;
|
|
40
|
+
const filePath = diffItem.path ?? 'file';
|
|
41
|
+
// Generate unified diff
|
|
42
|
+
const oldLines = oldText ? oldText.split('\n') : [];
|
|
43
|
+
const newLines = newText.split('\n');
|
|
44
|
+
let unifiedDiff = `Index: ${filePath}\n`;
|
|
45
|
+
unifiedDiff += '===================================================================\n';
|
|
46
|
+
unifiedDiff += `--- ${filePath}\n`;
|
|
47
|
+
unifiedDiff += `+++ ${filePath}\n`;
|
|
48
|
+
unifiedDiff += `@@ -${oldLines.length > 0 ? 1 : 0},${oldLines.length} +1,${newLines.length} @@\n`;
|
|
49
|
+
for (const line of oldLines) {
|
|
50
|
+
unifiedDiff += `-${line}\n`;
|
|
51
|
+
}
|
|
52
|
+
for (const line of newLines) {
|
|
53
|
+
unifiedDiff += `+${line}\n`;
|
|
54
|
+
}
|
|
55
|
+
// Return normalized diff item
|
|
56
|
+
return {
|
|
57
|
+
type: 'diff',
|
|
58
|
+
newText: unifiedDiff,
|
|
59
|
+
oldText: '',
|
|
60
|
+
path: filePath,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
return {
|
|
64
|
+
...update,
|
|
65
|
+
content: normalizedContent,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=session-updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-updates.js","sourceRoot":"","sources":["../src/session-updates.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAyB;IAEzB,OAAO,MAAM,CAAC,aAAa,KAAK,WAAW,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAyB;IAEzB,OAAO,MAAM,CAAC,aAAa,KAAK,kBAAkB,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAyB;IAEzB,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAyB;IAEzB,yEAAyE;IACzE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+CAA+C;IAC/C,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAuB,EAAE;QAClE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC;QAEzC,wBAAwB;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,WAAW,GAAG,UAAU,QAAQ,IAAI,CAAC;QACzC,WAAW,IAAI,uEAAuE,CAAC;QACvF,WAAW,IAAI,OAAO,QAAQ,IAAI,CAAC;QACnC,WAAW,IAAI,OAAO,QAAQ,IAAI,CAAC;QACnC,WAAW,IAAI,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,OAAO,QAAQ,CAAC,MAAM,OAAO,CAAC;QAElG,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC;QAC9B,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC;QAC9B,CAAC;QAED,8BAA8B;QAC9B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,QAAQ;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,iBAAiB;KAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-updates.test.d.ts","sourceRoot":"","sources":["../src/session-updates.test.ts"],"names":[],"mappings":""}
|