diff options
| author | Adam Malczewski <[email protected]> | 2026-05-23 05:06:12 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-05-23 05:06:12 +0900 |
| commit | 9287cccb29d135ea19f2612c26f3090c94820d8c (patch) | |
| tree | 2d68e8cacf6d71786f305d5f4a512a68f19137c5 /packages/core/src/tools | |
| parent | ef427d3eae77fca716c203dd8bd84939710c518a (diff) | |
| download | dispatch-9287cccb29d135ea19f2612c26f3090c94820d8c.tar.gz dispatch-9287cccb29d135ea19f2612c26f3090c94820d8c.zip | |
feat: add is_subagent flag to agents, fix all lint/type/test issues
- Add is_subagent checkbox to agent editor; subagents are hidden from Chat Settings
- Add is_subagent field to AgentDefinition type, TOML serialization, and API route
- Filter subagents from ModelSelector agent list
- Fix all biome lint/format errors across codebase (useLiteralKeys, noNonNullAssertion, noExplicitAny, formatting, import sorting)
- Fix svelte-check errors (type narrowing in SkillsBrowser, ToolPermissions, SidebarPanel)
- Fix a11y warnings in App.svelte (label-control associations)
- Fix test mocks missing BackgroundShellStore, BackgroundTranscriptStore, createWebSearchTool, createYoutubeTranscribeTool
- Update stale 409 test to match current message-queuing behavior
- Exclude packaging/ and release/ dirs from biome to avoid linting stale build artifacts
Diffstat (limited to 'packages/core/src/tools')
| -rw-r--r-- | packages/core/src/tools/retrieve.ts | 32 | ||||
| -rw-r--r-- | packages/core/src/tools/web-search.ts | 6 | ||||
| -rw-r--r-- | packages/core/src/tools/youtube-transcribe.ts | 6 |
3 files changed, 24 insertions, 20 deletions
diff --git a/packages/core/src/tools/retrieve.ts b/packages/core/src/tools/retrieve.ts index 021d1b7..80c3715 100644 --- a/packages/core/src/tools/retrieve.ts +++ b/packages/core/src/tools/retrieve.ts @@ -28,29 +28,33 @@ export function createRetrieveTool(callbacks: RetrieveCallbacks): ToolDefinition parameters: z.object({ agent_id: z.string().describe("The agent_id returned by a previous summon call."), }), - execute: async (args: Record<string, unknown>, context?: ToolExecuteContext): Promise<string> => { + execute: async ( + args: Record<string, unknown>, + context?: ToolExecuteContext, + ): Promise<string> => { const agentId = args.agent_id as string; const queueCallbacks = context?.queueCallbacks; try { let outcome: { status: "done"; result: string } | { status: "error"; error: string }; - if (queueCallbacks) { - const childPromise = callbacks.getResult(agentId); - const { promise: queuePromise, cancel: cancelQueueWait } = queueCallbacks.waitForQueuedMessage(); - const queueSignal = queuePromise.then(() => "QUEUE_INTERRUPT" as const); + if (queueCallbacks) { + const childPromise = callbacks.getResult(agentId); + const { promise: queuePromise, cancel: cancelQueueWait } = + queueCallbacks.waitForQueuedMessage(); + const queueSignal = queuePromise.then(() => "QUEUE_INTERRUPT" as const); - const raceResult = await Promise.race([childPromise, queueSignal]); + const raceResult = await Promise.race([childPromise, queueSignal]); - if (raceResult === "QUEUE_INTERRUPT") { - const queuedMsgs = queueCallbacks.dequeueMessages(); - const userMessages = queuedMsgs.map((m) => m.message).join("\n---\n"); - return `The subagent (agent_id: ${agentId}) has not completed its task yet. You will need to call retrieve with this agent_id again later to get the result.\n\n[USER INTERRUPT]\nThe user has sent you message(s) while you were working. You MUST address these before continuing with your current task:\n\n${userMessages}`; - } + if (raceResult === "QUEUE_INTERRUPT") { + const queuedMsgs = queueCallbacks.dequeueMessages(); + const userMessages = queuedMsgs.map((m) => m.message).join("\n---\n"); + return `The subagent (agent_id: ${agentId}) has not completed its task yet. You will need to call retrieve with this agent_id again later to get the result.\n\n[USER INTERRUPT]\nThe user has sent you message(s) while you were working. You MUST address these before continuing with your current task:\n\n${userMessages}`; + } - // Child finished first — clean up the queue listener - cancelQueueWait(); - outcome = raceResult; + // Child finished first — clean up the queue listener + cancelQueueWait(); + outcome = raceResult; } else { outcome = await callbacks.getResult(agentId); } diff --git a/packages/core/src/tools/web-search.ts b/packages/core/src/tools/web-search.ts index 4265aa7..7f061a5 100644 --- a/packages/core/src/tools/web-search.ts +++ b/packages/core/src/tools/web-search.ts @@ -70,7 +70,9 @@ export function createWebSearchTool(): ToolDefinition { return `Error: Firecrawl returned HTTP ${response.status} ${response.statusText}${text ? `: ${text}` : ""}`; } - let json: { data?: Array<{ title?: string; url?: string; description?: string; markdown?: string }> }; + let json: { + data?: Array<{ title?: string; url?: string; description?: string; markdown?: string }>; + }; try { json = await response.json(); } catch { @@ -96,7 +98,7 @@ export function createWebSearchTool(): ToolDefinition { let output = parts.join("\n\n---\n\n"); if (output.length > MAX_OUTPUT_CHARS) { - output = output.slice(0, MAX_OUTPUT_CHARS) + "\n\n[Output truncated]"; + output = `${output.slice(0, MAX_OUTPUT_CHARS)}\n\n[Output truncated]`; } return output; }, diff --git a/packages/core/src/tools/youtube-transcribe.ts b/packages/core/src/tools/youtube-transcribe.ts index cfa006d..ea8ed43 100644 --- a/packages/core/src/tools/youtube-transcribe.ts +++ b/packages/core/src/tools/youtube-transcribe.ts @@ -41,9 +41,7 @@ function formatTime(seconds: number): string { function formatTranscript(data: TranscriptResponse): string { const segments = data.segments ?? []; - const segmentsText = segments - .map((seg) => `[${formatTime(seg.start)}] ${seg.text}`) - .join("\n"); + const segmentsText = segments.map((seg) => `[${formatTime(seg.start)}] ${seg.text}`).join("\n"); const output = [ `Video ID: ${data.video_id}`, @@ -58,7 +56,7 @@ function formatTranscript(data: TranscriptResponse): string { ].join("\n"); return output.length > MAX_OUTPUT_CHARS - ? output.slice(0, MAX_OUTPUT_CHARS) + "\n\n[Transcript truncated]" + ? `${output.slice(0, MAX_OUTPUT_CHARS)}\n\n[Transcript truncated]` : output; } |
