Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions assistant/src/__tests__/subagent-manager-notify.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -397,8 +397,8 @@ describe('SubagentManager sendMessage validation', () => {
const subagentId = 'sub-1';
injectFakeSubagent(manager, subagentId, makeState(subagentId));

expect(manager.sendMessage(subagentId, '')).toBe(false);
expect(manager.sendMessage(subagentId, ' ')).toBe(false);
expect(manager.sendMessage(subagentId, '\n\t')).toBe(false);
expect(manager.sendMessage(subagentId, '')).toBe('empty');
expect(manager.sendMessage(subagentId, ' ')).toBe('empty');
expect(manager.sendMessage(subagentId, '\n\t')).toBe('empty');
});
});
13 changes: 10 additions & 3 deletions assistant/src/daemon/handlers/subagents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,17 @@ export function handleSubagentMessage(
return;
}

const sent = manager.sendMessage(msg.subagentId, msg.content);
const result = manager.sendMessage(msg.subagentId, msg.content);

if (!sent) {
log.warn({ subagentId: msg.subagentId }, 'Client sent message to terminal subagent');
if (result === 'queue_full') {
log.warn({ subagentId: msg.subagentId }, 'Subagent message rejected — queue full');
ctx.send(socket, {
type: 'error',
message: `Subagent "${msg.subagentId}" message queue is full. Please wait for current messages to be processed.`,
category: 'queue_full',
});
} else if (result !== 'sent') {
log.warn({ subagentId: msg.subagentId, reason: result }, 'Client sent message to terminal subagent');
ctx.send(socket, {
type: 'error',
message: `Subagent "${msg.subagentId}" not found or in terminal state.`,
Comment thread
siddseethepalli marked this conversation as resolved.
Expand Down
12 changes: 6 additions & 6 deletions assistant/src/subagent/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -343,28 +343,28 @@ export class SubagentManager {

// ── Send message to subagent ──────────────────────────────────────────

sendMessage(subagentId: string, content: string): boolean {
sendMessage(subagentId: string, content: string): 'sent' | 'empty' | 'not_found' | 'terminal' | 'queue_full' {
const trimmed = content?.trim();
if (!trimmed) return false;
if (!trimmed) return 'empty';

const managed = this.subagents.get(subagentId);
if (!managed) return false;
if (TERMINAL_STATUSES.has(managed.state.status)) return false;
if (!managed) return 'not_found';
if (TERMINAL_STATUSES.has(managed.state.status)) return 'terminal';

const onEvent = managed.session.sendToClient;
const requestId = uuid();

// If the session is busy, queue the message; otherwise process immediately.
const result = managed.session.enqueueMessage(trimmed, [], onEvent, requestId);
if (result.rejected) return false;
if (result.rejected) return 'queue_full';
if (!result.queued) {
// Session is idle — send directly. Fire-and-forget so we don't block.
const messageId = managed.session.persistUserMessage(trimmed, []);
managed.session.runAgentLoop(trimmed, messageId, onEvent).catch((err) => {
log.error({ subagentId, err }, 'Subagent message processing failed');
});
}
return true;
return 'sent';
}

// ── Queries ───────────────────────────────────────────────────────────
Expand Down
11 changes: 9 additions & 2 deletions assistant/src/tools/subagent/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,16 @@ export async function executeSubagentMessage(
};
}

const sent = manager.sendMessage(subagentId, content);
const result = manager.sendMessage(subagentId, content);

if (!sent) {
if (result === 'queue_full') {
return {
content: `Subagent "${subagentId}" message queue is full. Please wait for current messages to be processed.`,
isError: true,
};
}

if (result !== 'sent') {
return {
content: `Could not send message to subagent "${subagentId}". It may not exist or be in a terminal state.`,
isError: true,
Expand Down