@roj-ai/sdk 0.1.11 → 0.1.13

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 (46) hide show
  1. package/dist/bootstrap.d.ts +6 -0
  2. package/dist/bootstrap.d.ts.map +1 -1
  3. package/dist/core/agents/agent.d.ts +2 -0
  4. package/dist/core/agents/agent.d.ts.map +1 -1
  5. package/dist/core/agents/agent.js +46 -10
  6. package/dist/core/agents/agent.js.map +1 -1
  7. package/dist/core/sessions/session-manager.d.ts.map +1 -1
  8. package/dist/core/sessions/session-manager.js +13 -5
  9. package/dist/core/sessions/session-manager.js.map +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/plugins/agents/plugin.d.ts +20 -0
  13. package/dist/plugins/agents/plugin.d.ts.map +1 -1
  14. package/dist/plugins/agents/plugin.js +189 -2
  15. package/dist/plugins/agents/plugin.js.map +1 -1
  16. package/dist/plugins/agents/supervision.integration.test.d.ts +2 -0
  17. package/dist/plugins/agents/supervision.integration.test.d.ts.map +1 -0
  18. package/dist/plugins/agents/supervision.integration.test.js +215 -0
  19. package/dist/plugins/agents/supervision.integration.test.js.map +1 -0
  20. package/dist/plugins/mailbox/mailbox.integration.test.js +80 -0
  21. package/dist/plugins/mailbox/mailbox.integration.test.js.map +1 -1
  22. package/dist/plugins/mailbox/plugin.d.ts +1 -0
  23. package/dist/plugins/mailbox/plugin.d.ts.map +1 -1
  24. package/dist/plugins/mailbox/plugin.js +17 -0
  25. package/dist/plugins/mailbox/plugin.js.map +1 -1
  26. package/dist/plugins/mailbox/schema.d.ts +1 -1
  27. package/dist/plugins/mailbox/schema.d.ts.map +1 -1
  28. package/dist/plugins/mailbox/state.d.ts +2 -1
  29. package/dist/plugins/mailbox/state.d.ts.map +1 -1
  30. package/dist/plugins/mailbox/state.js +1 -1
  31. package/dist/plugins/mailbox/state.js.map +1 -1
  32. package/dist/transport/http/middleware/error-handler.d.ts +1 -1
  33. package/dist/user-config.d.ts +32 -0
  34. package/dist/user-config.d.ts.map +1 -1
  35. package/dist/user-config.js.map +1 -1
  36. package/package.json +2 -2
  37. package/src/core/agents/agent.ts +52 -14
  38. package/src/core/sessions/session-manager.ts +14 -5
  39. package/src/index.ts +1 -1
  40. package/src/plugins/agents/plugin.ts +228 -3
  41. package/src/plugins/agents/supervision.integration.test.ts +249 -0
  42. package/src/plugins/mailbox/mailbox.integration.test.ts +95 -0
  43. package/src/plugins/mailbox/plugin.ts +20 -0
  44. package/src/plugins/mailbox/schema.ts +1 -0
  45. package/src/plugins/mailbox/state.ts +2 -1
  46. package/src/user-config.ts +34 -0
@@ -18,6 +18,102 @@ import { getNextAgentSeq } from '../../core/sessions/state.js';
18
18
  import { createTool } from '../../core/tools/definition.js';
19
19
  import { Err, Ok } from '../../lib/utils/result.js';
20
20
  import { mailboxPlugin } from '../../plugins/mailbox/plugin.js';
