@animalabs/agent-framework 0.15.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 +32 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +55 -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 +418 -3
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +1782 -68
- 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 +89 -13
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +655 -24
- package/dist/src/modules/history/index.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 +36 -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.js +146 -0
- package/dist/test/history-module.test.js.map +1 -1
- 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/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 +5 -0
- package/dist/test/puppet-tool-call.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/agent.ts +69 -0
- package/src/api/server.ts +159 -2
- package/src/api/types.ts +15 -0
- package/src/framework.ts +2081 -89
- 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 +689 -25
- 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 +42 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable channel-label history (mcpl/channel-label-history append log).
|
|
3
|
+
*
|
|
4
|
+
* `resolveProseTarget()` resolves a label to a channel id only against the
|
|
5
|
+
* live `channels` map, which is empty for anything the bot has disconnected
|
|
6
|
+
* from or that hasn't re-registered since a restart. `appendLabelSighting()`
|
|
7
|
+
* durably records "this channelId had this label" on every descriptor
|
|
8
|
+
* observation, and `resolveProseTargetDurable()` falls back to that history
|
|
9
|
+
* when the live path misses — the case that matters for browsing message
|
|
10
|
+
* history on an old/quiet/disconnected channel.
|
|
11
|
+
*/
|
|
12
|
+
import { test } from 'node:test';
|
|
13
|
+
import assert from 'node:assert/strict';
|
|
14
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { JsStore } from '@animalabs/chronicle';
|
|
18
|
+
import { ChannelRegistry } from '../src/mcpl/channel-registry.js';
|
|
19
|
+
const CHANNEL_LABEL_HISTORY_LOG_ID = 'mcpl/channel-label-history';
|
|
20
|
+
function makeRegistry(store) {
|
|
21
|
+
const serverRegistry = {
|
|
22
|
+
getServer: (_id) => null,
|
|
23
|
+
};
|
|
24
|
+
return new ChannelRegistry(serverRegistry, {}, () => { }, () => { }, store ? { store: store } : undefined);
|
|
25
|
+
}
|
|
26
|
+
/** In-memory Chronicle-store stand-in, keyed by state id (unlike a single
|
|
27
|
+
* flat array) so the lifecycle log and the label-history log don't bleed
|
|
28
|
+
* into each other's getStateJson()/appendToStateJson() results. */
|
|
29
|
+
function memoryStore() {
|
|
30
|
+
const registered = new Set();
|
|
31
|
+
const events = new Map();
|
|
32
|
+
const store = {
|
|
33
|
+
registerState: (opts) => {
|
|
34
|
+
if (registered.has(opts.id))
|
|
35
|
+
throw new Error('State already exists');
|
|
36
|
+
registered.add(opts.id);
|
|
37
|
+
if (!events.has(opts.id))
|
|
38
|
+
events.set(opts.id, []);
|
|
39
|
+
},
|
|
40
|
+
getStateJson: (id) => events.get(id) ?? null,
|
|
41
|
+
appendToStateJson: (id, event) => {
|
|
42
|
+
if (!events.has(id))
|
|
43
|
+
events.set(id, []);
|
|
44
|
+
events.get(id).push(event);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
return { store, events };
|
|
48
|
+
}
|
|
49
|
+
function descriptor(id, label) {
|
|
50
|
+
return { id, type: 'discord', label, direction: 'bidirectional' };
|
|
51
|
+
}
|
|
52
|
+
function dmDescriptor(id, label, opts = {}) {
|
|
53
|
+
return {
|
|
54
|
+
id,
|
|
55
|
+
type: 'discord',
|
|
56
|
+
label,
|
|
57
|
+
direction: 'bidirectional',
|
|
58
|
+
metadata: {
|
|
59
|
+
channelType: opts.channelType ?? 'dm',
|
|
60
|
+
...(opts.recipientId ? { recipientId: opts.recipientId } : {}),
|
|
61
|
+
...(opts.recipientName ? { recipientName: opts.recipientName } : {}),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
test('a label sighting persists across a simulated restart', async () => {
|
|
66
|
+
const dir = mkdtempSync(join(tmpdir(), 'channel-label-history-'));
|
|
67
|
+
try {
|
|
68
|
+
const store = JsStore.openOrCreate({ path: join(dir, 'store') });
|
|
69
|
+
const first = makeRegistry(store);
|
|
70
|
+
await first.handleRegister('discord', {
|
|
71
|
+
channels: [descriptor('discord:g1:c1', "#general (Antra's Guild)")],
|
|
72
|
+
});
|
|
73
|
+
// Fresh registry over the SAME store, like a real restart — its live
|
|
74
|
+
// `channels` map starts empty (no handleRegister call this time), so
|
|
75
|
+
// resolveProseTarget() alone cannot see this channel at all.
|
|
76
|
+
const second = makeRegistry(store);
|
|
77
|
+
const liveMiss = second.resolveProseTarget("#general (Antra's Guild)");
|
|
78
|
+
assert.ok('error' in liveMiss, 'expected a live-path miss on a fresh registry');
|
|
79
|
+
// resolveProseTargetDurable() falls back to replayed history and finds it.
|
|
80
|
+
assert.deepEqual(second.resolveProseTargetDurable("#general (Antra's Guild)"), { channelId: 'discord:g1:c1', label: "#general (Antra's Guild)" });
|
|
81
|
+
// Name-segment match (bare name, parenthetical guild suffix omitted)
|
|
82
|
+
// mirrors resolveProseTarget()'s own byName normalization.
|
|
83
|
+
assert.deepEqual(second.resolveProseTargetDurable('#general'), { channelId: 'discord:g1:c1', label: "#general (Antra's Guild)" });
|
|
84
|
+
// Raw channelId also resolves, like resolveProseTarget()'s raw-id path.
|
|
85
|
+
assert.deepEqual(second.resolveProseTargetDurable('discord:g1:c1'), { channelId: 'discord:g1:c1', label: "#general (Antra's Guild)" });
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
rmSync(dir, { recursive: true, force: true });
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
test('repeated identical label sightings do not bloat the log', async () => {
|
|
92
|
+
const { store, events } = memoryStore();
|
|
93
|
+
const registry = makeRegistry(store);
|
|
94
|
+
for (let i = 0; i < 3; i++) {
|
|
95
|
+
await registry.handleRegister('discord', {
|
|
96
|
+
channels: [descriptor('discord:g1:c1', '#general')],
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const log = events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? [];
|
|
100
|
+
assert.equal(log.length, 1, 'unchanged sightings must not append new records');
|
|
101
|
+
});
|
|
102
|
+
test('a genuinely new label sighting does append a new record', async () => {
|
|
103
|
+
const { store, events } = memoryStore();
|
|
104
|
+
const registry = makeRegistry(store);
|
|
105
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:c1', '#general')] });
|
|
106
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:c1', '#general-renamed')] });
|
|
107
|
+
const log = events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? [];
|
|
108
|
+
assert.equal(log.length, 2);
|
|
109
|
+
// Later sighting wins on replay.
|
|
110
|
+
const second = makeRegistry(store);
|
|
111
|
+
assert.deepEqual(second.resolveProseTargetDurable('#general-renamed'), {
|
|
112
|
+
channelId: 'discord:g1:c1',
|
|
113
|
+
label: '#general-renamed',
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
test('resolveProseTargetDurable prefers the live path and only falls back to history on a live miss', async () => {
|
|
117
|
+
const { store, events } = memoryStore();
|
|
118
|
+
// Pre-seed history: a DIFFERENT (now-disconnected) channel historically
|
|
119
|
+
// held the same label text that a currently-live channel holds now.
|
|
120
|
+
events.set(CHANNEL_LABEL_HISTORY_LOG_ID, [
|
|
121
|
+
{ channelId: 'discord:g1:ghost', label: 'shared-label', ts: 1 },
|
|
122
|
+
]);
|
|
123
|
+
const registry = makeRegistry(store);
|
|
124
|
+
await registry.handleRegister('discord', {
|
|
125
|
+
channels: [descriptor('discord:g1:live', 'shared-label')],
|
|
126
|
+
});
|
|
127
|
+
// Live path resolves uniquely against the live channel — must win over
|
|
128
|
+
// the (stale) history entry for the ghost channel.
|
|
129
|
+
const live = registry.resolveProseTarget('shared-label');
|
|
130
|
+
assert.deepEqual(live, { channelId: 'discord:g1:live', label: 'shared-label' });
|
|
131
|
+
assert.deepEqual(registry.resolveProseTargetDurable('shared-label'), live);
|
|
132
|
+
});
|
|
133
|
+
test('a channel with no history at all still returns the original resolveProseTarget error/candidates unchanged', async () => {
|
|
134
|
+
const registry = makeRegistry(); // no chronicle store at all — appendLabelSighting must no-op safely
|
|
135
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:c1', '#other')] });
|
|
136
|
+
const live = registry.resolveProseTarget('#nonexistent');
|
|
137
|
+
assert.ok('error' in live);
|
|
138
|
+
const durable = registry.resolveProseTargetDurable('#nonexistent');
|
|
139
|
+
assert.deepEqual(durable, live);
|
|
140
|
+
// Also true for an entirely empty registry (no channels ever seen).
|
|
141
|
+
const empty = makeRegistry();
|
|
142
|
+
const liveEmpty = empty.resolveProseTarget('#anything');
|
|
143
|
+
assert.deepEqual(empty.resolveProseTargetDurable('#anything'), liveEmpty);
|
|
144
|
+
});
|
|
145
|
+
test('ensureChannelRegistered and handleChanged updates also feed label history', async () => {
|
|
146
|
+
const { store, events } = memoryStore();
|
|
147
|
+
const registry = makeRegistry(store);
|
|
148
|
+
// ensureChannelRegistered: lazy registration with NO label at all (e.g. a
|
|
149
|
+
// DM push missing both channelName and an author name). This must NOT be
|
|
150
|
+
// durably recorded as if the bare channelId were a real label (finding
|
|
151
|
+
// #3) — only the in-memory descriptor gets the placeholder, for live
|
|
152
|
+
// routing purposes.
|
|
153
|
+
registry.ensureChannelRegistered('discord', 'discord:dm:1', undefined);
|
|
154
|
+
// ...then a later message reveals a real label — the backfill path.
|
|
155
|
+
registry.ensureChannelRegistered('discord', 'discord:dm:1', 'DM: Antra');
|
|
156
|
+
// handleChanged: an "added" channel, then an "updated" descriptor for it.
|
|
157
|
+
await registry.handleChanged('discord', {
|
|
158
|
+
added: [descriptor('discord:g1:c2', '#dev')],
|
|
159
|
+
});
|
|
160
|
+
await registry.handleChanged('discord', {
|
|
161
|
+
updated: [descriptor('discord:g1:c2', '#dev-renamed')],
|
|
162
|
+
});
|
|
163
|
+
const restarted = makeRegistry(store);
|
|
164
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('DM: Antra'), {
|
|
165
|
+
channelId: 'discord:dm:1',
|
|
166
|
+
label: 'DM: Antra',
|
|
167
|
+
});
|
|
168
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('#dev-renamed'), {
|
|
169
|
+
channelId: 'discord:g1:c2',
|
|
170
|
+
label: '#dev-renamed',
|
|
171
|
+
});
|
|
172
|
+
const log = events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? [];
|
|
173
|
+
// discord:dm:1: the label-less lazy registration records NOTHING (fix
|
|
174
|
+
// #3), only the backfill ('DM: Antra') does = 1 record; discord:g1:c2
|
|
175
|
+
// added ('#dev') then updated ('#dev-renamed') = 2 records. Total 3, not
|
|
176
|
+
// the 4 a placeholder-recording implementation would produce.
|
|
177
|
+
assert.equal(log.length, 3);
|
|
178
|
+
});
|
|
179
|
+
test('a label-less lazy registration alone (no later backfill) records nothing durably (finding #3)', async () => {
|
|
180
|
+
const { store, events } = memoryStore();
|
|
181
|
+
const registry = makeRegistry(store);
|
|
182
|
+
registry.ensureChannelRegistered('discord', 'discord:dm:2', undefined);
|
|
183
|
+
const log = events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? [];
|
|
184
|
+
assert.equal(log.length, 0, 'a placeholder label (bare channelId) must never be durably recorded');
|
|
185
|
+
});
|
|
186
|
+
test('a label-less lazy re-registration after restart does not clobber an already-durable real label (finding #3)', async () => {
|
|
187
|
+
const { store, events } = memoryStore();
|
|
188
|
+
const first = makeRegistry(store);
|
|
189
|
+
// Boot 1: a real label lands on file (e.g. a DM push that DID carry a
|
|
190
|
+
// display name).
|
|
191
|
+
first.ensureChannelRegistered('discord', 'discord:dm:3', 'DM: Antra');
|
|
192
|
+
assert.equal((events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? []).length, 1);
|
|
193
|
+
// Simulated restart: fresh registry, live `channels` map starts empty —
|
|
194
|
+
// this is exactly the state that makes the NEXT event take the
|
|
195
|
+
// fresh-registration branch of ensureChannelRegistered again, even
|
|
196
|
+
// though the channel already has a real label on file.
|
|
197
|
+
const second = makeRegistry(store);
|
|
198
|
+
assert.deepEqual(second.resolveProseTargetDurable('DM: Antra'), {
|
|
199
|
+
channelId: 'discord:dm:3',
|
|
200
|
+
label: 'DM: Antra',
|
|
201
|
+
});
|
|
202
|
+
// A label-less push arrives post-restart. This used to durably overwrite
|
|
203
|
+
// the real label with the bare-id placeholder, and the dedup guard would
|
|
204
|
+
// then append a SECOND record the moment a later event restored the real
|
|
205
|
+
// label — degrading the log forever on every boot that hit this path.
|
|
206
|
+
second.ensureChannelRegistered('discord', 'discord:dm:3', undefined);
|
|
207
|
+
assert.deepEqual(second.resolveProseTargetDurable('DM: Antra'), {
|
|
208
|
+
channelId: 'discord:dm:3',
|
|
209
|
+
label: 'DM: Antra',
|
|
210
|
+
});
|
|
211
|
+
assert.equal((events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? []).length, 1, 'a label-less event must not durably record a placeholder over an already-known real label');
|
|
212
|
+
});
|
|
213
|
+
test('a label-less descriptor from handleRegister does not crash and does not poison labelHistory (finding #2)', async () => {
|
|
214
|
+
const { store } = memoryStore();
|
|
215
|
+
const registry = makeRegistry(store);
|
|
216
|
+
// ChannelDescriptor.label: string is a compile-time-only assertion over
|
|
217
|
+
// untrusted wire data — handleRegister only runtime-validates `id`. Build
|
|
218
|
+
// a descriptor with a missing label the way a misbehaving MCPL server
|
|
219
|
+
// could actually send one.
|
|
220
|
+
const labelless = { id: 'discord:g1:broken', type: 'discord', direction: 'bidirectional' };
|
|
221
|
+
await registry.handleRegister('discord', { channels: [labelless] });
|
|
222
|
+
// A subsequent, UNRELATED resolution call must still work — before the
|
|
223
|
+
// fix, an undefined label silently written into labelHistory threw a
|
|
224
|
+
// TypeError inside normalizeChannelLabel's `.replace()` on every future
|
|
225
|
+
// resolveProseTargetDurable call with a channelId, not just this one
|
|
226
|
+
// (this is what made it crash all four HistoryModule tools process-wide).
|
|
227
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:c2', '#general')] });
|
|
228
|
+
assert.deepEqual(registry.resolveProseTargetDurable('#general'), {
|
|
229
|
+
channelId: 'discord:g1:c2',
|
|
230
|
+
label: '#general',
|
|
231
|
+
});
|
|
232
|
+
assert.doesNotThrow(() => registry.resolveProseTargetDurable('#anything-else'));
|
|
233
|
+
});
|
|
234
|
+
test('a channel renamed A -> B -> A is still resolvable by a name from BEFORE the most recent rename (finding #9)', async () => {
|
|
235
|
+
const { store } = memoryStore();
|
|
236
|
+
const registry = makeRegistry(store);
|
|
237
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:c1', '#alpha')] });
|
|
238
|
+
await registry.handleChanged('discord', { updated: [descriptor('discord:g1:c1', '#beta')] });
|
|
239
|
+
await registry.handleChanged('discord', { updated: [descriptor('discord:g1:c1', '#alpha')] });
|
|
240
|
+
// Live-path check: '#alpha' is current again, so it resolves live.
|
|
241
|
+
assert.deepEqual(registry.resolveProseTarget('#alpha'), { channelId: 'discord:g1:c1', label: '#alpha' });
|
|
242
|
+
// The interesting case: '#beta' is a name from BEFORE the most recent
|
|
243
|
+
// rename (A -> B -> A), not the current OR immediately-previous label —
|
|
244
|
+
// labelHistory alone (latest-only) could never answer this; it needs
|
|
245
|
+
// allLabelsSeen's full per-channel history.
|
|
246
|
+
const restarted = makeRegistry(store);
|
|
247
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('#beta'), {
|
|
248
|
+
channelId: 'discord:g1:c1',
|
|
249
|
+
label: '#alpha', // reported label is always the CURRENT/latest one
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
test('a genuine label collision across two different channels reports ambiguity, not a silent pick (finding #9)', async () => {
|
|
253
|
+
const { store } = memoryStore();
|
|
254
|
+
const registry = makeRegistry(store);
|
|
255
|
+
// Two DIFFERENT channels each historically held the label '#shared' —
|
|
256
|
+
// channel a's label has since moved on, channel b's has not.
|
|
257
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:a', '#shared')] });
|
|
258
|
+
await registry.handleChanged('discord', { updated: [descriptor('discord:g1:a', '#a-current')] });
|
|
259
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:b', '#shared')] });
|
|
260
|
+
// A fresh (post-restart) registry — live path can't shortcut this to a
|
|
261
|
+
// unique live match, so resolution goes through the historical-label
|
|
262
|
+
// scan that must detect the collision across the two distinct channelIds.
|
|
263
|
+
const restarted = makeRegistry(store);
|
|
264
|
+
const result = restarted.resolveProseTargetDurable('#shared');
|
|
265
|
+
assert.ok('error' in result, `expected an ambiguity error, got ${JSON.stringify(result)}`);
|
|
266
|
+
});
|
|
267
|
+
test("durable DM resolution keeps the live resolver's recipientName-over-label precedence, not a flat equal-priority pool (finding: false ambiguity across two channels)", async () => {
|
|
268
|
+
// Two fully-recorded DMs whose identity data happens to cross-reference:
|
|
269
|
+
// A's actual username is 'alpha_user', but its stale/leftover display
|
|
270
|
+
// label is 'DM: beta_user'; B's actual username IS 'beta_user', with an
|
|
271
|
+
// unrelated display label. Live, '@beta_user' resolves uniquely to B —
|
|
272
|
+
// the live resolver prefers recipientName outright and never considers
|
|
273
|
+
// A's label a candidate at all. A flat "equal priority" pool of
|
|
274
|
+
// recipientName+label candidates made this falsely ambiguous after a
|
|
275
|
+
// restart (both A's label and B's recipientName satisfied the same
|
|
276
|
+
// query), even though the persisted recipientName data was sufficient on
|
|
277
|
+
// its own to resolve it uniquely, exactly like the live path does.
|
|
278
|
+
const { store } = memoryStore();
|
|
279
|
+
const registry = makeRegistry(store);
|
|
280
|
+
await registry.handleRegister('discord', {
|
|
281
|
+
channels: [
|
|
282
|
+
dmDescriptor('discord:dm:A', 'DM: beta_user', { recipientId: 'a', recipientName: 'alpha_user' }),
|
|
283
|
+
dmDescriptor('discord:dm:B', 'DM: unrelated-label', { recipientId: 'b', recipientName: 'beta_user' }),
|
|
284
|
+
],
|
|
285
|
+
});
|
|
286
|
+
const restarted = makeRegistry(store);
|
|
287
|
+
const resolved = restarted.resolveProseTargetDurable('@beta_user');
|
|
288
|
+
assert.ok('channelId' in resolved, `expected a unique resolution, got ${JSON.stringify(resolved)}`);
|
|
289
|
+
assert.equal(resolved.channelId, 'discord:dm:B');
|
|
290
|
+
// The label-derived fallback for a channel WITHOUT a competing
|
|
291
|
+
// recipientName match still works (recipientName tier only blocks the
|
|
292
|
+
// label tier when it actually resolves the query, not unconditionally) —
|
|
293
|
+
// '@unrelated-label' isn't anyone's recipientName, so it should still
|
|
294
|
+
// resolve to B via B's own label.
|
|
295
|
+
const byLabel = restarted.resolveProseTargetDurable('@unrelated-label');
|
|
296
|
+
assert.ok('channelId' in byLabel, `expected B's own label to still resolve it, got ${JSON.stringify(byLabel)}`);
|
|
297
|
+
assert.equal(byLabel.channelId, 'discord:dm:B');
|
|
298
|
+
});
|
|
299
|
+
test('a DM registered live resolves after a restart via @name, not just the literal stored label (DM-addressing regression)', async () => {
|
|
300
|
+
const { store } = memoryStore();
|
|
301
|
+
const first = makeRegistry(store);
|
|
302
|
+
await first.handleRegister('discord', {
|
|
303
|
+
channels: [dmDescriptor('discord:dm:antra', 'DM: antra', { recipientId: '123456789' })],
|
|
304
|
+
});
|
|
305
|
+
// Live check: '@antra' already resolves live, before any restart —
|
|
306
|
+
// establishes this is real DM-shaped addressing, not a coincidence.
|
|
307
|
+
assert.deepEqual(first.resolveProseTarget('@antra'), {
|
|
308
|
+
channelId: 'discord:dm:antra',
|
|
309
|
+
label: 'DM: antra',
|
|
310
|
+
});
|
|
311
|
+
// Simulated restart: fresh registry, live `channels` map starts empty —
|
|
312
|
+
// resolveProseTarget() alone can no longer see this DM at all.
|
|
313
|
+
const restarted = makeRegistry(store);
|
|
314
|
+
const liveMiss = restarted.resolveProseTarget('@antra');
|
|
315
|
+
assert.ok('error' in liveMiss, 'expected a live-path miss on a fresh registry');
|
|
316
|
+
// The durable fallback must still resolve '@antra' — normalizeChannelLabel
|
|
317
|
+
// alone (its previous only tool) has no '@'-handling at all, so this used
|
|
318
|
+
// to fail silently before falling through to resolveProseTarget's
|
|
319
|
+
// original (post-#8-fix: now HARD-thrown from HistoryModule) error.
|
|
320
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('@antra'), {
|
|
321
|
+
channelId: 'discord:dm:antra',
|
|
322
|
+
label: 'DM: antra',
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
test('a DM registered live resolves after a restart via the <@id> mention form (recipientId persisted durably)', async () => {
|
|
326
|
+
const { store } = memoryStore();
|
|
327
|
+
const first = makeRegistry(store);
|
|
328
|
+
await first.handleRegister('discord', {
|
|
329
|
+
channels: [dmDescriptor('discord:dm:antra', 'DM: antra', { recipientId: '123456789' })],
|
|
330
|
+
});
|
|
331
|
+
const restarted = makeRegistry(store);
|
|
332
|
+
assert.ok('error' in restarted.resolveProseTarget('<@123456789>'), 'expected a live-path miss on a fresh registry');
|
|
333
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('<@123456789>'), {
|
|
334
|
+
channelId: 'discord:dm:antra',
|
|
335
|
+
label: 'DM: antra',
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
test('a bare (non-DM-metadata) channel whose id merely contains ":dm:" is still DM-matched by @name after a restart', async () => {
|
|
339
|
+
// Exercises the id-shape half of isDmChannelId() independently of the
|
|
340
|
+
// 'DM: ' label-prefix half — a descriptor with no metadata.channelType
|
|
341
|
+
// at all, the way ensureChannelRegistered's lazy DM path (no server
|
|
342
|
+
// metadata yet) actually looks.
|
|
343
|
+
const { store } = memoryStore();
|
|
344
|
+
const first = makeRegistry(store);
|
|
345
|
+
first.ensureChannelRegistered('discord', 'discord:dm:5', 'DM: ghost');
|
|
346
|
+
const restarted = makeRegistry(store);
|
|
347
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('@ghost'), {
|
|
348
|
+
channelId: 'discord:dm:5',
|
|
349
|
+
label: 'DM: ghost',
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
test('a DM whose live username differs from its display label resolves by USERNAME after a restart (finding: recipientName persistence)', async () => {
|
|
353
|
+
// id `discord:dm:42`, label "DM: Tess" — but the actual live resolver
|
|
354
|
+
// prefers metadata.recipientName ("antra_tessera") over the label for
|
|
355
|
+
// DM name-matching, so '@antra_tessera' must resolve live, and the
|
|
356
|
+
// durable fallback (which previously only had the label "Tess" to
|
|
357
|
+
// search) needs recipientName persisted to answer it too.
|
|
358
|
+
const { store } = memoryStore();
|
|
359
|
+
const first = makeRegistry(store);
|
|
360
|
+
await first.handleRegister('discord', {
|
|
361
|
+
channels: [dmDescriptor('discord:dm:42', 'DM: Tess', { recipientName: 'antra_tessera' })],
|
|
362
|
+
});
|
|
363
|
+
// Live check: the live resolver already prefers recipientName over the
|
|
364
|
+
// label for DM matching — establishes this is real behavior to mirror,
|
|
365
|
+
// not an invented requirement.
|
|
366
|
+
assert.deepEqual(first.resolveProseTarget('@antra_tessera'), {
|
|
367
|
+
channelId: 'discord:dm:42',
|
|
368
|
+
label: 'DM: Tess',
|
|
369
|
+
});
|
|
370
|
+
const restarted = makeRegistry(store);
|
|
371
|
+
const liveMiss = restarted.resolveProseTarget('@antra_tessera');
|
|
372
|
+
assert.ok('error' in liveMiss, 'expected a live-path miss on a fresh registry');
|
|
373
|
+
// Durable fallback must resolve it by USERNAME, not just by the label text.
|
|
374
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('@antra_tessera'), {
|
|
375
|
+
channelId: 'discord:dm:42',
|
|
376
|
+
label: 'DM: Tess',
|
|
377
|
+
});
|
|
378
|
+
// The label-derived name ("tess") must still work too — recipientName is
|
|
379
|
+
// additive, not a replacement for the label fallback.
|
|
380
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('@tess'), {
|
|
381
|
+
channelId: 'discord:dm:42',
|
|
382
|
+
label: 'DM: Tess',
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
test('a DM classified only via metadata.channelType (non-conventional id/label) is still recognized and resolvable after a restart (finding: isDm persistence)', async () => {
|
|
386
|
+
// id `private-room-42` (no ":dm:"), label "Tess" (no "DM: " prefix) — the
|
|
387
|
+
// ONLY signal this is a DM at all is metadata.channelType === 'dm',
|
|
388
|
+
// which the live resolver checks FIRST. Without persisting that
|
|
389
|
+
// classification, the durable fallback's DM classifier has no way to
|
|
390
|
+
// even consider this channel a DM once disconnected, let alone resolve
|
|
391
|
+
// a <@id> mention against it.
|
|
392
|
+
const { store } = memoryStore();
|
|
393
|
+
const first = makeRegistry(store);
|
|
394
|
+
await first.handleRegister('discord', {
|
|
395
|
+
channels: [dmDescriptor('private-room-42', 'Tess', { recipientId: '42', channelType: 'dm' })],
|
|
396
|
+
});
|
|
397
|
+
// Live check: classified as a DM live via metadata alone.
|
|
398
|
+
assert.deepEqual(first.resolveProseTarget('<@42>'), {
|
|
399
|
+
channelId: 'private-room-42',
|
|
400
|
+
label: 'Tess',
|
|
401
|
+
});
|
|
402
|
+
const restarted = makeRegistry(store);
|
|
403
|
+
const liveMiss = restarted.resolveProseTarget('<@42>');
|
|
404
|
+
assert.ok('error' in liveMiss, 'expected a live-path miss on a fresh registry');
|
|
405
|
+
// Durable fallback must still recognize it as a DM (via the persisted
|
|
406
|
+
// isDm classification, not id/label shape) and resolve the mention.
|
|
407
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('<@42>'), {
|
|
408
|
+
channelId: 'private-room-42',
|
|
409
|
+
label: 'Tess',
|
|
410
|
+
});
|
|
411
|
+
assert.deepEqual(restarted.resolveProseTargetDurable('@tess'), {
|
|
412
|
+
channelId: 'private-room-42',
|
|
413
|
+
label: 'Tess',
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
test('a non-DM channel sighting never durably asserts isDm:false (only positive classification is ever persisted)', async () => {
|
|
417
|
+
const { store, events } = memoryStore();
|
|
418
|
+
const registry = makeRegistry(store);
|
|
419
|
+
await registry.handleRegister('discord', { channels: [descriptor('discord:g1:c1', '#general')] });
|
|
420
|
+
const log = events.get(CHANNEL_LABEL_HISTORY_LOG_ID) ?? [];
|
|
421
|
+
assert.equal(log.length, 1);
|
|
422
|
+
assert.equal(log[0].isDm, undefined, 'a plain guild channel must not record isDm at all');
|
|
423
|
+
});
|
|
424
|
+
//# sourceMappingURL=channel-label-history.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-label-history.test.js","sourceRoot":"","sources":["../../test/channel-label-history.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { join } from 'node:path';
|
|
|
5
5
|
import { tmpdir } from 'node:os';
|
|
6
6
|
import { DiscordAwarenessOutbox, extractDiscordAwarenessRefs, } from '../src/recovery/discord-awareness-outbox.js';
|
|
7
7
|
import { AgentFramework } from '../src/framework.js';
|
|
8
|
+
import { OperatorLog } from '../src/operator-log.js';
|
|
8
9
|
test('extractDiscordAwarenessRefs keeps only direct Discord addressing metadata', () => {
|
|
9
10
|
const refs = extractDiscordAwarenessRefs([
|
|
10
11
|
{ metadata: { serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm1' } },
|
|
@@ -211,6 +212,14 @@ test('message-granular undo prepares markers before switching branches', async (
|
|
|
211
212
|
let currentBranch = 'main';
|
|
212
213
|
const contextManager = {
|
|
213
214
|
getAllMessages: () => messages,
|
|
215
|
+
// Windowed reads — what the live rollback path uses so it never
|
|
216
|
+
// re-inflates every attachment on the branch.
|
|
217
|
+
getMessageCount: () => messages.length,
|
|
218
|
+
getMessageWindow: (offset, limit) => ({
|
|
219
|
+
messages: messages.slice(offset, offset + limit),
|
|
220
|
+
startIndex: offset,
|
|
221
|
+
totalCount: messages.length,
|
|
222
|
+
}),
|
|
214
223
|
branchAt: (_id, name) => { calls.push(`branch:${name}`); return name; },
|
|
215
224
|
switchBranch: async (name) => { calls.push(`switch:${name}`); currentBranch = name; },
|
|
216
225
|
};
|
|
@@ -232,6 +241,13 @@ test('message-granular undo prepares markers before switching branches', async (
|
|
|
232
241
|
framework.mcplServerRegistry = null;
|
|
233
242
|
framework.moduleRegistry = { getModule: () => null };
|
|
234
243
|
framework.lastVisiblePreview = async () => null;
|
|
244
|
+
// Live rollback reserves the store: it mints turn tokens for every agent
|
|
245
|
+
// and flushes deferred writers on release — give the stub those fields.
|
|
246
|
+
framework.activeTurnTokens = new Map();
|
|
247
|
+
framework.nextTurnToken = 1;
|
|
248
|
+
framework.deferredMessages = [];
|
|
249
|
+
framework.pendingAssistantBlocks = new Map();
|
|
250
|
+
framework.operatorLog = new OperatorLog(undefined);
|
|
235
251
|
const result = await framework.handleHostCommand('discord', {
|
|
236
252
|
command: 'undo', agentName: 'cairn', messages: 2,
|
|
237
253
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discord-awareness-outbox.test.js","sourceRoot":"","sources":["../../test/discord-awareness-outbox.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"discord-awareness-outbox.test.js","sourceRoot":"","sources":["../../test/discord-awareness-outbox.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -754,4 +754,48 @@ describe('defaultDecisions counters', () => {
|
|
|
754
754
|
assert.strictEqual(status.defaultDecisions.byEventType['other'].skipped, 1);
|
|
755
755
|
});
|
|
756
756
|
});
|
|
757
|
+
// ---------------------------------------------------------------------------
|
|
758
|
+
// Host quiesce suppression (issue #122)
|
|
759
|
+
// ---------------------------------------------------------------------------
|
|
760
|
+
describe('quiesce suppression', () => {
|
|
761
|
+
it('buffers debounce firings while quiesced and flushes on setQuiesced(false)', async () => {
|
|
762
|
+
const path = writeConfig('quiesce-debounce.json', {
|
|
763
|
+
policies: [
|
|
764
|
+
{ name: 'editor', match: { scope: ['mcpl:push-event'] }, behavior: { debounce: 120 } },
|
|
765
|
+
],
|
|
766
|
+
default: 'skip',
|
|
767
|
+
});
|
|
768
|
+
const { gate, messages, inferenceRequests } = makeGate(path);
|
|
769
|
+
gate.setQuiesced(true);
|
|
770
|
+
gate.evaluate(event({ content: 'edit 1' }));
|
|
771
|
+
gate.evaluate(event({ content: 'edit 2' }));
|
|
772
|
+
// Debounce fires while quiesced → buffered, no context write, no wake.
|
|
773
|
+
await new Promise(r => setTimeout(r, 250));
|
|
774
|
+
assert.strictEqual(messages.length, 0, 'no gate message mid-surgery');
|
|
775
|
+
assert.strictEqual(inferenceRequests.length, 0);
|
|
776
|
+
assert.strictEqual(gate.inferenceDiagnostics().bufferedEvents, 2);
|
|
777
|
+
gate.setQuiesced(false);
|
|
778
|
+
await new Promise(r => setTimeout(r, 20)); // flush is deferred a microtask
|
|
779
|
+
assert.strictEqual(messages.length, 1, 'buffered events compose one delivery');
|
|
780
|
+
assert.strictEqual(inferenceRequests.length, 1);
|
|
781
|
+
assert.strictEqual(gate.inferenceDiagnostics().bufferedEvents, 0);
|
|
782
|
+
});
|
|
783
|
+
it('a turn ending while quiesced does not flush the buffer', async () => {
|
|
784
|
+
const path = writeConfig('quiesce-turn-end.json', {
|
|
785
|
+
policies: [
|
|
786
|
+
{ name: 'editor', match: { scope: ['mcpl:push-event'] }, behavior: { debounce: 120 } },
|
|
787
|
+
],
|
|
788
|
+
default: 'skip',
|
|
789
|
+
});
|
|
790
|
+
const { gate, messages } = makeGate(path);
|
|
791
|
+
gate.setQuiesced(true);
|
|
792
|
+
gate.onInferenceStarted('agent');
|
|
793
|
+
gate.evaluate(event({ content: 'during drain' }));
|
|
794
|
+
await new Promise(r => setTimeout(r, 250));
|
|
795
|
+
gate.onInferenceEnded('agent'); // drain completes mid-quiesce
|
|
796
|
+
await new Promise(r => setTimeout(r, 20));
|
|
797
|
+
assert.strictEqual(messages.length, 0, 'buffer holds until resume, not turn end');
|
|
798
|
+
assert.strictEqual(gate.inferenceDiagnostics().bufferedEvents, 1);
|
|
799
|
+
});
|
|
800
|
+
});
|
|
757
801
|
//# sourceMappingURL=event-gate.test.js.map
|