@animalabs/agent-framework 0.6.5 → 0.6.7

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 (155) hide show
  1. package/README.md +78 -0
  2. package/dist/src/agent.d.ts +56 -2
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +372 -57
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/mcp-server.js +0 -0
  7. package/dist/src/api/server.d.ts.map +1 -1
  8. package/dist/src/api/server.js +7 -2
  9. package/dist/src/api/server.js.map +1 -1
  10. package/dist/src/canonical-json.d.ts +2 -0
  11. package/dist/src/canonical-json.d.ts.map +1 -0
  12. package/dist/src/canonical-json.js +23 -0
  13. package/dist/src/canonical-json.js.map +1 -0
  14. package/dist/src/framework.d.ts +160 -2
  15. package/dist/src/framework.d.ts.map +1 -1
  16. package/dist/src/framework.js +3098 -167
  17. package/dist/src/framework.js.map +1 -1
  18. package/dist/src/gate/event-gate.d.ts.map +1 -1
  19. package/dist/src/gate/event-gate.js +34 -4
  20. package/dist/src/gate/event-gate.js.map +1 -1
  21. package/dist/src/index.d.ts +4 -0
  22. package/dist/src/index.d.ts.map +1 -1
  23. package/dist/src/index.js +3 -0
  24. package/dist/src/index.js.map +1 -1
  25. package/dist/src/mcpl/channel-registry.d.ts +36 -15
  26. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  27. package/dist/src/mcpl/channel-registry.js +322 -76
  28. package/dist/src/mcpl/channel-registry.js.map +1 -1
  29. package/dist/src/mcpl/push-handler.d.ts +1 -0
  30. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  31. package/dist/src/mcpl/push-handler.js +1 -0
  32. package/dist/src/mcpl/push-handler.js.map +1 -1
  33. package/dist/src/mcpl/server-connection.d.ts +39 -4
  34. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  35. package/dist/src/mcpl/server-connection.js +146 -28
  36. package/dist/src/mcpl/server-connection.js.map +1 -1
  37. package/dist/src/mcpl/types.d.ts +43 -12
  38. package/dist/src/mcpl/types.d.ts.map +1 -1
  39. package/dist/src/mcpl/types.js +1 -0
  40. package/dist/src/mcpl/types.js.map +1 -1
  41. package/dist/src/modules/workspace/index.d.ts +12 -1
  42. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  43. package/dist/src/modules/workspace/index.js +661 -2
  44. package/dist/src/modules/workspace/index.js.map +1 -1
  45. package/dist/src/modules/workspace/types.d.ts +4 -0
  46. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  47. package/dist/src/modules/workspace/types.js.map +1 -1
  48. package/dist/src/recovery/discord-awareness-outbox.d.ts +99 -0
  49. package/dist/src/recovery/discord-awareness-outbox.d.ts.map +1 -0
  50. package/dist/src/recovery/discord-awareness-outbox.js +334 -0
  51. package/dist/src/recovery/discord-awareness-outbox.js.map +1 -0
  52. package/dist/src/recovery/offline-branch.d.ts +45 -0
  53. package/dist/src/recovery/offline-branch.d.ts.map +1 -0
  54. package/dist/src/recovery/offline-branch.js +362 -0
  55. package/dist/src/recovery/offline-branch.js.map +1 -0
  56. package/dist/src/recovery/recover-cli.d.ts +3 -0
  57. package/dist/src/recovery/recover-cli.d.ts.map +1 -0
  58. package/dist/src/recovery/recover-cli.js +129 -0
  59. package/dist/src/recovery/recover-cli.js.map +1 -0
  60. package/dist/src/types/agent.d.ts +37 -0
  61. package/dist/src/types/agent.d.ts.map +1 -1
  62. package/dist/src/types/events.d.ts +1 -0
  63. package/dist/src/types/events.d.ts.map +1 -1
  64. package/dist/src/types/framework.d.ts +14 -0
  65. package/dist/src/types/framework.d.ts.map +1 -1
  66. package/dist/src/types/module.d.ts +31 -0
  67. package/dist/src/types/module.d.ts.map +1 -1
  68. package/dist/src/types/trace.d.ts +4 -0
  69. package/dist/src/types/trace.d.ts.map +1 -1
  70. package/dist/test/agent-runtime-settings.test.d.ts +2 -0
  71. package/dist/test/agent-runtime-settings.test.d.ts.map +1 -0
  72. package/dist/test/agent-runtime-settings.test.js +227 -0
  73. package/dist/test/agent-runtime-settings.test.js.map +1 -0
  74. package/dist/test/busy-agent-scheduler.test.d.ts +2 -0
  75. package/dist/test/busy-agent-scheduler.test.d.ts.map +1 -0
  76. package/dist/test/busy-agent-scheduler.test.js +62 -0
  77. package/dist/test/busy-agent-scheduler.test.js.map +1 -0
  78. package/dist/test/channel-lifecycle-provenance.test.d.ts +2 -0
  79. package/dist/test/channel-lifecycle-provenance.test.d.ts.map +1 -0
  80. package/dist/test/channel-lifecycle-provenance.test.js +47 -0
  81. package/dist/test/channel-lifecycle-provenance.test.js.map +1 -0
  82. package/dist/test/channel-registry-routing.test.js +5 -4
  83. package/dist/test/channel-registry-routing.test.js.map +1 -1
  84. package/dist/test/conversation-fork-injection-scoping.test.js +12 -1
  85. package/dist/test/conversation-fork-injection-scoping.test.js.map +1 -1
  86. package/dist/test/discord-awareness-outbox.test.d.ts +2 -0
  87. package/dist/test/discord-awareness-outbox.test.d.ts.map +1 -0
  88. package/dist/test/discord-awareness-outbox.test.js +248 -0
  89. package/dist/test/discord-awareness-outbox.test.js.map +1 -0
  90. package/dist/test/event-gate.test.js +21 -1
  91. package/dist/test/event-gate.test.js.map +1 -1
  92. package/dist/test/helpers/mock-membrane.d.ts +13 -1
  93. package/dist/test/helpers/mock-membrane.d.ts.map +1 -1
  94. package/dist/test/helpers/mock-membrane.js +9 -2
  95. package/dist/test/helpers/mock-membrane.js.map +1 -1
  96. package/dist/test/maintenance-timer.test.js +103 -1
  97. package/dist/test/maintenance-timer.test.js.map +1 -1
  98. package/dist/test/mcpl-awareness-barrier.test.d.ts +2 -0
  99. package/dist/test/mcpl-awareness-barrier.test.d.ts.map +1 -0
  100. package/dist/test/mcpl-awareness-barrier.test.js +845 -0
  101. package/dist/test/mcpl-awareness-barrier.test.js.map +1 -0
  102. package/dist/test/mcpl-gate-roundtrip.test.js +138 -6
  103. package/dist/test/mcpl-gate-roundtrip.test.js.map +1 -1
  104. package/dist/test/mcpl-reconnect-reregistration.test.js +22 -3
  105. package/dist/test/mcpl-reconnect-reregistration.test.js.map +1 -1
  106. package/dist/test/mcpl-request-timeout.test.js +15 -0
  107. package/dist/test/mcpl-request-timeout.test.js.map +1 -1
  108. package/dist/test/offline-recovery-branch.test.d.ts +2 -0
  109. package/dist/test/offline-recovery-branch.test.d.ts.map +1 -0
  110. package/dist/test/offline-recovery-branch.test.js +226 -0
  111. package/dist/test/offline-recovery-branch.test.js.map +1 -0
  112. package/dist/test/present-while-acting.test.d.ts +19 -0
  113. package/dist/test/present-while-acting.test.d.ts.map +1 -0
  114. package/dist/test/present-while-acting.test.js +295 -0
  115. package/dist/test/present-while-acting.test.js.map +1 -0
  116. package/dist/test/primary-summary-refusal-fallback-integration.test.d.ts +2 -0
  117. package/dist/test/primary-summary-refusal-fallback-integration.test.d.ts.map +1 -0
  118. package/dist/test/primary-summary-refusal-fallback-integration.test.js +1955 -0
  119. package/dist/test/primary-summary-refusal-fallback-integration.test.js.map +1 -0
  120. package/dist/test/primary-summary-refusal-fallback.test.d.ts +2 -0
  121. package/dist/test/primary-summary-refusal-fallback.test.d.ts.map +1 -0
  122. package/dist/test/primary-summary-refusal-fallback.test.js +753 -0
  123. package/dist/test/primary-summary-refusal-fallback.test.js.map +1 -0
  124. package/dist/test/same-round-think-policy.test.d.ts +2 -0
  125. package/dist/test/same-round-think-policy.test.d.ts.map +1 -0
  126. package/dist/test/same-round-think-policy.test.js +853 -0
  127. package/dist/test/same-round-think-policy.test.js.map +1 -0
  128. package/dist/test/trunk-channel-routing.test.js +38 -0
  129. package/dist/test/trunk-channel-routing.test.js.map +1 -1
  130. package/dist/test/workspace-read-image.test.d.ts +2 -0
  131. package/dist/test/workspace-read-image.test.d.ts.map +1 -0
  132. package/dist/test/workspace-read-image.test.js +518 -0
  133. package/dist/test/workspace-read-image.test.js.map +1 -0
  134. package/dist/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +6 -4
  136. package/src/agent.ts +485 -63
  137. package/src/api/server.ts +8 -2
  138. package/src/canonical-json.ts +22 -0
  139. package/src/framework.ts +4096 -304
  140. package/src/gate/event-gate.ts +50 -4
  141. package/src/index.ts +20 -0
  142. package/src/mcpl/channel-registry.ts +396 -85
  143. package/src/mcpl/push-handler.ts +2 -0
  144. package/src/mcpl/server-connection.ts +173 -28
  145. package/src/mcpl/types.ts +49 -12
  146. package/src/modules/workspace/index.ts +759 -2
  147. package/src/modules/workspace/types.ts +5 -0
  148. package/src/recovery/discord-awareness-outbox.ts +459 -0
  149. package/src/recovery/offline-branch.ts +510 -0
  150. package/src/recovery/recover-cli.ts +130 -0
  151. package/src/types/agent.ts +44 -0
  152. package/src/types/events.ts +1 -1
  153. package/src/types/framework.ts +17 -0
  154. package/src/types/module.ts +33 -0
  155. package/src/types/trace.ts +4 -0
