summaryrefslogtreecommitdiffhomepage
path: root/packages/core/src/tools
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-23 05:06:12 +0900
committerAdam Malczewski <[email protected]>2026-05-23 05:06:12 +0900
commit9287cccb29d135ea19f2612c26f3090c94820d8c (patch)
tree2d68e8cacf6d71786f305d5f4a512a68f19137c5 /packages/core/src/tools
parentef427d3eae77fca716c203dd8bd84939710c518a (diff)
downloaddispatch-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.ts32
-rw-r--r--packages/core/src/tools/web-search.ts6
-rw-r--r--packages/core/src/tools/youtube-transcribe.ts6
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;
}