@animalabs/agent-framework 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -1
- package/dist/src/agent.d.ts +42 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +94 -0
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/server.d.ts +9 -0
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +156 -0
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/api/types.d.ts +15 -0
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/framework.d.ts +423 -5
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1906 -102
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +16 -0
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +41 -3
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +172 -0
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +444 -2
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +9 -0
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +71 -13
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +145 -0
- package/dist/src/modules/history/index.d.ts.map +1 -0
- package/dist/src/modules/history/index.js +1150 -0
- package/dist/src/modules/history/index.js.map +1 -0
- package/dist/src/modules/history/search-regex-worker.d.ts +23 -0
- package/dist/src/modules/history/search-regex-worker.d.ts.map +1 -0
- package/dist/src/modules/history/search-regex-worker.js +57 -0
- package/dist/src/modules/history/search-regex-worker.js.map +1 -0
- package/dist/src/modules/index.d.ts +1 -0
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -0
- package/dist/src/modules/index.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +42 -1
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +5 -0
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/operator-log.d.ts +78 -0
- package/dist/src/operator-log.d.ts.map +1 -0
- package/dist/src/operator-log.js +102 -0
- package/dist/src/operator-log.js.map +1 -0
- package/dist/src/recovery/discord-awareness-outbox.d.ts +10 -0
- package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
- package/dist/src/recovery/discord-awareness-outbox.js +20 -0
- package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
- package/dist/src/types/framework.d.ts +24 -0
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +40 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/agent-runtime-settings.test.js +199 -1
- package/dist/test/agent-runtime-settings.test.js.map +1 -1
- package/dist/test/api-admin-gate.test.d.ts +2 -0
- package/dist/test/api-admin-gate.test.d.ts.map +1 -0
- package/dist/test/api-admin-gate.test.js +116 -0
- package/dist/test/api-admin-gate.test.js.map +1 -0
- package/dist/test/channel-label-history.test.d.ts +2 -0
- package/dist/test/channel-label-history.test.d.ts.map +1 -0
- package/dist/test/channel-label-history.test.js +424 -0
- package/dist/test/channel-label-history.test.js.map +1 -0
- package/dist/test/discord-awareness-outbox.test.js +16 -0
- package/dist/test/discord-awareness-outbox.test.js.map +1 -1
- package/dist/test/event-gate.test.js +44 -0
- package/dist/test/event-gate.test.js.map +1 -1
- package/dist/test/helpers/quiesce-crash-child.d.ts +2 -0
- package/dist/test/helpers/quiesce-crash-child.d.ts.map +1 -0
- package/dist/test/helpers/quiesce-crash-child.js +156 -0
- package/dist/test/helpers/quiesce-crash-child.js.map +1 -0
- package/dist/test/history-module-overview.test.d.ts +2 -0
- package/dist/test/history-module-overview.test.d.ts.map +1 -0
- package/dist/test/history-module-overview.test.js +711 -0
- package/dist/test/history-module-overview.test.js.map +1 -0
- package/dist/test/history-module.test.d.ts +2 -0
- package/dist/test/history-module.test.d.ts.map +1 -0
- package/dist/test/history-module.test.js +595 -0
- package/dist/test/history-module.test.js.map +1 -0
- package/dist/test/host-quiesce.test.d.ts +2 -0
- package/dist/test/host-quiesce.test.d.ts.map +1 -0
- package/dist/test/host-quiesce.test.js +863 -0
- package/dist/test/host-quiesce.test.js.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.d.ts +2 -0
- package/dist/test/kv-unified-open-flight-retry.test.d.ts.map +1 -0
- package/dist/test/kv-unified-open-flight-retry.test.js +189 -0
- package/dist/test/kv-unified-open-flight-retry.test.js.map +1 -0
- package/dist/test/kv-unified-wiring.test.js +39 -0
- package/dist/test/kv-unified-wiring.test.js.map +1 -1
- package/dist/test/operator-surgery.test.d.ts +2 -0
- package/dist/test/operator-surgery.test.d.ts.map +1 -0
- package/dist/test/operator-surgery.test.js +398 -0
- package/dist/test/operator-surgery.test.js.map +1 -0
- package/dist/test/puppet-tool-call.test.js +118 -1
- package/dist/test/puppet-tool-call.test.js.map +1 -1
- package/dist/test/puppet-turn-reservation.test.d.ts +2 -0
- package/dist/test/puppet-turn-reservation.test.d.ts.map +1 -0
- package/dist/test/puppet-turn-reservation.test.js +139 -0
- package/dist/test/puppet-turn-reservation.test.js.map +1 -0
- package/dist/test/save-recent-image.test.js +29 -0
- package/dist/test/save-recent-image.test.js.map +1 -1
- package/dist/test/tool-result-spill.test.js +114 -0
- package/dist/test/tool-result-spill.test.js.map +1 -1
- package/dist/test/workspace-read-text.test.d.ts +2 -0
- package/dist/test/workspace-read-text.test.d.ts.map +1 -0
- package/dist/test/workspace-read-text.test.js +101 -0
- package/dist/test/workspace-read-text.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/agent.ts +110 -0
- package/src/api/server.ts +159 -2
- package/src/api/types.ts +15 -0
- package/src/framework.ts +2196 -115
- package/src/gate/event-gate.ts +47 -4
- package/src/index.ts +5 -1
- package/src/mcpl/channel-registry.ts +495 -2
- package/src/mcpl/server-connection.ts +73 -13
- package/src/modules/history/index.ts +1277 -0
- package/src/modules/history/search-regex-worker.ts +76 -0
- package/src/modules/index.ts +2 -0
- package/src/modules/workspace/index.ts +42 -1
- package/src/modules/workspace/types.ts +5 -0
- package/src/operator-log.ts +132 -0
- package/src/recovery/discord-awareness-outbox.ts +19 -0
- package/src/types/framework.ts +27 -0
- package/src/types/trace.ts +46 -0
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Live operator surgery: rollbackToMessage / suppressMessages on an OPEN
|
|
3
|
+
* store, and the durable operator-actions.jsonl record every operator
|
|
4
|
+
* mutation leaves behind.
|
|
5
|
+
*
|
|
6
|
+
* Asserted at the store seam (branch names, message counts on each branch,
|
|
7
|
+
* log file contents, operator:action traces) — no inference runs.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
10
|
+
import assert from 'node:assert/strict';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { AgentFramework, OperatorActionError, OperatorLog } from '../src/index.js';
|
|
15
|
+
import { MockMembrane } from './helpers/mock-membrane.js';
|
|
16
|
+
function readLog(path) {
|
|
17
|
+
if (!existsSync(path))
|
|
18
|
+
return [];
|
|
19
|
+
return readFileSync(path, 'utf8')
|
|
20
|
+
.split('\n')
|
|
21
|
+
.filter((l) => l.length > 0)
|
|
22
|
+
.map((l) => JSON.parse(l));
|
|
23
|
+
}
|
|
24
|
+
describe('live operator surgery', () => {
|
|
25
|
+
let tempDir;
|
|
26
|
+
let storePath;
|
|
27
|
+
let framework;
|
|
28
|
+
let membrane;
|
|
29
|
+
let traces;
|
|
30
|
+
let ids;
|
|
31
|
+
const cm = () => framework.getAgent('scout').getContextManager();
|
|
32
|
+
const remainingTexts = () => cm().getAllMessages().map((m) => m.content[0].text);
|
|
33
|
+
beforeEach(async () => {
|
|
34
|
+
tempDir = mkdtempSync(join(tmpdir(), 'operator-surgery-test-'));
|
|
35
|
+
storePath = join(tempDir, 'test.chronicle');
|
|
36
|
+
membrane = new MockMembrane();
|
|
37
|
+
framework = await AgentFramework.create({
|
|
38
|
+
storePath,
|
|
39
|
+
membrane: membrane.asMembrane(),
|
|
40
|
+
agents: [{ name: 'scout', model: 'test-model', systemPrompt: 'You are scout.' }],
|
|
41
|
+
modules: [],
|
|
42
|
+
});
|
|
43
|
+
traces = [];
|
|
44
|
+
framework.onTrace((e) => { traces.push(e); });
|
|
45
|
+
ids = [];
|
|
46
|
+
for (let i = 1; i <= 5; i++) {
|
|
47
|
+
ids.push(cm().addMessage(i % 2 ? 'user' : 'scout', [{ type: 'text', text: `m${i}` }], {
|
|
48
|
+
serverId: 'discord',
|
|
49
|
+
channelId: 'discord:g1:c1',
|
|
50
|
+
messageId: `d${i}`,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
afterEach(async () => {
|
|
55
|
+
await framework.stop();
|
|
56
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
57
|
+
});
|
|
58
|
+
it('defaults the operator log next to the store', () => {
|
|
59
|
+
assert.equal(framework.getOperatorLogPath(), join(storePath, 'operator-actions.jsonl'));
|
|
60
|
+
});
|
|
61
|
+
it('rollbackToMessage forks at the message, switches to the fork, keeps the source intact, logs', async () => {
|
|
62
|
+
const r = await framework.rollbackToMessage('scout', {
|
|
63
|
+
messageId: ids[2],
|
|
64
|
+
requester: { via: 'webui', name: 'antra' },
|
|
65
|
+
note: 'bad turn',
|
|
66
|
+
});
|
|
67
|
+
assert.equal(r.sourceBranch, 'main');
|
|
68
|
+
assert.match(r.targetBranch, /^rollback\/scout\/\d+$/);
|
|
69
|
+
assert.equal(r.messagesRemoved, 2);
|
|
70
|
+
assert.equal(r.removedRefs.length, 2, 'discord refs of the discarded messages are collected');
|
|
71
|
+
assert.equal(cm().currentBranch().name, r.targetBranch);
|
|
72
|
+
assert.deepEqual(remainingTexts(), ['m1', 'm2', 'm3']);
|
|
73
|
+
// The source branch still has everything.
|
|
74
|
+
await cm().switchBranch('main');
|
|
75
|
+
assert.deepEqual(remainingTexts(), ['m1', 'm2', 'm3', 'm4', 'm5']);
|
|
76
|
+
const log = readLog(framework.getOperatorLogPath());
|
|
77
|
+
const entry = log.find((e) => e.kind === 'rollback');
|
|
78
|
+
assert.ok(entry, 'rollback recorded in operator-actions.jsonl');
|
|
79
|
+
assert.equal(entry.agent, 'scout');
|
|
80
|
+
assert.deepEqual(entry.requester, { via: 'webui', name: 'antra' });
|
|
81
|
+
assert.equal(entry.note, 'bad turn');
|
|
82
|
+
assert.deepEqual(entry.params, { messageId: ids[2] });
|
|
83
|
+
assert.equal(entry.result?.messagesRemoved, 2);
|
|
84
|
+
assert.equal(entry.result?.targetBranch, r.targetBranch);
|
|
85
|
+
assert.ok(typeof entry.at === 'string' && !Number.isNaN(Date.parse(entry.at)));
|
|
86
|
+
const trace = traces.find((t) => t.type === 'operator:action' && t.kind === 'rollback');
|
|
87
|
+
assert.ok(trace, 'operator:action trace broadcast');
|
|
88
|
+
assert.equal(trace.agentName, 'scout');
|
|
89
|
+
});
|
|
90
|
+
it('rollback refuses the tail, unknown ids, and busy agents — and logs the refusal', async () => {
|
|
91
|
+
await assert.rejects(framework.rollbackToMessage('scout', { messageId: ids[4] }), (e) => e instanceof OperatorActionError && e.code === 'invalid');
|
|
92
|
+
await assert.rejects(framework.rollbackToMessage('scout', { messageId: 'nope' }), (e) => e instanceof OperatorActionError && e.code === 'unknown-message');
|
|
93
|
+
const agent = framework.getAgent('scout');
|
|
94
|
+
agent._state = { status: 'inferring' };
|
|
95
|
+
try {
|
|
96
|
+
await assert.rejects(framework.rollbackToMessage('scout', { messageId: ids[1] }), (e) => e instanceof OperatorActionError && e.code === 'agent-busy');
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
agent._state = { status: 'idle' };
|
|
100
|
+
}
|
|
101
|
+
assert.equal(cm().currentBranch().name, 'main', 'nothing moved');
|
|
102
|
+
assert.equal(cm().getMessageCount(), 5);
|
|
103
|
+
const errors = readLog(framework.getOperatorLogPath()).filter((e) => e.kind === 'rollback' && e.error);
|
|
104
|
+
assert.equal(errors.length, 3);
|
|
105
|
+
assert.match(errors[2].error, /Cannot roll back while scout is inferring/);
|
|
106
|
+
});
|
|
107
|
+
// --- store-wide exclusion ---------------------------------------------------
|
|
108
|
+
// A branch switch moves the active branch for EVERY context manager on the
|
|
109
|
+
// store; the gate must cover every agent, and hold across the await.
|
|
110
|
+
it('refuses surgery on an idle agent while a different agent sharing the store has a turn alive', async () => {
|
|
111
|
+
await framework.stop();
|
|
112
|
+
framework = await AgentFramework.create({
|
|
113
|
+
storePath,
|
|
114
|
+
membrane: new MockMembrane().asMembrane(),
|
|
115
|
+
agents: [
|
|
116
|
+
{ name: 'scout', model: 'test-model', systemPrompt: 'You are scout.' },
|
|
117
|
+
{ name: 'shade', model: 'test-model', systemPrompt: 'You are shade.' },
|
|
118
|
+
],
|
|
119
|
+
modules: [],
|
|
120
|
+
});
|
|
121
|
+
const tokens = framework.activeTurnTokens;
|
|
122
|
+
const shadeBefore = framework.getAgent('shade').getContextManager().getMessageCount();
|
|
123
|
+
tokens.set('shade', 7);
|
|
124
|
+
try {
|
|
125
|
+
await assert.rejects(framework.rollbackToMessage('scout', { messageId: ids[1] }), (e) => e instanceof OperatorActionError && e.code === 'agent-busy' && /shade is idle\+turn-alive/.test(e.message));
|
|
126
|
+
await assert.rejects(framework.suppressMessages('scout', { messageIds: [ids[1]] }), (e) => e instanceof OperatorActionError && e.code === 'agent-busy' && /shade/.test(e.message));
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
tokens.delete('shade');
|
|
130
|
+
}
|
|
131
|
+
assert.equal(cm().currentBranch().name, 'main', 'shared branch untouched');
|
|
132
|
+
assert.equal(framework.getAgent('shade').getContextManager().getMessageCount(), shadeBefore, "shade's history untouched");
|
|
133
|
+
// With shade idle the same call goes through — and the reservation is
|
|
134
|
+
// released afterwards (no token left behind on either agent).
|
|
135
|
+
const r = await framework.rollbackToMessage('scout', { messageId: ids[1] });
|
|
136
|
+
assert.equal(r.messagesRemoved, 3);
|
|
137
|
+
assert.equal(tokens.size, 0, 'store reservation released');
|
|
138
|
+
});
|
|
139
|
+
it('holds a turn token on every agent for the duration of the switch', async () => {
|
|
140
|
+
const tokens = framework.activeTurnTokens;
|
|
141
|
+
const c = cm();
|
|
142
|
+
const original = c.switchBranch;
|
|
143
|
+
let heldDuringSwitch = null;
|
|
144
|
+
c.switchBranch = async (name) => { heldDuringSwitch = tokens.size; return original.call(c, name); };
|
|
145
|
+
try {
|
|
146
|
+
await framework.rollbackToMessage('scout', { messageId: ids[2] });
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
c.switchBranch = original;
|
|
150
|
+
}
|
|
151
|
+
assert.equal(heldDuringSwitch, 1, 'reservation held while the switch was awaited');
|
|
152
|
+
assert.equal(tokens.size, 0, 'and released after');
|
|
153
|
+
});
|
|
154
|
+
it('holds the store against agents admitted AFTER the reservation: ephemeral admission is refused (ticket kept) and wakes are parked', async () => {
|
|
155
|
+
// Hold the awaited switch open so the surgery is mid-flight.
|
|
156
|
+
const c = cm();
|
|
157
|
+
const originalSwitch = c.switchBranch;
|
|
158
|
+
let releaseSwitch;
|
|
159
|
+
const gate = new Promise((resolve) => { releaseSwitch = resolve; });
|
|
160
|
+
c.switchBranch = async (name) => { await gate; return originalSwitch.call(c, name); };
|
|
161
|
+
// An ephemeral candidate: not in this.agents, so the token snapshot
|
|
162
|
+
// cannot cover it — this is the reviewer's dynamic-admission probe.
|
|
163
|
+
const worker = await framework.createEphemeralAgent({
|
|
164
|
+
name: 'worker', model: 'test-model', systemPrompt: 'Do the task.', allowedTools: 'all',
|
|
165
|
+
});
|
|
166
|
+
worker.contextManager.addMessage('user', [{ type: 'text', text: 'Run once.' }]);
|
|
167
|
+
const internals = framework;
|
|
168
|
+
try {
|
|
169
|
+
const rollback = framework.rollbackToMessage('scout', { messageId: ids[1] });
|
|
170
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
171
|
+
assert.ok(internals.surgeryHold, 'store hold is up while the switch is awaited');
|
|
172
|
+
await assert.rejects(framework.runEphemeralToCompletion(worker.agent, worker.contextManager), /under live roll back/);
|
|
173
|
+
assert.equal(internals.ephemeralCandidates.get(worker.agent), worker.contextManager, 'refused BEFORE consuming the generation ticket — a clean retry stays possible');
|
|
174
|
+
// A wake arriving now is parked by the scheduler, not started.
|
|
175
|
+
framework.nudgeAgent('scout', 'test');
|
|
176
|
+
await internals.processInferenceRequests();
|
|
177
|
+
assert.equal(membrane.calls.length, 0, 'no provider call while the store is held');
|
|
178
|
+
assert.ok(internals.pendingRequests.length >= 1, 'the wake is requeued for after the surgery');
|
|
179
|
+
releaseSwitch();
|
|
180
|
+
const r = await rollback;
|
|
181
|
+
assert.equal(r.messagesRemoved, 3);
|
|
182
|
+
assert.equal(internals.surgeryHold, null, 'hold released with the reservation');
|
|
183
|
+
assert.equal(membrane.calls.length, 0);
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
c.switchBranch = originalSwitch;
|
|
187
|
+
worker.cleanup();
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
// --- strategy-initialization failure -----------------------------------------
|
|
191
|
+
// switchBranch()/fork() move the chronicle branch BEFORE awaiting strategy
|
|
192
|
+
// initialization, so a rejection there leaves the store on the new branch.
|
|
193
|
+
const failNextStrategyInit = () => {
|
|
194
|
+
const c = cm();
|
|
195
|
+
const original = c.initializeStrategy;
|
|
196
|
+
let armed = true;
|
|
197
|
+
c.initializeStrategy = async function (...args) {
|
|
198
|
+
if (armed) {
|
|
199
|
+
armed = false;
|
|
200
|
+
throw new Error('injected strategy init failure');
|
|
201
|
+
}
|
|
202
|
+
return original.apply(this, args);
|
|
203
|
+
};
|
|
204
|
+
return () => { c.initializeStrategy = original; };
|
|
205
|
+
};
|
|
206
|
+
it('rollback restores the source branch when strategy initialization rejects after the switch', async () => {
|
|
207
|
+
const restore = failNextStrategyInit();
|
|
208
|
+
try {
|
|
209
|
+
await assert.rejects(framework.rollbackToMessage('scout', { messageId: ids[1], branchName: 'failed-rollback' }), (e) => e instanceof OperatorActionError && e.code === 'failed'
|
|
210
|
+
&& /active branch restored to main/.test(e.message) && /injected/.test(e.message));
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
restore();
|
|
214
|
+
}
|
|
215
|
+
assert.equal(cm().currentBranch().name, 'main');
|
|
216
|
+
assert.equal(cm().isReady(), true, 'strategy re-initialized on the source branch');
|
|
217
|
+
assert.deepEqual(remainingTexts(), ['m1', 'm2', 'm3', 'm4', 'm5']);
|
|
218
|
+
assert.ok(cm().listBranches().some((b) => b.name === 'failed-rollback'), 'failed branch kept for diagnosis');
|
|
219
|
+
const tokens = framework.activeTurnTokens;
|
|
220
|
+
assert.equal(tokens.size, 0);
|
|
221
|
+
});
|
|
222
|
+
it('suppress restores the source branch when fork() rejects after the switch', async () => {
|
|
223
|
+
const restore = failNextStrategyInit();
|
|
224
|
+
try {
|
|
225
|
+
await assert.rejects(framework.suppressMessages('scout', { messageIds: [ids[1]], branchName: 'failed-suppress' }), (e) => e instanceof OperatorActionError && e.code === 'failed'
|
|
226
|
+
&& /active branch restored to main/.test(e.message));
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
restore();
|
|
230
|
+
}
|
|
231
|
+
assert.equal(cm().currentBranch().name, 'main');
|
|
232
|
+
assert.equal(cm().isReady(), true);
|
|
233
|
+
assert.equal(cm().getMessageCount(), 5, 'nothing redacted anywhere visible');
|
|
234
|
+
const outbox = framework.discordAwarenessOutbox;
|
|
235
|
+
assert.equal(outbox.batches().filter((b) => b.status === 'prepared').length, 0);
|
|
236
|
+
});
|
|
237
|
+
it('suppressMessages forks at head, redacts only the chosen messages on the fork, logs', async () => {
|
|
238
|
+
const r = await framework.suppressMessages('scout', {
|
|
239
|
+
messageIds: [ids[1], ids[3], ids[3]],
|
|
240
|
+
requester: { via: 'webui', name: 'antra' },
|
|
241
|
+
});
|
|
242
|
+
assert.equal(r.sourceBranch, 'main');
|
|
243
|
+
assert.match(r.targetBranch, /^suppress\/scout\/\d+$/);
|
|
244
|
+
assert.equal(r.messagesRemoved, 2);
|
|
245
|
+
assert.deepEqual(new Set(r.removedIds), new Set([ids[1], ids[3]]));
|
|
246
|
+
assert.equal(cm().currentBranch().name, r.targetBranch);
|
|
247
|
+
assert.deepEqual(remainingTexts(), ['m1', 'm3', 'm5']);
|
|
248
|
+
await cm().switchBranch('main');
|
|
249
|
+
assert.deepEqual(remainingTexts(), ['m1', 'm2', 'm3', 'm4', 'm5'], 'source branch untouched');
|
|
250
|
+
const entry = readLog(framework.getOperatorLogPath()).find((e) => e.kind === 'suppress');
|
|
251
|
+
assert.ok(entry);
|
|
252
|
+
assert.deepEqual(entry.params, { messageIds: [ids[1], ids[3]] });
|
|
253
|
+
assert.deepEqual(new Set(entry.result?.removedIds), new Set([ids[1], ids[3]]));
|
|
254
|
+
});
|
|
255
|
+
it('suppress validates every id before mutating anything', async () => {
|
|
256
|
+
await assert.rejects(framework.suppressMessages('scout', { messageIds: [ids[0], 'ghost'] }), (e) => e instanceof OperatorActionError && e.code === 'unknown-message' && /ghost/.test(e.message));
|
|
257
|
+
await assert.rejects(framework.suppressMessages('scout', { messageIds: ids }), (e) => e instanceof OperatorActionError && e.code === 'invalid');
|
|
258
|
+
assert.equal(cm().currentBranch().name, 'main');
|
|
259
|
+
assert.equal(cm().listBranches().length, 1, 'no fork was created');
|
|
260
|
+
assert.equal(cm().getMessageCount(), 5);
|
|
261
|
+
});
|
|
262
|
+
it('host-command message-granular undo rides on rollbackToMessage and keeps its branch prefix', async () => {
|
|
263
|
+
const internals = framework;
|
|
264
|
+
const r = await internals.handleHostCommand('discord', {
|
|
265
|
+
command: 'undo',
|
|
266
|
+
agentName: 'scout',
|
|
267
|
+
messages: 2,
|
|
268
|
+
requesterName: 'antra',
|
|
269
|
+
});
|
|
270
|
+
assert.equal(r.ok, true);
|
|
271
|
+
assert.equal(r.messagesRemoved, 2);
|
|
272
|
+
assert.match(cm().currentBranch().name, /^undo-msgs\/scout\/\d+$/);
|
|
273
|
+
assert.deepEqual(remainingTexts(), ['m1', 'm2', 'm3']);
|
|
274
|
+
const entry = readLog(framework.getOperatorLogPath()).find((e) => e.kind === 'rollback');
|
|
275
|
+
assert.ok(entry);
|
|
276
|
+
assert.equal(entry.requester?.via, 'host-command:discord');
|
|
277
|
+
assert.equal(entry.requester?.name, 'antra');
|
|
278
|
+
});
|
|
279
|
+
const appendShards = (group, texts) => texts.map((text, shardIndex) => cm().messageStore
|
|
280
|
+
.append('user', [{ type: 'text', text }], {}, undefined, { bodyGroupId: group, shardIndex }).id);
|
|
281
|
+
it('suppress removes a whole body group from any shard id, and a single-shard group as a range', async () => {
|
|
282
|
+
// m1..m5 exist; add a 3-shard group then a plain message, then a 1-shard group.
|
|
283
|
+
const [g0, g1, g2] = appendShards('g3', ['s0', 's1', 's2']);
|
|
284
|
+
cm().addMessage('user', [{ type: 'text', text: 'after' }]);
|
|
285
|
+
const [lone] = appendShards('g1', ['lone']);
|
|
286
|
+
const before = cm().getMessageCount();
|
|
287
|
+
const r = await framework.suppressMessages('scout', { messageIds: [g1, lone] });
|
|
288
|
+
assert.equal(r.messagesRemoved, 4, 'middle shard expands to its 3-shard group; lone shard removed as a range');
|
|
289
|
+
assert.deepEqual(new Set(r.removedIds), new Set([g0, g1, g2, lone]));
|
|
290
|
+
assert.equal(cm().getMessageCount(), before - 4);
|
|
291
|
+
assert.deepEqual(remainingTexts().slice(-2), ['m5', 'after'], 'no partial run survives');
|
|
292
|
+
});
|
|
293
|
+
it('rollback never bisects a body group: a mid-group target snaps to the group tail', async () => {
|
|
294
|
+
const [s0, s1, s2] = appendShards('g3', ['s0', 's1', 's2']);
|
|
295
|
+
cm().addMessage('user', [{ type: 'text', text: 'after' }]);
|
|
296
|
+
const r = await framework.rollbackToMessage('scout', { messageId: s1 });
|
|
297
|
+
assert.equal(r.tailMessageId, s2, 'fork lands on the last shard');
|
|
298
|
+
assert.equal(r.messagesRemoved, 1, 'only the message after the group leaves');
|
|
299
|
+
assert.deepEqual(remainingTexts().slice(-3), ['s0', 's1', 's2']);
|
|
300
|
+
void s0;
|
|
301
|
+
});
|
|
302
|
+
// --- failure path ----------------------------------------------------------
|
|
303
|
+
it('a failed suppression restores the source branch, retires its outbox batch, and leaves the store bootable', async () => {
|
|
304
|
+
const c = cm();
|
|
305
|
+
const original = c.removeMessages;
|
|
306
|
+
c.removeMessages = () => { throw new Error('injected redaction failure'); };
|
|
307
|
+
try {
|
|
308
|
+
// A 2-shard group forces the range path (the injected failure).
|
|
309
|
+
const [s0] = appendShards('g2', ['x0', 'x1']);
|
|
310
|
+
await assert.rejects(framework.suppressMessages('scout', { messageIds: [s0] }), (e) => e instanceof OperatorActionError && e.code === 'failed'
|
|
311
|
+
&& /active branch restored to main/.test(e.message) && /injected/.test(e.message));
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
c.removeMessages = original;
|
|
315
|
+
}
|
|
316
|
+
assert.equal(cm().currentBranch().name, 'main');
|
|
317
|
+
const fork = cm().listBranches().find((b) => b.name.startsWith('suppress/'));
|
|
318
|
+
assert.ok(fork, 'the fork is kept for diagnosis');
|
|
319
|
+
const outbox = framework.discordAwarenessOutbox;
|
|
320
|
+
assert.equal(outbox.batches().filter((b) => b.status === 'prepared').length, 0, 'no armed batch left behind');
|
|
321
|
+
// The reproduction from review: open the failed fork, restart the host.
|
|
322
|
+
// Before the fix, the orphaned prepared batch re-ran the failed removal
|
|
323
|
+
// at boot and AgentFramework.create() threw.
|
|
324
|
+
await cm().switchBranch(fork.name);
|
|
325
|
+
await framework.stop();
|
|
326
|
+
framework = await AgentFramework.create({
|
|
327
|
+
storePath,
|
|
328
|
+
membrane: new MockMembrane().asMembrane(),
|
|
329
|
+
agents: [{ name: 'scout', model: 'test-model', systemPrompt: 'You are scout.' }],
|
|
330
|
+
modules: [],
|
|
331
|
+
});
|
|
332
|
+
assert.equal(cm().currentBranch().name, fork.name, 'host boots on the diagnostic branch');
|
|
333
|
+
});
|
|
334
|
+
it('the suppression outbox batch activates only after the last redaction', async () => {
|
|
335
|
+
const outbox = framework.discordAwarenessOutbox;
|
|
336
|
+
const c = cm();
|
|
337
|
+
const original = c.removeMessage;
|
|
338
|
+
const seen = [];
|
|
339
|
+
c.removeMessage = (id) => { seen.push(outbox.batches().map((b) => b.status)); original.call(c, id); };
|
|
340
|
+
try {
|
|
341
|
+
await framework.suppressMessages('scout', { messageIds: [ids[1], ids[3]] });
|
|
342
|
+
}
|
|
343
|
+
finally {
|
|
344
|
+
c.removeMessage = original;
|
|
345
|
+
}
|
|
346
|
+
assert.equal(seen.length, 2);
|
|
347
|
+
for (const statuses of seen)
|
|
348
|
+
assert.deepEqual(statuses, ['prepared'], 'still prepared while removals run');
|
|
349
|
+
assert.deepEqual(outbox.batches().map((b) => b.status), ['active']);
|
|
350
|
+
});
|
|
351
|
+
it("the idle gate also refuses 'idle+turn-alive' (turn token held, status idle)", async () => {
|
|
352
|
+
const tokens = framework.activeTurnTokens;
|
|
353
|
+
tokens.set('scout', 1);
|
|
354
|
+
try {
|
|
355
|
+
await assert.rejects(framework.rollbackToMessage('scout', { messageId: ids[1] }), (e) => e instanceof OperatorActionError && e.code === 'agent-busy' && /idle\+turn-alive/.test(e.message));
|
|
356
|
+
await assert.rejects(framework.suppressMessages('scout', { messageIds: [ids[1]] }), (e) => e instanceof OperatorActionError && e.code === 'agent-busy');
|
|
357
|
+
}
|
|
358
|
+
finally {
|
|
359
|
+
tokens.delete('scout');
|
|
360
|
+
}
|
|
361
|
+
assert.equal(cm().listBranches().length, 1);
|
|
362
|
+
});
|
|
363
|
+
it('nudge and settings changes are recorded; getOperatorLog reads newest-last', async () => {
|
|
364
|
+
framework.nudgeAgent('scout', 'host-console');
|
|
365
|
+
framework.updateAgentRuntimeSettings('scout', { contextBudgetTokens: 150_000 }, {
|
|
366
|
+
persist: false,
|
|
367
|
+
requester: { via: 'webui', name: 'antra' },
|
|
368
|
+
});
|
|
369
|
+
framework.recordOperatorAction({ kind: 'quiesce', requester: { via: 'webui' }, params: { reason: 'maintenance' } });
|
|
370
|
+
const log = framework.getOperatorLog({ limit: 10 });
|
|
371
|
+
assert.deepEqual(log.map((e) => e.kind), ['nudge', 'settings-update', 'quiesce']);
|
|
372
|
+
assert.equal(log[1].params?.persist, false);
|
|
373
|
+
assert.deepEqual(framework.getOperatorLog({ limit: 1 }).map((e) => e.kind), ['quiesce']);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('OperatorLog', () => {
|
|
377
|
+
it('creates parent directories, tolerates corrupt lines, and is inert when disabled', () => {
|
|
378
|
+
const dir = mkdtempSync(join(tmpdir(), 'operator-log-'));
|
|
379
|
+
try {
|
|
380
|
+
const path = join(dir, 'nested', 'deeper', 'ops.jsonl');
|
|
381
|
+
const log = new OperatorLog(path);
|
|
382
|
+
log.append({ kind: 'a' });
|
|
383
|
+
writeFileSync(path, '{not json\n', { flag: 'a' });
|
|
384
|
+
log.append({ kind: 'b', agent: 'x' });
|
|
385
|
+
assert.deepEqual(log.readTail().map((e) => e.kind), ['a', 'b']);
|
|
386
|
+
assert.deepEqual(log.readTail(1).map((e) => e.kind), ['b']);
|
|
387
|
+
const off = new OperatorLog(undefined);
|
|
388
|
+
assert.equal(off.enabled, false);
|
|
389
|
+
const entry = off.append({ kind: 'noop' });
|
|
390
|
+
assert.equal(entry.kind, 'noop');
|
|
391
|
+
assert.deepEqual(off.readTail(), []);
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
rmSync(dir, { recursive: true, force: true });
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
//# sourceMappingURL=operator-surgery.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-surgery.test.js","sourceRoot":"","sources":["../../test/operator-surgery.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,28 @@ function puppetHarness(opts) {
|
|
|
28
28
|
framework.agents =
|
|
29
29
|
new Map([['princess', agent]]);
|
|
30
30
|
framework.toolImageLedgers = new Map();
|
|
31
|
+
// Turn-alive machinery the puppet reserves through (#145).
|
|
32
|
+
const fw = framework;
|
|
33
|
+
fw.activeTurnTokens = new Map();
|
|
34
|
+
fw.nextTurnToken = 1;
|
|
35
|
+
fw.deferredMessages = [];
|
|
36
|
+
// Flushed-but-unsynced deferred writes (durable-queue ack bookkeeping);
|
|
37
|
+
// a prototype-built harness must seed it like the constructor does.
|
|
38
|
+
fw.unackedDeferredWrites = [];
|
|
39
|
+
fw.deferredSeq = 0;
|
|
40
|
+
fw.deferredScanFrom = new Map();
|
|
41
|
+
fw.pendingAssistantBlocks = new Map();
|
|
42
|
+
fw.primaryAgentName = 'princess';
|
|
43
|
+
// Cross-turn writer path (what a channel message goes through): defers
|
|
44
|
+
// while a turn is alive, else stores — the real guard, reduced.
|
|
45
|
+
fw.addMessage = (participant, content, _m, opts) => {
|
|
46
|
+
if (fw.activeTurnTokens.has('princess')) {
|
|
47
|
+
fw.deferredMessages.push({ participant, content, forAgent: opts?.forAgent });
|
|
48
|
+
return '';
|
|
49
|
+
}
|
|
50
|
+
stored.push({ participant, content });
|
|
51
|
+
return `msg-${stored.length}`;
|
|
52
|
+
};
|
|
31
53
|
framework.getToolsForAgent =
|
|
32
54
|
() => surface.map((name) => ({ name }));
|
|
33
55
|
framework.executeToolCall =
|
|
@@ -39,7 +61,22 @@ function puppetHarness(opts) {
|
|
|
39
61
|
() => ({ cap: undefined });
|
|
40
62
|
framework.emitTrace =
|
|
41
63
|
(e) => { traces.push(e); };
|
|
42
|
-
|
|
64
|
+
const turn = fw;
|
|
65
|
+
return { framework, stored, traces, executed, fw: turn };
|
|
66
|
+
}
|
|
67
|
+
/** A harness whose executeToolCall stays open until `release()` is called. */
|
|
68
|
+
function heldHarness() {
|
|
69
|
+
const h = puppetHarness();
|
|
70
|
+
let release;
|
|
71
|
+
const gate = new Promise((r) => { release = r; });
|
|
72
|
+
const executed = [];
|
|
73
|
+
h.framework.executeToolCall =
|
|
74
|
+
async (call) => {
|
|
75
|
+
executed.push(call);
|
|
76
|
+
await gate;
|
|
77
|
+
return { success: true, data: [{ type: 'text', text: 'done' }], isError: false };
|
|
78
|
+
};
|
|
79
|
+
return { ...h, executed, release };
|
|
43
80
|
}
|
|
44
81
|
test('puppetToolCall executes with agent provenance and stores the pair', async () => {
|
|
45
82
|
const { framework, stored, traces, executed } = puppetHarness();
|
|
@@ -104,4 +141,84 @@ test('puppetToolCall stores an error result as isError, still paired', async ()
|
|
|
104
141
|
console.log = quiet;
|
|
105
142
|
}
|
|
106
143
|
});
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// #145 — the idle guard is a point in time; the reservation must span the
|
|
146
|
+
// awaits, or a wake starts a turn underneath the pair.
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
test('puppetToolCall holds the turn-alive marker across tool execution and releases it after the pair is stored', async () => {
|
|
149
|
+
const { framework, stored, fw, release, executed } = heldHarness();
|
|
150
|
+
const quiet = console.log;
|
|
151
|
+
console.log = () => { };
|
|
152
|
+
try {
|
|
153
|
+
assert.equal(fw.activeTurnTokens.has('princess'), false, 'nothing reserved before the call');
|
|
154
|
+
const p = framework.puppetToolCall('princess', 'mcpl--eido--look', {});
|
|
155
|
+
await new Promise((r) => setImmediate(r));
|
|
156
|
+
assert.equal(executed.length, 1, 'tool is executing');
|
|
157
|
+
assert.equal(fw.activeTurnTokens.has('princess'), true, 'while the tool runs the agent is turn-alive — the scheduler requeues wakes on exactly this');
|
|
158
|
+
release();
|
|
159
|
+
await p;
|
|
160
|
+
assert.equal(fw.activeTurnTokens.has('princess'), false, 'released once the pair is stored');
|
|
161
|
+
assert.equal(stored.length, 2, 'the pair, stored directly');
|
|
162
|
+
assert.equal(stored[0].content[0].type, 'tool_use');
|
|
163
|
+
assert.equal(stored[1].content[0].type, 'tool_result');
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
console.log = quiet;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
test('puppetToolCall releases the reservation when the tool throws', async () => {
|
|
170
|
+
const { framework, fw } = puppetHarness();
|
|
171
|
+
framework.executeToolCall =
|
|
172
|
+
async () => { throw new Error('boom'); };
|
|
173
|
+
await assert.rejects(() => framework.puppetToolCall('princess', 'mcpl--eido--look', {}), /boom/);
|
|
174
|
+
assert.equal(fw.activeTurnTokens.has('princess'), false, 'no leaked token (the idle+turn-alive wedge)');
|
|
175
|
+
});
|
|
176
|
+
test('puppetToolCall refuses an idle agent whose turn is still alive (teardown pending)', async () => {
|
|
177
|
+
const { framework, stored, fw } = puppetHarness();
|
|
178
|
+
fw.activeTurnTokens.set('princess', 41);
|
|
179
|
+
await assert.rejects(() => framework.puppetToolCall('princess', 'mcpl--eido--look', {}), /idle\+turn-alive.*requires idle/);
|
|
180
|
+
assert.equal(stored.length, 0);
|
|
181
|
+
assert.equal(fw.activeTurnTokens.get('princess'), 41, 'someone else\'s token untouched');
|
|
182
|
+
});
|
|
183
|
+
test('a message arriving while the puppet holds the agent lands AFTER the pair, never between', async () => {
|
|
184
|
+
const { framework, stored, fw, release } = heldHarness();
|
|
185
|
+
const quiet = console.log;
|
|
186
|
+
console.log = () => { };
|
|
187
|
+
try {
|
|
188
|
+
const p = framework.puppetToolCall('princess', 'mcpl--eido--look', {});
|
|
189
|
+
await new Promise((r) => setImmediate(r));
|
|
190
|
+
// a channel message for the agent, mid-execution: the cross-turn writer defers
|
|
191
|
+
framework
|
|
192
|
+
.addMessage('user', [{ type: 'text', text: 'hey, you there?' }]);
|
|
193
|
+
assert.equal(stored.length, 0, 'deferred, not stored mid-puppet');
|
|
194
|
+
assert.equal(fw.deferredMessages.length, 1);
|
|
195
|
+
release();
|
|
196
|
+
await p;
|
|
197
|
+
assert.equal(fw.deferredMessages.length, 0, 'flushed at the puppet\'s end, like a turn\'s end');
|
|
198
|
+
assert.deepEqual(stored.map((m) => m.content[0].type), ['tool_use', 'tool_result', 'text'], 'pair first and adjacent; the deferred message follows');
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
console.log = quiet;
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
test('if a turn replaced the reservation mid-flight, the pair is queued as a unit behind it, not written into it', async () => {
|
|
205
|
+
const { framework, stored, traces, fw, release } = heldHarness();
|
|
206
|
+
const quiet = console.log;
|
|
207
|
+
console.log = () => { };
|
|
208
|
+
try {
|
|
209
|
+
const p = framework.puppetToolCall('princess', 'mcpl--eido--look', {});
|
|
210
|
+
await new Promise((r) => setImmediate(r));
|
|
211
|
+
// the provider-admission re-entry: a turn takes the marker without re-testing it
|
|
212
|
+
fw.activeTurnTokens.set('princess', 9999);
|
|
213
|
+
release();
|
|
214
|
+
await p;
|
|
215
|
+
assert.equal(stored.length, 0, 'nothing written under the live turn');
|
|
216
|
+
assert.equal(fw.activeTurnTokens.get('princess'), 9999, 'the turn\'s token is not clobbered');
|
|
217
|
+
assert.deepEqual(fw.deferredMessages.map((m) => [m.forAgent, m.content[0].type]), [['princess', 'tool_use'], ['princess', 'tool_result']], 'both halves queued, adjacent, addressed to the agent');
|
|
218
|
+
assert.equal(traces[0].deferred, true, 'trace says so');
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
console.log = quiet;
|
|
222
|
+
}
|
|
223
|
+
});
|
|
107
224
|
//# sourceMappingURL=puppet-tool-call.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"puppet-tool-call.test.js","sourceRoot":"","sources":["../../test/puppet-tool-call.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"puppet-tool-call.test.js","sourceRoot":"","sources":["../../test/puppet-tool-call.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppet-turn-reservation.test.d.ts","sourceRoot":"","sources":["../../test/puppet-turn-reservation.test.ts"],"names":[],"mappings":""}
|