@@ -0,0 +1,226 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, rmSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { tmpdir } from 'node:os';
6
+ import { JsStore } from '@animalabs/chronicle';
7
+ import { ContextManager } from '@animalabs/context-manager';
8
+ import { createOfflineRecoveryBranch } from '../src/recovery/offline-branch.js';
9
+ import { DiscordAwarenessOutbox, defaultDiscordAwarenessOutboxPath, } from '../src/recovery/discord-awareness-outbox.js';
10
+ test('offline recovery branches without compiling and queues discarded Discord refs', async () => {
11
+ const dir = mkdtempSync(join(tmpdir(), 'offline-recovery-'));
12
+ const storePath = join(dir, 'agent.chronicle');
13
+ try {
14
+ const store = JsStore.openOrCreate({ path: storePath });
15
+ const cm = await ContextManager.open({ store, namespace: 'agents/cairn' });
16
+ cm.addMessage('user', [{ type: 'text', text: 'safe' }], {
17
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-safe',
18
+ });
19
+ cm.addMessage('user', [{ type: 'text', text: 'never echo this one' }], {
20
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-toxic-1',
21
+ });
22
+ cm.addMessage('user', [{ type: 'text', text: 'or this one' }], {
23
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-toxic-2',
24
+ });
25
+ cm.close();
26
+ store.close();
27
+ const result = await createOfflineRecoveryBranch({
28
+ storePath,
29
+ agentName: 'cairn',
30
+ messageId: 'm-safe',
31
+ branchName: 'recovery/cairn/toxic-tail',
32
+ });
33
+ assert.equal(result.sourceBranch, 'main');
34
+ assert.equal(result.targetBranch, 'recovery/cairn/toxic-tail');
35
+ assert.equal(result.messagesRemoved, 2);
36
+ assert.deepEqual(result.refs.map((ref) => ref.messageId), ['m-toxic-1', 'm-toxic-2']);
37
+ const recoveredStore = JsStore.openOrCreate({ path: storePath });
38
+ assert.equal(recoveredStore.currentBranch().name, 'recovery/cairn/toxic-tail');
39
+ const recoveredCm = await ContextManager.open({
40
+ store: recoveredStore,
41
+ namespace: 'agents/cairn',
42
+ });
43
+ assert.equal(recoveredCm.getMessageCount(), 1);
44
+ assert.equal(recoveredCm.getMessageWindow(0, 1, { resolveBlobs: false }).messages[0].metadata?.messageId, 'm-safe');
45
+ recoveredCm.close();
46
+ recoveredStore.close();
47
+ const batches = new DiscordAwarenessOutbox(defaultDiscordAwarenessOutboxPath(storePath)).pending('discord');
48
+ assert.equal(batches.length, 2);
49
+ assert.deepEqual(batches.map((operation) => operation.ref.messageId), ['m-toxic-1', 'm-toxic-2']);
50
+ // The outbox is metadata-only: quarantined text must never leak to it.
51
+ const rawOutbox = await import('node:fs').then(({ readFileSync }) => readFileSync(defaultDiscordAwarenessOutboxPath(storePath), 'utf8'));
52
+ assert.ok(!rawOutbox.includes('never echo this one'));
53
+ assert.ok(!rawOutbox.includes('or this one'));
54
+ }
55
+ finally {
56
+ rmSync(dir, { recursive: true, force: true });
57
+ }
58
+ });
59
+ test('offline recovery can branch at the current message and suppress an exact list', async () => {
60
+ const dir = mkdtempSync(join(tmpdir(), 'offline-recovery-list-'));
61
+ const storePath = join(dir, 'agent.chronicle');
62
+ try {
63
+ const store = JsStore.openOrCreate({ path: storePath });
64
+ const cm = await ContextManager.open({ store, namespace: 'agents/cairn' });
65
+ cm.addMessage('user', [{ type: 'text', text: 'keep first' }], {
66
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-keep',
67
+ });
68
+ cm.addMessage('user', [{ type: 'text', text: 'suppress A' }], {
69
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-a',
70
+ });
71
+ cm.addMessage('assistant', [{ type: 'text', text: 'keep between' }]);
72
+ cm.addMessage('user', [{ type: 'text', text: 'suppress B' }], {
73
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-b',
74
+ });
75
+ cm.addMessage('user', [{ type: 'text', text: 'current anchor' }], {
76
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-current',
77
+ });
78
+ cm.close();
79
+ store.close();
80
+ const result = await createOfflineRecoveryBranch({
81
+ storePath,
82
+ agentName: 'cairn',
83
+ messageId: 'm-current',
84
+ suppressMessageIds: ['m-a', 'm-b'],
85
+ branchName: 'recovery/cairn/exact-list',
86
+ });
87
+ assert.equal(result.messagesRemoved, 0);
88
+ assert.equal(result.messagesSuppressed, 2);
89
+ assert.deepEqual(result.refs.map((ref) => ref.messageId), ['m-a', 'm-b']);
90
+ const recoveredStore = JsStore.openOrCreate({ path: storePath });
91
+ const recoveredCm = await ContextManager.open({
92
+ store: recoveredStore,
93
+ namespace: 'agents/cairn',
94
+ });
95
+ assert.deepEqual(recoveredCm.getAllMessages().map((message) => message.metadata?.messageId ?? message.participant), ['m-keep', 'assistant', 'm-current']);
96
+ await recoveredCm.switchBranch('main');
97
+ assert.deepEqual(recoveredCm.getAllMessages().map((message) => message.metadata?.messageId ?? message.participant), ['m-keep', 'm-a', 'assistant', 'm-b', 'm-current']);
98
+ recoveredCm.close();
99
+ recoveredStore.close();
100
+ }
101
+ finally {
102
+ rmSync(dir, { recursive: true, force: true });
103
+ }
104
+ });
105
+ test('offline recovery suppresses inclusive ranges in context order', async () => {
106
+ const dir = mkdtempSync(join(tmpdir(), 'offline-recovery-range-'));
107
+ const storePath = join(dir, 'agent.chronicle');
108
+ try {
109
+ const store = JsStore.openOrCreate({ path: storePath });
110
+ const cm = await ContextManager.open({ store, namespace: 'agents/cairn' });
111
+ cm.addMessage('user', [{ type: 'text', text: 'keep first' }], {
112
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-keep',
113
+ });
114
+ cm.addMessage('user', [{ type: 'text', text: 'range start' }], {
115
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-from',
116
+ });
117
+ cm.addMessage('assistant', [{ type: 'text', text: 'also suppressed by range' }]);
118
+ cm.addMessage('user', [{ type: 'text', text: 'inside range' }], {
119
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-inside',
120
+ });
121
+ cm.addMessage('user', [{ type: 'text', text: 'range end' }], {
122
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-to',
123
+ });
124
+ cm.addMessage('user', [{ type: 'text', text: 'current anchor' }], {
125
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-current',
126
+ });
127
+ cm.close();
128
+ store.close();
129
+ const result = await createOfflineRecoveryBranch({
130
+ storePath,
131
+ agentName: 'cairn',
132
+ messageId: 'm-current',
133
+ // Reversed endpoints should still mean the inclusive context interval.
134
+ suppressRanges: [{ fromMessageId: 'm-to', toMessageId: 'm-from' }],
135
+ branchName: 'recovery/cairn/range',
136
+ });
137
+ assert.equal(result.messagesRemoved, 0);
138
+ assert.equal(result.messagesSuppressed, 4);
139
+ assert.deepEqual(result.refs.map((ref) => ref.messageId), ['m-from', 'm-inside', 'm-to']);
140
+ const recoveredStore = JsStore.openOrCreate({ path: storePath });
141
+ const recoveredCm = await ContextManager.open({
142
+ store: recoveredStore,
143
+ namespace: 'agents/cairn',
144
+ });
145
+ assert.deepEqual(recoveredCm.getAllMessages().map((message) => message.metadata?.messageId), ['m-keep', 'm-current']);
146
+ recoveredCm.close();
147
+ recoveredStore.close();
148
+ const batches = new DiscordAwarenessOutbox(defaultDiscordAwarenessOutboxPath(storePath)).pending('discord');
149
+ assert.equal(batches.length, 3);
150
+ assert.deepEqual(batches.map((operation) => operation.ref.messageId), ['m-from', 'm-inside', 'm-to']);
151
+ }
152
+ finally {
153
+ rmSync(dir, { recursive: true, force: true });
154
+ }
155
+ });
156
+ test('offline recovery accepts an exact internal context ID anchor', async () => {
157
+ const dir = mkdtempSync(join(tmpdir(), 'offline-recovery-context-id-'));
158
+ const storePath = join(dir, 'agent.chronicle');
159
+ try {
160
+ const store = JsStore.openOrCreate({ path: storePath });
161
+ const cm = await ContextManager.open({ store, namespace: 'agents/cairn' });
162
+ cm.addMessage('user', [{ type: 'text', text: 'prompt' }], {
163
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-prompt',
164
+ });
165
+ const coherentAssistantId = cm.addMessage('assistant', [{ type: 'text', text: 'safe answer' }]);
166
+ cm.addMessage('user', [{ type: 'text', text: 'poison' }], {
167
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-poison',
168
+ });
169
+ cm.close();
170
+ store.close();
171
+ const result = await createOfflineRecoveryBranch({
172
+ storePath,
173
+ agentName: 'cairn',
174
+ contextId: String(coherentAssistantId),
175
+ branchName: 'recovery/cairn/internal-anchor',
176
+ });
177
+ assert.equal(result.messagesRemoved, 1);
178
+ assert.deepEqual(result.refs.map((ref) => ref.messageId), ['m-poison']);
179
+ const recoveredStore = JsStore.openOrCreate({ path: storePath });
180
+ const recoveredCm = await ContextManager.open({
181
+ store: recoveredStore,
182
+ namespace: 'agents/cairn',
183
+ });
184
+ assert.deepEqual(recoveredCm.getAllMessages().map((message) => message.participant), ['user', 'assistant']);
185
+ recoveredCm.close();
186
+ recoveredStore.close();
187
+ }
188
+ finally {
189
+ rmSync(dir, { recursive: true, force: true });
190
+ }
191
+ });
192
+ test('suppression rejects a range that splits a tool exchange', async () => {
193
+ const dir = mkdtempSync(join(tmpdir(), 'offline-recovery-tool-integrity-'));
194
+ const storePath = join(dir, 'agent.chronicle');
195
+ try {
196
+ const store = JsStore.openOrCreate({ path: storePath });
197
+ const cm = await ContextManager.open({ store, namespace: 'agents/cairn' });
198
+ cm.addMessage('user', [{ type: 'text', text: 'range start' }], {
199
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-from',
200
+ });
201
+ cm.addMessage('assistant', [
202
+ { type: 'tool_use', id: 'tool-1', name: 'shell', input: {} },
203
+ ]);
204
+ cm.addMessage('user', [{ type: 'text', text: 'range end' }], {
205
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-to',
206
+ });
207
+ cm.addMessage('user', [
208
+ { type: 'tool_result', toolUseId: 'tool-1', content: 'result' },
209
+ ]);
210
+ cm.addMessage('user', [{ type: 'text', text: 'current' }], {
211
+ serverId: 'discord', channelId: 'discord:g1:c1', messageId: 'm-current',
212
+ });
213
+ cm.close();
214
+ store.close();
215
+ await assert.rejects(createOfflineRecoveryBranch({
216
+ storePath,
217
+ agentName: 'cairn',
218
+ messageId: 'm-current',
219
+ suppressRanges: [{ fromMessageId: 'm-from', toMessageId: 'm-to' }],
220
+ }), /split tool exchange tool-1/);
221
+ }
222
+ finally {
223
+ rmSync(dir, { recursive: true, force: true });
224
+ }
225
+ });
226
+ //# sourceMappingURL=offline-recovery-branch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline-recovery-branch.test.js","sourceRoot":"","sources":["../../test/offline-recovery-branch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * "Present while acting": the two halves that keep an agent conversationally
3
+ * alive during a long tool-using turn.
4
+ *
5
+ * SPEAK-while-acting — each round's prose is routed to the locus LIVE when
6
+ * the round yields its tool calls. Explicit-send suppression lasts until new
7
+ * external input begins another conversational round; the 'complete' case
8
+ * routes only trailing prose.
9
+ * Previously all segments were batched to the end of the turn.
10
+ *
11
+ * HEAR-while-acting — messages arriving mid-turn (deferred by addMessage
12
+ * while tool_use blocks are pending) are flushed to the context window at
13
+ * the tool-result boundary AND injected into the live stream via
14
+ * provideToolResults(results, { injectedMessages }) (membrane ≥0.5.72), so
15
+ * the next round of the SAME turn sees them instead of the agent staying
16
+ * deaf until the turn ends.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=present-while-acting.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"present-while-acting.test.d.ts","sourceRoot":"","sources":["../../test/present-while-acting.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * "Present while acting": the two halves that keep an agent conversationally
3
+ * alive during a long tool-using turn.
4
+ *
5
+ * SPEAK-while-acting — each round's prose is routed to the locus LIVE when
6
+ * the round yields its tool calls. Explicit-send suppression lasts until new
7
+ * external input begins another conversational round; the 'complete' case
8
+ * routes only trailing prose.
9
+ * Previously all segments were batched to the end of the turn.
10
+ *
11
+ * HEAR-while-acting — messages arriving mid-turn (deferred by addMessage
12
+ * while tool_use blocks are pending) are flushed to the context window at
13
+ * the tool-result boundary AND injected into the live stream via
14
+ * provideToolResults(results, { injectedMessages }) (membrane ≥0.5.72), so
15
+ * the next round of the SAME turn sees them instead of the agent staying
16
+ * deaf until the turn ends.
17
+ */
18
+ import { describe, it, beforeEach, afterEach } from 'node:test';
19
+ import assert from 'node:assert/strict';
20
+ import { tmpdir } from 'node:os';
21
+ import { mkdtempSync, rmSync } from 'node:fs';
22
+ import { join } from 'node:path';
23
+ import { AgentFramework } from '../src/index.js';
24
+ import { MockMembrane, createMockResponse } from './helpers/mock-membrane.js';
25
+ // ---------------------------------------------------------------------------
26
+ // Test module: tools that optionally emit a mid-turn external message
27
+ // ---------------------------------------------------------------------------
28
+ class RobotModule {
29
+ name = 'robot';
30
+ framework = null;
31
+ /** When set, the next `move` call pushes this text as an external message
32
+ * BEFORE returning its result (simulating a chat reply arriving while the
33
+ * tool executes). */
34
+ interjection = null;
35
+ /** Optional routing locus attached to the interjected message. */
36
+ interjectionChannelId = null;
37
+ /** Delay tool completion so live routing deterministically precedes it. */
38
+ toolDelayMs = 0;
39
+ async start(_ctx) { }
40
+ async stop() { }
41
+ getTools() {
42
+ return [
43
+ {
44
+ name: 'move',
45
+ description: 'Move the robot',
46
+ inputSchema: { type: 'object', properties: { dir: { type: 'string' } } },
47
+ },
48
+ {
49
+ name: 'send_message',
50
+ description: 'Explicitly send a message',
51
+ inputSchema: { type: 'object', properties: { text: { type: 'string' } } },
52
+ },
53
+ ];
54
+ }
55
+ async handleToolCall(call) {
56
+ if (this.toolDelayMs > 0) {
57
+ await new Promise((r) => setTimeout(r, this.toolDelayMs));
58
+ }
59
+ if (this.interjection) {
60
+ const text = this.interjection;
61
+ this.interjection = null;
62
+ this.framework.pushEvent({
63
+ type: 'external-message',
64
+ source: 'test',
65
+ content: text,
66
+ metadata: this.interjectionChannelId
67
+ ? { channelId: this.interjectionChannelId }
68
+ : {},
69
+ });
70
+ // Give the run loop a beat to process the queued message while this
71
+ // tool round is still pending (pendingAssistantBlocks non-empty), so
72
+ // it lands in deferredMessages before the tool-result event.
73
+ await new Promise((r) => setTimeout(r, 30));
74
+ }
75
+ return { success: true, data: { ok: true, tool: call.name } };
76
+ }
77
+ async onProcess(event, _state) {
78
+ if (event.type === 'external-message') {
79
+ const text = String(event.content);
80
+ const metadata = event.metadata;
81
+ return {
82
+ addMessages: [
83
+ {
84
+ participant: 'Antra',
85
+ content: [{ type: 'text', text }],
86
+ ...(metadata ? { metadata } : {}),
87
+ },
88
+ ],
89
+ // Only the initial 'go' starts a turn. Mid-turn interjections must
90
+ // NOT request inference — we're testing mid-turn delivery, not wakes.
91
+ requestInference: text === 'go',
92
+ };
93
+ }
94
+ return {};
95
+ }
96
+ }
97
+ /** Minimal ChannelRegistry stub covering everything driveStream touches. */
98
+ function stubChannelRegistry(framework) {
99
+ const routed = [];
100
+ let locusCalls = 0;
101
+ const explicit = {
102
+ resolveLocus: () => {
103
+ locusCalls++;
104
+ return `chan-live-${locusCalls}`;
105
+ },
106
+ routeSpeech: async (_agent, text, locus) => {
107
+ routed.push({ text, locus: locus ?? null });
108
+ },
109
+ getDefaultPublishChannel: () => null,
110
+ isChannelOpen: () => true,
111
+ getDescriptor: () => undefined,
112
+ getChannelTools: () => [],
113
+ };
114
+ // Everything else driveStream/stop touches (startTyping, stopTyping,
115
+ // stopAll, ensureChannelRegistered, ...) becomes a no-op via Proxy so the
116
+ // stub doesn't chase the real registry's surface.
117
+ framework.channelRegistry = new Proxy(explicit, {
118
+ get: (target, prop) => (prop in target ? target[prop] : () => undefined),
119
+ });
120
+ return routed;
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ describe('present while acting', () => {
124
+ let tempDir;
125
+ let membrane;
126
+ let module;
127
+ beforeEach(() => {
128
+ tempDir = mkdtempSync(join(tmpdir(), 'pwa-test-'));
129
+ membrane = new MockMembrane();
130
+ module = new RobotModule();
131
+ });
132
+ afterEach(() => {
133
+ rmSync(tempDir, { recursive: true, force: true });
134
+ });
135
+ async function createFramework() {
136
+ const framework = await AgentFramework.create({
137
+ storePath: join(tempDir, 'test.chronicle'),
138
+ membrane: membrane.asMembrane(),
139
+ agents: [
140
+ { name: 'assistant', model: 'test-model', systemPrompt: 'You are a robot pilot.' },
141
+ ],
142
+ modules: [module],
143
+ });
144
+ module.framework = framework;
145
+ return framework;
146
+ }
147
+ function trigger(framework) {
148
+ framework.pushEvent({
149
+ type: 'external-message',
150
+ source: 'test',
151
+ content: 'go',
152
+ metadata: {},
153
+ });
154
+ }
155
+ // -------------------------------------------------------------------------
156
+ // Speak-while-acting
157
+ // -------------------------------------------------------------------------
158
+ it('routes each round\'s prose live and only trailing prose at complete', async () => {
159
+ // Round 1: narration + move; Round 2: more narration + move; final: postscript
160
+ membrane.pushResponse(createMockResponse([
161
+ { type: 'text', text: 'Heading to the door now!' },
162
+ { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
163
+ ], 'tool_use'));
164
+ membrane.pushResponse(createMockResponse([
165
+ { type: 'text', text: 'Door reached, opening it.' },
166
+ { type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'east' } },
167
+ ], 'tool_use'));
168
+ membrane.pushResponse(createMockResponse([
169
+ { type: 'text', text: 'Arrived.' },
170
+ ]));
171
+ const framework = await createFramework();
172
+ const routed = stubChannelRegistry(framework);
173
+ module.toolDelayMs = 25;
174
+ // Track live ordering: when the first segment routes, no tool results
175
+ // may have been provided yet (i.e. delivery happened DURING the round).
176
+ const resultsAtRouteTime = [];
177
+ const registry = framework.channelRegistry;
178
+ const origRoute = registry.routeSpeech;
179
+ registry.routeSpeech = async (a, t, l) => {
180
+ resultsAtRouteTime.push(membrane.lastStream.receivedToolResults.length);
181
+ return origRoute(a, t, l);
182
+ };
183
+ trigger(framework);
184
+ await framework.runUntilIdle();
185
+ assert.deepEqual(routed.map((r) => r.text), ['Heading to the door now!', 'Door reached, opening it.', 'Arrived.'], 'all three segments delivered, in order');
186
+ // Live: segment N routed before round N's tool results were provided
187
+ assert.equal(resultsAtRouteTime[0], 0, 'round-1 prose routed before round-1 results');
188
+ assert.equal(resultsAtRouteTime[1], 1, 'round-2 prose routed before round-2 results');
189
+ // Locus resolved ONCE and pinned for the whole turn (incl. trailing prose)
190
+ assert.deepEqual(routed.map((r) => r.locus), ['chan-live-1', 'chan-live-1', 'chan-live-1'], 'one locus resolution, pinned across the turn');
191
+ await framework.stop();
192
+ });
193
+ it('sticky silencing: a silencing round suppresses its own and all later prose', async () => {
194
+ membrane.pushResponse(createMockResponse([
195
+ { type: 'text', text: 'sending it directly' },
196
+ { type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'hi' } },
197
+ ], 'tool_use'));
198
+ membrane.pushResponse(createMockResponse([
199
+ { type: 'text', text: 'Narrating round two.' },
200
+ { type: 'tool_use', id: 'c2', name: 'robot--move', input: { dir: 'up' } },
201
+ ], 'tool_use'));
202
+ membrane.pushResponse(createMockResponse([]));
203
+ const framework = await createFramework();
204
+ const routed = stubChannelRegistry(framework);
205
+ trigger(framework);
206
+ await framework.runUntilIdle();
207
+ assert.deepEqual(routed.map((r) => r.text), [], 'explicit send in round 1 silences the turn from that round onward');
208
+ await framework.stop();
209
+ });
210
+ it('sticky silencing is forward-only: earlier rounds\' prose still routes', async () => {
211
+ membrane.pushResponse(createMockResponse([
212
+ { type: 'text', text: 'Round one narration.' },
213
+ { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'up' } },
214
+ ], 'tool_use'));
215
+ membrane.pushResponse(createMockResponse([
216
+ { type: 'text', text: 'private planning' },
217
+ { type: 'tool_use', id: 'c2', name: 'robot--send_message', input: { text: 'hi' } },
218
+ ], 'tool_use'));
219
+ membrane.pushResponse(createMockResponse([
220
+ { type: 'text', text: 'trailing postscript' },
221
+ ]));
222
+ const framework = await createFramework();
223
+ const routed = stubChannelRegistry(framework);
224
+ trigger(framework);
225
+ await framework.runUntilIdle();
226
+ assert.deepEqual(routed.map((r) => r.text), ['Round one narration.'], 'round-1 prose delivered live; round-2 (silencing) and trailing suppressed');
227
+ await framework.stop();
228
+ });
229
+ it('new injected channel input resets send suppression and moves the reply locus', async () => {
230
+ // Exact shape of the Fable incident: while handling one channel, the agent
231
+ // explicitly sends that response; a message from another channel arrives
232
+ // during the send, and the terminal prose answers the new message.
233
+ membrane.pushResponse(createMockResponse([
234
+ { type: 'tool_use', id: 'c1', name: 'robot--send_message', input: { text: 'reply to room4' } },
235
+ ], 'tool_use'));
236
+ membrane.pushResponse(createMockResponse([
237
+ { type: 'text', text: 'Yes, I want to try the VR space.' },
238
+ ]));
239
+ const framework = await createFramework();
240
+ const routed = stubChannelRegistry(framework);
241
+ module.interjection = 'Want to try a VR space?';
242
+ module.interjectionChannelId = 'discord:guild:fable';
243
+ trigger(framework);
244
+ await framework.runUntilIdle();
245
+ assert.deepEqual(routed, [
246
+ { text: 'Yes, I want to try the VR space.', locus: 'discord:guild:fable' },
247
+ ]);
248
+ await framework.stop();
249
+ });
250
+ // -------------------------------------------------------------------------
251
+ // Hear-while-acting
252
+ // -------------------------------------------------------------------------
253
+ it('injects a mid-turn message into the resumed stream at the tool boundary', async () => {
254
+ membrane.pushResponse(createMockResponse([
255
+ { type: 'text', text: 'Moving.' },
256
+ { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
257
+ ], 'tool_use'));
258
+ membrane.pushResponse(createMockResponse([
259
+ { type: 'text', text: 'Heard you!' },
260
+ ]));
261
+ const framework = await createFramework();
262
+ module.interjection = 'look left!';
263
+ trigger(framework);
264
+ await framework.runUntilIdle();
265
+ const stream = membrane.lastStream;
266
+ assert.equal(stream.receivedToolResults.length, 1);
267
+ const options = stream.receivedToolResultOptions[0];
268
+ assert.ok(options?.injectedMessages, 'tool-result resume carried injected messages');
269
+ assert.equal(options.injectedMessages.length, 1);
270
+ const injected = options.injectedMessages[0];
271
+ assert.equal(injected.participant, 'Antra');
272
+ const text = injected.content
273
+ .filter((b) => b.type === 'text')
274
+ .map((b) => b.text)
275
+ .join('\n');
276
+ assert.equal(text, 'look left!');
277
+ await framework.stop();
278
+ });
279
+ it('passes no injection options when nothing arrived mid-turn', async () => {
280
+ membrane.pushResponse(createMockResponse([
281
+ { type: 'tool_use', id: 'c1', name: 'robot--move', input: { dir: 'north' } },
282
+ ], 'tool_use'));
283
+ membrane.pushResponse(createMockResponse([
284
+ { type: 'text', text: 'done' },
285
+ ]));
286
+ const framework = await createFramework();
287
+ trigger(framework);
288
+ await framework.runUntilIdle();
289
+ const stream = membrane.lastStream;
290
+ assert.equal(stream.receivedToolResults.length, 1);
291
+ assert.equal(stream.receivedToolResultOptions[0], undefined);
292
+ await framework.stop();
293
+ });
294
+ });
295
+ //# sourceMappingURL=present-while-acting.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"present-while-acting.test.js","sourceRoot":"","sources":["../../test/present-while-acting.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAWjC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAG9E,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAE9E,MAAM,WAAW;IACN,IAAI,GAAG,OAAO,CAAC;IACxB,SAAS,GAA0B,IAAI,CAAC;IACxC;;0BAEsB;IACtB,YAAY,GAAkB,IAAI,CAAC;IACnC,kEAAkE;IAClE,qBAAqB,GAAkB,IAAI,CAAC;IAC5C,2EAA2E;IAC3E,WAAW,GAAG,CAAC,CAAC;IAEhB,KAAK,CAAC,KAAK,CAAC,IAAmB,IAAkB,CAAC;IAClD,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B,QAAQ;QACN,OAAO;YACL;gBACE,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,gBAAgB;gBAC7B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;aACzE;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,WAAW,EAAE,2BAA2B;gBACxC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;aAC1E;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAc;QACjC,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,SAAU,CAAC,SAAS,CAAC;gBACxB,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI,CAAC,qBAAqB;oBAClC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE;oBAC3C,CAAC,CAAC,EAAE;aACoB,CAAC,CAAC;YAC9B,oEAAoE;YACpE,qEAAqE;YACrE,6DAA6D;YAC7D,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAmB,EAAE,MAAoB;QACvD,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,CAAE,KAA+B,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAI,KAAgD,CAAC,QAAQ,CAAC;YAC5E,OAAO;gBACL,WAAW,EAAE;oBACX;wBACE,WAAW,EAAE,OAAO;wBACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;wBACjC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAClC;iBACF;gBACD,mEAAmE;gBACnE,sEAAsE;gBACtE,gBAAgB,EAAE,IAAI,KAAK,IAAI;aAChC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,4EAA4E;AAC5E,SAAS,mBAAmB,CAAC,SAAyB;IACpD,MAAM,MAAM,GAAkD,EAAE,CAAC;IACjE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,QAAQ,GAA4B;QACxC,YAAY,EAAE,GAAG,EAAE;YACjB,UAAU,EAAE,CAAC;YACb,OAAO,aAAa,UAAU,EAAE,CAAC;QACnC,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,KAAqB,EAAE,EAAE;YACzE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAI;QACpC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;QACzB,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS;QAC9B,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE;KAC1B,CAAC;IACF,qEAAqE;IACrE,0EAA0E;IAC1E,kDAAkD;IACjD,SAAqD,CAAC,eAAe,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE;QAC3F,GAAG,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACjF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAE9E,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,OAAe,CAAC;IACpB,IAAI,QAAsB,CAAC;IAC3B,IAAI,MAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC;QACnD,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,eAAe;QAC5B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC;YAC5C,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE;YAC/B,MAAM,EAAE;gBACN,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE;aACnF;YACD,OAAO,EAAE,CAAC,MAAM,CAAC;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,SAAS,OAAO,CAAC,SAAyB;QACxC,SAAS,CAAC,SAAS,CAAC;YAClB,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,EAAE;SACc,CAAC,CAAC;IAChC,CAAC;IAED,4EAA4E;IAC5E,qBAAqB;IACrB,4EAA4E;IAE5E,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,+EAA+E;QAC/E,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;YAClD,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;SAC3D,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,2BAA2B,EAAE;YACnD,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;SAC1D,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;SACjB,CAAC,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;QAExB,sEAAsE;QACtE,wEAAwE;QACxE,MAAM,kBAAkB,GAAa,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAI,SAEhB,CAAC,eAAe,CAAC;QACnB,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC;QACvC,QAAQ,CAAC,WAAW,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACvC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAW,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACzE,OAAO,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,CAAC,SAAS,CACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EACzB,CAAC,0BAA0B,EAAE,2BAA2B,EAAE,UAAU,CAAC,EACrE,wCAAwC,CACzC,CAAC;QACF,qEAAqE;QACrE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,6CAA6C,CAAC,CAAC;QACtF,2EAA2E;QAC3E,MAAM,CAAC,SAAS,CACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAC1B,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,EAC7C,8CAA8C,CAC/C,CAAC;QAEF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;QAC1F,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;YAC7C,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;SACjE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE;YAC9C,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;SACxD,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAoB,CAAC,CAAC,CAAC;QAEhE,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAE9C,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,CAAC,SAAS,CACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EACzB,EAAE,EACF,mEAAmE,CACpE,CAAC;QAEF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE;YAC9C,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;SACxD,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAC1C,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;SACjE,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE;SAC5B,CAAC,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAE9C,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,CAAC,SAAS,CACd,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EACzB,CAAC,sBAAsB,CAAC,EACxB,2EAA2E,CAC5E,CAAC;QAEF,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,2EAA2E;QAC3E,yEAAyE;QACzE,mEAAmE;QACnE,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE;SAC7E,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC,EAAE;SACzC,CAAC,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,YAAY,GAAG,yBAAyB,CAAC;QAChD,MAAM,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QAErD,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;YACvB,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK,EAAE,qBAAqB,EAAE;SAC3E,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAE5E,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;YACjC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;SAC3D,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE;SACnB,CAAC,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,YAAY,GAAG,YAAY,CAAC;QAEnC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAW,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,8CAA8C,CAAC,CAAC;QACrF,MAAM,CAAC,KAAK,CAAC,OAAQ,CAAC,gBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAQ,CAAC,gBAAiB,CAAC,CAAC,CAAE,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAI,QAAQ,CAAC,OAAkD;aACtE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAEjC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;SAC3D,EAAE,UAAU,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;YACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;SACb,CAAC,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,MAAM,eAAe,EAAE,CAAC;QAE1C,OAAO,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,SAAS,CAAC,YAAY,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAW,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAE7D,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=primary-summary-refusal-fallback-integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primary-summary-refusal-fallback-integration.test.d.ts","sourceRoot":"","sources":["../../test/primary-summary-refusal-fallback-integration.test.ts"],"names":[],"mappings":""}