@townco/agent 0.1.28 → 0.1.29
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.
- package/dist/acp-server/adapter.d.ts +21 -14
- package/dist/acp-server/adapter.js +15 -3
- package/dist/acp-server/cli.d.ts +1 -3
- package/dist/acp-server/cli.js +5 -9
- package/dist/acp-server/http.d.ts +1 -3
- package/dist/acp-server/http.js +3 -3
- package/dist/bin.js +0 -0
- package/dist/index.js +8 -0
- package/dist/runner/agent-runner.d.ts +1 -0
- package/dist/runner/index.d.ts +1 -3
- package/dist/runner/index.js +14 -18
- package/dist/runner/langchain/index.d.ts +2 -2
- package/dist/runner/langchain/index.js +66 -7
- package/dist/runner/langchain/tools/subagent.d.ts +43 -0
- package/dist/runner/langchain/tools/subagent.js +278 -0
- package/dist/runner/langchain/tools/todo.d.ts +33 -48
- package/dist/runner/langchain/tools/todo.js +2 -1
- package/dist/runner/langchain/tools/web_search.d.ts +3 -0
- package/dist/runner/langchain/tools/web_search.js +55 -13
- package/dist/scaffold/templates/dot-claude/CLAUDE-append.md +73 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/index.ts +8 -0
- package/package.json +8 -9
- package/dist/definition/mcp.d.ts +0 -0
- package/dist/definition/mcp.js +0 -0
- package/dist/definition/tools/todo.d.ts +0 -49
- package/dist/definition/tools/todo.js +0 -80
- package/dist/definition/tools/web_search.d.ts +0 -4
- package/dist/definition/tools/web_search.js +0 -26
- package/dist/dev-agent/index.d.ts +0 -2
- package/dist/dev-agent/index.js +0 -18
- package/dist/example.d.ts +0 -2
- package/dist/example.js +0 -19
- package/dist/utils/logger.d.ts +0 -39
- package/dist/utils/logger.js +0 -175
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import * as acp from "@agentclientprotocol/sdk";
|
|
2
2
|
import type { AgentRunner } from "../runner";
|
|
3
|
+
/**
|
|
4
|
+
* ACP extension key for subagent mode indicator
|
|
5
|
+
* Following ACP extensibility pattern with namespaced key
|
|
6
|
+
*/
|
|
7
|
+
export declare const SUBAGENT_MODE_KEY = "town.com/isSubagent";
|
|
8
|
+
/**
|
|
9
|
+
* Extension metadata type for subagent mode indicator
|
|
10
|
+
*/
|
|
11
|
+
export interface SubagentModeExtension {
|
|
12
|
+
[SUBAGENT_MODE_KEY]?: boolean;
|
|
13
|
+
}
|
|
3
14
|
/** Adapts an Agent to speak the ACP protocol */
|
|
4
15
|
export declare class AgentAcpAdapter implements acp.Agent {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
_params: acp.SetSessionModeRequest,
|
|
16
|
-
): Promise<acp.SetSessionModeResponse>;
|
|
17
|
-
prompt(params: acp.PromptRequest): Promise<acp.PromptResponse>;
|
|
18
|
-
cancel(params: acp.CancelNotification): Promise<void>;
|
|
16
|
+
private connection;
|
|
17
|
+
private sessions;
|
|
18
|
+
private agent;
|
|
19
|
+
constructor(agent: AgentRunner, connection: acp.AgentSideConnection);
|
|
20
|
+
initialize(_params: acp.InitializeRequest): Promise<acp.InitializeResponse>;
|
|
21
|
+
newSession(params: acp.NewSessionRequest): Promise<acp.NewSessionResponse>;
|
|
22
|
+
authenticate(_params: acp.AuthenticateRequest): Promise<acp.AuthenticateResponse | undefined>;
|
|
23
|
+
setSessionMode(_params: acp.SetSessionModeRequest): Promise<acp.SetSessionModeResponse>;
|
|
24
|
+
prompt(params: acp.PromptRequest): Promise<acp.PromptResponse>;
|
|
25
|
+
cancel(params: acp.CancelNotification): Promise<void>;
|
|
19
26
|
}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import * as acp from "@agentclientprotocol/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* ACP extension key for subagent mode indicator
|
|
4
|
+
* Following ACP extensibility pattern with namespaced key
|
|
5
|
+
*/
|
|
6
|
+
export const SUBAGENT_MODE_KEY = "town.com/isSubagent";
|
|
2
7
|
/** Adapts an Agent to speak the ACP protocol */
|
|
3
8
|
export class AgentAcpAdapter {
|
|
4
9
|
connection;
|
|
@@ -17,11 +22,12 @@ export class AgentAcpAdapter {
|
|
|
17
22
|
},
|
|
18
23
|
};
|
|
19
24
|
}
|
|
20
|
-
async newSession(
|
|
25
|
+
async newSession(params) {
|
|
21
26
|
const sessionId = Math.random().toString(36).substring(2);
|
|
22
27
|
this.sessions.set(sessionId, {
|
|
23
28
|
pendingPrompt: null,
|
|
24
29
|
messages: [],
|
|
30
|
+
requestParams: params,
|
|
25
31
|
});
|
|
26
32
|
return {
|
|
27
33
|
sessionId,
|
|
@@ -43,6 +49,7 @@ export class AgentAcpAdapter {
|
|
|
43
49
|
session = {
|
|
44
50
|
pendingPrompt: null,
|
|
45
51
|
messages: [],
|
|
52
|
+
requestParams: { cwd: process.cwd(), mcpServers: [] },
|
|
46
53
|
};
|
|
47
54
|
this.sessions.set(params.sessionId, session);
|
|
48
55
|
}
|
|
@@ -51,11 +58,16 @@ export class AgentAcpAdapter {
|
|
|
51
58
|
// Generate a unique messageId for this assistant response
|
|
52
59
|
const messageId = Math.random().toString(36).substring(2);
|
|
53
60
|
try {
|
|
54
|
-
|
|
61
|
+
const invokeParams = {
|
|
55
62
|
prompt: params.prompt,
|
|
56
63
|
sessionId: params.sessionId,
|
|
57
64
|
messageId,
|
|
58
|
-
}
|
|
65
|
+
};
|
|
66
|
+
// Only add sessionMeta if it's defined
|
|
67
|
+
if (session.requestParams._meta) {
|
|
68
|
+
invokeParams.sessionMeta = session.requestParams._meta;
|
|
69
|
+
}
|
|
70
|
+
for await (const msg of this.agent.invoke(invokeParams)) {
|
|
59
71
|
// Debug: log if this is an agent_message_chunk with tokenUsage in _meta
|
|
60
72
|
if ("sessionUpdate" in msg &&
|
|
61
73
|
msg.sessionUpdate === "agent_message_chunk") {
|
package/dist/acp-server/cli.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type { AgentDefinition } from "../definition";
|
|
2
2
|
import { type AgentRunner } from "../runner";
|
|
3
|
-
export declare function makeStdioTransport(
|
|
4
|
-
agent: AgentRunner | AgentDefinition,
|
|
5
|
-
): void;
|
|
3
|
+
export declare function makeStdioTransport(agent: AgentRunner | AgentDefinition): void;
|
package/dist/acp-server/cli.js
CHANGED
|
@@ -3,13 +3,9 @@ import * as acp from "@agentclientprotocol/sdk";
|
|
|
3
3
|
import { makeRunnerFromDefinition } from "../runner";
|
|
4
4
|
import { AgentAcpAdapter } from "./adapter";
|
|
5
5
|
export function makeStdioTransport(agent) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
new acp.AgentSideConnection(
|
|
12
|
-
(conn) => new AgentAcpAdapter(agentRunner, conn),
|
|
13
|
-
stream,
|
|
14
|
-
);
|
|
6
|
+
const agentRunner = "definition" in agent ? agent : makeRunnerFromDefinition(agent);
|
|
7
|
+
const input = Writable.toWeb(process.stdout);
|
|
8
|
+
const output = Readable.toWeb(process.stdin);
|
|
9
|
+
const stream = acp.ndJsonStream(input, output);
|
|
10
|
+
new acp.AgentSideConnection((conn) => new AgentAcpAdapter(agentRunner, conn), stream);
|
|
15
11
|
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type { AgentDefinition } from "../definition";
|
|
2
2
|
import { type AgentRunner } from "../runner";
|
|
3
|
-
export declare function makeHttpTransport(
|
|
4
|
-
agent: AgentRunner | AgentDefinition,
|
|
5
|
-
): void;
|
|
3
|
+
export declare function makeHttpTransport(agent: AgentRunner | AgentDefinition): void;
|
package/dist/acp-server/http.js
CHANGED
|
@@ -2,11 +2,11 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { gzipSync } from "node:zlib";
|
|
3
3
|
import * as acp from "@agentclientprotocol/sdk";
|
|
4
4
|
import { PGlite } from "@electric-sql/pglite";
|
|
5
|
+
import { createLogger } from "@townco/core";
|
|
5
6
|
import { Hono } from "hono";
|
|
6
7
|
import { cors } from "hono/cors";
|
|
7
8
|
import { streamSSE } from "hono/streaming";
|
|
8
9
|
import { makeRunnerFromDefinition } from "../runner";
|
|
9
|
-
import { createLogger } from "../utils/logger.js";
|
|
10
10
|
import { AgentAcpAdapter } from "./adapter";
|
|
11
11
|
const logger = createLogger("agent");
|
|
12
12
|
/**
|
|
@@ -103,7 +103,7 @@ export function makeHttpTransport(agent) {
|
|
|
103
103
|
requestId: rawMsg.id,
|
|
104
104
|
originalSize,
|
|
105
105
|
compressedSize,
|
|
106
|
-
compressionRatio: ((1 - compressedSize / originalSize) * 100).toFixed(1)
|
|
106
|
+
compressionRatio: `${((1 - compressedSize / originalSize) * 100).toFixed(1)}%`,
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
// Escape single quotes for PostgreSQL
|
|
@@ -214,7 +214,7 @@ export function makeHttpTransport(agent) {
|
|
|
214
214
|
messageType,
|
|
215
215
|
originalSize,
|
|
216
216
|
compressedSize,
|
|
217
|
-
compressionRatio: ((1 - compressedSize / originalSize) * 100).toFixed(1)
|
|
217
|
+
compressionRatio: `${((1 - compressedSize / originalSize) * 100).toFixed(1)}%`,
|
|
218
218
|
});
|
|
219
219
|
}
|
|
220
220
|
// Escape single quotes for PostgreSQL
|
package/dist/bin.js
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { makeHttpTransport, makeStdioTransport } from "./acp-server";
|
|
2
|
+
import { makeSubagentsTool } from "./utils";
|
|
2
3
|
const exampleAgent = {
|
|
3
4
|
model: "claude-sonnet-4-5-20250929",
|
|
4
5
|
systemPrompt: "You are a helpful assistant.",
|
|
@@ -10,6 +11,13 @@ const exampleAgent = {
|
|
|
10
11
|
type: "filesystem",
|
|
11
12
|
//working_directory: "/Users/<user>/town"
|
|
12
13
|
},
|
|
14
|
+
makeSubagentsTool([
|
|
15
|
+
{
|
|
16
|
+
agentName: "example",
|
|
17
|
+
description: "An example subagent for demonstration",
|
|
18
|
+
path: import.meta.filename,
|
|
19
|
+
},
|
|
20
|
+
]),
|
|
13
21
|
],
|
|
14
22
|
mcps: [],
|
|
15
23
|
};
|
|
@@ -31,6 +31,7 @@ export declare const zAgentRunnerParams: z.ZodObject<{
|
|
|
31
31
|
export type CreateAgentRunnerParams = z.infer<typeof zAgentRunnerParams>;
|
|
32
32
|
export type InvokeRequest = Omit<PromptRequest, "_meta"> & {
|
|
33
33
|
messageId: string;
|
|
34
|
+
sessionMeta?: Record<string, unknown>;
|
|
34
35
|
};
|
|
35
36
|
export interface TokenUsage {
|
|
36
37
|
inputTokens?: number;
|
package/dist/runner/index.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { AgentDefinition } from "../definition";
|
|
2
2
|
import { type AgentRunner } from "./agent-runner";
|
|
3
3
|
export type { AgentRunner };
|
|
4
|
-
export declare const makeRunnerFromDefinition: (
|
|
5
|
-
definition: AgentDefinition,
|
|
6
|
-
) => AgentRunner;
|
|
4
|
+
export declare const makeRunnerFromDefinition: (definition: AgentDefinition) => AgentRunner;
|
package/dist/runner/index.js
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
1
1
|
import { zAgentRunnerParams } from "./agent-runner";
|
|
2
2
|
import { LangchainAgent } from "./langchain";
|
|
3
3
|
export const makeRunnerFromDefinition = (definition) => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
`Unsupported harness implementation: ${definition.harnessImplementation}`,
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
4
|
+
const agentRunnerParams = zAgentRunnerParams.safeParse(definition);
|
|
5
|
+
if (!agentRunnerParams.success) {
|
|
6
|
+
throw new Error(`Invalid agent definition: ${agentRunnerParams.error.message}`);
|
|
7
|
+
}
|
|
8
|
+
switch (definition.harnessImplementation) {
|
|
9
|
+
case undefined:
|
|
10
|
+
case "langchain": {
|
|
11
|
+
return new LangchainAgent(agentRunnerParams.data);
|
|
12
|
+
}
|
|
13
|
+
default: {
|
|
14
|
+
const _exhaustiveCheck = definition.harnessImplementation;
|
|
15
|
+
throw new Error(`Unsupported harness implementation: ${definition.harnessImplementation}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
22
18
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { PromptResponse } from "@agentclientprotocol/sdk";
|
|
2
2
|
import { type DynamicStructuredTool, type Tool } from "langchain";
|
|
3
3
|
import type { AgentRunner, CreateAgentRunnerParams, ExtendedSessionUpdate, InvokeRequest } from "../agent-runner";
|
|
4
|
-
import type { BuiltInToolType } from "../tools
|
|
4
|
+
import type { BuiltInToolType } from "../tools";
|
|
5
5
|
type LangchainTool = DynamicStructuredTool | Tool;
|
|
6
6
|
/** Lazily-loaded langchain tools */
|
|
7
7
|
type LazyLangchainTool = MakeLazy<LangchainTool>;
|
|
@@ -13,4 +13,4 @@ export declare class LangchainAgent implements AgentRunner {
|
|
|
13
13
|
constructor(params: CreateAgentRunnerParams);
|
|
14
14
|
invoke(req: InvokeRequest): AsyncGenerator<ExtendedSessionUpdate, PromptResponse, undefined>;
|
|
15
15
|
}
|
|
16
|
-
export {};
|
|
16
|
+
export { makeSubagentsTool } from "./tools/subagent.js";
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
|
|
2
|
+
import { createLogger } from "@townco/core";
|
|
2
3
|
import { AIMessageChunk, createAgent, ToolMessage, tool, } from "langchain";
|
|
3
4
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
5
|
+
import { SUBAGENT_MODE_KEY } from "../../acp-server/adapter";
|
|
5
6
|
import { loadCustomToolModule, } from "../tool-loader.js";
|
|
6
|
-
import { makeFilesystemTools } from "./tools/filesystem
|
|
7
|
-
import {
|
|
7
|
+
import { makeFilesystemTools } from "./tools/filesystem";
|
|
8
|
+
import { TASK_TOOL_NAME } from "./tools/subagent";
|
|
9
|
+
import { TODO_WRITE_TOOL_NAME, todoWrite } from "./tools/todo";
|
|
8
10
|
import { makeWebSearchTools } from "./tools/web_search";
|
|
9
|
-
const
|
|
11
|
+
const _logger = createLogger("agent-runner");
|
|
10
12
|
const getWeather = tool(({ city }) => `It's always sunny in ${city}!`, {
|
|
11
13
|
name: "get_weather",
|
|
12
14
|
description: "Get the weather for a given city",
|
|
@@ -113,12 +115,19 @@ export class LangchainAgent {
|
|
|
113
115
|
if ((this.definition.mcps?.length ?? 0) > 0) {
|
|
114
116
|
enabledTools.push(...(await makeMcpToolsClient(this.definition.mcps).getTools()));
|
|
115
117
|
}
|
|
118
|
+
// Filter tools if running in subagent mode
|
|
119
|
+
const isSubagent = req.sessionMeta?.[SUBAGENT_MODE_KEY] === true;
|
|
120
|
+
const finalTools = isSubagent
|
|
121
|
+
? enabledTools.filter((t) => t.name !== TODO_WRITE_TOOL_NAME && t.name !== TASK_TOOL_NAME)
|
|
122
|
+
: enabledTools;
|
|
116
123
|
const agentConfig = {
|
|
117
124
|
model: this.definition.model,
|
|
118
|
-
tools:
|
|
125
|
+
tools: finalTools,
|
|
119
126
|
};
|
|
120
|
-
|
|
121
|
-
|
|
127
|
+
// Inject system prompt with optional TodoWrite instructions
|
|
128
|
+
const hasTodoWrite = builtInNames.includes("todo_write");
|
|
129
|
+
if (hasTodoWrite) {
|
|
130
|
+
agentConfig.systemPrompt = `${agentConfig.systemPrompt ?? ""}\n\n${TODO_WRITE_INSTRUCTIONS}`;
|
|
122
131
|
}
|
|
123
132
|
const agent = createAgent(agentConfig);
|
|
124
133
|
const messages = req.prompt
|
|
@@ -391,3 +400,53 @@ const makeMcpToolsClient = (mcpConfigs) => {
|
|
|
391
400
|
});
|
|
392
401
|
return client;
|
|
393
402
|
};
|
|
403
|
+
// System prompt instructions to inject when TodoWrite tool is enabled
|
|
404
|
+
const TODO_WRITE_INSTRUCTIONS = `
|
|
405
|
+
# Task Management
|
|
406
|
+
You have access to the TodoWrite tools to help you manage and plan tasks. Use these tools VERY frequently to ensure that you are tracking your tasks and giving the user visibility into your progress.
|
|
407
|
+
These tools are also EXTREMELY helpful for planning tasks, and for breaking down larger complex tasks into smaller steps. If you do not use this tool when planning, you may forget to do important tasks - and that is unacceptable.
|
|
408
|
+
|
|
409
|
+
It is critical that you mark todos as completed as soon as you are done with a task. Do not batch up multiple tasks before marking them as completed.
|
|
410
|
+
|
|
411
|
+
Examples:
|
|
412
|
+
|
|
413
|
+
<example>
|
|
414
|
+
user: Run the build and fix any type errors
|
|
415
|
+
assistant: I'm going to use the TodoWrite tool to write the following items to the todo list:
|
|
416
|
+
- Run the build
|
|
417
|
+
- Fix any type errors
|
|
418
|
+
|
|
419
|
+
I'm now going to run the build using Bash.
|
|
420
|
+
|
|
421
|
+
Looks like I found 10 type errors. I'm going to use the TodoWrite tool to write 10 items to the todo list.
|
|
422
|
+
|
|
423
|
+
marking the first todo as in_progress
|
|
424
|
+
|
|
425
|
+
Let me start working on the first item...
|
|
426
|
+
|
|
427
|
+
The first item has been fixed, let me mark the first todo as completed, and move on to the second item...
|
|
428
|
+
..
|
|
429
|
+
..
|
|
430
|
+
</example>
|
|
431
|
+
In the above example, the assistant completes all the tasks, including the 10 error fixes and running the build and fixing all errors.
|
|
432
|
+
|
|
433
|
+
<example>
|
|
434
|
+
user: Help me write a new feature that allows users to track their usage metrics and export them to various formats
|
|
435
|
+
assistant: I'll help you implement a usage metrics tracking and export feature. Let me first use the TodoWrite tool to plan this task.
|
|
436
|
+
Adding the following todos to the todo list:
|
|
437
|
+
1. Research existing metrics tracking in the codebase
|
|
438
|
+
2. Design the metrics collection system
|
|
439
|
+
3. Implement core metrics tracking functionality
|
|
440
|
+
4. Create export functionality for different formats
|
|
441
|
+
|
|
442
|
+
Let me start by researching the existing codebase to understand what metrics we might already be tracking and how we can build on that.
|
|
443
|
+
|
|
444
|
+
I'm going to search for any existing metrics or telemetry code in the project.
|
|
445
|
+
|
|
446
|
+
I've found some existing telemetry code. Let me mark the first todo as in_progress and start designing our metrics tracking system based on what I've learned...
|
|
447
|
+
|
|
448
|
+
[Assistant continues implementing the feature step by step, marking todos as in_progress and completed as they go]
|
|
449
|
+
</example>
|
|
450
|
+
`.trim();
|
|
451
|
+
// Re-export subagent tool utility
|
|
452
|
+
export { makeSubagentsTool } from "./tools/subagent.js";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { DirectTool } from "../../tools.js";
|
|
2
|
+
/**
|
|
3
|
+
* Name of the Task tool created by makeSubagentsTool
|
|
4
|
+
*/
|
|
5
|
+
export declare const TASK_TOOL_NAME = "Task";
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for a single subagent - supports two variants:
|
|
8
|
+
* 1. Agent name with optional working directory
|
|
9
|
+
* 2. Direct path to agent's index.ts file
|
|
10
|
+
*/
|
|
11
|
+
type SubagentConfig = {
|
|
12
|
+
agentName: string;
|
|
13
|
+
description: string;
|
|
14
|
+
cwd?: string;
|
|
15
|
+
} | {
|
|
16
|
+
agentName: string;
|
|
17
|
+
description: string;
|
|
18
|
+
path: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Creates a DirectTool that delegates work to one of multiple configured subagents.
|
|
22
|
+
*
|
|
23
|
+
* @param configs - Array of subagent configurations
|
|
24
|
+
* @returns A DirectTool named "Task" that can route to any configured subagent
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* import { makeSubagentsTool } from "@townco/agent/utils";
|
|
29
|
+
*
|
|
30
|
+
* const agent: AgentDefinition = {
|
|
31
|
+
* model: "claude-sonnet-4-5-20250929",
|
|
32
|
+
* systemPrompt: "You are a coordinator.",
|
|
33
|
+
* tools: [
|
|
34
|
+
* makeSubagentsTool([
|
|
35
|
+
* { agentName: "researcher", description: "Use this agent to research topics", cwd: "/path/to/agents" },
|
|
36
|
+
* { agentName: "writer", description: "Use this agent to write content", path: "/absolute/path/to/writer/index.ts" },
|
|
37
|
+
* ]),
|
|
38
|
+
* ]
|
|
39
|
+
* };
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function makeSubagentsTool(configs: SubagentConfig[]): DirectTool;
|
|
43
|
+
export {};
|