kagent-ts 0.1.3 → 0.1.5
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/LICENSE +68 -21
- package/README.md +27 -371
- package/dist/compression/progressive-compressor.d.ts +66 -0
- package/dist/compression/progressive-compressor.d.ts.map +1 -0
- package/dist/compression/progressive-compressor.js +367 -0
- package/dist/compression/progressive-compressor.js.map +1 -0
- package/dist/compression/types.d.ts +1 -5
- package/dist/compression/types.d.ts.map +1 -1
- package/dist/context/context-manager.d.ts +34 -15
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +78 -28
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/types.d.ts +20 -4
- package/dist/context/types.d.ts.map +1 -1
- package/dist/core/agent.d.ts +407 -35
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +685 -70
- package/dist/core/agent.js.map +1 -1
- package/dist/core/fusion-agent.d.ts +207 -0
- package/dist/core/fusion-agent.d.ts.map +1 -0
- package/dist/core/fusion-agent.js +769 -0
- package/dist/core/fusion-agent.js.map +1 -0
- package/dist/core/hooks.d.ts +19 -7
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/plan-solve-agent.d.ts +1 -15
- package/dist/core/plan-solve-agent.d.ts.map +1 -1
- package/dist/core/plan-solve-agent.js +144 -117
- package/dist/core/plan-solve-agent.js.map +1 -1
- package/dist/core/react-agent.d.ts +0 -13
- package/dist/core/react-agent.d.ts.map +1 -1
- package/dist/core/react-agent.js +128 -101
- package/dist/core/react-agent.js.map +1 -1
- package/dist/core/response-schema.d.ts +65 -0
- package/dist/core/response-schema.d.ts.map +1 -1
- package/dist/core/response-schema.js +174 -1
- package/dist/core/response-schema.js.map +1 -1
- package/dist/core/system-prompts.d.ts +27 -0
- package/dist/core/system-prompts.d.ts.map +1 -0
- package/dist/core/system-prompts.js +112 -0
- package/dist/core/system-prompts.js.map +1 -0
- package/dist/eval/benchmark.d.ts +81 -0
- package/dist/eval/benchmark.d.ts.map +1 -0
- package/dist/eval/benchmark.js +292 -0
- package/dist/eval/benchmark.js.map +1 -0
- package/dist/eval/eval-runner.d.ts +79 -0
- package/dist/eval/eval-runner.d.ts.map +1 -0
- package/dist/eval/eval-runner.js +252 -0
- package/dist/eval/eval-runner.js.map +1 -0
- package/dist/eval/index.d.ts +7 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +13 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/tool-call-evaluator.d.ts +72 -0
- package/dist/eval/tool-call-evaluator.d.ts.map +1 -0
- package/dist/eval/tool-call-evaluator.js +265 -0
- package/dist/eval/tool-call-evaluator.js.map +1 -0
- package/dist/eval/types.d.ts +219 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +3 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/index.d.ts +61 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -8
- package/dist/index.js.map +1 -1
- package/dist/llm/anthropic-provider.d.ts +141 -0
- package/dist/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/llm/anthropic-provider.js +486 -0
- package/dist/llm/anthropic-provider.js.map +1 -0
- package/dist/llm/errors.d.ts +26 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +19 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/factory.d.ts +73 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +77 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/fallback-provider.d.ts +47 -0
- package/dist/llm/fallback-provider.d.ts.map +1 -0
- package/dist/llm/fallback-provider.js +91 -0
- package/dist/llm/fallback-provider.js.map +1 -0
- package/dist/llm/interface.d.ts +54 -11
- package/dist/llm/interface.d.ts.map +1 -1
- package/dist/llm/interface.js +34 -0
- package/dist/llm/interface.js.map +1 -1
- package/dist/llm/model-router.d.ts +126 -0
- package/dist/llm/model-router.d.ts.map +1 -0
- package/dist/llm/model-router.js +178 -0
- package/dist/llm/model-router.js.map +1 -0
- package/dist/llm/openai-provider.d.ts +8 -32
- package/dist/llm/openai-provider.d.ts.map +1 -1
- package/dist/llm/openai-provider.js +27 -60
- package/dist/llm/openai-provider.js.map +1 -1
- package/dist/llm/rate-limiter.d.ts +41 -0
- package/dist/llm/rate-limiter.d.ts.map +1 -0
- package/dist/llm/rate-limiter.js +93 -0
- package/dist/llm/rate-limiter.js.map +1 -0
- package/dist/llm/retry.d.ts +26 -0
- package/dist/llm/retry.d.ts.map +1 -0
- package/dist/llm/retry.js +44 -0
- package/dist/llm/retry.js.map +1 -0
- package/dist/llm/token-budget.d.ts +97 -0
- package/dist/llm/token-budget.d.ts.map +1 -0
- package/dist/llm/token-budget.js +115 -0
- package/dist/llm/token-budget.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +7 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +38 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +34 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-client-manager.d.ts +72 -0
- package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
- package/dist/mcp/mcp-client-manager.js +235 -0
- package/dist/mcp/mcp-client-manager.js.map +1 -0
- package/dist/mcp/mcp-types.d.ts +58 -0
- package/dist/mcp/mcp-types.d.ts.map +1 -0
- package/dist/mcp/mcp-types.js +20 -0
- package/dist/mcp/mcp-types.js.map +1 -0
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +6 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +119 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +334 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/messages/types.d.ts +2 -0
- package/dist/messages/types.d.ts.map +1 -1
- package/dist/orchestrator/index.d.ts +5 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +13 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/json-extractor.d.ts +18 -0
- package/dist/orchestrator/json-extractor.d.ts.map +1 -0
- package/dist/orchestrator/json-extractor.js +111 -0
- package/dist/orchestrator/json-extractor.js.map +1 -0
- package/dist/orchestrator/orchestrator-agent.d.ts +152 -0
- package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-agent.js +675 -0
- package/dist/orchestrator/orchestrator-agent.js.map +1 -0
- package/dist/orchestrator/orchestrator-response.d.ts +40 -0
- package/dist/orchestrator/orchestrator-response.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-response.js +275 -0
- package/dist/orchestrator/orchestrator-response.js.map +1 -0
- package/dist/orchestrator/orchestrator-types.d.ts +116 -0
- package/dist/orchestrator/orchestrator-types.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-types.js +3 -0
- package/dist/orchestrator/orchestrator-types.js.map +1 -0
- package/dist/preferences/preference-manager.d.ts +8 -3
- package/dist/preferences/preference-manager.d.ts.map +1 -1
- package/dist/preferences/preference-manager.js +17 -4
- package/dist/preferences/preference-manager.js.map +1 -1
- package/dist/rag/chroma-store.d.ts +52 -0
- package/dist/rag/chroma-store.d.ts.map +1 -0
- package/dist/rag/chroma-store.js +110 -0
- package/dist/rag/chroma-store.js.map +1 -0
- package/dist/rag/document-loader.d.ts +21 -0
- package/dist/rag/document-loader.d.ts.map +1 -0
- package/dist/rag/document-loader.js +129 -0
- package/dist/rag/document-loader.js.map +1 -0
- package/dist/rag/embedding-provider.d.ts +36 -0
- package/dist/rag/embedding-provider.d.ts.map +1 -0
- package/dist/rag/embedding-provider.js +74 -0
- package/dist/rag/embedding-provider.js.map +1 -0
- package/dist/rag/index.d.ts +17 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +27 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/rag/keyword-index.d.ts +53 -0
- package/dist/rag/keyword-index.d.ts.map +1 -0
- package/dist/rag/keyword-index.js +161 -0
- package/dist/rag/keyword-index.js.map +1 -0
- package/dist/rag/llm-reranker.d.ts +36 -0
- package/dist/rag/llm-reranker.d.ts.map +1 -0
- package/dist/rag/llm-reranker.js +95 -0
- package/dist/rag/llm-reranker.js.map +1 -0
- package/dist/rag/rag-manager.d.ts +54 -0
- package/dist/rag/rag-manager.d.ts.map +1 -0
- package/dist/rag/rag-manager.js +179 -0
- package/dist/rag/rag-manager.js.map +1 -0
- package/dist/rag/rag-types.d.ts +143 -0
- package/dist/rag/rag-types.d.ts.map +1 -0
- package/dist/rag/rag-types.js +9 -0
- package/dist/rag/rag-types.js.map +1 -0
- package/dist/rag/rrf.d.ts +47 -0
- package/dist/rag/rrf.d.ts.map +1 -0
- package/dist/rag/rrf.js +70 -0
- package/dist/rag/rrf.js.map +1 -0
- package/dist/rag/search-knowledge.d.ts +24 -0
- package/dist/rag/search-knowledge.d.ts.map +1 -0
- package/dist/rag/search-knowledge.js +86 -0
- package/dist/rag/search-knowledge.js.map +1 -0
- package/dist/rag/text-splitter.d.ts +25 -0
- package/dist/rag/text-splitter.d.ts.map +1 -0
- package/dist/rag/text-splitter.js +136 -0
- package/dist/rag/text-splitter.js.map +1 -0
- package/dist/rag/vector-store.d.ts +34 -0
- package/dist/rag/vector-store.d.ts.map +1 -0
- package/dist/rag/vector-store.js +73 -0
- package/dist/rag/vector-store.js.map +1 -0
- package/dist/reflection/error-notebook.d.ts +125 -0
- package/dist/reflection/error-notebook.d.ts.map +1 -0
- package/dist/reflection/error-notebook.js +368 -0
- package/dist/reflection/error-notebook.js.map +1 -0
- package/dist/reflection/index.d.ts +8 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/dist/reflection/index.js +12 -0
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/memory-reflector.d.ts +97 -0
- package/dist/reflection/memory-reflector.d.ts.map +1 -0
- package/dist/reflection/memory-reflector.js +215 -0
- package/dist/reflection/memory-reflector.js.map +1 -0
- package/dist/reflection/reflection-agent.d.ts +105 -0
- package/dist/reflection/reflection-agent.d.ts.map +1 -0
- package/dist/reflection/reflection-agent.js +234 -0
- package/dist/reflection/reflection-agent.js.map +1 -0
- package/dist/reflection/reflection-hook.d.ts +50 -0
- package/dist/reflection/reflection-hook.d.ts.map +1 -0
- package/dist/reflection/reflection-hook.js +108 -0
- package/dist/reflection/reflection-hook.js.map +1 -0
- package/dist/rules/project-rules.d.ts +47 -0
- package/dist/rules/project-rules.d.ts.map +1 -0
- package/dist/rules/project-rules.js +166 -0
- package/dist/rules/project-rules.js.map +1 -0
- package/dist/security/boundaries.d.ts +81 -0
- package/dist/security/boundaries.d.ts.map +1 -0
- package/dist/security/boundaries.js +158 -0
- package/dist/security/boundaries.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/session/session-types.d.ts +25 -4
- package/dist/session/session-types.d.ts.map +1 -1
- package/dist/skills/file-skill-loader.d.ts +9 -20
- package/dist/skills/file-skill-loader.d.ts.map +1 -1
- package/dist/skills/file-skill-loader.js +35 -164
- package/dist/skills/file-skill-loader.js.map +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -2
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-manager.d.ts +22 -29
- package/dist/skills/skill-manager.d.ts.map +1 -1
- package/dist/skills/skill-manager.js +63 -85
- package/dist/skills/skill-manager.js.map +1 -1
- package/dist/skills/types.d.ts +4 -16
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/subagent/index.d.ts +4 -0
- package/dist/subagent/index.d.ts.map +1 -0
- package/dist/subagent/index.js +8 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/subagent-loader.d.ts +53 -0
- package/dist/subagent/subagent-loader.d.ts.map +1 -0
- package/dist/subagent/subagent-loader.js +155 -0
- package/dist/subagent/subagent-loader.js.map +1 -0
- package/dist/subagent/subagent-manager.d.ts +161 -0
- package/dist/subagent/subagent-manager.d.ts.map +1 -0
- package/dist/subagent/subagent-manager.js +468 -0
- package/dist/subagent/subagent-manager.js.map +1 -0
- package/dist/subagent/subagent-types.d.ts +77 -0
- package/dist/subagent/subagent-types.d.ts.map +1 -0
- package/dist/subagent/subagent-types.js +3 -0
- package/dist/subagent/subagent-types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +3 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +87 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit-file.d.ts.map +1 -1
- package/dist/tools/builtin/edit-file.js +1 -0
- package/dist/tools/builtin/edit-file.js.map +1 -1
- package/dist/tools/builtin/index.d.ts +14 -0
- package/dist/tools/builtin/index.d.ts.map +1 -1
- package/dist/tools/builtin/index.js +45 -1
- package/dist/tools/builtin/index.js.map +1 -1
- package/dist/tools/builtin/list-errors.d.ts +7 -0
- package/dist/tools/builtin/list-errors.d.ts.map +1 -0
- package/dist/tools/builtin/list-errors.js +64 -0
- package/dist/tools/builtin/list-errors.js.map +1 -0
- package/dist/tools/builtin/list-subagents.d.ts +7 -0
- package/dist/tools/builtin/list-subagents.d.ts.map +1 -0
- package/dist/tools/builtin/list-subagents.js +21 -0
- package/dist/tools/builtin/list-subagents.js.map +1 -0
- package/dist/tools/builtin/recall.d.ts +11 -0
- package/dist/tools/builtin/recall.d.ts.map +1 -0
- package/dist/tools/builtin/recall.js +60 -0
- package/dist/tools/builtin/recall.js.map +1 -0
- package/dist/tools/builtin/remember.d.ts +12 -0
- package/dist/tools/builtin/remember.d.ts.map +1 -0
- package/dist/tools/builtin/remember.js +72 -0
- package/dist/tools/builtin/remember.js.map +1 -0
- package/dist/tools/builtin/skill.d.ts +14 -0
- package/dist/tools/builtin/skill.d.ts.map +1 -0
- package/dist/tools/builtin/skill.js +71 -0
- package/dist/tools/builtin/skill.js.map +1 -0
- package/dist/tools/builtin/spawn-subagent.d.ts +7 -0
- package/dist/tools/builtin/spawn-subagent.d.ts.map +1 -0
- package/dist/tools/builtin/spawn-subagent.js +43 -0
- package/dist/tools/builtin/spawn-subagent.js.map +1 -0
- package/dist/tools/builtin/web-fetch.d.ts +3 -0
- package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtin/web-fetch.js +101 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/builtin/write-file.d.ts.map +1 -1
- package/dist/tools/builtin/write-file.js +1 -0
- package/dist/tools/builtin/write-file.js.map +1 -1
- package/dist/tools/circuit-breaker.d.ts +19 -10
- package/dist/tools/circuit-breaker.d.ts.map +1 -1
- package/dist/tools/circuit-breaker.js +22 -11
- package/dist/tools/circuit-breaker.js.map +1 -1
- package/dist/tools/error-tracker.d.ts +28 -44
- package/dist/tools/error-tracker.d.ts.map +1 -1
- package/dist/tools/error-tracker.js +39 -156
- package/dist/tools/error-tracker.js.map +1 -1
- package/dist/tools/tool-filter.d.ts +70 -0
- package/dist/tools/tool-filter.d.ts.map +1 -0
- package/dist/tools/tool-filter.js +92 -0
- package/dist/tools/tool-filter.js.map +1 -0
- package/dist/tools/tool-output-truncator.d.ts +36 -0
- package/dist/tools/tool-output-truncator.d.ts.map +1 -0
- package/dist/tools/tool-output-truncator.js +117 -0
- package/dist/tools/tool-output-truncator.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +25 -9
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/tool-registry.js +77 -28
- package/dist/tools/tool-registry.js.map +1 -1
- package/dist/tools/tool-validator.d.ts +13 -0
- package/dist/tools/tool-validator.d.ts.map +1 -0
- package/dist/tools/tool-validator.js +116 -0
- package/dist/tools/tool-validator.js.map +1 -0
- package/dist/tools/types.d.ts +86 -3
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +51 -2
- package/dist/tools/types.js.map +1 -1
- package/dist/trace/trace-logger.d.ts +30 -4
- package/dist/trace/trace-logger.d.ts.map +1 -1
- package/dist/trace/trace-logger.js +83 -7
- package/dist/trace/trace-logger.js.map +1 -1
- package/package.json +14 -4
- package/dist/compression/sliding-window.d.ts +0 -21
- package/dist/compression/sliding-window.d.ts.map +0 -1
- package/dist/compression/sliding-window.js +0 -44
- package/dist/compression/sliding-window.js.map +0 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { SubAgentDefinition, SubAgentResult } from "./subagent-types";
|
|
2
|
+
import { LLMProvider } from "../llm/interface";
|
|
3
|
+
import { ToolRegistry } from "../tools/tool-registry";
|
|
4
|
+
import { ToolFilter } from "../tools/tool-filter";
|
|
5
|
+
import { SkillManager } from "../skills/skill-manager";
|
|
6
|
+
import { Logger } from "../logging/logger";
|
|
7
|
+
/**
|
|
8
|
+
* Manages sub-agent definitions, spawning, and result collection.
|
|
9
|
+
*
|
|
10
|
+
* The SubAgentManager is owned by the main agent. It:
|
|
11
|
+
* 1. Loads sub-agent definitions from a directory (AGENT.md files)
|
|
12
|
+
* 2. Spawns sub-agents on demand (fire-and-forget)
|
|
13
|
+
* 3. Collects completed results for the main agent to pick up
|
|
14
|
+
*
|
|
15
|
+
* Sub-agents are standard ReActAgent instances with:
|
|
16
|
+
* - A shared LLM provider (from the main agent)
|
|
17
|
+
* - A filtered tool set (only tools declared in the definition)
|
|
18
|
+
* - Pre-activated skills (as declared)
|
|
19
|
+
* - NO spawn tool (prevents nested agent creation)
|
|
20
|
+
*/
|
|
21
|
+
export declare class SubAgentManager {
|
|
22
|
+
private logger;
|
|
23
|
+
/** Set the logger instance (called by the owning agent). */
|
|
24
|
+
setLogger(logger: Logger): void;
|
|
25
|
+
/** Registered definitions keyed by name. */
|
|
26
|
+
private definitions;
|
|
27
|
+
/** Currently pending (running) sub-agents. */
|
|
28
|
+
private pending;
|
|
29
|
+
/** Shared LLM provider injected by the main agent. */
|
|
30
|
+
private llmProvider?;
|
|
31
|
+
/**
|
|
32
|
+
* Optional LLM provider for sub-agents.
|
|
33
|
+
* When set, sub-agents use this instead of `llmProvider`.
|
|
34
|
+
* Enables model routing — use a different (e.g. cheaper) model for
|
|
35
|
+
* sub-agent tasks while keeping the main model for complex reasoning.
|
|
36
|
+
*/
|
|
37
|
+
private subAgentLLM?;
|
|
38
|
+
/** Reference to the main agent's ToolRegistry for tool lookup. */
|
|
39
|
+
private toolRegistry?;
|
|
40
|
+
/** Reference to the main agent's SkillManager (fallback). */
|
|
41
|
+
private skillManager?;
|
|
42
|
+
/** Skills directory path for sub-agent skill loading. */
|
|
43
|
+
private skillsDir?;
|
|
44
|
+
/** Max wall-clock duration for a single sub-agent run (ms). Default: 5 min. */
|
|
45
|
+
private timeoutMs;
|
|
46
|
+
/**
|
|
47
|
+
* Default ToolFilter applied to every sub-agent's tool set.
|
|
48
|
+
* Useful for globally disallowing certain tools (e.g., sub-agent spawning).
|
|
49
|
+
* Per-definition `toolFilter` is applied on top of this one.
|
|
50
|
+
*/
|
|
51
|
+
private defaultFilter?;
|
|
52
|
+
/** Counter for generating unique sub-agent run IDs. */
|
|
53
|
+
private runIdCounter;
|
|
54
|
+
/**
|
|
55
|
+
* Register sub-agent definitions from a directory of AGENT.md files.
|
|
56
|
+
*/
|
|
57
|
+
registerFromDirectory(dir: string): number;
|
|
58
|
+
/**
|
|
59
|
+
* Register a single sub-agent definition programmatically.
|
|
60
|
+
*/
|
|
61
|
+
register(definition: SubAgentDefinition): void;
|
|
62
|
+
/**
|
|
63
|
+
* Check whether any sub-agent definitions are registered.
|
|
64
|
+
*
|
|
65
|
+
* Used by the main agent to decide whether to include sub-agent delegation
|
|
66
|
+
* instructions in the system prompt.
|
|
67
|
+
*/
|
|
68
|
+
hasDefinitions(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Set shared resources from the main agent.
|
|
71
|
+
* Called once during agent init.
|
|
72
|
+
*
|
|
73
|
+
* @param defaultFilter Optional ToolFilter applied to all sub-agents.
|
|
74
|
+
* Use this to globally deny dangerous tools
|
|
75
|
+
* (e.g. `denylist("spawn_subagent")`).
|
|
76
|
+
* @param subAgentLLM Optional LLM provider for sub-agents.
|
|
77
|
+
* When set, sub-agents use this instead of the main
|
|
78
|
+
* `llmProvider`. Enables model routing.
|
|
79
|
+
*/
|
|
80
|
+
bind(llmProvider: LLMProvider, toolRegistry: ToolRegistry, skillManager: SkillManager, skillsDir?: string, timeoutMs?: number, defaultFilter?: ToolFilter, subAgentLLM?: LLMProvider): void;
|
|
81
|
+
/**
|
|
82
|
+
* Spawn a sub-agent by definition name. Returns immediately with a run ID;
|
|
83
|
+
* the sub-agent executes asynchronously.
|
|
84
|
+
*
|
|
85
|
+
* Multiple instances of the same definition can run concurrently — each
|
|
86
|
+
* gets a unique run ID. This enables orchestrator patterns where the same
|
|
87
|
+
* sub-agent type handles different inputs in parallel.
|
|
88
|
+
*
|
|
89
|
+
* @param name The registered sub-agent definition name.
|
|
90
|
+
* @param input The task description passed to the sub-agent.
|
|
91
|
+
* @returns The unique run ID (used to correlate results later).
|
|
92
|
+
* @throws If the definition is unknown or the manager is not yet bound.
|
|
93
|
+
*/
|
|
94
|
+
spawn(name: string, input: string): string;
|
|
95
|
+
/**
|
|
96
|
+
* Check all pending sub-agent runs for completion.
|
|
97
|
+
*
|
|
98
|
+
* Call this at the start of each ReAct iteration. Completed results
|
|
99
|
+
* are removed from the pending queue and returned; still-running
|
|
100
|
+
* entries remain queued.
|
|
101
|
+
*
|
|
102
|
+
* @returns Array of completed sub-agent results (empty if none finished).
|
|
103
|
+
*/
|
|
104
|
+
pollCompleted(): Promise<SubAgentResult[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Wait for all pending sub-agents to complete.
|
|
107
|
+
* Useful for graceful shutdown.
|
|
108
|
+
*/
|
|
109
|
+
awaitAll(): Promise<SubAgentResult[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Cancel all pending sub-agents without waiting for them to finish.
|
|
112
|
+
*
|
|
113
|
+
* Running sub-agents are marked as cancelled but their promises are
|
|
114
|
+
* kept alive. When the agent resumes, `collectOrphanedResults()` can
|
|
115
|
+
* recover completed results so the LLM sees sub-agent output instead
|
|
116
|
+
* of losing it forever.
|
|
117
|
+
*/
|
|
118
|
+
cancelAll(): void;
|
|
119
|
+
/**
|
|
120
|
+
* Collect results from sub-agents that were cancelled mid-run.
|
|
121
|
+
*
|
|
122
|
+
* Call this after resuming a session to pick up any sub-agent results
|
|
123
|
+
* that completed while the agent was inactive. Results are removed from
|
|
124
|
+
* the pending queue and tagged so the LLM knows they were interrupted.
|
|
125
|
+
*
|
|
126
|
+
* @returns Completed results from cancelled sub-agents.
|
|
127
|
+
*/
|
|
128
|
+
collectOrphanedResults(): SubAgentResult[];
|
|
129
|
+
hasRunning(): boolean;
|
|
130
|
+
getActiveCount(): number;
|
|
131
|
+
getDefinitions(): SubAgentDefinition[];
|
|
132
|
+
/**
|
|
133
|
+
* Build a formatted list of all registered sub-agents with their
|
|
134
|
+
* capabilities (returned by the `list_subagents` tool).
|
|
135
|
+
*/
|
|
136
|
+
buildSubAgentList(): string;
|
|
137
|
+
/**
|
|
138
|
+
* Execute a sub-agent run and wrap the result in XML.
|
|
139
|
+
*/
|
|
140
|
+
private executeRun;
|
|
141
|
+
private doExecute;
|
|
142
|
+
/**
|
|
143
|
+
* Build a ReActAgent instance from a sub-agent definition, with:
|
|
144
|
+
* - Filtered tool set (name allowlist + wildcard patterns → defaultFilter → definition.toolFilter)
|
|
145
|
+
* - Pre-activated skills (copied from main agent's SkillManager)
|
|
146
|
+
* - No spawn tool
|
|
147
|
+
* - Auto-detect disabled (skills are pre-activated)
|
|
148
|
+
*
|
|
149
|
+
* Tool name patterns support `*` as a wildcard. For example,
|
|
150
|
+
* `filesystem_*` matches all tools whose names start with `filesystem_`
|
|
151
|
+
* (e.g. MCP tools from the "filesystem" server).
|
|
152
|
+
*/
|
|
153
|
+
private buildSubAgent;
|
|
154
|
+
/** Shared tail of buildSubAgent: wire up skills and return the agent. */
|
|
155
|
+
private finishBuildSubAgent;
|
|
156
|
+
/**
|
|
157
|
+
* Wrap the sub-agent output in an XML envelope for the main agent.
|
|
158
|
+
*/
|
|
159
|
+
private wrapXml;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=subagent-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-manager.d.ts","sourceRoot":"","sources":["../../src/subagent/subagent-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAc,MAAM,kBAAkB,CAAC;AAGlF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAmB1D;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA+B;IAE7C,4DAA4D;IAC5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,4CAA4C;IAC5C,OAAO,CAAC,WAAW,CAA8C;IAEjE,8CAA8C;IAC9C,OAAO,CAAC,OAAO,CAAoB;IAEnC,sDAAsD;IACtD,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC,kEAAkE;IAClE,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,6DAA6D;IAC7D,OAAO,CAAC,YAAY,CAAC,CAAe;IAEpC,yDAAyD;IACzD,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,+EAA+E;IAC/E,OAAO,CAAC,SAAS,CAAyB;IAE1C;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAC,CAAa;IAEnC,uDAAuD;IACvD,OAAO,CAAC,YAAY,CAAK;IAIzB;;OAEG;IACH,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAqB1C;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI;IAO9C;;;;;OAKG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;;;;;;;OAUG;IACH,IAAI,CACF,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,UAAU,EAC1B,WAAW,CAAC,EAAE,WAAW,GACxB,IAAI;IAYP;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAkD1C;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAyBhD;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAQ3C;;;;;;;OAOG;IACH,SAAS,IAAI,IAAI;IAcjB;;;;;;;;OAQG;IACH,sBAAsB,IAAI,cAAc,EAAE;IAsB1C,UAAU,IAAI,OAAO;IAIrB,cAAc,IAAI,MAAM;IAIxB,cAAc,IAAI,kBAAkB,EAAE;IAItC;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAiB3B;;OAEG;YACW,UAAU;YAgCV,SAAS;IAmBvB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,aAAa;IAkFrB,yEAAyE;IACzE,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;IACH,OAAO,CAAC,OAAO;CAahB"}
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubAgentManager = void 0;
|
|
4
|
+
const subagent_loader_1 = require("./subagent-loader");
|
|
5
|
+
const react_agent_1 = require("../core/react-agent");
|
|
6
|
+
const tool_registry_1 = require("../tools/tool-registry");
|
|
7
|
+
const skill_manager_1 = require("../skills/skill-manager");
|
|
8
|
+
const logger_1 = require("../logging/logger");
|
|
9
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
10
|
+
/**
|
|
11
|
+
* Convert a simple glob pattern (only `*` wildcards) to a RegExp.
|
|
12
|
+
*
|
|
13
|
+
* `*` matches any sequence of characters (like shell glob, not regex `.*`).
|
|
14
|
+
* All other regex-special characters are escaped so they match literally.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* globToRegex("filesystem_*") → /^filesystem_.*$/
|
|
18
|
+
* globToRegex("*_read") → /^.*_read$/
|
|
19
|
+
*/
|
|
20
|
+
function globToRegex(pattern) {
|
|
21
|
+
const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
22
|
+
return new RegExp(`^${escaped}$`);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Manages sub-agent definitions, spawning, and result collection.
|
|
26
|
+
*
|
|
27
|
+
* The SubAgentManager is owned by the main agent. It:
|
|
28
|
+
* 1. Loads sub-agent definitions from a directory (AGENT.md files)
|
|
29
|
+
* 2. Spawns sub-agents on demand (fire-and-forget)
|
|
30
|
+
* 3. Collects completed results for the main agent to pick up
|
|
31
|
+
*
|
|
32
|
+
* Sub-agents are standard ReActAgent instances with:
|
|
33
|
+
* - A shared LLM provider (from the main agent)
|
|
34
|
+
* - A filtered tool set (only tools declared in the definition)
|
|
35
|
+
* - Pre-activated skills (as declared)
|
|
36
|
+
* - NO spawn tool (prevents nested agent creation)
|
|
37
|
+
*/
|
|
38
|
+
class SubAgentManager {
|
|
39
|
+
logger = new logger_1.ConsoleLogger();
|
|
40
|
+
/** Set the logger instance (called by the owning agent). */
|
|
41
|
+
setLogger(logger) {
|
|
42
|
+
this.logger = logger;
|
|
43
|
+
}
|
|
44
|
+
/** Registered definitions keyed by name. */
|
|
45
|
+
definitions = new Map();
|
|
46
|
+
/** Currently pending (running) sub-agents. */
|
|
47
|
+
pending = [];
|
|
48
|
+
/** Shared LLM provider injected by the main agent. */
|
|
49
|
+
llmProvider;
|
|
50
|
+
/**
|
|
51
|
+
* Optional LLM provider for sub-agents.
|
|
52
|
+
* When set, sub-agents use this instead of `llmProvider`.
|
|
53
|
+
* Enables model routing — use a different (e.g. cheaper) model for
|
|
54
|
+
* sub-agent tasks while keeping the main model for complex reasoning.
|
|
55
|
+
*/
|
|
56
|
+
subAgentLLM;
|
|
57
|
+
/** Reference to the main agent's ToolRegistry for tool lookup. */
|
|
58
|
+
toolRegistry;
|
|
59
|
+
/** Reference to the main agent's SkillManager (fallback). */
|
|
60
|
+
skillManager;
|
|
61
|
+
/** Skills directory path for sub-agent skill loading. */
|
|
62
|
+
skillsDir;
|
|
63
|
+
/** Max wall-clock duration for a single sub-agent run (ms). Default: 5 min. */
|
|
64
|
+
timeoutMs = 5 * 60 * 1000;
|
|
65
|
+
/**
|
|
66
|
+
* Default ToolFilter applied to every sub-agent's tool set.
|
|
67
|
+
* Useful for globally disallowing certain tools (e.g., sub-agent spawning).
|
|
68
|
+
* Per-definition `toolFilter` is applied on top of this one.
|
|
69
|
+
*/
|
|
70
|
+
defaultFilter;
|
|
71
|
+
/** Counter for generating unique sub-agent run IDs. */
|
|
72
|
+
runIdCounter = 0;
|
|
73
|
+
// ─── Registration ─────────────────────────────────────────────────────────
|
|
74
|
+
/**
|
|
75
|
+
* Register sub-agent definitions from a directory of AGENT.md files.
|
|
76
|
+
*/
|
|
77
|
+
registerFromDirectory(dir) {
|
|
78
|
+
const loader = new subagent_loader_1.SubAgentLoader(dir, undefined, this.logger);
|
|
79
|
+
const definitions = loader.scan();
|
|
80
|
+
let count = 0;
|
|
81
|
+
for (const def of definitions) {
|
|
82
|
+
if (this.definitions.has(def.name)) {
|
|
83
|
+
this.logger.warn("SubAgent", `Skipping "${def.name}": already registered.`);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
this.definitions.set(def.name, def);
|
|
87
|
+
count++;
|
|
88
|
+
}
|
|
89
|
+
if (count > 0) {
|
|
90
|
+
this.logger.info("SubAgent", `Registered ${count} sub-agent(s) from ${dir}.`);
|
|
91
|
+
}
|
|
92
|
+
return count;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Register a single sub-agent definition programmatically.
|
|
96
|
+
*/
|
|
97
|
+
register(definition) {
|
|
98
|
+
if (this.definitions.has(definition.name)) {
|
|
99
|
+
throw new Error(`SubAgent "${definition.name}" is already registered.`);
|
|
100
|
+
}
|
|
101
|
+
this.definitions.set(definition.name, definition);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check whether any sub-agent definitions are registered.
|
|
105
|
+
*
|
|
106
|
+
* Used by the main agent to decide whether to include sub-agent delegation
|
|
107
|
+
* instructions in the system prompt.
|
|
108
|
+
*/
|
|
109
|
+
hasDefinitions() {
|
|
110
|
+
return this.definitions.size > 0;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Set shared resources from the main agent.
|
|
114
|
+
* Called once during agent init.
|
|
115
|
+
*
|
|
116
|
+
* @param defaultFilter Optional ToolFilter applied to all sub-agents.
|
|
117
|
+
* Use this to globally deny dangerous tools
|
|
118
|
+
* (e.g. `denylist("spawn_subagent")`).
|
|
119
|
+
* @param subAgentLLM Optional LLM provider for sub-agents.
|
|
120
|
+
* When set, sub-agents use this instead of the main
|
|
121
|
+
* `llmProvider`. Enables model routing.
|
|
122
|
+
*/
|
|
123
|
+
bind(llmProvider, toolRegistry, skillManager, skillsDir, timeoutMs, defaultFilter, subAgentLLM) {
|
|
124
|
+
this.llmProvider = llmProvider;
|
|
125
|
+
this.toolRegistry = toolRegistry;
|
|
126
|
+
this.skillManager = skillManager;
|
|
127
|
+
this.skillsDir = skillsDir;
|
|
128
|
+
if (timeoutMs !== undefined)
|
|
129
|
+
this.timeoutMs = timeoutMs;
|
|
130
|
+
this.defaultFilter = defaultFilter;
|
|
131
|
+
this.subAgentLLM = subAgentLLM;
|
|
132
|
+
}
|
|
133
|
+
// ─── Spawn ────────────────────────────────────────────────────────────────
|
|
134
|
+
/**
|
|
135
|
+
* Spawn a sub-agent by definition name. Returns immediately with a run ID;
|
|
136
|
+
* the sub-agent executes asynchronously.
|
|
137
|
+
*
|
|
138
|
+
* Multiple instances of the same definition can run concurrently — each
|
|
139
|
+
* gets a unique run ID. This enables orchestrator patterns where the same
|
|
140
|
+
* sub-agent type handles different inputs in parallel.
|
|
141
|
+
*
|
|
142
|
+
* @param name The registered sub-agent definition name.
|
|
143
|
+
* @param input The task description passed to the sub-agent.
|
|
144
|
+
* @returns The unique run ID (used to correlate results later).
|
|
145
|
+
* @throws If the definition is unknown or the manager is not yet bound.
|
|
146
|
+
*/
|
|
147
|
+
spawn(name, input) {
|
|
148
|
+
const definition = this.definitions.get(name);
|
|
149
|
+
if (!definition) {
|
|
150
|
+
const available = Array.from(this.definitions.keys()).join(", ") || "none";
|
|
151
|
+
throw new Error(`Unknown sub-agent: "${name}". Available: ${available}`);
|
|
152
|
+
}
|
|
153
|
+
if (!this.llmProvider || !this.toolRegistry || !this.skillManager) {
|
|
154
|
+
throw new Error("SubAgentManager is not bound to an LLM provider / ToolRegistry / SkillManager. " +
|
|
155
|
+
"Call bind() before spawn().");
|
|
156
|
+
}
|
|
157
|
+
const runId = `${name}_${++this.runIdCounter}_${Date.now()}`;
|
|
158
|
+
const pending = {
|
|
159
|
+
subAgentId: runId,
|
|
160
|
+
name,
|
|
161
|
+
startedAt: Date.now(),
|
|
162
|
+
resolved: null,
|
|
163
|
+
promise: Promise.resolve(undefined), // placeholder
|
|
164
|
+
};
|
|
165
|
+
// Fire-and-forget: start the sub-agent run, store the result
|
|
166
|
+
pending.promise = this.executeRun(name, runId, definition, input, pending.startedAt)
|
|
167
|
+
.then((r) => { pending.resolved = r; return r; })
|
|
168
|
+
.catch((err) => {
|
|
169
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
170
|
+
const fallback = {
|
|
171
|
+
subAgentId: runId,
|
|
172
|
+
name,
|
|
173
|
+
success: false,
|
|
174
|
+
output: this.wrapXml(name, runId, false, message, Date.now() - pending.startedAt),
|
|
175
|
+
durationMs: Date.now() - pending.startedAt,
|
|
176
|
+
};
|
|
177
|
+
pending.resolved = fallback;
|
|
178
|
+
return fallback;
|
|
179
|
+
});
|
|
180
|
+
this.pending.push(pending);
|
|
181
|
+
this.logger.info("SubAgent", `Spawned "${name}" (run: ${runId}).`);
|
|
182
|
+
return runId;
|
|
183
|
+
}
|
|
184
|
+
// ─── Poll ─────────────────────────────────────────────────────────────────
|
|
185
|
+
/**
|
|
186
|
+
* Check all pending sub-agent runs for completion.
|
|
187
|
+
*
|
|
188
|
+
* Call this at the start of each ReAct iteration. Completed results
|
|
189
|
+
* are removed from the pending queue and returned; still-running
|
|
190
|
+
* entries remain queued.
|
|
191
|
+
*
|
|
192
|
+
* @returns Array of completed sub-agent results (empty if none finished).
|
|
193
|
+
*/
|
|
194
|
+
async pollCompleted() {
|
|
195
|
+
if (this.pending.length === 0)
|
|
196
|
+
return [];
|
|
197
|
+
// Yield the event loop so in-flight promises can make progress
|
|
198
|
+
await new Promise((r) => setImmediate(r));
|
|
199
|
+
const results = [];
|
|
200
|
+
const stillPending = [];
|
|
201
|
+
for (const run of this.pending) {
|
|
202
|
+
if (run.resolved !== null) {
|
|
203
|
+
results.push(run.resolved);
|
|
204
|
+
this.logger.info("SubAgent", `"${run.name}" (run: ${run.subAgentId}) completed in ${run.resolved.durationMs}ms.`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
stillPending.push(run);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
this.pending = stillPending;
|
|
211
|
+
return results;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Wait for all pending sub-agents to complete.
|
|
215
|
+
* Useful for graceful shutdown.
|
|
216
|
+
*/
|
|
217
|
+
async awaitAll() {
|
|
218
|
+
const results = await Promise.all(this.pending.map((r) => r.promise));
|
|
219
|
+
this.pending = [];
|
|
220
|
+
return results;
|
|
221
|
+
}
|
|
222
|
+
// ─── Cancel ───────────────────────────────────────────────────────────────
|
|
223
|
+
/**
|
|
224
|
+
* Cancel all pending sub-agents without waiting for them to finish.
|
|
225
|
+
*
|
|
226
|
+
* Running sub-agents are marked as cancelled but their promises are
|
|
227
|
+
* kept alive. When the agent resumes, `collectOrphanedResults()` can
|
|
228
|
+
* recover completed results so the LLM sees sub-agent output instead
|
|
229
|
+
* of losing it forever.
|
|
230
|
+
*/
|
|
231
|
+
cancelAll() {
|
|
232
|
+
if (this.pending.length === 0)
|
|
233
|
+
return;
|
|
234
|
+
let marked = 0;
|
|
235
|
+
for (const run of this.pending) {
|
|
236
|
+
if (!run.cancelled && run.resolved === null) {
|
|
237
|
+
run.cancelled = true;
|
|
238
|
+
marked++;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (marked > 0) {
|
|
242
|
+
this.logger.info("SubAgent", `Marked ${marked} pending sub-agent(s) as cancelled (results preserved).`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Collect results from sub-agents that were cancelled mid-run.
|
|
247
|
+
*
|
|
248
|
+
* Call this after resuming a session to pick up any sub-agent results
|
|
249
|
+
* that completed while the agent was inactive. Results are removed from
|
|
250
|
+
* the pending queue and tagged so the LLM knows they were interrupted.
|
|
251
|
+
*
|
|
252
|
+
* @returns Completed results from cancelled sub-agents.
|
|
253
|
+
*/
|
|
254
|
+
collectOrphanedResults() {
|
|
255
|
+
const results = [];
|
|
256
|
+
const stillPending = [];
|
|
257
|
+
for (const run of this.pending) {
|
|
258
|
+
if (run.cancelled && run.resolved !== null) {
|
|
259
|
+
const tagged = {
|
|
260
|
+
...run.resolved,
|
|
261
|
+
output: `[Interrupted by user — result recovered on resume]\n\n${run.resolved.output}`,
|
|
262
|
+
};
|
|
263
|
+
results.push(tagged);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
stillPending.push(run);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
this.pending = stillPending;
|
|
270
|
+
return results;
|
|
271
|
+
}
|
|
272
|
+
// ─── Queries ──────────────────────────────────────────────────────────────
|
|
273
|
+
hasRunning() {
|
|
274
|
+
return this.pending.length > 0;
|
|
275
|
+
}
|
|
276
|
+
getActiveCount() {
|
|
277
|
+
return this.pending.length;
|
|
278
|
+
}
|
|
279
|
+
getDefinitions() {
|
|
280
|
+
return Array.from(this.definitions.values());
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Build a formatted list of all registered sub-agents with their
|
|
284
|
+
* capabilities (returned by the `list_subagents` tool).
|
|
285
|
+
*/
|
|
286
|
+
buildSubAgentList() {
|
|
287
|
+
if (this.definitions.size === 0)
|
|
288
|
+
return "No sub-agents registered.";
|
|
289
|
+
const lines = [];
|
|
290
|
+
for (const def of this.definitions.values()) {
|
|
291
|
+
lines.push(`- **${def.name}**: ${def.description}`);
|
|
292
|
+
if (def.tools.length > 0) {
|
|
293
|
+
lines.push(` Tools: ${def.tools.join(", ")}`);
|
|
294
|
+
}
|
|
295
|
+
if (def.skills.length > 0) {
|
|
296
|
+
lines.push(` Skills: ${def.skills.join(", ")}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return lines.join("\n");
|
|
300
|
+
}
|
|
301
|
+
// ─── Internal ─────────────────────────────────────────────────────────────
|
|
302
|
+
/**
|
|
303
|
+
* Execute a sub-agent run and wrap the result in XML.
|
|
304
|
+
*/
|
|
305
|
+
async executeRun(name, runId, definition, input, startedAt) {
|
|
306
|
+
const runPromise = this.doExecute(name, runId, definition, input, startedAt);
|
|
307
|
+
// Wrap with timeout
|
|
308
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
309
|
+
setTimeout(() => reject(new Error(`Sub-agent "${name}" timed out after ${this.timeoutMs / 1000}s.`)), this.timeoutMs);
|
|
310
|
+
});
|
|
311
|
+
try {
|
|
312
|
+
return await Promise.race([runPromise, timeoutPromise]);
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
316
|
+
const durationMs = Date.now() - startedAt;
|
|
317
|
+
return {
|
|
318
|
+
subAgentId: runId,
|
|
319
|
+
name,
|
|
320
|
+
success: false,
|
|
321
|
+
output: this.wrapXml(name, runId, false, message, durationMs),
|
|
322
|
+
durationMs,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async doExecute(name, runId, definition, input, startedAt) {
|
|
327
|
+
const agent = this.buildSubAgent(definition);
|
|
328
|
+
const output = await agent.run(input);
|
|
329
|
+
const durationMs = Date.now() - startedAt;
|
|
330
|
+
return {
|
|
331
|
+
subAgentId: runId,
|
|
332
|
+
name,
|
|
333
|
+
success: true,
|
|
334
|
+
output: this.wrapXml(name, runId, true, output, durationMs),
|
|
335
|
+
durationMs,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Build a ReActAgent instance from a sub-agent definition, with:
|
|
340
|
+
* - Filtered tool set (name allowlist + wildcard patterns → defaultFilter → definition.toolFilter)
|
|
341
|
+
* - Pre-activated skills (copied from main agent's SkillManager)
|
|
342
|
+
* - No spawn tool
|
|
343
|
+
* - Auto-detect disabled (skills are pre-activated)
|
|
344
|
+
*
|
|
345
|
+
* Tool name patterns support `*` as a wildcard. For example,
|
|
346
|
+
* `filesystem_*` matches all tools whose names start with `filesystem_`
|
|
347
|
+
* (e.g. MCP tools from the "filesystem" server).
|
|
348
|
+
*/
|
|
349
|
+
buildSubAgent(definition) {
|
|
350
|
+
// Look up declared tools from the main agent's registry.
|
|
351
|
+
// Supports wildcard patterns (e.g. "filesystem_*" matches all tools
|
|
352
|
+
// from the "filesystem" MCP server). Uses a Map for deduplication.
|
|
353
|
+
const toolMap = new Map();
|
|
354
|
+
const allToolNames = this.toolRegistry.toolNames;
|
|
355
|
+
const allTools = this.toolRegistry.getTools();
|
|
356
|
+
for (const toolPattern of definition.tools) {
|
|
357
|
+
if (toolPattern.includes("*")) {
|
|
358
|
+
// Wildcard pattern — match against all tool names in the registry
|
|
359
|
+
const regex = globToRegex(toolPattern);
|
|
360
|
+
let matched = 0;
|
|
361
|
+
for (const toolName of allToolNames) {
|
|
362
|
+
if (regex.test(toolName)) {
|
|
363
|
+
const tool = allTools.find((t) => t.name === toolName);
|
|
364
|
+
if (tool && !toolMap.has(toolName)) {
|
|
365
|
+
toolMap.set(toolName, tool);
|
|
366
|
+
matched++;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (matched === 0) {
|
|
371
|
+
this.logger.warn("SubAgent", `Pattern "${toolPattern}" requested by "${definition.name}" matched no tools.`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
// Exact match (existing behavior)
|
|
376
|
+
const tool = this.toolRegistry.getTool(toolPattern);
|
|
377
|
+
if (tool) {
|
|
378
|
+
toolMap.set(toolPattern, tool);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
this.logger.warn("SubAgent", `Tool "${toolPattern}" requested by "${definition.name}" not found in registry.`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const tools = Array.from(toolMap.values());
|
|
386
|
+
// Build a dedicated ToolRegistry for this sub-agent
|
|
387
|
+
const toolRegistry = new tool_registry_1.ToolRegistry();
|
|
388
|
+
if (tools.length > 0) {
|
|
389
|
+
toolRegistry.registerMany(tools);
|
|
390
|
+
}
|
|
391
|
+
// Compose filters: name allowlist applied first, then defaultFilter,
|
|
392
|
+
// then definition-level toolFilter. Each layer narrows the set.
|
|
393
|
+
if (this.defaultFilter || definition.toolFilter) {
|
|
394
|
+
const filteredRegistry = new tool_registry_1.ToolRegistry();
|
|
395
|
+
const namesOnly = toolRegistry.toolNames;
|
|
396
|
+
const allTools = this.toolRegistry.getTools();
|
|
397
|
+
for (const toolName of namesOnly) {
|
|
398
|
+
const tool = allTools.find((t) => t.name === toolName);
|
|
399
|
+
if (!tool)
|
|
400
|
+
continue;
|
|
401
|
+
let pass = true;
|
|
402
|
+
if (this.defaultFilter && !this.defaultFilter.filter(tool)) {
|
|
403
|
+
pass = false;
|
|
404
|
+
}
|
|
405
|
+
if (pass && definition.toolFilter && !definition.toolFilter.filter(tool)) {
|
|
406
|
+
pass = false;
|
|
407
|
+
}
|
|
408
|
+
if (pass) {
|
|
409
|
+
filteredRegistry.register(tool);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Replace with the doubly-filtered registry
|
|
413
|
+
// (reuse the variable for the rest of the method)
|
|
414
|
+
return this.finishBuildSubAgent(definition, filteredRegistry);
|
|
415
|
+
}
|
|
416
|
+
return this.finishBuildSubAgent(definition, toolRegistry);
|
|
417
|
+
}
|
|
418
|
+
/** Shared tail of buildSubAgent: wire up skills and return the agent. */
|
|
419
|
+
finishBuildSubAgent(definition, toolRegistry) {
|
|
420
|
+
// Build a dedicated SkillManager with declared skills pre-activated.
|
|
421
|
+
// Use registerFromDirectory when skillsDir is available so lazy-loading
|
|
422
|
+
// works correctly (populates systemPrompt from disk).
|
|
423
|
+
const skillManager = new skill_manager_1.SkillManager();
|
|
424
|
+
if (this.skillsDir) {
|
|
425
|
+
skillManager.registerFromDirectory(this.skillsDir);
|
|
426
|
+
}
|
|
427
|
+
for (const skillName of definition.skills) {
|
|
428
|
+
if (skillManager.has(skillName)) {
|
|
429
|
+
skillManager.activate(skillName);
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
this.logger.warn("SubAgent", `Skill "${skillName}" requested by "${definition.name}" not found.`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// Build system prompt: sub-agent definition prompt + active skill content
|
|
436
|
+
const systemPrompt = definition.systemPrompt;
|
|
437
|
+
// Select the LLM provider for this sub-agent:
|
|
438
|
+
// subAgentLLM (from AgentConfig) takes priority over the main model.
|
|
439
|
+
const effectiveLLM = this.subAgentLLM ?? this.llmProvider;
|
|
440
|
+
return new react_agent_1.ReActAgent({
|
|
441
|
+
llm: effectiveLLM,
|
|
442
|
+
systemPrompt,
|
|
443
|
+
toolRegistry,
|
|
444
|
+
skillManager,
|
|
445
|
+
maxIterations: 10,
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Wrap the sub-agent output in an XML envelope for the main agent.
|
|
450
|
+
*/
|
|
451
|
+
wrapXml(name, runId, success, output, durationMs) {
|
|
452
|
+
return [
|
|
453
|
+
`<subagent-result name="${escapeXml(name)}" id="${runId}" success="${success}" duration_ms="${durationMs}">`,
|
|
454
|
+
output,
|
|
455
|
+
"</subagent-result>",
|
|
456
|
+
].join("\n");
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
exports.SubAgentManager = SubAgentManager;
|
|
460
|
+
/** Escape special XML characters. */
|
|
461
|
+
function escapeXml(s) {
|
|
462
|
+
return s
|
|
463
|
+
.replace(/&/g, "&")
|
|
464
|
+
.replace(/</g, "<")
|
|
465
|
+
.replace(/>/g, ">")
|
|
466
|
+
.replace(/"/g, """);
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=subagent-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-manager.js","sourceRoot":"","sources":["../../src/subagent/subagent-manager.ts"],"names":[],"mappings":"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"}
|