agentx-sdk 0.1.0
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/README.md +561 -0
- package/dist/agent.d.ts +105 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +690 -0
- package/dist/agent.js.map +1 -0
- package/dist/config/config.d.ts +346 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +93 -0
- package/dist/config/config.js.map +1 -0
- package/dist/contracts/entities/agent-event.d.ts +97 -0
- package/dist/contracts/entities/agent-event.d.ts.map +1 -0
- package/dist/contracts/entities/agent-event.js +2 -0
- package/dist/contracts/entities/agent-event.js.map +1 -0
- package/dist/contracts/entities/agent-skill.d.ts +59 -0
- package/dist/contracts/entities/agent-skill.d.ts.map +1 -0
- package/dist/contracts/entities/agent-skill.js +2 -0
- package/dist/contracts/entities/agent-skill.js.map +1 -0
- package/dist/contracts/entities/agent-tool.d.ts +42 -0
- package/dist/contracts/entities/agent-tool.d.ts.map +1 -0
- package/dist/contracts/entities/agent-tool.js +2 -0
- package/dist/contracts/entities/agent-tool.js.map +1 -0
- package/dist/contracts/entities/chat-message.d.ts +13 -0
- package/dist/contracts/entities/chat-message.d.ts.map +1 -0
- package/dist/contracts/entities/chat-message.js +2 -0
- package/dist/contracts/entities/chat-message.js.map +1 -0
- package/dist/contracts/entities/content-part.d.ts +16 -0
- package/dist/contracts/entities/content-part.d.ts.map +1 -0
- package/dist/contracts/entities/content-part.js +2 -0
- package/dist/contracts/entities/content-part.js.map +1 -0
- package/dist/contracts/entities/execution-context.d.ts +9 -0
- package/dist/contracts/entities/execution-context.d.ts.map +1 -0
- package/dist/contracts/entities/execution-context.js +2 -0
- package/dist/contracts/entities/execution-context.js.map +1 -0
- package/dist/contracts/entities/index.d.ts +11 -0
- package/dist/contracts/entities/index.d.ts.map +1 -0
- package/dist/contracts/entities/index.js +2 -0
- package/dist/contracts/entities/index.js.map +1 -0
- package/dist/contracts/entities/knowledge.d.ts +21 -0
- package/dist/contracts/entities/knowledge.d.ts.map +1 -0
- package/dist/contracts/entities/knowledge.js +2 -0
- package/dist/contracts/entities/knowledge.js.map +1 -0
- package/dist/contracts/entities/stores.d.ts +18 -0
- package/dist/contracts/entities/stores.d.ts.map +1 -0
- package/dist/contracts/entities/stores.js +2 -0
- package/dist/contracts/entities/stores.js.map +1 -0
- package/dist/contracts/entities/token-usage.d.ts +7 -0
- package/dist/contracts/entities/token-usage.d.ts.map +1 -0
- package/dist/contracts/entities/token-usage.js +2 -0
- package/dist/contracts/entities/token-usage.js.map +1 -0
- package/dist/contracts/entities/tool-call.d.ts +16 -0
- package/dist/contracts/entities/tool-call.d.ts.map +1 -0
- package/dist/contracts/entities/tool-call.js +2 -0
- package/dist/contracts/entities/tool-call.js.map +1 -0
- package/dist/contracts/enums/index.d.ts +21 -0
- package/dist/contracts/enums/index.d.ts.map +1 -0
- package/dist/contracts/enums/index.js +8 -0
- package/dist/contracts/enums/index.js.map +1 -0
- package/dist/contracts/index.d.ts +3 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +3 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/core/compaction/autocompact.d.ts +18 -0
- package/dist/core/compaction/autocompact.d.ts.map +1 -0
- package/dist/core/compaction/autocompact.js +68 -0
- package/dist/core/compaction/autocompact.js.map +1 -0
- package/dist/core/compaction/microcompact.d.ts +20 -0
- package/dist/core/compaction/microcompact.d.ts.map +1 -0
- package/dist/core/compaction/microcompact.js +38 -0
- package/dist/core/compaction/microcompact.js.map +1 -0
- package/dist/core/compaction/snip-compact.d.ts +22 -0
- package/dist/core/compaction/snip-compact.d.ts.map +1 -0
- package/dist/core/compaction/snip-compact.js +61 -0
- package/dist/core/compaction/snip-compact.js.map +1 -0
- package/dist/core/compaction/tool-result-budget.d.ts +24 -0
- package/dist/core/compaction/tool-result-budget.d.ts.map +1 -0
- package/dist/core/compaction/tool-result-budget.js +67 -0
- package/dist/core/compaction/tool-result-budget.js.map +1 -0
- package/dist/core/context-analysis.d.ts +24 -0
- package/dist/core/context-analysis.d.ts.map +1 -0
- package/dist/core/context-analysis.js +37 -0
- package/dist/core/context-analysis.js.map +1 -0
- package/dist/core/context-builder.d.ts +25 -0
- package/dist/core/context-builder.d.ts.map +1 -0
- package/dist/core/context-builder.js +108 -0
- package/dist/core/context-builder.js.map +1 -0
- package/dist/core/conversation-manager.d.ts +19 -0
- package/dist/core/conversation-manager.d.ts.map +1 -0
- package/dist/core/conversation-manager.js +62 -0
- package/dist/core/conversation-manager.js.map +1 -0
- package/dist/core/execution-context.d.ts +6 -0
- package/dist/core/execution-context.d.ts.map +1 -0
- package/dist/core/execution-context.js +14 -0
- package/dist/core/execution-context.js.map +1 -0
- package/dist/core/loop-deps.d.ts +15 -0
- package/dist/core/loop-deps.d.ts.map +1 -0
- package/dist/core/loop-deps.js +8 -0
- package/dist/core/loop-deps.js.map +1 -0
- package/dist/core/loop-types.d.ts +34 -0
- package/dist/core/loop-types.d.ts.map +1 -0
- package/dist/core/loop-types.js +15 -0
- package/dist/core/loop-types.js.map +1 -0
- package/dist/core/message-normalize.d.ts +18 -0
- package/dist/core/message-normalize.d.ts.map +1 -0
- package/dist/core/message-normalize.js +69 -0
- package/dist/core/message-normalize.js.map +1 -0
- package/dist/core/prompt-builders.d.ts +36 -0
- package/dist/core/prompt-builders.d.ts.map +1 -0
- package/dist/core/prompt-builders.js +89 -0
- package/dist/core/prompt-builders.js.map +1 -0
- package/dist/core/prompt-cache.d.ts +25 -0
- package/dist/core/prompt-cache.d.ts.map +1 -0
- package/dist/core/prompt-cache.js +34 -0
- package/dist/core/prompt-cache.js.map +1 -0
- package/dist/core/react-loop.d.ts +43 -0
- package/dist/core/react-loop.d.ts.map +1 -0
- package/dist/core/react-loop.js +403 -0
- package/dist/core/react-loop.js.map +1 -0
- package/dist/core/stop-hooks.d.ts +18 -0
- package/dist/core/stop-hooks.d.ts.map +1 -0
- package/dist/core/stop-hooks.js +18 -0
- package/dist/core/stop-hooks.js.map +1 -0
- package/dist/core/stream-emitter.d.ts +24 -0
- package/dist/core/stream-emitter.d.ts.map +1 -0
- package/dist/core/stream-emitter.js +65 -0
- package/dist/core/stream-emitter.js.map +1 -0
- package/dist/core/streaming-tool-executor.d.ts +54 -0
- package/dist/core/streaming-tool-executor.d.ts.map +1 -0
- package/dist/core/streaming-tool-executor.js +164 -0
- package/dist/core/streaming-tool-executor.js.map +1 -0
- package/dist/core/turn-end-hooks.d.ts +39 -0
- package/dist/core/turn-end-hooks.d.ts.map +1 -0
- package/dist/core/turn-end-hooks.js +36 -0
- package/dist/core/turn-end-hooks.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chunking.d.ts +9 -0
- package/dist/knowledge/chunking.d.ts.map +1 -0
- package/dist/knowledge/chunking.js +49 -0
- package/dist/knowledge/chunking.js.map +1 -0
- package/dist/knowledge/embedding-service.d.ts +16 -0
- package/dist/knowledge/embedding-service.d.ts.map +1 -0
- package/dist/knowledge/embedding-service.js +43 -0
- package/dist/knowledge/embedding-service.js.map +1 -0
- package/dist/knowledge/knowledge-manager.d.ts +33 -0
- package/dist/knowledge/knowledge-manager.d.ts.map +1 -0
- package/dist/knowledge/knowledge-manager.js +62 -0
- package/dist/knowledge/knowledge-manager.js.map +1 -0
- package/dist/knowledge/sqlite-vector-store.d.ts +16 -0
- package/dist/knowledge/sqlite-vector-store.d.ts.map +1 -0
- package/dist/knowledge/sqlite-vector-store.js +56 -0
- package/dist/knowledge/sqlite-vector-store.js.map +1 -0
- package/dist/knowledge/vector-store.d.ts +2 -0
- package/dist/knowledge/vector-store.d.ts.map +1 -0
- package/dist/knowledge/vector-store.js +2 -0
- package/dist/knowledge/vector-store.js.map +1 -0
- package/dist/llm/errors.d.ts +15 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +39 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/message-types.d.ts +80 -0
- package/dist/llm/message-types.d.ts.map +1 -0
- package/dist/llm/message-types.js +2 -0
- package/dist/llm/message-types.js.map +1 -0
- package/dist/llm/openrouter-client.d.ts +18 -0
- package/dist/llm/openrouter-client.d.ts.map +1 -0
- package/dist/llm/openrouter-client.js +215 -0
- package/dist/llm/openrouter-client.js.map +1 -0
- package/dist/llm/reasoning.d.ts +10 -0
- package/dist/llm/reasoning.d.ts.map +1 -0
- package/dist/llm/reasoning.js +18 -0
- package/dist/llm/reasoning.js.map +1 -0
- package/dist/memory/file-memory-system.d.ts +98 -0
- package/dist/memory/file-memory-system.d.ts.map +1 -0
- package/dist/memory/file-memory-system.js +310 -0
- package/dist/memory/file-memory-system.js.map +1 -0
- package/dist/memory/memory-age.d.ts +22 -0
- package/dist/memory/memory-age.d.ts.map +1 -0
- package/dist/memory/memory-age.js +44 -0
- package/dist/memory/memory-age.js.map +1 -0
- package/dist/memory/memory-extractor.d.ts +56 -0
- package/dist/memory/memory-extractor.d.ts.map +1 -0
- package/dist/memory/memory-extractor.js +91 -0
- package/dist/memory/memory-extractor.js.map +1 -0
- package/dist/memory/memory-paths.d.ts +45 -0
- package/dist/memory/memory-paths.d.ts.map +1 -0
- package/dist/memory/memory-paths.js +121 -0
- package/dist/memory/memory-paths.js.map +1 -0
- package/dist/memory/memory-prompts.d.ts +41 -0
- package/dist/memory/memory-prompts.d.ts.map +1 -0
- package/dist/memory/memory-prompts.js +279 -0
- package/dist/memory/memory-prompts.js.map +1 -0
- package/dist/memory/memory-relevance.d.ts +16 -0
- package/dist/memory/memory-relevance.d.ts.map +1 -0
- package/dist/memory/memory-relevance.js +46 -0
- package/dist/memory/memory-relevance.js.map +1 -0
- package/dist/memory/memory-scanner.d.ts +22 -0
- package/dist/memory/memory-scanner.d.ts.map +1 -0
- package/dist/memory/memory-scanner.js +99 -0
- package/dist/memory/memory-scanner.js.map +1 -0
- package/dist/memory/memory-tools.d.ts +16 -0
- package/dist/memory/memory-tools.d.ts.map +1 -0
- package/dist/memory/memory-tools.js +196 -0
- package/dist/memory/memory-tools.js.map +1 -0
- package/dist/memory/memory-types.d.ts +47 -0
- package/dist/memory/memory-types.d.ts.map +1 -0
- package/dist/memory/memory-types.js +24 -0
- package/dist/memory/memory-types.js.map +1 -0
- package/dist/skills/skill-args.d.ts +23 -0
- package/dist/skills/skill-args.d.ts.map +1 -0
- package/dist/skills/skill-args.js +77 -0
- package/dist/skills/skill-args.js.map +1 -0
- package/dist/skills/skill-glob.d.ts +24 -0
- package/dist/skills/skill-glob.d.ts.map +1 -0
- package/dist/skills/skill-glob.js +60 -0
- package/dist/skills/skill-glob.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +49 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +197 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-manager.d.ts +83 -0
- package/dist/skills/skill-manager.d.ts.map +1 -0
- package/dist/skills/skill-manager.js +338 -0
- package/dist/skills/skill-manager.js.map +1 -0
- package/dist/storage/sqlite-conversation-store.d.ts +15 -0
- package/dist/storage/sqlite-conversation-store.d.ts.map +1 -0
- package/dist/storage/sqlite-conversation-store.js +45 -0
- package/dist/storage/sqlite-conversation-store.js.map +1 -0
- package/dist/storage/sqlite-database.d.ts +14 -0
- package/dist/storage/sqlite-database.d.ts.map +1 -0
- package/dist/storage/sqlite-database.js +95 -0
- package/dist/storage/sqlite-database.js.map +1 -0
- package/dist/tools/builtin/ask-user.d.ts +7 -0
- package/dist/tools/builtin/ask-user.d.ts.map +1 -0
- package/dist/tools/builtin/ask-user.js +23 -0
- package/dist/tools/builtin/ask-user.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 +54 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/file-edit.d.ts +3 -0
- package/dist/tools/builtin/file-edit.d.ts.map +1 -0
- package/dist/tools/builtin/file-edit.js +50 -0
- package/dist/tools/builtin/file-edit.js.map +1 -0
- package/dist/tools/builtin/file-read.d.ts +3 -0
- package/dist/tools/builtin/file-read.d.ts.map +1 -0
- package/dist/tools/builtin/file-read.js +47 -0
- package/dist/tools/builtin/file-read.js.map +1 -0
- package/dist/tools/builtin/file-write.d.ts +3 -0
- package/dist/tools/builtin/file-write.d.ts.map +1 -0
- package/dist/tools/builtin/file-write.js +29 -0
- package/dist/tools/builtin/file-write.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +3 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +67 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +3 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +94 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/index.d.ts +49 -0
- package/dist/tools/builtin/index.d.ts.map +1 -0
- package/dist/tools/builtin/index.js +65 -0
- package/dist/tools/builtin/index.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 +56 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/json-schema-to-zod.d.ts +30 -0
- package/dist/tools/json-schema-to-zod.d.ts.map +1 -0
- package/dist/tools/json-schema-to-zod.js +123 -0
- package/dist/tools/json-schema-to-zod.js.map +1 -0
- package/dist/tools/mcp-adapter.d.ts +80 -0
- package/dist/tools/mcp-adapter.d.ts.map +1 -0
- package/dist/tools/mcp-adapter.js +326 -0
- package/dist/tools/mcp-adapter.js.map +1 -0
- package/dist/tools/skill-tool.d.ts +41 -0
- package/dist/tools/skill-tool.d.ts.map +1 -0
- package/dist/tools/skill-tool.js +149 -0
- package/dist/tools/skill-tool.js.map +1 -0
- package/dist/tools/sql/index.d.ts +4 -0
- package/dist/tools/sql/index.d.ts.map +1 -0
- package/dist/tools/sql/index.js +2 -0
- package/dist/tools/sql/index.js.map +1 -0
- package/dist/tools/sql/sql-query-def.d.ts +22 -0
- package/dist/tools/sql/sql-query-def.d.ts.map +1 -0
- package/dist/tools/sql/sql-query-def.js +2 -0
- package/dist/tools/sql/sql-query-def.js.map +1 -0
- package/dist/tools/sql/sql-tool-factory.d.ts +28 -0
- package/dist/tools/sql/sql-tool-factory.d.ts.map +1 -0
- package/dist/tools/sql/sql-tool-factory.js +136 -0
- package/dist/tools/sql/sql-tool-factory.js.map +1 -0
- package/dist/tools/tool-executor.d.ts +67 -0
- package/dist/tools/tool-executor.d.ts.map +1 -0
- package/dist/tools/tool-executor.js +232 -0
- package/dist/tools/tool-executor.js.map +1 -0
- package/dist/utils/cache.d.ts +22 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +61 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +46 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/model-context.d.ts +14 -0
- package/dist/utils/model-context.d.ts.map +1 -0
- package/dist/utils/model-context.js +52 -0
- package/dist/utils/model-context.js.map +1 -0
- package/dist/utils/retry.d.ts +13 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +41 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/token-counter.d.ts +6 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +19 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based skill loader — scans directories for SKILL.md files.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the memory-scanner pattern: read .md files with YAML frontmatter,
|
|
5
|
+
* parse metadata, return typed AgentSkill objects.
|
|
6
|
+
*
|
|
7
|
+
* Supported directory layouts:
|
|
8
|
+
* skillsDir/skill-name/SKILL.md (preferred — each skill in its own folder)
|
|
9
|
+
* skillsDir/skill-name.md (flat — single file per skill)
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentSkill } from '../contracts/entities/agent-skill.js';
|
|
12
|
+
export interface SkillFrontmatter {
|
|
13
|
+
name?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
whenToUse?: string;
|
|
16
|
+
triggerPrefix?: string;
|
|
17
|
+
aliases?: string[];
|
|
18
|
+
argNames?: string[];
|
|
19
|
+
allowedTools?: string[];
|
|
20
|
+
model?: string;
|
|
21
|
+
context?: 'inline';
|
|
22
|
+
paths?: string[];
|
|
23
|
+
effort?: number;
|
|
24
|
+
exclusive?: boolean;
|
|
25
|
+
priority?: number;
|
|
26
|
+
modelInvocable?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse YAML-like frontmatter from markdown content.
|
|
30
|
+
* Only handles simple key: value and key: [array] — no nested objects.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseSkillFrontmatter(content: string): SkillFrontmatter;
|
|
33
|
+
/**
|
|
34
|
+
* Extract body content (after frontmatter).
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractBody(content: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Load a single SKILL.md file into an AgentSkill.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadSkillFile(filePath: string): Promise<AgentSkill | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Scan a directory for skill files and return AgentSkill objects.
|
|
43
|
+
*
|
|
44
|
+
* Supports two layouts:
|
|
45
|
+
* dir/skill-name/SKILL.md (subdirectory per skill)
|
|
46
|
+
* dir/skill-name.md (flat file per skill)
|
|
47
|
+
*/
|
|
48
|
+
export declare function scanSkillFiles(dir: string): Promise<AgentSkill[]>;
|
|
49
|
+
//# sourceMappingURL=skill-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAUvE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAqDvE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGnD;AAMD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAkDhF;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA+BvE"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based skill loader — scans directories for SKILL.md files.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the memory-scanner pattern: read .md files with YAML frontmatter,
|
|
5
|
+
* parse metadata, return typed AgentSkill objects.
|
|
6
|
+
*
|
|
7
|
+
* Supported directory layouts:
|
|
8
|
+
* skillsDir/skill-name/SKILL.md (preferred — each skill in its own folder)
|
|
9
|
+
* skillsDir/skill-name.md (flat — single file per skill)
|
|
10
|
+
*/
|
|
11
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
12
|
+
import { join, basename, dirname } from 'node:path';
|
|
13
|
+
import { substituteArgs } from './skill-args.js';
|
|
14
|
+
const SKILL_FILENAME = 'SKILL.md';
|
|
15
|
+
const FRONTMATTER_MAX_LINES = 40;
|
|
16
|
+
/**
|
|
17
|
+
* Parse YAML-like frontmatter from markdown content.
|
|
18
|
+
* Only handles simple key: value and key: [array] — no nested objects.
|
|
19
|
+
*/
|
|
20
|
+
export function parseSkillFrontmatter(content) {
|
|
21
|
+
const match = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
22
|
+
if (!match)
|
|
23
|
+
return {};
|
|
24
|
+
const yaml = match[1];
|
|
25
|
+
const result = {};
|
|
26
|
+
for (const line of yaml.split('\n').slice(0, FRONTMATTER_MAX_LINES)) {
|
|
27
|
+
const kv = line.match(/^(\w[\w-]*):\s*(.*)/);
|
|
28
|
+
if (!kv)
|
|
29
|
+
continue;
|
|
30
|
+
const key = kv[1];
|
|
31
|
+
let value = kv[2].trim();
|
|
32
|
+
// Parse inline arrays: [a, b, c]
|
|
33
|
+
if (typeof value === 'string' && value.startsWith('[') && value.endsWith(']')) {
|
|
34
|
+
value = value.slice(1, -1).split(',').map(s => s.trim().replace(/^["']|["']$/g, ''));
|
|
35
|
+
}
|
|
36
|
+
// Parse booleans
|
|
37
|
+
else if (value === 'true')
|
|
38
|
+
value = true;
|
|
39
|
+
else if (value === 'false')
|
|
40
|
+
value = false;
|
|
41
|
+
// Parse numbers
|
|
42
|
+
else if (typeof value === 'string' && /^\d+$/.test(value))
|
|
43
|
+
value = parseInt(value, 10);
|
|
44
|
+
// Unquote strings
|
|
45
|
+
else if (typeof value === 'string')
|
|
46
|
+
value = value.replace(/^["']|["']$/g, '');
|
|
47
|
+
result[key] = value;
|
|
48
|
+
}
|
|
49
|
+
// Normalize kebab-case keys to camelCase
|
|
50
|
+
const fm = {};
|
|
51
|
+
fm.name = str(result['name']);
|
|
52
|
+
fm.description = str(result['description']);
|
|
53
|
+
fm.whenToUse = str(result['whenToUse'] ?? result['when-to-use'] ?? result['when_to_use']);
|
|
54
|
+
fm.triggerPrefix = str(result['triggerPrefix'] ?? result['trigger-prefix']);
|
|
55
|
+
fm.aliases = arr(result['aliases']);
|
|
56
|
+
fm.argNames = arr(result['argNames'] ?? result['arg-names'] ?? result['arguments']);
|
|
57
|
+
fm.allowedTools = arr(result['allowedTools'] ?? result['allowed-tools']);
|
|
58
|
+
fm.model = str(result['model']);
|
|
59
|
+
fm.paths = arr(result['paths']);
|
|
60
|
+
fm.effort = typeof result['effort'] === 'number' ? result['effort'] : undefined;
|
|
61
|
+
fm.exclusive = typeof result['exclusive'] === 'boolean' ? result['exclusive'] : undefined;
|
|
62
|
+
fm.priority = typeof result['priority'] === 'number' ? result['priority'] : undefined;
|
|
63
|
+
fm.modelInvocable = typeof result['modelInvocable'] === 'boolean'
|
|
64
|
+
? result['modelInvocable']
|
|
65
|
+
: typeof result['model-invocable'] === 'boolean'
|
|
66
|
+
? result['model-invocable']
|
|
67
|
+
: undefined;
|
|
68
|
+
const ctx = str(result['context']);
|
|
69
|
+
if (ctx === 'inline')
|
|
70
|
+
fm.context = ctx;
|
|
71
|
+
return fm;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Extract body content (after frontmatter).
|
|
75
|
+
*/
|
|
76
|
+
export function extractBody(content) {
|
|
77
|
+
const match = content.match(/^---\s*\n[\s\S]*?\n---\s*\n?([\s\S]*)/);
|
|
78
|
+
return match?.[1]?.trim() ?? content.trim();
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Skill file loading
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Load a single SKILL.md file into an AgentSkill.
|
|
85
|
+
*/
|
|
86
|
+
export async function loadSkillFile(filePath) {
|
|
87
|
+
try {
|
|
88
|
+
const content = await readFile(filePath, 'utf-8');
|
|
89
|
+
const fm = parseSkillFrontmatter(content);
|
|
90
|
+
const body = extractBody(content);
|
|
91
|
+
if (!body && !fm.description)
|
|
92
|
+
return null;
|
|
93
|
+
const skillDir = dirname(filePath);
|
|
94
|
+
const fallbackName = basename(skillDir);
|
|
95
|
+
const name = fm.name || fallbackName;
|
|
96
|
+
const skill = {
|
|
97
|
+
name,
|
|
98
|
+
description: fm.description || name,
|
|
99
|
+
instructions: body,
|
|
100
|
+
source: 'directory',
|
|
101
|
+
skillDir,
|
|
102
|
+
};
|
|
103
|
+
// Apply optional frontmatter fields
|
|
104
|
+
if (fm.whenToUse)
|
|
105
|
+
skill.whenToUse = fm.whenToUse;
|
|
106
|
+
if (fm.triggerPrefix)
|
|
107
|
+
skill.triggerPrefix = fm.triggerPrefix;
|
|
108
|
+
if (fm.aliases)
|
|
109
|
+
skill.aliases = fm.aliases;
|
|
110
|
+
if (fm.argNames)
|
|
111
|
+
skill.argNames = fm.argNames;
|
|
112
|
+
if (fm.allowedTools)
|
|
113
|
+
skill.allowedTools = fm.allowedTools;
|
|
114
|
+
if (fm.model)
|
|
115
|
+
skill.model = fm.model;
|
|
116
|
+
if (fm.context)
|
|
117
|
+
skill.context = fm.context;
|
|
118
|
+
if (fm.paths)
|
|
119
|
+
skill.paths = fm.paths;
|
|
120
|
+
if (fm.effort !== undefined)
|
|
121
|
+
skill.effort = fm.effort;
|
|
122
|
+
if (fm.exclusive !== undefined)
|
|
123
|
+
skill.exclusive = fm.exclusive;
|
|
124
|
+
if (fm.priority !== undefined)
|
|
125
|
+
skill.priority = fm.priority;
|
|
126
|
+
if (fm.modelInvocable !== undefined)
|
|
127
|
+
skill.modelInvocable = fm.modelInvocable;
|
|
128
|
+
// If skill has argNames, wrap instructions in a getPrompt that does substitution
|
|
129
|
+
if (fm.argNames && fm.argNames.length > 0) {
|
|
130
|
+
const argNames = fm.argNames;
|
|
131
|
+
skill.getPrompt = (args, ctx) => {
|
|
132
|
+
return substituteArgs(body, args, argNames, {
|
|
133
|
+
SKILL_DIR: ctx.skillDir ?? skillDir,
|
|
134
|
+
THREAD_ID: ctx.threadId,
|
|
135
|
+
TRACE_ID: ctx.traceId,
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return skill;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Scan a directory for skill files and return AgentSkill objects.
|
|
147
|
+
*
|
|
148
|
+
* Supports two layouts:
|
|
149
|
+
* dir/skill-name/SKILL.md (subdirectory per skill)
|
|
150
|
+
* dir/skill-name.md (flat file per skill)
|
|
151
|
+
*/
|
|
152
|
+
export async function scanSkillFiles(dir) {
|
|
153
|
+
const skills = [];
|
|
154
|
+
try {
|
|
155
|
+
const entries = await readdir(dir);
|
|
156
|
+
for (const entry of entries) {
|
|
157
|
+
const entryPath = join(dir, entry);
|
|
158
|
+
try {
|
|
159
|
+
const entryStat = await stat(entryPath);
|
|
160
|
+
if (entryStat.isDirectory()) {
|
|
161
|
+
// Subdirectory layout: skill-name/SKILL.md
|
|
162
|
+
const skillFile = join(entryPath, SKILL_FILENAME);
|
|
163
|
+
const skill = await loadSkillFile(skillFile);
|
|
164
|
+
if (skill)
|
|
165
|
+
skills.push(skill);
|
|
166
|
+
}
|
|
167
|
+
else if (entry.endsWith('.md') && entry !== 'README.md') {
|
|
168
|
+
// Flat layout: skill-name.md
|
|
169
|
+
const skill = await loadSkillFile(entryPath);
|
|
170
|
+
if (skill)
|
|
171
|
+
skills.push(skill);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Skip entries that can't be read
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Directory doesn't exist or can't be read
|
|
181
|
+
}
|
|
182
|
+
return skills;
|
|
183
|
+
}
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
// Helpers
|
|
186
|
+
// ---------------------------------------------------------------------------
|
|
187
|
+
function str(v) {
|
|
188
|
+
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
189
|
+
}
|
|
190
|
+
function arr(v) {
|
|
191
|
+
if (Array.isArray(v))
|
|
192
|
+
return v.filter(x => typeof x === 'string');
|
|
193
|
+
if (typeof v === 'string')
|
|
194
|
+
return v.split(/\s+/).filter(Boolean);
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=skill-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { AgentSkill, SkillPromptContext } from '../contracts/entities/agent-skill.js';
|
|
2
|
+
import type { EmbeddingService } from '../knowledge/embedding-service.js';
|
|
3
|
+
export interface SkillMatchResult {
|
|
4
|
+
skill: AgentSkill;
|
|
5
|
+
matchType: 'prefix' | 'alias' | 'custom' | 'semantic' | 'sticky';
|
|
6
|
+
score: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Registers skills, matches them against user input, manages conditional
|
|
10
|
+
* activation, and provides budget-aware skill listings for model discovery.
|
|
11
|
+
*
|
|
12
|
+
* Matching hierarchy: prefix > alias > custom match() > semantic similarity.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SkillManager {
|
|
15
|
+
/** All registered skills (unconditional — always eligible for matching) */
|
|
16
|
+
private readonly skills;
|
|
17
|
+
/** Skills with `paths` — waiting for file touch to activate */
|
|
18
|
+
private readonly conditionalSkills;
|
|
19
|
+
/** Skills activated via path matching (moved from conditionalSkills) */
|
|
20
|
+
private readonly activatedSkills;
|
|
21
|
+
/** Tracks which skills have been invoked in this session */
|
|
22
|
+
private readonly invokedSkills;
|
|
23
|
+
/** Sticky skill sessions per thread — outer key: threadId, inner key: skillName */
|
|
24
|
+
private readonly stickySessions;
|
|
25
|
+
private readonly embeddingService?;
|
|
26
|
+
private readonly maxActiveSkills;
|
|
27
|
+
constructor(options?: {
|
|
28
|
+
embeddingService?: EmbeddingService;
|
|
29
|
+
maxActiveSkills?: number;
|
|
30
|
+
});
|
|
31
|
+
register(skill: AgentSkill): void;
|
|
32
|
+
unregister(name: string): boolean;
|
|
33
|
+
/** All skills (unconditional + activated conditional) */
|
|
34
|
+
listSkills(): AgentSkill[];
|
|
35
|
+
/** All skills including pending conditional ones */
|
|
36
|
+
listAllSkills(): AgentSkill[];
|
|
37
|
+
/**
|
|
38
|
+
* Load skills from a directory containing SKILL.md files.
|
|
39
|
+
* Returns the number of skills loaded.
|
|
40
|
+
*/
|
|
41
|
+
loadFromDirectory(dir: string): Promise<number>;
|
|
42
|
+
/**
|
|
43
|
+
* Activate conditional skills whose `paths` match any of the given file paths.
|
|
44
|
+
* Returns the names of newly activated skills.
|
|
45
|
+
*/
|
|
46
|
+
activateForPaths(filePaths: string[]): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Matches skills against input. Returns top skills sorted by priority.
|
|
49
|
+
*/
|
|
50
|
+
match(input: string, context: {
|
|
51
|
+
threadId: string;
|
|
52
|
+
}): Promise<AgentSkill[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the final instructions for a matched skill.
|
|
55
|
+
* If `getPrompt` exists, calls it with args and context.
|
|
56
|
+
* Otherwise uses static `instructions` with argument substitution.
|
|
57
|
+
*/
|
|
58
|
+
resolveInstructions(skill: AgentSkill, args: string, context: SkillPromptContext): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Build a formatted listing of available skills for model context.
|
|
61
|
+
* Truncates to fit within the given character budget.
|
|
62
|
+
*/
|
|
63
|
+
buildSkillListing(budgetChars: number): string;
|
|
64
|
+
markInvoked(name: string): void;
|
|
65
|
+
getInvokedSkills(): string[];
|
|
66
|
+
/** Remove a single sticky skill from a thread */
|
|
67
|
+
clearStickySkill(threadId: string, skillName: string): void;
|
|
68
|
+
/** Remove all sticky skills for a thread (e.g. on clearHistory) */
|
|
69
|
+
clearStickySkills(threadId: string): void;
|
|
70
|
+
/** Remove all sticky sessions across all threads (e.g. on destroy) */
|
|
71
|
+
clearAllStickySessions(): void;
|
|
72
|
+
private activateStickySession;
|
|
73
|
+
private decrementStickySessions;
|
|
74
|
+
/** Get all skills eligible for matching (unconditional + activated) */
|
|
75
|
+
private getEligibleSkills;
|
|
76
|
+
/**
|
|
77
|
+
* Returns true if any eligible skill lacks both triggerPrefix, aliases, and match(),
|
|
78
|
+
* meaning it can only be activated via semantic matching.
|
|
79
|
+
*/
|
|
80
|
+
private hasSkillsNeedingSemantic;
|
|
81
|
+
private semanticMatch;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=skill-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manager.d.ts","sourceRoot":"","sources":["../../src/skills/skill-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAK1E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjE,KAAK,EAAE,MAAM,CAAC;CACf;AAWD;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;IACnE,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiC;IACjE,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,mFAAmF;IACnF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiD;IAEhF,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;IASvF,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQjC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAMjC,yDAAyD;IACzD,UAAU,IAAI,UAAU,EAAE;IAI1B,oDAAoD;IACpD,aAAa,IAAI,UAAU,EAAE;IAY7B;;;OAGG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYrD;;;OAGG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAoB/C;;OAEG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA+FhF;;;;OAIG;IACG,mBAAmB,CACvB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC;IAqBlB;;;OAGG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAoC9C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,gBAAgB,IAAI,MAAM,EAAE;IAQ5B,iDAAiD;IACjD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI3D,mEAAmE;IACnE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIzC,sEAAsE;IACtE,sBAAsB,IAAI,IAAI;IAQ9B,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,uBAAuB;IAU/B,uEAAuE;IACvE,OAAO,CAAC,iBAAiB;IAazB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;YAIlB,aAAa;CA0B5B"}
|