@bytespell/amux 0.0.12 → 0.0.15
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 +7 -1
- package/README.md +24 -10
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- 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/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 +10 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +87 -14
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +4 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -3
- package/dist/types.js.map +1 -1
- package/package.json +5 -18
- package/src/index.ts +0 -1
- package/src/message-parser.test.ts +207 -0
- package/src/session-updates.test.ts +265 -0
- package/src/session.ts +94 -15
- package/src/types.ts +10 -7
- package/tsconfig.json +1 -1
- package/vitest.config.ts +7 -0
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
"Bash(gh repo create:*)",
|
|
6
6
|
"Bash(gh org:*)",
|
|
7
7
|
"Bash(gh api:*)",
|
|
8
|
-
"Bash(npm publish:*)"
|
|
8
|
+
"Bash(npm publish:*)",
|
|
9
|
+
"Bash(npm run typecheck:*)",
|
|
10
|
+
"Bash(npm run build)",
|
|
11
|
+
"Bash(npm test:*)",
|
|
12
|
+
"Bash(npm link)",
|
|
13
|
+
"Bash(npm install:*)",
|
|
14
|
+
"Bash(npm version:*)"
|
|
9
15
|
]
|
|
10
16
|
}
|
|
11
17
|
}
|
package/README.md
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
# amux
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**ACP Multiplexer** - the session layer for ACP agents.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The [ACP TypeScript SDK](https://github.com/agentclientprotocol/typescript-sdk) does the hard work of getting the protocol right - json-rpc transport, type definitions, connection lifecycle. But there's a gap between "I can send messages to an agent" and "I can manage agent sessions in my app".
|
|
6
|
+
|
|
7
|
+
amux fills that gap. Think tmux for agents - spawn sessions, detach, reattach later, pick up where you left off.
|
|
8
|
+
|
|
9
|
+
Everything the SDK doesn't do:
|
|
10
|
+
- Spawn and manage agent processes (the SDK gives you a connection, not a process)
|
|
11
|
+
- Persist session state to disk (detach and reattach later)
|
|
12
|
+
- Replay history on reconnect (your UI picks up where it left off)
|
|
13
|
+
- Handle permission requests with pluggable strategies
|
|
14
|
+
- Switch between agents (Claude Code, Codex, Pi) without changing your code
|
|
15
|
+
|
|
16
|
+
Transport-agnostic core with an optional WebSocket adapter.
|
|
6
17
|
|
|
7
18
|
## Installation
|
|
8
19
|
|
|
@@ -10,14 +21,21 @@ Manage ACP agent sessions (Claude Code, Codex, Pi) with a simple event-driven in
|
|
|
10
21
|
npm install @bytespell/amux
|
|
11
22
|
```
|
|
12
23
|
|
|
13
|
-
You'll also need at least one ACP agent:
|
|
24
|
+
You'll also need at least one ACP agent installed and available on your PATH:
|
|
14
25
|
|
|
15
26
|
```bash
|
|
16
|
-
|
|
17
|
-
npm install @
|
|
18
|
-
|
|
27
|
+
# Claude Code
|
|
28
|
+
npm install -g @anthropics/claude-code
|
|
29
|
+
|
|
30
|
+
# Codex
|
|
31
|
+
npm install -g @openai/codex
|
|
32
|
+
|
|
33
|
+
# Pi
|
|
34
|
+
npm install -g @mariozechner/pi-coding-agent
|
|
19
35
|
```
|
|
20
36
|
|
|
37
|
+
amux automatically detects which agents are installed by checking your PATH.
|
|
38
|
+
|
|
21
39
|
## Quick Start
|
|
22
40
|
|
|
23
41
|
### With WebSocket Adapter
|
|
@@ -32,7 +50,6 @@ const wss = new WebSocketServer({ server, path: '/ws' });
|
|
|
32
50
|
|
|
33
51
|
const session = new AgentSession({
|
|
34
52
|
instanceId: process.env.INSTANCE_ID ?? 'default',
|
|
35
|
-
basePath: process.cwd(),
|
|
36
53
|
systemContext: 'You are a helpful assistant...',
|
|
37
54
|
});
|
|
38
55
|
|
|
@@ -52,7 +69,6 @@ import { AgentSession } from '@bytespell/amux';
|
|
|
52
69
|
|
|
53
70
|
const session = new AgentSession({
|
|
54
71
|
instanceId: 'my-instance',
|
|
55
|
-
basePath: process.cwd(),
|
|
56
72
|
});
|
|
57
73
|
|
|
58
74
|
// Subscribe to events
|
|
@@ -90,7 +106,6 @@ Core class for managing an ACP agent session. Extends `EventEmitter`.
|
|
|
90
106
|
```typescript
|
|
91
107
|
const session = new AgentSession({
|
|
92
108
|
instanceId: string; // Unique ID for state isolation
|
|
93
|
-
basePath: string; // Path to node_modules with agent binaries
|
|
94
109
|
systemContext?: string; // Injected context for the agent
|
|
95
110
|
fixedCwd?: string; // Lock working directory
|
|
96
111
|
agentType?: string; // 'claude-code' | 'codex' | 'pi'
|
|
@@ -176,7 +191,6 @@ Inject context to customize agent behavior:
|
|
|
176
191
|
```typescript
|
|
177
192
|
const session = new AgentSession({
|
|
178
193
|
instanceId: 'docs-helper',
|
|
179
|
-
basePath: __dirname,
|
|
180
194
|
systemContext: `
|
|
181
195
|
# Documentation Assistant
|
|
182
196
|
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAGlE,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,0BAA0B;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlD,6CAA6C;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,2BAA2B;AAC3B,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAE9B,4BAA4B;AAC5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAYlE,2BAA2B;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-parser.test.d.ts","sourceRoot":"","sources":["../src/message-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseMessageToContentBlocks } from './message-parser.js';
|
|
3
|
+
describe('parseMessageToContentBlocks', () => {
|
|
4
|
+
const workingDir = '/home/user/project';
|
|
5
|
+
describe('plain text messages', () => {
|
|
6
|
+
it('returns single text block for plain text', () => {
|
|
7
|
+
const result = parseMessageToContentBlocks('hello world', workingDir);
|
|
8
|
+
expect(result).toEqual([{ type: 'text', text: 'hello world' }]);
|
|
9
|
+
});
|
|
10
|
+
it('returns single text block for empty message', () => {
|
|
11
|
+
const result = parseMessageToContentBlocks('', workingDir);
|
|
12
|
+
expect(result).toEqual([{ type: 'text', text: '' }]);
|
|
13
|
+
});
|
|
14
|
+
it('returns single text block for whitespace-only message', () => {
|
|
15
|
+
const result = parseMessageToContentBlocks(' ', workingDir);
|
|
16
|
+
expect(result).toEqual([{ type: 'text', text: ' ' }]);
|
|
17
|
+
});
|
|
18
|
+
it('preserves multi-line text', () => {
|
|
19
|
+
const result = parseMessageToContentBlocks('line one\nline two', workingDir);
|
|
20
|
+
expect(result).toEqual([{ type: 'text', text: 'line one\nline two' }]);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('single @mentions', () => {
|
|
24
|
+
it('parses single @mention as resource_link', () => {
|
|
25
|
+
const result = parseMessageToContentBlocks('@src/foo.ts', workingDir);
|
|
26
|
+
expect(result).toEqual([
|
|
27
|
+
{
|
|
28
|
+
type: 'resource_link',
|
|
29
|
+
uri: 'file:///home/user/project/src/foo.ts',
|
|
30
|
+
name: 'src/foo.ts',
|
|
31
|
+
},
|
|
32
|
+
]);
|
|
33
|
+
});
|
|
34
|
+
it('parses relative path with ./', () => {
|
|
35
|
+
const result = parseMessageToContentBlocks('@./local.ts', workingDir);
|
|
36
|
+
expect(result).toEqual([
|
|
37
|
+
{
|
|
38
|
+
type: 'resource_link',
|
|
39
|
+
uri: 'file:///home/user/project/local.ts',
|
|
40
|
+
name: './local.ts',
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
});
|
|
44
|
+
it('parses relative path with ../', () => {
|
|
45
|
+
const result = parseMessageToContentBlocks('@../parent/file.ts', workingDir);
|
|
46
|
+
expect(result).toEqual([
|
|
47
|
+
{
|
|
48
|
+
type: 'resource_link',
|
|
49
|
+
uri: 'file:///home/user/parent/file.ts',
|
|
50
|
+
name: '../parent/file.ts',
|
|
51
|
+
},
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
it('handles file with dashes in name', () => {
|
|
55
|
+
const result = parseMessageToContentBlocks('@src/my-file.ts', workingDir);
|
|
56
|
+
expect(result).toEqual([
|
|
57
|
+
{
|
|
58
|
+
type: 'resource_link',
|
|
59
|
+
uri: 'file:///home/user/project/src/my-file.ts',
|
|
60
|
+
name: 'src/my-file.ts',
|
|
61
|
+
},
|
|
62
|
+
]);
|
|
63
|
+
});
|
|
64
|
+
it('handles deeply nested paths', () => {
|
|
65
|
+
const result = parseMessageToContentBlocks('@src/a/b/c/d.ts', workingDir);
|
|
66
|
+
expect(result).toEqual([
|
|
67
|
+
{
|
|
68
|
+
type: 'resource_link',
|
|
69
|
+
uri: 'file:///home/user/project/src/a/b/c/d.ts',
|
|
70
|
+
name: 'src/a/b/c/d.ts',
|
|
71
|
+
},
|
|
72
|
+
]);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('mixed text and @mentions', () => {
|
|
76
|
+
it('parses text before and after mention', () => {
|
|
77
|
+
const result = parseMessageToContentBlocks('check @src/foo.ts for bugs', workingDir);
|
|
78
|
+
expect(result).toEqual([
|
|
79
|
+
{ type: 'text', text: 'check ' },
|
|
80
|
+
{
|
|
81
|
+
type: 'resource_link',
|
|
82
|
+
uri: 'file:///home/user/project/src/foo.ts',
|
|
83
|
+
name: 'src/foo.ts',
|
|
84
|
+
},
|
|
85
|
+
{ type: 'text', text: ' for bugs' },
|
|
86
|
+
]);
|
|
87
|
+
});
|
|
88
|
+
it('parses text only before mention', () => {
|
|
89
|
+
const result = parseMessageToContentBlocks('look at @src/foo.ts', workingDir);
|
|
90
|
+
expect(result).toEqual([
|
|
91
|
+
{ type: 'text', text: 'look at ' },
|
|
92
|
+
{
|
|
93
|
+
type: 'resource_link',
|
|
94
|
+
uri: 'file:///home/user/project/src/foo.ts',
|
|
95
|
+
name: 'src/foo.ts',
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
});
|
|
99
|
+
it('parses text only after mention', () => {
|
|
100
|
+
const result = parseMessageToContentBlocks('@src/foo.ts has a bug', workingDir);
|
|
101
|
+
expect(result).toEqual([
|
|
102
|
+
{
|
|
103
|
+
type: 'resource_link',
|
|
104
|
+
uri: 'file:///home/user/project/src/foo.ts',
|
|
105
|
+
name: 'src/foo.ts',
|
|
106
|
+
},
|
|
107
|
+
{ type: 'text', text: ' has a bug' },
|
|
108
|
+
]);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('multiple @mentions', () => {
|
|
112
|
+
it('parses multiple mentions with text between', () => {
|
|
113
|
+
const result = parseMessageToContentBlocks('@src/a.ts and @src/b.ts', workingDir);
|
|
114
|
+
expect(result).toEqual([
|
|
115
|
+
{
|
|
116
|
+
type: 'resource_link',
|
|
117
|
+
uri: 'file:///home/user/project/src/a.ts',
|
|
118
|
+
name: 'src/a.ts',
|
|
119
|
+
},
|
|
120
|
+
{ type: 'text', text: ' and ' },
|
|
121
|
+
{
|
|
122
|
+
type: 'resource_link',
|
|
123
|
+
uri: 'file:///home/user/project/src/b.ts',
|
|
124
|
+
name: 'src/b.ts',
|
|
125
|
+
},
|
|
126
|
+
]);
|
|
127
|
+
});
|
|
128
|
+
it('parses consecutive mentions without text between', () => {
|
|
129
|
+
const result = parseMessageToContentBlocks('@a.ts @b.ts', workingDir);
|
|
130
|
+
// The space between becomes whitespace-only and gets skipped
|
|
131
|
+
expect(result).toEqual([
|
|
132
|
+
{
|
|
133
|
+
type: 'resource_link',
|
|
134
|
+
uri: 'file:///home/user/project/a.ts',
|
|
135
|
+
name: 'a.ts',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
type: 'resource_link',
|
|
139
|
+
uri: 'file:///home/user/project/b.ts',
|
|
140
|
+
name: 'b.ts',
|
|
141
|
+
},
|
|
142
|
+
]);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('edge cases', () => {
|
|
146
|
+
it('handles email-like patterns (should not match)', () => {
|
|
147
|
+
// Email addresses should be matched by regex, which may not be desired
|
|
148
|
+
// This test documents current behavior
|
|
149
|
+
const result = parseMessageToContentBlocks('email user@example.com', workingDir);
|
|
150
|
+
// The regex matches @example.com as a mention
|
|
151
|
+
expect(result[0]).toEqual({ type: 'text', text: 'email user' });
|
|
152
|
+
expect(result[1]).toHaveProperty('type', 'resource_link');
|
|
153
|
+
});
|
|
154
|
+
it('handles @ at end of string without path', () => {
|
|
155
|
+
const result = parseMessageToContentBlocks('just an @', workingDir);
|
|
156
|
+
expect(result).toEqual([{ type: 'text', text: 'just an @' }]);
|
|
157
|
+
});
|
|
158
|
+
it('handles multiple @ signs', () => {
|
|
159
|
+
const result = parseMessageToContentBlocks('@@foo.ts', workingDir);
|
|
160
|
+
// First @ doesn't match (followed by @), second @ matches
|
|
161
|
+
expect(result).toHaveLength(2);
|
|
162
|
+
expect(result[0]).toEqual({ type: 'text', text: '@' });
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('working directory resolution', () => {
|
|
166
|
+
it('uses provided working directory for absolute path resolution', () => {
|
|
167
|
+
const result = parseMessageToContentBlocks('@file.ts', '/custom/dir');
|
|
168
|
+
expect(result).toEqual([
|
|
169
|
+
{
|
|
170
|
+
type: 'resource_link',
|
|
171
|
+
uri: 'file:///custom/dir/file.ts',
|
|
172
|
+
name: 'file.ts',
|
|
173
|
+
},
|
|
174
|
+
]);
|
|
175
|
+
});
|
|
176
|
+
it('resolves relative paths correctly from working directory', () => {
|
|
177
|
+
const result = parseMessageToContentBlocks('@../sibling/file.ts', '/home/user/project');
|
|
178
|
+
expect(result).toEqual([
|
|
179
|
+
{
|
|
180
|
+
type: 'resource_link',
|
|
181
|
+
uri: 'file:///home/user/sibling/file.ts',
|
|
182
|
+
name: '../sibling/file.ts',
|
|
183
|
+
},
|
|
184
|
+
]);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=message-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-parser.test.js","sourceRoot":"","sources":["../src/message-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-updates.test.d.ts","sourceRoot":"","sources":["../src/session-updates.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { isToolCallUpdate, isToolCallUpdateMessage, normalizeSessionUpdate, } from './session-updates.js';
|
|
3
|
+
describe('isToolCallUpdate', () => {
|
|
4
|
+
it('returns true for tool_call updates', () => {
|
|
5
|
+
const update = {
|
|
6
|
+
sessionUpdate: 'tool_call',
|
|
7
|
+
id: 'test',
|
|
8
|
+
title: 'Test',
|
|
9
|
+
status: 'pending',
|
|
10
|
+
};
|
|
11
|
+
expect(isToolCallUpdate(update)).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it('returns false for other update types', () => {
|
|
14
|
+
const update = {
|
|
15
|
+
sessionUpdate: 'agent_message_chunk',
|
|
16
|
+
content: { type: 'text', text: 'hello' },
|
|
17
|
+
};
|
|
18
|
+
expect(isToolCallUpdate(update)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('isToolCallUpdateMessage', () => {
|
|
22
|
+
it('returns true for tool_call_update updates', () => {
|
|
23
|
+
const update = {
|
|
24
|
+
sessionUpdate: 'tool_call_update',
|
|
25
|
+
id: 'test',
|
|
26
|
+
};
|
|
27
|
+
expect(isToolCallUpdateMessage(update)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it('returns false for other update types', () => {
|
|
30
|
+
const update = {
|
|
31
|
+
sessionUpdate: 'tool_call',
|
|
32
|
+
id: 'test',
|
|
33
|
+
title: 'Test',
|
|
34
|
+
status: 'pending',
|
|
35
|
+
};
|
|
36
|
+
expect(isToolCallUpdateMessage(update)).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('normalizeSessionUpdate', () => {
|
|
40
|
+
it('passes through non-tool updates unchanged', () => {
|
|
41
|
+
const update = {
|
|
42
|
+
sessionUpdate: 'agent_message_chunk',
|
|
43
|
+
content: { type: 'text', text: 'hello' },
|
|
44
|
+
};
|
|
45
|
+
const result = normalizeSessionUpdate(update);
|
|
46
|
+
expect(result).toEqual(update);
|
|
47
|
+
});
|
|
48
|
+
it('passes through turn_start unchanged', () => {
|
|
49
|
+
const update = {
|
|
50
|
+
sessionUpdate: 'turn_start',
|
|
51
|
+
};
|
|
52
|
+
const result = normalizeSessionUpdate(update);
|
|
53
|
+
expect(result).toEqual(update);
|
|
54
|
+
});
|
|
55
|
+
it('passes through turn_end unchanged', () => {
|
|
56
|
+
const update = {
|
|
57
|
+
sessionUpdate: 'turn_end',
|
|
58
|
+
};
|
|
59
|
+
const result = normalizeSessionUpdate(update);
|
|
60
|
+
expect(result).toEqual(update);
|
|
61
|
+
});
|
|
62
|
+
it('passes through tool_call without content unchanged', () => {
|
|
63
|
+
const update = {
|
|
64
|
+
sessionUpdate: 'tool_call',
|
|
65
|
+
id: 'test',
|
|
66
|
+
title: 'Test Tool',
|
|
67
|
+
status: 'pending',
|
|
68
|
+
};
|
|
69
|
+
const result = normalizeSessionUpdate(update);
|
|
70
|
+
expect(result).toEqual(update);
|
|
71
|
+
});
|
|
72
|
+
it('passes through tool_call with non-diff content unchanged', () => {
|
|
73
|
+
const update = {
|
|
74
|
+
sessionUpdate: 'tool_call',
|
|
75
|
+
id: 'test',
|
|
76
|
+
title: 'Test Tool',
|
|
77
|
+
status: 'pending',
|
|
78
|
+
content: [{ type: 'text', text: 'some output' }],
|
|
79
|
+
};
|
|
80
|
+
const result = normalizeSessionUpdate(update);
|
|
81
|
+
expect(result).toEqual(update);
|
|
82
|
+
});
|
|
83
|
+
it('normalizes tool_call with diff content', () => {
|
|
84
|
+
const update = {
|
|
85
|
+
sessionUpdate: 'tool_call',
|
|
86
|
+
id: 'test',
|
|
87
|
+
title: 'Edit File',
|
|
88
|
+
status: 'completed',
|
|
89
|
+
content: [
|
|
90
|
+
{
|
|
91
|
+
type: 'diff',
|
|
92
|
+
oldText: 'old content',
|
|
93
|
+
newText: 'new content',
|
|
94
|
+
path: '/path/to/file.ts',
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
const result = normalizeSessionUpdate(update);
|
|
99
|
+
// Should have same structure but with normalized diff
|
|
100
|
+
expect(result.sessionUpdate).toBe('tool_call');
|
|
101
|
+
expect(result.content).toHaveLength(1);
|
|
102
|
+
const diffContent = result.content[0];
|
|
103
|
+
expect(diffContent.type).toBe('diff');
|
|
104
|
+
// The newText should now contain unified diff format
|
|
105
|
+
const normalizedDiff = diffContent;
|
|
106
|
+
expect(normalizedDiff.newText).toContain('Index: /path/to/file.ts');
|
|
107
|
+
expect(normalizedDiff.newText).toContain('---');
|
|
108
|
+
expect(normalizedDiff.newText).toContain('+++');
|
|
109
|
+
expect(normalizedDiff.newText).toContain('-old content');
|
|
110
|
+
expect(normalizedDiff.newText).toContain('+new content');
|
|
111
|
+
expect(normalizedDiff.oldText).toBe('');
|
|
112
|
+
expect(normalizedDiff.path).toBe('/path/to/file.ts');
|
|
113
|
+
});
|
|
114
|
+
it('normalizes tool_call_update with diff content', () => {
|
|
115
|
+
const update = {
|
|
116
|
+
sessionUpdate: 'tool_call_update',
|
|
117
|
+
id: 'test',
|
|
118
|
+
content: [
|
|
119
|
+
{
|
|
120
|
+
type: 'diff',
|
|
121
|
+
oldText: 'line1\nline2',
|
|
122
|
+
newText: 'line1\nmodified',
|
|
123
|
+
path: 'test.ts',
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
const result = normalizeSessionUpdate(update);
|
|
128
|
+
const diffContent = result.content[0];
|
|
129
|
+
expect(diffContent.newText).toContain('-line1');
|
|
130
|
+
expect(diffContent.newText).toContain('-line2');
|
|
131
|
+
expect(diffContent.newText).toContain('+line1');
|
|
132
|
+
expect(diffContent.newText).toContain('+modified');
|
|
133
|
+
});
|
|
134
|
+
it('handles empty oldText (new file creation)', () => {
|
|
135
|
+
const update = {
|
|
136
|
+
sessionUpdate: 'tool_call',
|
|
137
|
+
id: 'test',
|
|
138
|
+
title: 'Write File',
|
|
139
|
+
status: 'completed',
|
|
140
|
+
content: [
|
|
141
|
+
{
|
|
142
|
+
type: 'diff',
|
|
143
|
+
oldText: '',
|
|
144
|
+
newText: 'new file content',
|
|
145
|
+
path: 'new-file.ts',
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
const result = normalizeSessionUpdate(update);
|
|
150
|
+
const diffContent = result.content[0];
|
|
151
|
+
expect(diffContent.newText).toContain('@@ -0,0 +1,1 @@');
|
|
152
|
+
expect(diffContent.newText).toContain('+new file content');
|
|
153
|
+
// No removed lines in the diff body (lines starting with - followed by content, not headers)
|
|
154
|
+
const lines = diffContent.newText.split('\n');
|
|
155
|
+
const removedLines = lines.filter(l => l.startsWith('-') && !l.startsWith('---'));
|
|
156
|
+
expect(removedLines).toHaveLength(0);
|
|
157
|
+
});
|
|
158
|
+
it('handles multi-line diffs', () => {
|
|
159
|
+
const update = {
|
|
160
|
+
sessionUpdate: 'tool_call',
|
|
161
|
+
id: 'test',
|
|
162
|
+
title: 'Edit File',
|
|
163
|
+
status: 'completed',
|
|
164
|
+
content: [
|
|
165
|
+
{
|
|
166
|
+
type: 'diff',
|
|
167
|
+
oldText: 'line1\nline2\nline3',
|
|
168
|
+
newText: 'line1\nmodified\nline3\nline4',
|
|
169
|
+
path: 'file.ts',
|
|
170
|
+
},
|
|
171
|
+
],
|
|
172
|
+
};
|
|
173
|
+
const result = normalizeSessionUpdate(update);
|
|
174
|
+
const diffContent = result.content[0];
|
|
175
|
+
// Should have correct line counts in header
|
|
176
|
+
expect(diffContent.newText).toContain('@@ -1,3 +1,4 @@');
|
|
177
|
+
});
|
|
178
|
+
it('uses "file" as default path when path is missing', () => {
|
|
179
|
+
const update = {
|
|
180
|
+
sessionUpdate: 'tool_call',
|
|
181
|
+
id: 'test',
|
|
182
|
+
title: 'Edit',
|
|
183
|
+
status: 'completed',
|
|
184
|
+
content: [
|
|
185
|
+
{
|
|
186
|
+
type: 'diff',
|
|
187
|
+
oldText: 'old',
|
|
188
|
+
newText: 'new',
|
|
189
|
+
// path intentionally omitted
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
};
|
|
193
|
+
const result = normalizeSessionUpdate(update);
|
|
194
|
+
const diffContent = result.content[0];
|
|
195
|
+
expect(diffContent.newText).toContain('Index: file');
|
|
196
|
+
expect(diffContent.path).toBe('file');
|
|
197
|
+
});
|
|
198
|
+
it('preserves mixed content types in tool_call', () => {
|
|
199
|
+
const update = {
|
|
200
|
+
sessionUpdate: 'tool_call',
|
|
201
|
+
id: 'test',
|
|
202
|
+
title: 'Complex Tool',
|
|
203
|
+
status: 'completed',
|
|
204
|
+
content: [
|
|
205
|
+
{ type: 'text', text: 'Before diff' },
|
|
206
|
+
{
|
|
207
|
+
type: 'diff',
|
|
208
|
+
oldText: 'old',
|
|
209
|
+
newText: 'new',
|
|
210
|
+
path: 'file.ts',
|
|
211
|
+
},
|
|
212
|
+
{ type: 'text', text: 'After diff' },
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
const result = normalizeSessionUpdate(update);
|
|
216
|
+
const content = result.content;
|
|
217
|
+
expect(content).toHaveLength(3);
|
|
218
|
+
expect(content[0]).toEqual({ type: 'text', text: 'Before diff' });
|
|
219
|
+
expect(content[1]?.type).toBe('diff');
|
|
220
|
+
expect(content[2]).toEqual({ type: 'text', text: 'After diff' });
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=session-updates.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-updates.test.js","sourceRoot":"","sources":["../src/session-updates.test.ts"],"names":[],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -60,7 +60,6 @@ export interface AgentSessionEvents {
|
|
|
60
60
|
* ```typescript
|
|
61
61
|
* const session = new AgentSession({
|
|
62
62
|
* instanceId: 'my-instance',
|
|
63
|
-
* basePath: __dirname,
|
|
64
63
|
* });
|
|
65
64
|
*
|
|
66
65
|
* session.on('ready', (data) => console.log('Ready:', data));
|
|
@@ -78,11 +77,11 @@ export declare class AgentSession extends EventEmitter {
|
|
|
78
77
|
private agentProcess;
|
|
79
78
|
private acpConnection;
|
|
80
79
|
private _agentCapabilities;
|
|
80
|
+
private _changingCwd;
|
|
81
81
|
private terminalManager;
|
|
82
82
|
private amuxClient;
|
|
83
83
|
private stateManager;
|
|
84
84
|
private instanceId;
|
|
85
|
-
private basePath;
|
|
86
85
|
private fixedCwd?;
|
|
87
86
|
private agents;
|
|
88
87
|
constructor(config: AgentSessionConfig);
|
|
@@ -111,11 +110,19 @@ export declare class AgentSession extends EventEmitter {
|
|
|
111
110
|
name: string;
|
|
112
111
|
};
|
|
113
112
|
/**
|
|
114
|
-
* Get available agents list
|
|
113
|
+
* Get available agents list (checks if base CLI is on PATH and ACP wrapper is bundled)
|
|
115
114
|
*/
|
|
116
115
|
getAvailableAgents(): Array<{
|
|
117
116
|
id: string;
|
|
118
117
|
name: string;
|
|
118
|
+
installed: boolean;
|
|
119
|
+
}>;
|
|
120
|
+
/**
|
|
121
|
+
* Get only installed agents
|
|
122
|
+
*/
|
|
123
|
+
getInstalledAgents(): Array<{
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
119
126
|
}>;
|
|
120
127
|
/**
|
|
121
128
|
* Save current state to disk
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|