@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.
Files changed (96) hide show
  1. package/README.md +22 -1
  2. package/dist/src/agent.d.ts +32 -0
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +55 -0
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/server.d.ts +9 -0
  7. package/dist/src/api/server.d.ts.map +1 -1
  8. package/dist/src/api/server.js +156 -0
  9. package/dist/src/api/server.js.map +1 -1
  10. package/dist/src/api/types.d.ts +15 -0
  11. package/dist/src/api/types.d.ts.map +1 -1
  12. package/dist/src/framework.d.ts +418 -3
  13. package/dist/src/framework.d.ts.map +1 -1
  14. package/dist/src/framework.js +1782 -68
  15. package/dist/src/framework.js.map +1 -1
  16. package/dist/src/gate/event-gate.d.ts +16 -0
  17. package/dist/src/gate/event-gate.d.ts.map +1 -1
  18. package/dist/src/gate/event-gate.js +41 -3
  19. package/dist/src/gate/event-gate.js.map +1 -1
  20. package/dist/src/index.d.ts +4 -1
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +3 -1
  23. package/dist/src/index.js.map +1 -1
  24. package/dist/src/mcpl/channel-registry.d.ts +172 -0
  25. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  26. package/dist/src/mcpl/channel-registry.js +444 -2
  27. package/dist/src/mcpl/channel-registry.js.map +1 -1
  28. package/dist/src/mcpl/server-connection.d.ts +9 -0
  29. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  30. package/dist/src/mcpl/server-connection.js +71 -13
  31. package/dist/src/mcpl/server-connection.js.map +1 -1
  32. package/dist/src/modules/history/index.d.ts +89 -13
  33. package/dist/src/modules/history/index.d.ts.map +1 -1
  34. package/dist/src/modules/history/index.js +655 -24
  35. package/dist/src/modules/history/index.js.map +1 -1
  36. package/dist/src/operator-log.d.ts +78 -0
  37. package/dist/src/operator-log.d.ts.map +1 -0
  38. package/dist/src/operator-log.js +102 -0
  39. package/dist/src/operator-log.js.map +1 -0
  40. package/dist/src/recovery/discord-awareness-outbox.d.ts +10 -0
  41. package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -1
  42. package/dist/src/recovery/discord-awareness-outbox.js +20 -0
  43. package/dist/src/recovery/discord-awareness-outbox.js.map +1 -1
  44. package/dist/src/types/framework.d.ts +24 -0
  45. package/dist/src/types/framework.d.ts.map +1 -1
  46. package/dist/src/types/trace.d.ts +36 -0
  47. package/dist/src/types/trace.d.ts.map +1 -1
  48. package/dist/test/agent-runtime-settings.test.js +199 -1
  49. package/dist/test/agent-runtime-settings.test.js.map +1 -1
  50. package/dist/test/api-admin-gate.test.d.ts +2 -0
  51. package/dist/test/api-admin-gate.test.d.ts.map +1 -0
  52. package/dist/test/api-admin-gate.test.js +116 -0
  53. package/dist/test/api-admin-gate.test.js.map +1 -0
  54. package/dist/test/channel-label-history.test.d.ts +2 -0
  55. package/dist/test/channel-label-history.test.d.ts.map +1 -0
  56. package/dist/test/channel-label-history.test.js +424 -0
  57. package/dist/test/channel-label-history.test.js.map +1 -0
  58. package/dist/test/discord-awareness-outbox.test.js +16 -0
  59. package/dist/test/discord-awareness-outbox.test.js.map +1 -1
  60. package/dist/test/event-gate.test.js +44 -0
  61. package/dist/test/event-gate.test.js.map +1 -1
  62. package/dist/test/helpers/quiesce-crash-child.d.ts +2 -0
  63. package/dist/test/helpers/quiesce-crash-child.d.ts.map +1 -0
  64. package/dist/test/helpers/quiesce-crash-child.js +156 -0
  65. package/dist/test/helpers/quiesce-crash-child.js.map +1 -0
  66. package/dist/test/history-module-overview.test.d.ts +2 -0
  67. package/dist/test/history-module-overview.test.d.ts.map +1 -0
  68. package/dist/test/history-module-overview.test.js +711 -0
  69. package/dist/test/history-module-overview.test.js.map +1 -0
  70. package/dist/test/history-module.test.js +146 -0
  71. package/dist/test/history-module.test.js.map +1 -1
  72. package/dist/test/host-quiesce.test.d.ts +2 -0
  73. package/dist/test/host-quiesce.test.d.ts.map +1 -0
  74. package/dist/test/host-quiesce.test.js +863 -0
  75. package/dist/test/host-quiesce.test.js.map +1 -0
  76. package/dist/test/operator-surgery.test.d.ts +2 -0
  77. package/dist/test/operator-surgery.test.d.ts.map +1 -0
  78. package/dist/test/operator-surgery.test.js +398 -0
  79. package/dist/test/operator-surgery.test.js.map +1 -0
  80. package/dist/test/puppet-tool-call.test.js +5 -0
  81. package/dist/test/puppet-tool-call.test.js.map +1 -1
  82. package/dist/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +2 -2
  84. package/src/agent.ts +69 -0
  85. package/src/api/server.ts +159 -2
  86. package/src/api/types.ts +15 -0
  87. package/src/framework.ts +2081 -89
  88. package/src/gate/event-gate.ts +47 -4
  89. package/src/index.ts +5 -1
  90. package/src/mcpl/channel-registry.ts +495 -2
  91. package/src/mcpl/server-connection.ts +73 -13
  92. package/src/modules/history/index.ts +689 -25
  93. package/src/operator-log.ts +132 -0
  94. package/src/recovery/discord-awareness-outbox.ts +19 -0
  95. package/src/types/framework.ts +27 -0
  96. 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