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
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SkillManager = void 0;
|
|
4
4
|
const file_skill_loader_1 = require("./file-skill-loader");
|
|
5
|
+
const logger_1 = require("../logging/logger");
|
|
6
|
+
const boundaries_1 = require("../security/boundaries");
|
|
5
7
|
/**
|
|
6
8
|
* Manages skill registration, activation, and progressive disclosure.
|
|
7
9
|
*
|
|
@@ -10,12 +12,17 @@ const file_skill_loader_1 = require("./file-skill-loader");
|
|
|
10
12
|
* core system prompt small while allowing deep expertise to be
|
|
11
13
|
* injected when needed.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
* 1.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Workflow:
|
|
16
|
+
* 1. Skills are registered from a directory (metadata only: name, description, keywords)
|
|
17
|
+
* 2. `buildAvailableSkillsHint()` lists all available skills in the system prompt
|
|
18
|
+
* 3. LLM decides which skill to use → `activate(name)` loads the full content
|
|
19
|
+
* 4. `buildSkillsPrompt()` includes the active skill's full system prompt
|
|
17
20
|
*/
|
|
18
21
|
class SkillManager {
|
|
22
|
+
logger;
|
|
23
|
+
constructor(logger) {
|
|
24
|
+
this.logger = logger ?? new logger_1.ConsoleLogger();
|
|
25
|
+
}
|
|
19
26
|
/** All registered skills (active or not), keyed by name. */
|
|
20
27
|
registry = new Map();
|
|
21
28
|
/** Skills that are currently active. */
|
|
@@ -26,32 +33,16 @@ class SkillManager {
|
|
|
26
33
|
fileLoaders = new Map();
|
|
27
34
|
/** File-based skills whose full content has been loaded from disk. */
|
|
28
35
|
loadedFileSkills = new Set();
|
|
29
|
-
/** Reference to the ToolRegistry for registering/unregistering skill tools. */
|
|
30
|
-
toolRegistry;
|
|
31
|
-
/**
|
|
32
|
-
* @param toolRegistry Optional ToolRegistry — skills with tools
|
|
33
|
-
* will auto-register/unregister there.
|
|
34
|
-
*/
|
|
35
|
-
constructor(toolRegistry) {
|
|
36
|
-
this.toolRegistry = toolRegistry;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Bind a ToolRegistry so skill tools are managed automatically.
|
|
40
|
-
*/
|
|
41
|
-
bindToolRegistry(registry) {
|
|
42
|
-
this.toolRegistry = registry;
|
|
43
|
-
}
|
|
44
36
|
// ─── Registration ────────────────────────────────────────────────────
|
|
45
37
|
/**
|
|
46
|
-
* Register
|
|
38
|
+
* Register a skill object directly (programmatic registration).
|
|
39
|
+
* Used when skills are defined in code rather than loaded from disk.
|
|
47
40
|
*/
|
|
48
|
-
register(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
throw new Error(`Skill "${skill.name}" is already registered.`);
|
|
52
|
-
}
|
|
53
|
-
this.registry.set(skill.name, skill);
|
|
41
|
+
register(skill) {
|
|
42
|
+
if (this.registry.has(skill.name)) {
|
|
43
|
+
throw new Error(`Skill "${skill.name}" is already registered.`);
|
|
54
44
|
}
|
|
45
|
+
this.registry.set(skill.name, skill);
|
|
55
46
|
}
|
|
56
47
|
/**
|
|
57
48
|
* Unregister a skill by name. Deactivates it first if active.
|
|
@@ -60,6 +51,7 @@ class SkillManager {
|
|
|
60
51
|
if (this.activeSkills.has(name)) {
|
|
61
52
|
this.deactivate(name);
|
|
62
53
|
}
|
|
54
|
+
this.fileLoaders.delete(name);
|
|
63
55
|
return this.registry.delete(name);
|
|
64
56
|
}
|
|
65
57
|
/**
|
|
@@ -73,12 +65,12 @@ class SkillManager {
|
|
|
73
65
|
* @returns Number of skills successfully registered.
|
|
74
66
|
*/
|
|
75
67
|
registerFromDirectory(dir) {
|
|
76
|
-
const loader = new file_skill_loader_1.FileSkillLoader(dir);
|
|
68
|
+
const loader = new file_skill_loader_1.FileSkillLoader(dir, this.logger);
|
|
77
69
|
const scanned = loader.scan();
|
|
78
70
|
let count = 0;
|
|
79
71
|
for (const skill of scanned) {
|
|
80
72
|
if (this.registry.has(skill.name)) {
|
|
81
|
-
|
|
73
|
+
this.logger.warn("Skills", `Skipping "${skill.name}": already registered (duplicate name).`);
|
|
82
74
|
continue;
|
|
83
75
|
}
|
|
84
76
|
this.registry.set(skill.name, skill);
|
|
@@ -86,13 +78,36 @@ class SkillManager {
|
|
|
86
78
|
count++;
|
|
87
79
|
}
|
|
88
80
|
if (count > 0) {
|
|
89
|
-
|
|
81
|
+
this.logger.info("Skills", `Registered ${count} file-based skill(s) from ${dir}` +
|
|
90
82
|
(scanned.length !== count
|
|
91
83
|
? ` (${scanned.length - count} skipped)`
|
|
92
84
|
: ""));
|
|
93
85
|
}
|
|
94
86
|
return count;
|
|
95
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Re-scan the skills directory for new SKILL.md files.
|
|
90
|
+
*
|
|
91
|
+
* Safe to call at the start of each run — only registers skills that
|
|
92
|
+
* haven't been registered yet. Already-registered skills are left as-is.
|
|
93
|
+
*
|
|
94
|
+
* @param dir Path to the skills directory.
|
|
95
|
+
* @returns Names of newly registered skills (empty if nothing changed).
|
|
96
|
+
*/
|
|
97
|
+
reloadFromDirectory(dir) {
|
|
98
|
+
const before = new Set(this.registry.keys());
|
|
99
|
+
this.registerFromDirectory(dir);
|
|
100
|
+
const after = new Set(this.registry.keys());
|
|
101
|
+
const added = [];
|
|
102
|
+
for (const name of after) {
|
|
103
|
+
if (!before.has(name))
|
|
104
|
+
added.push(name);
|
|
105
|
+
}
|
|
106
|
+
if (added.length > 0) {
|
|
107
|
+
this.logger.info("Skills", `Picked up ${added.length} new skill(s): ${added.join(", ")}`);
|
|
108
|
+
}
|
|
109
|
+
return added;
|
|
110
|
+
}
|
|
96
111
|
/**
|
|
97
112
|
* Check if a skill is registered.
|
|
98
113
|
*/
|
|
@@ -114,8 +129,7 @@ class SkillManager {
|
|
|
114
129
|
// ─── Activation / Deactivation ───────────────────────────────────────
|
|
115
130
|
/**
|
|
116
131
|
* Activate a skill by name.
|
|
117
|
-
* -
|
|
118
|
-
* - Registers its tools (if a ToolRegistry is bound).
|
|
132
|
+
* - Lazy-loads the full system prompt from disk (if file-based).
|
|
119
133
|
* - Returns true if the skill was newly activated.
|
|
120
134
|
*/
|
|
121
135
|
activate(name) {
|
|
@@ -126,12 +140,11 @@ class SkillManager {
|
|
|
126
140
|
if (this.activeSkills.has(name)) {
|
|
127
141
|
return false; // Already active
|
|
128
142
|
}
|
|
129
|
-
// Lazy-load file-based skills: populate systemPrompt
|
|
143
|
+
// Lazy-load file-based skills: populate systemPrompt from disk
|
|
130
144
|
const loader = this.fileLoaders.get(name);
|
|
131
145
|
if (loader && !this.loadedFileSkills.has(name)) {
|
|
132
146
|
try {
|
|
133
147
|
skill.systemPrompt = loader.loadSystemPrompt(name);
|
|
134
|
-
skill.tools = loader.loadScriptsAsTools(name);
|
|
135
148
|
this.loadedFileSkills.add(name);
|
|
136
149
|
}
|
|
137
150
|
catch (err) {
|
|
@@ -141,17 +154,6 @@ class SkillManager {
|
|
|
141
154
|
}
|
|
142
155
|
this.activeSkills.set(name, skill);
|
|
143
156
|
this.activatedAt.set(name, new Date());
|
|
144
|
-
// Register skill tools if we have a registry
|
|
145
|
-
if (this.toolRegistry && skill.tools) {
|
|
146
|
-
for (const tool of skill.tools) {
|
|
147
|
-
try {
|
|
148
|
-
this.toolRegistry.register(tool);
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// Tool already registered — skip
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
157
|
return true;
|
|
156
158
|
}
|
|
157
159
|
/**
|
|
@@ -173,18 +175,11 @@ class SkillManager {
|
|
|
173
175
|
}
|
|
174
176
|
/**
|
|
175
177
|
* Deactivate a skill.
|
|
176
|
-
* - Unregisters its tools (if a ToolRegistry is bound).
|
|
177
178
|
*/
|
|
178
179
|
deactivate(name) {
|
|
179
180
|
const skill = this.activeSkills.get(name);
|
|
180
181
|
if (!skill)
|
|
181
182
|
return false;
|
|
182
|
-
// Unregister skill tools
|
|
183
|
-
if (this.toolRegistry && skill.tools) {
|
|
184
|
-
for (const tool of skill.tools) {
|
|
185
|
-
this.toolRegistry.remove(tool.name);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
183
|
this.activeSkills.delete(name);
|
|
189
184
|
this.activatedAt.delete(name);
|
|
190
185
|
// Allow re-activation to reload from disk if the skill files changed
|
|
@@ -200,36 +195,6 @@ class SkillManager {
|
|
|
200
195
|
this.deactivate(name);
|
|
201
196
|
}
|
|
202
197
|
}
|
|
203
|
-
// ─── Auto-Detection ──────────────────────────────────────────────────
|
|
204
|
-
/**
|
|
205
|
-
* Scan user input against unregistered (not yet active) skills.
|
|
206
|
-
* Activates any skill whose keywords match the input.
|
|
207
|
-
*
|
|
208
|
-
* @param input The user's input text.
|
|
209
|
-
* @returns Names of newly activated skills.
|
|
210
|
-
*/
|
|
211
|
-
detectAndActivate(input) {
|
|
212
|
-
const lowerInput = input.toLowerCase();
|
|
213
|
-
const activated = [];
|
|
214
|
-
for (const skill of this.registry.values()) {
|
|
215
|
-
// Skip already-active skills
|
|
216
|
-
if (this.activeSkills.has(skill.name))
|
|
217
|
-
continue;
|
|
218
|
-
// Skip skills without keywords
|
|
219
|
-
if (!skill.keywords || skill.keywords.length === 0)
|
|
220
|
-
continue;
|
|
221
|
-
// Check each keyword
|
|
222
|
-
for (const keyword of skill.keywords) {
|
|
223
|
-
if (lowerInput.includes(keyword.toLowerCase())) {
|
|
224
|
-
if (this.activate(skill.name)) {
|
|
225
|
-
activated.push(skill.name);
|
|
226
|
-
}
|
|
227
|
-
break; // One match is enough per skill
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
return activated;
|
|
232
|
-
}
|
|
233
198
|
// ─── System Prompt Assembly ──────────────────────────────────────────
|
|
234
199
|
/**
|
|
235
200
|
* Build the accumulated system prompt content from all active skills.
|
|
@@ -243,9 +208,16 @@ class SkillManager {
|
|
|
243
208
|
return "";
|
|
244
209
|
const sections = [];
|
|
245
210
|
for (const skill of active) {
|
|
246
|
-
sections.push(`[Skill: ${skill.name}]\n${skill.systemPrompt}`);
|
|
211
|
+
sections.push(`[Skill: ${skill.name}]\n${skill.systemPrompt ?? ""}`);
|
|
247
212
|
}
|
|
248
|
-
|
|
213
|
+
const body = sections.join("\n\n");
|
|
214
|
+
// Scan for prompt-injection signatures in user-authored skill content
|
|
215
|
+
const patterns = (0, boundaries_1.detectInjectionSignatures)(body);
|
|
216
|
+
const warning = (0, boundaries_1.buildUserContentInjectionWarning)(patterns, "skills");
|
|
217
|
+
// Wrap with user-authored boundary markers (skills are user-authored files,
|
|
218
|
+
// same risk profile as project rules)
|
|
219
|
+
const wrapped = (0, boundaries_1.wrapUserAuthored)("Active Skills", body);
|
|
220
|
+
return "\n\n" + warning + wrapped;
|
|
249
221
|
}
|
|
250
222
|
/**
|
|
251
223
|
* Build a lightweight list of available (unactivated) skill names
|
|
@@ -263,8 +235,14 @@ class SkillManager {
|
|
|
263
235
|
}
|
|
264
236
|
if (available.length === 0)
|
|
265
237
|
return "";
|
|
266
|
-
|
|
267
|
-
available.map((line) => ` - ${line}`).join("\n")
|
|
238
|
+
const body = "Available skills (use the `skill` tool to activate them when needed):\n" +
|
|
239
|
+
available.map((line) => ` - ${line}`).join("\n");
|
|
240
|
+
// Scan for prompt-injection signatures in skill names/descriptions
|
|
241
|
+
const patterns = (0, boundaries_1.detectInjectionSignatures)(body);
|
|
242
|
+
const warning = (0, boundaries_1.buildUserContentInjectionWarning)(patterns, "skill descriptions");
|
|
243
|
+
// Wrap with user-authored boundary markers
|
|
244
|
+
const wrapped = (0, boundaries_1.wrapUserAuthored)("Available Skills", body);
|
|
245
|
+
return "\n\n" + warning + wrapped;
|
|
268
246
|
}
|
|
269
247
|
// ─── Query ───────────────────────────────────────────────────────────
|
|
270
248
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skills/skill-manager.ts"],"names":[],"mappings":";;;AACA,2DAAsD;
|
|
1
|
+
{"version":3,"file":"skill-manager.js","sourceRoot":"","sources":["../../src/skills/skill-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/skills/types.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { Tool } from "../tools/types";
|
|
2
1
|
/**
|
|
3
2
|
* A Skill is a reusable capability that can be loaded into the agent's
|
|
4
3
|
* system prompt on demand (progressive disclosure).
|
|
5
4
|
*
|
|
6
|
-
* Each skill carries
|
|
7
|
-
* -
|
|
8
|
-
*
|
|
9
|
-
* - Optional keywords that trigger automatic activation
|
|
5
|
+
* Each skill carries a system prompt fragment with instructions for the LLM.
|
|
6
|
+
* Activation is LLM-driven — the agent calls the `skill` tool to load a skill
|
|
7
|
+
* when it determines one is needed.
|
|
10
8
|
*/
|
|
11
9
|
export interface Skill {
|
|
12
10
|
/** Unique identifier for this skill. */
|
|
@@ -17,17 +15,7 @@ export interface Skill {
|
|
|
17
15
|
* System prompt content injected into the agent's system message
|
|
18
16
|
* when this skill is activated.
|
|
19
17
|
*/
|
|
20
|
-
systemPrompt
|
|
21
|
-
/**
|
|
22
|
-
* Optional keywords for auto-detection.
|
|
23
|
-
* When user input contains any of these, the skill is activated automatically.
|
|
24
|
-
*/
|
|
25
|
-
keywords?: string[];
|
|
26
|
-
/**
|
|
27
|
-
* Optional tools that this skill provides.
|
|
28
|
-
* These are registered when the skill activates and unregistered on deactivation.
|
|
29
|
-
*/
|
|
30
|
-
tools?: Tool[];
|
|
18
|
+
systemPrompt?: string;
|
|
31
19
|
}
|
|
32
20
|
/**
|
|
33
21
|
* Status of a skill within the SkillManager.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,KAAK;IACpB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IAEb,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubAgentLoader = exports.SubAgentManager = void 0;
|
|
4
|
+
var subagent_manager_1 = require("./subagent-manager");
|
|
5
|
+
Object.defineProperty(exports, "SubAgentManager", { enumerable: true, get: function () { return subagent_manager_1.SubAgentManager; } });
|
|
6
|
+
var subagent_loader_1 = require("./subagent-loader");
|
|
7
|
+
Object.defineProperty(exports, "SubAgentLoader", { enumerable: true, get: function () { return subagent_loader_1.SubAgentLoader; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subagent/index.ts"],"names":[],"mappings":";;;AAAA,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { SubAgentDefinition } from "./subagent-types";
|
|
2
|
+
import { Logger } from "../logging/logger";
|
|
3
|
+
/**
|
|
4
|
+
* Loads sub-agent definitions from a directory of AGENT.md files.
|
|
5
|
+
*
|
|
6
|
+
* Expected directory structure:
|
|
7
|
+
* ```
|
|
8
|
+
* subagents/
|
|
9
|
+
* ├── <agent-name>/
|
|
10
|
+
* │ └── AGENT.md # Frontmatter (metadata) + body (system prompt)
|
|
11
|
+
* ├── <another-agent>/
|
|
12
|
+
* │ └── AGENT.md
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* The AGENT.md format:
|
|
16
|
+
* ```markdown
|
|
17
|
+
* ---
|
|
18
|
+
* name: code-reviewer
|
|
19
|
+
* description: Reviews code for bugs and style issues
|
|
20
|
+
* tools: read_file, grep_search, glob_search
|
|
21
|
+
* skills: code-review
|
|
22
|
+
* ---
|
|
23
|
+
* You are a code review specialist...
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class SubAgentLoader {
|
|
27
|
+
private directory;
|
|
28
|
+
private agentFileName;
|
|
29
|
+
private logger;
|
|
30
|
+
/**
|
|
31
|
+
* @param directory Path to the sub-agents root directory.
|
|
32
|
+
* @param agentFileName The markdown filename to look for (default: "AGENT.md").
|
|
33
|
+
* @param logger Logger instance (defaults to ConsoleLogger).
|
|
34
|
+
*/
|
|
35
|
+
constructor(directory: string, agentFileName?: string, logger?: Logger);
|
|
36
|
+
/**
|
|
37
|
+
* Get the root directory path.
|
|
38
|
+
*/
|
|
39
|
+
getDirectory(): string;
|
|
40
|
+
/**
|
|
41
|
+
* Scan the directory and return SubAgentDefinition objects for each
|
|
42
|
+
* subdirectory that contains a valid AGENT.md file.
|
|
43
|
+
*
|
|
44
|
+
* Subdirectories without an AGENT.md or without a `name` in frontmatter
|
|
45
|
+
* are skipped with a warning.
|
|
46
|
+
*/
|
|
47
|
+
scan(): SubAgentDefinition[];
|
|
48
|
+
/**
|
|
49
|
+
* Load a single sub-agent definition by name (the subdirectory name).
|
|
50
|
+
*/
|
|
51
|
+
loadDefinition(dirName: string): SubAgentDefinition | null;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=subagent-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-loader.d.ts","sourceRoot":"","sources":["../../src/subagent/subagent-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAS;IAEvB;;;;OAIG;gBACS,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAMtE;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;;;;;OAMG;IACH,IAAI,IAAI,kBAAkB,EAAE;IAuB5B;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;CAoC3D"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SubAgentLoader = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const file_skill_loader_1 = require("../skills/file-skill-loader");
|
|
40
|
+
const logger_1 = require("../logging/logger");
|
|
41
|
+
/**
|
|
42
|
+
* Loads sub-agent definitions from a directory of AGENT.md files.
|
|
43
|
+
*
|
|
44
|
+
* Expected directory structure:
|
|
45
|
+
* ```
|
|
46
|
+
* subagents/
|
|
47
|
+
* ├── <agent-name>/
|
|
48
|
+
* │ └── AGENT.md # Frontmatter (metadata) + body (system prompt)
|
|
49
|
+
* ├── <another-agent>/
|
|
50
|
+
* │ └── AGENT.md
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* The AGENT.md format:
|
|
54
|
+
* ```markdown
|
|
55
|
+
* ---
|
|
56
|
+
* name: code-reviewer
|
|
57
|
+
* description: Reviews code for bugs and style issues
|
|
58
|
+
* tools: read_file, grep_search, glob_search
|
|
59
|
+
* skills: code-review
|
|
60
|
+
* ---
|
|
61
|
+
* You are a code review specialist...
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
class SubAgentLoader {
|
|
65
|
+
directory;
|
|
66
|
+
agentFileName;
|
|
67
|
+
logger;
|
|
68
|
+
/**
|
|
69
|
+
* @param directory Path to the sub-agents root directory.
|
|
70
|
+
* @param agentFileName The markdown filename to look for (default: "AGENT.md").
|
|
71
|
+
* @param logger Logger instance (defaults to ConsoleLogger).
|
|
72
|
+
*/
|
|
73
|
+
constructor(directory, agentFileName, logger) {
|
|
74
|
+
this.directory = path.resolve(directory);
|
|
75
|
+
this.agentFileName = agentFileName ?? "AGENT.md";
|
|
76
|
+
this.logger = logger ?? new logger_1.ConsoleLogger();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the root directory path.
|
|
80
|
+
*/
|
|
81
|
+
getDirectory() {
|
|
82
|
+
return this.directory;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Scan the directory and return SubAgentDefinition objects for each
|
|
86
|
+
* subdirectory that contains a valid AGENT.md file.
|
|
87
|
+
*
|
|
88
|
+
* Subdirectories without an AGENT.md or without a `name` in frontmatter
|
|
89
|
+
* are skipped with a warning.
|
|
90
|
+
*/
|
|
91
|
+
scan() {
|
|
92
|
+
const definitions = [];
|
|
93
|
+
let entries;
|
|
94
|
+
try {
|
|
95
|
+
entries = fs.readdirSync(this.directory, { withFileTypes: true });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (!entry.isDirectory())
|
|
102
|
+
continue;
|
|
103
|
+
if (entry.name.startsWith("."))
|
|
104
|
+
continue;
|
|
105
|
+
const def = this.loadDefinition(entry.name);
|
|
106
|
+
if (def) {
|
|
107
|
+
definitions.push(def);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return definitions;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Load a single sub-agent definition by name (the subdirectory name).
|
|
114
|
+
*/
|
|
115
|
+
loadDefinition(dirName) {
|
|
116
|
+
const agentPath = path.join(this.directory, dirName, this.agentFileName);
|
|
117
|
+
let raw;
|
|
118
|
+
try {
|
|
119
|
+
raw = fs.readFileSync(agentPath, "utf-8");
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
this.logger.warn("SubAgent", `Skipping "${dirName}": no ${this.agentFileName} found.`);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
const { frontmatter, body } = (0, file_skill_loader_1.parseFrontmatter)(raw);
|
|
126
|
+
const name = frontmatter.name?.trim();
|
|
127
|
+
if (!name) {
|
|
128
|
+
this.logger.warn("SubAgent", `Skipping "${dirName}": no "name" in frontmatter.`);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const tools = parseCsvList(frontmatter.tools);
|
|
132
|
+
const skills = parseCsvList(frontmatter.skills);
|
|
133
|
+
return {
|
|
134
|
+
name,
|
|
135
|
+
description: frontmatter.description?.trim() ?? "",
|
|
136
|
+
systemPrompt: body,
|
|
137
|
+
tools,
|
|
138
|
+
skills,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.SubAgentLoader = SubAgentLoader;
|
|
143
|
+
/**
|
|
144
|
+
* Parse a comma-separated string into a string array.
|
|
145
|
+
* Returns empty array for empty/absent input.
|
|
146
|
+
*/
|
|
147
|
+
function parseCsvList(raw) {
|
|
148
|
+
if (!raw)
|
|
149
|
+
return [];
|
|
150
|
+
return raw
|
|
151
|
+
.split(",")
|
|
152
|
+
.map((s) => s.trim())
|
|
153
|
+
.filter(Boolean);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=subagent-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent-loader.js","sourceRoot":"","sources":["../../src/subagent/subagent-loader.ts"],"names":[],"mappings":"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"}
|