21
+ /**
22
+ * Recommended supervision interval — 4 min, just under prompt cache TTL.
23
+ * Each tick triggers a parent inference, keeping the prompt cache warm.
24
+ */
25
+ export const SUPERVISION_INTERVAL_CACHE_FRIENDLY = 240_000;
26
+ /**
27
+ * Get all direct children of an agent.
28
+ */
29
+ function getDirectChildren(sessionAgents, parentId) {
30
+ const out = [];
31
+ for (const agent of sessionAgents.values()) {
32
+ if (agent.parentId === parentId)
33
+ out.push(agent);
34
+ }
35
+ return out;
36
+ }
37
+ /**
38
+ * Count assistant tool calls across conversation history + currently pending.
39
+ */
40
+ function countToolCalls(state) {
41
+ let total = state.pendingToolCalls.length;
42
+ for (const m of state.conversationHistory) {
43
+ if (m.role === 'assistant' && m.toolCalls)
44
+ total += m.toolCalls.length;
45
+ }
46
+ return total;
47
+ }
48
+ /**
49
+ * Count completed LLM inferences (= assistant turns in history).
50
+ */
51
+ function countLLMCalls(state) {
52
+ let total = 0;
53
+ for (const m of state.conversationHistory) {
54
+ if (m.role === 'assistant')
55
+ total++;
56
+ }
57
+ return total;
58
+ }
59
+ /**
60
+ * Build a compact "first N words..last M words" preview of the agent's most
61
+ * recent assistant message (skipping empty turns). Returns null if none.
62
+ */
63
+ function previewLastAssistant(state, headWords = 5, tailWords = 5) {
64
+ for (let i = state.conversationHistory.length - 1; i >= 0; i--) {
65
+ const m = state.conversationHistory[i];
66
+ if (m.role !== 'assistant')
67
+ continue;
68
+ const text = m.content?.trim();
69
+ if (!text)
70
+ continue;
71
+ const words = text.split(/\s+/);
72
+ if (words.length <= headWords + tailWords + 1)
73
+ return text;
74
+ return `${words.slice(0, headWords).join(' ')}..${words.slice(-tailWords).join(' ')}`;
75
+ }
76
+ return null;
77
+ }
78
+ /**
79
+ * Build a compact children-status snapshot for the given parent agent.
80
+ */
81
+ function buildChildrenStatus(sessionAgents, parentId) {
82
+ const children = getDirectChildren(sessionAgents, parentId);
83
+ const lines = children.map((c) => {
84
+ const tools = countToolCalls(c);
85
+ const llm = countLLMCalls(c);
86
+ const subs = getDirectChildren(sessionAgents, c.id).length;
87
+ const last = previewLastAssistant(c);
88
+ const parts = [c.id, c.status];
89
+ parts.push(`${tools} tools`);
90
+ parts.push(`${llm} llm`);
91
+ if (subs > 0)
92
+ parts.push(`${subs} sub${subs === 1 ? '' : 's'}`);
93
+ if (last)
94
+ parts.push(`last "${last.replaceAll('"', "'")}"`);
95
+ return parts.join(', ');
96
+ });
97
+ return `<children-status>\n${lines.join('\n')}\n</children-status>`;
98
+ }
99
+ /**
100
+ * (Re)schedule a supervision tick for an agent. Any existing timer is cleared first.
101
+ */
102
+ function scheduleSupervisionTick(pluginContext, agentId, delayMs) {
103
+ const existing = pluginContext.timers.get(agentId);
104
+ if (existing)
105
+ clearTimeout(existing);
106
+ const timer = setTimeout(() => {
107
+ pluginContext.timers.delete(agentId);
108
+ const trigger = pluginContext.triggerTick;
109
+ if (!trigger)
110
+ return;
111
+ trigger(agentId).catch((err) => {
112
+ pluginContext.logger?.error('Supervision tick failed', err instanceof Error ? err : undefined, { agentId });
113
+ });
114
+ }, delayMs);
115
+ pluginContext.timers.set(agentId, timer);
116
+ }
21
117
  /**
22
118
  * Creates the Zod schema for a start_<agent_name> tool.
23
119
  * If the agent has an inputSchema, includes a typed `input` field.
@@ -36,6 +132,12 @@ function createStartAgentSchema(agent) {
36
132
  export const agentsPlugin = definePlugin('agents')
37
133
  .pluginConfig()
38
134
  .dependencies([mailboxPlugin])
135
+ .context(async () => ({
136
+ timers: new Map(),
137
+ triggerTick: null,
138
+ intervalMs: null,
139
+ logger: null,
140
+ }))
39
141
  .isEnabled((ctx) => {
40
142
  return ctx.agentConfig.spawnableAgents.length > 0;
41
143
  })
@@ -82,6 +184,10 @@ export const agentsPlugin = definePlugin('agents')
82
184
  definitionName: input.definitionName,
83
185
  parentId: input.parentId,
84
186
  });
187
+ // Ensure parent has a supervision tick running now that it has a child.
188
+ if (ctx.pluginContext.intervalMs !== null) {
189
+ scheduleSupervisionTick(ctx.pluginContext, parentId, ctx.pluginContext.intervalMs);
190
+ }
85
191
  return Ok({ agentId });
86
192
  },
87
193
  })
@@ -157,12 +263,93 @@ export const agentsPlugin = definePlugin('agents')
157
263
  return Ok({});
158
264
  },
159
265
  })
160
- .systemPrompt(() => {
161
- return `## Working with Child Agents
266
+ .method('_supervisionTick', {
267
+ input: z.object({ agentId: agentIdSchema }),
268
+ output: z.object({}),
269
+ handler: async (ctx, input) => {
270
+ const agentId = AgentId(input.agentId);
271
+ // Self may already be gone (terminated mid-tick); just stop.
272
+ if (!ctx.sessionState.agents.has(agentId))
273
+ return Ok({});
274
+ const children = getDirectChildren(ctx.sessionState.agents, agentId);
275
+ if (children.length === 0) {
276
+ // No active children → don't reschedule. spawn() will re-arm if/when needed.
277
+ return Ok({});
278
+ }
279
+ const snapshot = buildChildrenStatus(ctx.sessionState.agents, agentId);
280
+ const sendResult = await ctx.deps.mailbox.send({
281
+ toAgentId: agentId,
282
+ content: snapshot,
283
+ fromSupervisor: true,
284
+ });
285
+ if (!sendResult.ok) {
286
+ ctx.logger.warn('Supervision snapshot send failed', {
287
+ agentId,
288
+ error: sendResult.error.message,
289
+ });
290
+ }
291
+ // Reschedule the next tick from now (rolling).
292
+ if (ctx.pluginContext.intervalMs !== null) {
293
+ scheduleSupervisionTick(ctx.pluginContext, agentId, ctx.pluginContext.intervalMs);
294
+ }
295
+ return Ok({});
296
+ },
297
+ })
298
+ .sessionHook('onSessionReady', async (ctx) => {
299
+ const intervalMs = ctx.pluginConfig.superviseChildrenIntervalMs;
300
+ if (intervalMs === undefined) {
301
+ // Supervision disabled (default). No timer wiring; spawn() and
302
+ // afterInference() check intervalMs === null and skip too.
303
+ ctx.pluginContext.intervalMs = null;
304
+ return;
305
+ }
306
+ ctx.pluginContext.intervalMs = intervalMs;
307
+ ctx.pluginContext.logger = ctx.logger;
308
+ // Wire the trigger callback — calls back via self.* so each tick gets a
309
+ // fresh ctx (live sessionState/pluginState/deps).
310
+ ctx.pluginContext.triggerTick = (agentId) => ctx.self._supervisionTick({ agentId });
311
+ // (Re-)schedule timers for every agent that currently has direct children.
312
+ // Covers initial session creation AND server-restart reload (onSessionReady
313
+ // fires in both paths). Worst-case drift after restart = intervalMs.
314
+ for (const agent of ctx.sessionState.agents.values()) {
315
+ if (getDirectChildren(ctx.sessionState.agents, agent.id).length > 0) {
316
+ scheduleSupervisionTick(ctx.pluginContext, agent.id, intervalMs);
317
+ }
318
+ }
319
+ })
320
+ .sessionHook('onSessionClose', async (ctx) => {
321
+ for (const t of ctx.pluginContext.timers.values())
322
+ clearTimeout(t);
323
+ ctx.pluginContext.timers.clear();
324
+ ctx.pluginContext.triggerTick = null;
325
+ })
326
+ .hook('afterInference', async (ctx) => {
327
+ // Natural inference warmed the cache — push the next tick out by intervalMs
328
+ // so we don't double-charge for parents who are already actively interacting.
329
+ if (ctx.pluginContext.intervalMs !== null) {
330
+ if (getDirectChildren(ctx.sessionState.agents, ctx.agentId).length > 0) {
331
+ scheduleSupervisionTick(ctx.pluginContext, ctx.agentId, ctx.pluginContext.intervalMs);
332
+ }
333
+ }
334
+ return null;
335
+ })
336
+ .systemPrompt((ctx) => {
337
+ const base = `## Working with Child Agents
162
338
 
163
339
  - **New task** → spawn a new agent using \`start_<agent_name>\`. You will receive the agent's ID in the result — use it with \`send_message\` for follow-up communication.
164
340
  - **Follow-up on an existing task** → send a message to the existing agent via \`send_message\` with the agent's ID. Do NOT spawn a new agent for feedback, corrections, or additional instructions on a task already assigned.
165
341
  - Spawned agents communicate back to you via \`send_message\`. Check your incoming messages for their results and progress updates.`;
342
+ // Only include supervision instructions if supervision is actually enabled
343
+ // for this session — otherwise the section is misleading bloat.
344
+ if (ctx.pluginContext.intervalMs === null)
345
+ return base;
346
+ return `${base}
347
+
348
+ ### Supervision messages
349
+
350
+ You will periodically receive a \`<children-status>\` message from \`from="supervisor"\`. It is a status snapshot of your direct children — purely informational. Per child you'll see status, cumulative tool/llm call counts, sub-agent count, and a "first words..last words" preview of their last assistant turn.
351
+
352
+ Do NOT act on a supervision tick unless something is genuinely wrong (a child has been errored or stuck for a long time, you have a deadline, etc.). Most of the time you should just wait. Never reply to the supervisor.`;
166
353
  })
167
354
  .tools((ctx) => {
168
355
  const spawnableAgents = ctx.agentConfig.spawnableAgents;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/agents/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/plugins/agents/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=supervision.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.integration.test.d.ts","sourceRoot":"","sources":["../../../src/plugins/agents/supervision.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,215 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { MockLLMProvider } from '../../core/llm/mock.js';
3
+ import { ToolCallId } from '../../core/tools/schema.js';
4
+ import { agentsPlugin } from '../../plugins/agents/plugin.js';
5
+ import { mailboxEvents } from '../../plugins/mailbox/index.js';
6
+ import { createMultiAgentPreset, TestHarness } from '../../testing/index.js';
7
+ /**
8
+ * Helper — wait until at least one supervision message has landed in the parent's
9
+ * mailbox (or timeout). We poll because supervision ticks fire on real timers.
10
+ */
11
+ async function waitForSupervisorMessage(session, toAgentId, timeoutMs = 2000) {
12
+ const deadline = Date.now() + timeoutMs;
13
+ while (Date.now() < deadline) {
14
+ const events = await session.getEventsByType(mailboxEvents, 'mailbox_message');
15
+ const found = events.find((e) => e.message.from === 'supervisor'
16
+ && e.toAgentId === toAgentId
17
+ && typeof e.message.content === 'string');
18
+ if (found)
19
+ return found;
20
+ await new Promise((r) => setTimeout(r, 25));
21
+ }
22
+ return undefined;
23
+ }
24
+ describe('agents plugin supervision', () => {
25
+ it('parent with active children receives a periodic <children-status> snapshot', async () => {
26
+ let orchestratorCalls = 0;
27
+ let workerCalls = 0;
28
+ const harness = new TestHarness({
29
+ presets: [{
30
+ ...createMultiAgentPreset([
31
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
32
+ ], { orchestratorSystem: 'Orchestrator agent.' }),
33
+ plugins: [{ pluginName: 'agents', definition: agentsPlugin, config: { superviseChildrenIntervalMs: 100 } }],
34
+ }],
35
+ mockHandler: (request) => {
36
+ if (request.systemPrompt.includes('Orchestrator')) {
37
+ orchestratorCalls++;
38
+ if (orchestratorCalls === 1) {
39
+ return {
40
+ content: null,
41
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Long-running task' } }],
42
+ finishReason: 'stop',
43
+ metrics: MockLLMProvider.defaultMetrics(),
44
+ };
45
+ }
46
+ // Subsequent calls: orchestrator does nothing more, just acknowledges.
47
+ return { content: 'noted', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
48
+ }
49
+ // Worker: takes a long time — say something but never reports back.
50
+ workerCalls++;
51
+ return { content: `Working on step ${workerCalls}`, toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
52
+ },
53
+ });
54
+ const session = await harness.createSession('test');
55
+ await session.sendMessage('Start');
56
+ // Orchestrator is the entry agent in this preset. Wait for a tick.
57
+ const orchestratorId = session.getEntryAgentId();
58
+ const supervisorMsg = await waitForSupervisorMessage(session, orchestratorId);
59
+ expect(supervisorMsg).toBeDefined();
60
+ expect(supervisorMsg.message.content).toContain('<children-status>');
61
+ expect(supervisorMsg.message.content).toContain('worker_1');
62
+ // Cumulative LLM call count should be present
63
+ expect(supervisorMsg.message.content).toMatch(/worker_1[^,\n]*,[^,\n]*,\s*\d+ tools,\s*\d+ llm/);
64
+ await harness.shutdown();
65
+ });
66
+ it('default (no config) → supervision disabled, no tick fires', async () => {
67
+ const harness = new TestHarness({
68
+ presets: [createMultiAgentPreset([
69
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
70
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
71
+ mockHandler: (request) => {
72
+ if (request.systemPrompt.includes('Orchestrator')) {
73
+ return {
74
+ content: null,
75
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Do work' } }],
76
+ finishReason: 'stop',
77
+ metrics: MockLLMProvider.defaultMetrics(),
78
+ };
79
+ }
80
+ return { content: 'Working', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
81
+ },
82
+ });
83
+ const session = await harness.createSession('test');
84
+ await session.sendMessage('Start');
85
+ // Wait long enough for ticks if they were enabled (they shouldn't).
86
+ await new Promise((r) => setTimeout(r, 300));
87
+ const events = await session.getEventsByType(mailboxEvents, 'mailbox_message');
88
+ const supervisorMessages = events.filter(e => e.message.from === 'supervisor');
89
+ expect(supervisorMessages).toHaveLength(0);
90
+ await harness.shutdown();
91
+ });
92
+ it('parent without children → no tick fires', async () => {
93
+ const harness = new TestHarness({
94
+ presets: [{
95
+ ...createMultiAgentPreset([
96
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
97
+ ], { orchestratorSystem: 'Orchestrator agent.' }),
98
+ plugins: [{ pluginName: 'agents', definition: agentsPlugin, config: { superviseChildrenIntervalMs: 100 } }],
99
+ }],
100
+ mockHandler: (request) => {
101
+ // Orchestrator never spawns anyone.
102
+ if (request.systemPrompt.includes('Orchestrator')) {
103
+ return { content: 'Done without spawning', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
104
+ }
105
+ return { content: 'unused', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
106
+ },
107
+ });
108
+ const session = await harness.createSession('test');
109
+ await session.sendAndWaitForIdle('Start');
110
+ // Give supervision plenty of room to fire (it shouldn't).
111
+ await new Promise((r) => setTimeout(r, 300));
112
+ const events = await session.getEventsByType(mailboxEvents, 'mailbox_message');
113
+ const supervisorMessages = events.filter(e => e.message.from === 'supervisor');
114
+ expect(supervisorMessages).toHaveLength(0);
115
+ await harness.shutdown();
116
+ });
117
+ it('snapshot includes "first words..last words" preview of last assistant turn', async () => {
118
+ let orchestratorCalls = 0;
119
+ const harness = new TestHarness({
120
+ presets: [{
121
+ ...createMultiAgentPreset([
122
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
123
+ ], { orchestratorSystem: 'Orchestrator agent.' }),
124
+ plugins: [{ pluginName: 'agents', definition: agentsPlugin, config: { superviseChildrenIntervalMs: 100 } }],
125
+ }],
126
+ mockHandler: (request) => {
127
+ if (request.systemPrompt.includes('Orchestrator')) {
128
+ orchestratorCalls++;
129
+ if (orchestratorCalls === 1) {
130
+ return {
131
+ content: null,
132
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Long task' } }],
133
+ finishReason: 'stop',
134
+ metrics: MockLLMProvider.defaultMetrics(),
135
+ };
136
+ }
137
+ return { content: 'ack', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
138
+ }
139
+ // Worker says a long sentence that should be truncated to first..last words
140
+ return {
141
+ content: 'Started fetching data and now I am running through the pipeline analyzing the response carefully',
142
+ toolCalls: [],
143
+ finishReason: 'stop',
144
+ metrics: MockLLMProvider.defaultMetrics(),
145
+ };
146
+ },
147
+ });
148
+ const session = await harness.createSession('test');
149
+ await session.sendMessage('Start');
150
+ const orchestratorId = session.getEntryAgentId();
151
+ const msg = await waitForSupervisorMessage(session, orchestratorId);
152
+ expect(msg).toBeDefined();
153
+ // Should contain both head (first 5 words) and tail (last 5 words), joined by ".."
154
+ expect(msg.message.content).toContain('Started fetching data and now');
155
+ expect(msg.message.content).toContain('pipeline analyzing the response carefully');
156
+ expect(msg.message.content).toMatch(/\.\.pipeline/);
157
+ await harness.shutdown();
158
+ });
159
+ it('server restart re-establishes timers via onSessionReady', async () => {
160
+ const sharedEventStore = new (await import('../../core/events/memory.js')).MemoryEventStore();
161
+ // Counter shared across phases — phase 1 spawns once, then orchestrator goes idle;
162
+ // phase 2 just acknowledges any wake-up triggered by the supervision tick.
163
+ let orchestratorCalls = 0;
164
+ const buildHarness = (intervalMs) => new TestHarness({
165
+ eventStore: sharedEventStore,
166
+ presets: [{
167
+ ...createMultiAgentPreset([
168
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
169
+ ], { orchestratorSystem: 'Orchestrator agent.' }),
170
+ ...(intervalMs !== undefined && {
171
+ plugins: [{ pluginName: 'agents', definition: agentsPlugin, config: { superviseChildrenIntervalMs: intervalMs } }],
172
+ }),
173
+ }],
174
+ mockHandler: (request) => {
175
+ if (request.systemPrompt.includes('Orchestrator')) {
176
+ orchestratorCalls++;
177
+ if (orchestratorCalls === 1) {
178
+ return {
179
+ content: null,
180
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Long task' } }],
181
+ finishReason: 'stop',
182
+ metrics: MockLLMProvider.defaultMetrics(),
183
+ };
184
+ }
185
+ return { content: 'noted', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
186
+ }
187
+ return { content: 'still working', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
188
+ },
189
+ });
190
+ // Phase 1: create session with supervision DISABLED (default) so no ticks pre-restart.
191
+ const harness1 = buildHarness(undefined);
192
+ const session1 = await harness1.createSession('test');
193
+ await session1.sendAndWaitForIdle('Start');
194
+ const hasWorker = () => {
195
+ for (const agent of session1.state.agents.values()) {
196
+ if (agent.definitionName === 'worker')
197
+ return true;
198
+ }
199
+ return false;
200
+ };
201
+ expect(hasWorker()).toBe(true);
202
+ const sessionId = session1.sessionId;
203
+ await harness1.shutdown();
204
+ // Phase 2: restart with supervision enabled. onSessionReady should
205
+ // re-arm the orchestrator's tick because it has a child.
206
+ const harness2 = buildHarness(100);
207
+ const session2 = await harness2.openSession(sessionId);
208
+ const orchestratorId = session2.getEntryAgentId();
209
+ const msg = await waitForSupervisorMessage(session2, orchestratorId, 1500);
210
+ expect(msg).toBeDefined();
211
+ expect(msg.message.content).toContain('worker_1');
212
+ await harness2.shutdown();
213
+ });
214
+ });
215
+ //# sourceMappingURL=supervision.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.integration.test.js","sourceRoot":"","sources":["../../../src/plugins/agents/supervision.integration.test.ts"],"names":[],"mappings":"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"}
@@ -498,6 +498,86 @@ describe('mailbox plugin', () => {
498
498
  expect(completionMessages).toHaveLength(0);
499
499
  await harness.shutdown();
500
500
  });
501
+ it('empty-stop LLM response → agent retries; persistent empty → onError reports to parent', async () => {
502
+ let workerCalls = 0;
503
+ let orchestratorCalls = 0;
504
+ const harness = new TestHarness({
505
+ presets: [createMultiAgentPreset([
506
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
507
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
508
+ mockHandler: (request) => {
509
+ if (request.systemPrompt.includes('Orchestrator')) {
510
+ orchestratorCalls++;
511
+ if (orchestratorCalls === 1) {
512
+ return {
513
+ content: null,
514
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Do work' } }],
515
+ finishReason: 'stop',
516
+ metrics: MockLLMProvider.defaultMetrics(),
517
+ };
518
+ }
519
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
520
+ }
521
+ workerCalls++;
522
+ // Always empty-stop → triggers retry until exhausted, then onError
523
+ return { content: null, toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
524
+ },
525
+ });
526
+ const session = await harness.createSession('test');
527
+ await session.sendMessage('Start');
528
+ // Worker ends up errored (not idle); poll for the error message to parent.
529
+ const deadline = Date.now() + 5000;
530
+ let errMsg;
531
+ while (Date.now() < deadline) {
532
+ const events = await session.getEventsByType(mailboxEvents, 'mailbox_message');
533
+ errMsg = events.find(e => e.message.from === AgentId('worker_1')
534
+ && typeof e.message.content === 'string'
535
+ && e.message.content.startsWith('Agent encountered an error:'));
536
+ if (errMsg)
537
+ break;
538
+ await new Promise((r) => setTimeout(r, 50));
539
+ }
540
+ // Initial + 2 retries = 3 worker LLM calls
541
+ expect(workerCalls).toBe(3);
542
+ expect(errMsg).toBeDefined();
543
+ await harness.shutdown();
544
+ });
545
+ it('empty-stop LLM response → recovers on retry, no error sent', async () => {
546
+ let workerCalls = 0;
547
+ let orchestratorCalls = 0;
548
+ const harness = new TestHarness({
549
+ presets: [createMultiAgentPreset([
550
+ { name: 'worker', system: 'Worker agent.', tools: [], agents: [] },
551
+ ], { orchestratorSystem: 'Orchestrator agent.' })],
552
+ mockHandler: (request) => {
553
+ if (request.systemPrompt.includes('Orchestrator')) {
554
+ orchestratorCalls++;
555
+ if (orchestratorCalls === 1) {
556
+ return {
557
+ content: null,
558
+ toolCalls: [{ id: ToolCallId('tc1'), name: 'start_worker', input: { message: 'Do work' } }],
559
+ finishReason: 'stop',
560
+ metrics: MockLLMProvider.defaultMetrics(),
561
+ };
562
+ }
563
+ return { content: 'Done', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
564
+ }
565
+ workerCalls++;
566
+ if (workerCalls === 1) {
567
+ return { content: null, toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
568
+ }
569
+ return { content: 'Recovered', toolCalls: [], finishReason: 'stop', metrics: MockLLMProvider.defaultMetrics() };
570
+ },
571
+ });
572
+ const session = await harness.createSession('test');
573
+ await session.sendAndWaitForIdle('Start');
574
+ expect(workerCalls).toBe(2);
575
+ const events = await session.getEventsByType(mailboxEvents, 'mailbox_message');
576
+ const errMsg = events.find(e => typeof e.message.content === 'string'
577
+ && e.message.content.startsWith('Agent encountered an error:'));
578
+ expect(errMsg).toBeUndefined();
579
+ await harness.shutdown();
580
+ });
501
581
  it('agent without parent → no completion message even with flag true', async () => {
502
582
  const harness = new TestHarness({
503
583
  presets: [createTestPreset({