@animalabs/agent-framework 0.6.4 → 0.6.6
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/README.md +5 -0
- package/dist/src/agent.d.ts +18 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +221 -2
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +59 -2
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +687 -229
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +27 -4
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +34 -15
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +299 -67
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/push-handler.d.ts +1 -0
- package/dist/src/mcpl/push-handler.d.ts.map +1 -1
- package/dist/src/mcpl/push-handler.js +1 -0
- package/dist/src/mcpl/push-handler.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +3 -1
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +4 -0
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +43 -12
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js +1 -0
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/types/agent.d.ts +15 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +1 -0
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +9 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +2 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/activation-request-sanitize.test.d.ts +2 -0
- package/dist/test/activation-request-sanitize.test.d.ts.map +1 -0
- package/dist/test/activation-request-sanitize.test.js +89 -0
- package/dist/test/activation-request-sanitize.test.js.map +1 -0
- package/dist/test/agent-runtime-settings.test.d.ts +2 -0
- package/dist/test/agent-runtime-settings.test.d.ts.map +1 -0
- package/dist/test/agent-runtime-settings.test.js +120 -0
- package/dist/test/agent-runtime-settings.test.js.map +1 -0
- package/dist/test/channel-registry-routing.test.js +5 -4
- package/dist/test/channel-registry-routing.test.js.map +1 -1
- package/dist/test/conversation-fork-injection-scoping.test.js +12 -1
- package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -1
- package/dist/test/ephemeral-settle.test.d.ts +2 -0
- package/dist/test/ephemeral-settle.test.d.ts.map +1 -0
- package/dist/test/ephemeral-settle.test.js +351 -0
- package/dist/test/ephemeral-settle.test.js.map +1 -0
- package/dist/test/event-gate.test.js +21 -1
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/helpers/mock-membrane.d.ts +13 -1
- package/dist/test/helpers/mock-membrane.d.ts.map +1 -1
- package/dist/test/helpers/mock-membrane.js +8 -1
- package/dist/test/helpers/mock-membrane.js.map +1 -1
- package/dist/test/maintenance-timer.test.js +52 -1
- package/dist/test/maintenance-timer.test.js.map +1 -1
- package/dist/test/mcpl-gate-roundtrip.test.js +138 -6
- package/dist/test/mcpl-gate-roundtrip.test.js.map +1 -1
- package/dist/test/overbudget-drain-breaker.test.d.ts +2 -0
- package/dist/test/overbudget-drain-breaker.test.d.ts.map +1 -0
- package/dist/test/overbudget-drain-breaker.test.js +157 -0
- package/dist/test/overbudget-drain-breaker.test.js.map +1 -0
- package/dist/test/present-while-acting.test.d.ts +18 -0
- package/dist/test/present-while-acting.test.d.ts.map +1 -0
- package/dist/test/present-while-acting.test.js +267 -0
- package/dist/test/present-while-acting.test.js.map +1 -0
- package/dist/test/trunk-channel-routing.test.js +38 -0
- package/dist/test/trunk-channel-routing.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/agent.ts +244 -3
- package/src/framework.ts +763 -235
- package/src/gate/event-gate.ts +38 -4
- package/src/mcpl/channel-registry.ts +372 -76
- package/src/mcpl/push-handler.ts +2 -0
- package/src/mcpl/server-connection.ts +10 -0
- package/src/mcpl/types.ts +49 -12
- package/src/types/agent.ts +18 -0
- package/src/types/events.ts +1 -1
- package/src/types/framework.ts +10 -0
- package/src/types/trace.ts +2 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Present while acting": the two halves that keep an agent conversationally
|
|
3
|
+
* alive during a long tool-using turn.
|
|
4
|
+
*
|
|
5
|
+
* SPEAK-while-acting — each round's prose is routed to the locus LIVE when
|
|
6
|
+
* the round yields its tool calls (per-round SILENCING_TOOLS rule), and the
|
|
7
|
+
* 'complete' case routes only the TRAILING prose (turn-wide silencing rule).
|
|
8
|
+
* Previously all segments were batched to the end of the turn.
|
|
9
|
+
*
|
|
10
|
+
* HEAR-while-acting — messages arriving mid-turn (deferred by addMessage
|
|
11
|
+
* while tool_use blocks are pending) are flushed to the context window at
|
|
12
|
+
* the tool-result boundary AND injected into the live stream via
|
|
13
|
+
* provideToolResults(results, { injectedMessages }) (membrane ≥0.5.72), so
|
|
14
|
+
* the next round of the SAME turn sees them instead of the agent staying
|
|
15
|
+
* deaf until the turn ends.
|
|
16
|
+
*/
|
|
17
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
18
|
+
import assert from 'node:assert/strict';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
21
|
+
import { join } from 'node:path';
|
|
22
|
+
import { AgentFramework } from '../src/index.js';
|
|
23
|
+
import { MockMembrane, createMockResponse } from './helpers/mock-membrane.js';
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Test module: tools that optionally emit a mid-turn external message
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
class RobotModule {
|
|
28
|
+
name = 'robot';
|
|
29
|
+
framework = null;
|
|
30
|
+
/** When set, the next `move` call pushes this text as an external message
|
|
31
|
+
* BEFORE returning its result (simulating a chat reply arriving while the
|
|
32
|
+
* tool executes). */
|
|
33
|
+
interjection = null;
|
|
34
|
+
/** Delay tool completion so live routing deterministically precedes it. */
|
|
35
|
+
toolDelayMs = 0;
|
|
36
|
+
async start(_ctx) { }
|
|
37
|
+
async stop() { }
|
|
38
|
+
getTools() {
|
|
39
|
+
return [
|
|
40
|
+
{
|
|
41
|
+
name: 'move',
|
|
42
|
+
description: 'Move the robot',
|
|
43
|
+
inputSchema: { type: 'object', properties: { dir: { type: 'string' } } },
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'send_message',
|
|
47
|
+
description: 'Explicitly send a message',
|
|
48
|
+
inputSchema: { type: 'object', properties: { text: { type: 'string' } } },
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
async handleToolCall(call) {
|
|
53
|
+
if (this.toolDelayMs > 0) {
|
|
54
|
+
await new Promise((r) => setTimeout(r, this.toolDelayMs));
|
|
55
|
+
}
|
|
56
|
+
if (this.interjection) {
|
|
57
|
+
const text = this.interjection;
|
|
58
|
+
this.interjection = null;
|
|
59
|
+
this.framework.pushEvent({
|
|
60
|
+
type: 'external-message',
|
|
61
|
+
source: 'test',
|
|
62
|
+
content: text,
|
|
63
|
+
metadata: {},
|
|
64
|
+
});
|
|
65
|
+
// Give the run loop a beat to process the queued message while this
|
|
66
|
+
// tool round is still pending (pendingAssistantBlocks non-empty), so
|
|
67
|
+
// it lands in deferredMessages before the tool-result event.
|
|
68
|
+
await new Promise((r) => setTimeout(r, 30));
|
|
69
|
+
}
|
|
70
|
+
return { success: true, data: { ok: true, tool: call.name } };
|
|
71
|
+
}
|
|
72
|
+
async onProcess(event, _state) {
|
|
73
|
+
if (event.type === 'external-message') {
|
|
74
|
+
const text = String(event.content);
|
|
75
|
+
return {
|
|
76
|
+
addMessages: [
|
|
77
|
+
{
|
|
78
|
+
participant: 'Antra',
|
|
79
|
+
content: [{ type: 'text', text }],
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
// Only the initial 'go' starts a turn. Mid-turn interjections must
|
|
83
|
+
// NOT request inference — we're testing mid-turn delivery, not wakes.
|
|
84
|
+
requestInference: text === 'go',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Minimal ChannelRegistry stub covering everything driveStream touches. */
|
|
91
|
+
function stubChannelRegistry(framework) {
|
|
92
|
+
const routed = [];
|
|
93
|
+
let locusCalls = 0;
|
|
94
|
+
const explicit = {
|
|
95
|
+
resolveLocus: () => {
|
|
96
|
+
locusCalls++;
|
|
97
|
+
return `chan-live-${locusCalls}`;
|
|
98
|
+
},
|
|
99
|
+
routeSpeech: async (_agent, text, locus) => {
|
|
100
|
+
routed.push({ text, locus: locus ?? null });
|
|
101
|
+
},
|
|
102
|
+
getDefaultPublishChannel: () => null,
|
|
103
|
+
isChannelOpen: () => true,
|
|
104
|
+
getDescriptor: () => undefined,
|
|
105
|
+
getChannelTools: () => [],
|
|
106
|
+
};
|
|
107
|
+
// Everything else driveStream/stop touches (startTyping, stopTyping,
|
|
108
|
+
// stopAll, ensureChannelRegistered, ...) becomes a no-op via Proxy so the
|
|
109
|
+
// stub doesn't chase the real registry's surface.
|
|
110
|
+
framework.channelRegistry = new Proxy(explicit, {
|
|
111
|
+
get: (target, prop) => (prop in target ? target[prop] : () => undefined),
|
|
112
|
+
});
|
|
113
|
+
return routed;
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
describe('present while acting', () => {
|
|
117
|
+
let tempDir;
|
|
118
|
+
let membrane;
|
|
119
|
+
let module;
|
|
120
|
+
beforeEach(() => {
|
|
121
|
+
tempDir = mkdtempSync(join(tmpdir(), 'pwa-test-'));
|
|
122
|
+
membrane = new MockMembrane();
|
|
123
|
+
module = new RobotModule();
|
|
124
|
+
});
|
|
125
|
+
afterEach(() => {
|
|
126
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
127
|
+
});
|
|
128
|
+
async function createFramework() {
|
|
129
|
+
const framework = await AgentFramework.create({
|
|
130
|
+
storePath: join(tempDir, 'test.chronicle'),
|
|
131
|
+
membrane: membrane.asMembrane(),
|
|
132
|
+
agents: [
|
|
133
|
+
{ name: 'assistant', model: 'test-model', systemPrompt: 'You are a robot pilot.' },
|
|
134
|
+
],
|
|
135
|
+
modules: [module],
|
|
136
|
+
});
|
|
137
|
+
module.framework = framework;
|
|
138
|
+
return framework;
|
|
139
|
+
}
|
|
140
|
+
function trigger(framework) {
|
|
141
|
+
framework.pushEvent({
|
|
142
|
+
type: 'external-message',
|
|
143
|
+
source: 'test',
|
|
144
|
+
content: 'go',
|
|
145
|
+
metadata: {},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
// -------------------------------------------------------------------------
|
|
149
|
+
// Speak-while-acting
|
|
150
|
+
// -------------------------------------------------------------------------
|
|
151
|
+
it('routes each round\'s prose live and only trailing prose at complete', async () => {
|
|
152
|
+
// Round 1: narration + move; Round 2: more narration + move; final: postscript
|
|
153
|
+
membrane.pushResponse(createMockResponse([
|
|
154
|
+
{ type: 'text', text: 'Heading to the door now!' },
|
|
155
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
156
|
+
], 'tool_use'));
|
|
157
|
+
membrane.pushResponse(createMockResponse([
|
|
158
|
+
{ type: 'text', text: 'Door reached, opening it.' },
|
|
159
|
+
{ type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'east' } },
|
|
160
|
+
], 'tool_use'));
|
|
161
|
+
membrane.pushResponse(createMockResponse([
|
|
162
|
+
{ type: 'text', text: 'Arrived.' },
|
|
163
|
+
]));
|
|
164
|
+
const framework = await createFramework();
|
|
165
|
+
const routed = stubChannelRegistry(framework);
|
|
166
|
+
module.toolDelayMs = 25;
|
|
167
|
+
// Track live ordering: when the first segment routes, no tool results
|
|
168
|
+
// may have been provided yet (i.e. delivery happened DURING the round).
|
|
169
|
+
const resultsAtRouteTime = [];
|
|
170
|
+
const registry = framework.channelRegistry;
|
|
171
|
+
const origRoute = registry.routeSpeech;
|
|
172
|
+
registry.routeSpeech = async (a, t, l) => {
|
|
173
|
+
resultsAtRouteTime.push(membrane.lastStream.receivedToolResults.length);
|
|
174
|
+
return origRoute(a, t, l);
|
|
175
|
+
};
|
|
176
|
+
trigger(framework);
|
|
177
|
+
await framework.runUntilIdle();
|
|
178
|
+
assert.deepEqual(routed.map((r) => r.text), ['Heading to the door now!', 'Door reached, opening it.', 'Arrived.'], 'all three segments delivered, in order');
|
|
179
|
+
// Live: segment N routed before round N's tool results were provided
|
|
180
|
+
assert.equal(resultsAtRouteTime[0], 0, 'round-1 prose routed before round-1 results');
|
|
181
|
+
assert.equal(resultsAtRouteTime[1], 1, 'round-2 prose routed before round-2 results');
|
|
182
|
+
// Locus resolved ONCE and pinned for the whole turn (incl. trailing prose)
|
|
183
|
+
assert.deepEqual(routed.map((r) => r.locus), ['chan-live-1', 'chan-live-1', 'chan-live-1'], 'one locus resolution, pinned across the turn');
|
|
184
|
+
await framework.stop();
|
|
185
|
+
});
|
|
186
|
+
it('sticky silencing: a silencing round suppresses its own and all later prose', async () => {
|
|
187
|
+
membrane.pushResponse(createMockResponse([
|
|
188
|
+
{ type: 'text', text: 'sending it directly' },
|
|
189
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'hi' } },
|
|
190
|
+
], 'tool_use'));
|
|
191
|
+
membrane.pushResponse(createMockResponse([
|
|
192
|
+
{ type: 'text', text: 'Narrating round two.' },
|
|
193
|
+
{ type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'up' } },
|
|
194
|
+
], 'tool_use'));
|
|
195
|
+
membrane.pushResponse(createMockResponse([]));
|
|
196
|
+
const framework = await createFramework();
|
|
197
|
+
const routed = stubChannelRegistry(framework);
|
|
198
|
+
trigger(framework);
|
|
199
|
+
await framework.runUntilIdle();
|
|
200
|
+
assert.deepEqual(routed.map((r) => r.text), [], 'explicit send in round 1 silences the turn from that round onward');
|
|
201
|
+
await framework.stop();
|
|
202
|
+
});
|
|
203
|
+
it('sticky silencing is forward-only: earlier rounds\' prose still routes', async () => {
|
|
204
|
+
membrane.pushResponse(createMockResponse([
|
|
205
|
+
{ type: 'text', text: 'Round one narration.' },
|
|
206
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'up' } },
|
|
207
|
+
], 'tool_use'));
|
|
208
|
+
membrane.pushResponse(createMockResponse([
|
|
209
|
+
{ type: 'text', text: 'private planning' },
|
|
210
|
+
{ type: 'tool_use', id: 'c2', name: 'robot--send_message', input: { text: 'hi' } },
|
|
211
|
+
], 'tool_use'));
|
|
212
|
+
membrane.pushResponse(createMockResponse([
|
|
213
|
+
{ type: 'text', text: 'trailing postscript' },
|
|
214
|
+
]));
|
|
215
|
+
const framework = await createFramework();
|
|
216
|
+
const routed = stubChannelRegistry(framework);
|
|
217
|
+
trigger(framework);
|
|
218
|
+
await framework.runUntilIdle();
|
|
219
|
+
assert.deepEqual(routed.map((r) => r.text), ['Round one narration.'], 'round-1 prose delivered live; round-2 (silencing) and trailing suppressed');
|
|
220
|
+
await framework.stop();
|
|
221
|
+
});
|
|
222
|
+
// -------------------------------------------------------------------------
|
|
223
|
+
// Hear-while-acting
|
|
224
|
+
// -------------------------------------------------------------------------
|
|
225
|
+
it('injects a mid-turn message into the resumed stream at the tool boundary', async () => {
|
|
226
|
+
membrane.pushResponse(createMockResponse([
|
|
227
|
+
{ type: 'text', text: 'Moving.' },
|
|
228
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
229
|
+
], 'tool_use'));
|
|
230
|
+
membrane.pushResponse(createMockResponse([
|
|
231
|
+
{ type: 'text', text: 'Heard you!' },
|
|
232
|
+
]));
|
|
233
|
+
const framework = await createFramework();
|
|
234
|
+
module.interjection = 'look left!';
|
|
235
|
+
trigger(framework);
|
|
236
|
+
await framework.runUntilIdle();
|
|
237
|
+
const stream = membrane.lastStream;
|
|
238
|
+
assert.equal(stream.receivedToolResults.length, 1);
|
|
239
|
+
const options = stream.receivedToolResultOptions[0];
|
|
240
|
+
assert.ok(options?.injectedMessages, 'tool-result resume carried injected messages');
|
|
241
|
+
assert.equal(options.injectedMessages.length, 1);
|
|
242
|
+
const injected = options.injectedMessages[0];
|
|
243
|
+
assert.equal(injected.participant, 'Antra');
|
|
244
|
+
const text = injected.content
|
|
245
|
+
.filter((b) => b.type === 'text')
|
|
246
|
+
.map((b) => b.text)
|
|
247
|
+
.join('\n');
|
|
248
|
+
assert.equal(text, 'look left!');
|
|
249
|
+
await framework.stop();
|
|
250
|
+
});
|
|
251
|
+
it('passes no injection options when nothing arrived mid-turn', async () => {
|
|
252
|
+
membrane.pushResponse(createMockResponse([
|
|
253
|
+
{ type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
|
|
254
|
+
], 'tool_use'));
|
|
255
|
+
membrane.pushResponse(createMockResponse([
|
|
256
|
+
{ type: 'text', text: 'done' },
|
|
257
|
+
]));
|
|
258
|
+
const framework = await createFramework();
|
|
259
|
+
trigger(framework);
|
|
260
|
+
await framework.runUntilIdle();
|
|
261
|
+
const stream = membrane.lastStream;
|
|
262
|
+
assert.equal(stream.receivedToolResults.length, 1);
|
|
263
|
+
assert.equal(stream.receivedToolResultOptions[0], undefined);
|
|
264
|
+
await framework.stop();
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
//# sourceMappingURL=present-while-acting.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"present-while-acting.test.js","sourceRoot":"","sources":["../../test/present-while-acting.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -118,6 +118,44 @@ describe('Trunk channel routing (item-3 redux)', () => {
|
|
|
118
118
|
assert.equal(i.derivePushEventChannel({ source: 'heartbeat', kind: 'tick' }), undefined);
|
|
119
119
|
await framework.stop();
|
|
120
120
|
});
|
|
121
|
+
it('adds an actionable invitation when addressed in a closed channel', async () => {
|
|
122
|
+
const framework = await makeFramework();
|
|
123
|
+
const i = internals(framework);
|
|
124
|
+
i.channelRegistry = {
|
|
125
|
+
ensureChannelRegistered: () => { },
|
|
126
|
+
isChannelOpen: () => false,
|
|
127
|
+
getDescriptor: () => ({ capabilities: { history: { maxMessages: 80 } } }),
|
|
128
|
+
stopAll: () => { },
|
|
129
|
+
};
|
|
130
|
+
i.handleMcplPushEvent({
|
|
131
|
+
type: 'mcpl:push-event',
|
|
132
|
+
serverId: 'discord',
|
|
133
|
+
featureSet: 'discord.messaging',
|
|
134
|
+
eventId: 'discord_msg_m1',
|
|
135
|
+
content: [{ type: 'text', text: 'Antra: can you look at this?' }],
|
|
136
|
+
origin: {
|
|
137
|
+
source: 'discord',
|
|
138
|
+
messageId: 'm1',
|
|
139
|
+
mcplChannelId: 'discord:G1:C7',
|
|
140
|
+
channelName: 'portables',
|
|
141
|
+
},
|
|
142
|
+
tags: ['chat:mention', 'chat:addressed'],
|
|
143
|
+
timestamp: new Date().toISOString(),
|
|
144
|
+
inferenceId: 'i1',
|
|
145
|
+
triggerInference: false,
|
|
146
|
+
});
|
|
147
|
+
const messages = framework.getAgent('scout').getContextManager().queryMessages({}).messages;
|
|
148
|
+
const text = messages.at(-1)?.content
|
|
149
|
+
.filter((block) => block.type === 'text')
|
|
150
|
+
.map((block) => block.text)
|
|
151
|
+
.join('\n') ?? '';
|
|
152
|
+
assert.match(text, /Channel invitation/);
|
|
153
|
+
assert.match(text, /channel_open/);
|
|
154
|
+
assert.match(text, /backscroll \(0-80\)/);
|
|
155
|
+
assert.match(text, /channel_decline/);
|
|
156
|
+
assert.match(text, /optionally set acknowledge/);
|
|
157
|
+
await framework.stop();
|
|
158
|
+
});
|
|
121
159
|
it('a channel-incoming trunk turn records its triggering channel', async () => {
|
|
122
160
|
membrane.pushResponse(createMockResponse([{ type: 'text', text: 'the date is ...' }]));
|
|
123
161
|
const framework = await makeFramework();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trunk-channel-routing.test.js","sourceRoot":"","sources":["../../test/trunk-channel-routing.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAE9E,oFAAoF;AACpF,SAAS,SAAS,CAAC,SAAyB;IAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"trunk-channel-routing.test.js","sourceRoot":"","sources":["../../test/trunk-channel-routing.test.ts"],"names":[],"mappings":"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"}
|