@xandout/libra-harness 0.1.8
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 +21 -0
- package/README.md +486 -0
- package/dist/agent.d.ts +174 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +575 -0
- package/dist/agent.js.map +1 -0
- package/dist/ai-sdk-model.d.ts +26 -0
- package/dist/ai-sdk-model.d.ts.map +1 -0
- package/dist/ai-sdk-model.js +260 -0
- package/dist/ai-sdk-model.js.map +1 -0
- package/dist/context.d.ts +75 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/errors.d.ts +33 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/extension.d.ts +63 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +2 -0
- package/dist/extension.js.map +1 -0
- package/dist/extras/extension-loader.d.ts +205 -0
- package/dist/extras/extension-loader.d.ts.map +1 -0
- package/dist/extras/extension-loader.js +315 -0
- package/dist/extras/extension-loader.js.map +1 -0
- package/dist/extras/extensions/auto-steer/extension.d.ts +46 -0
- package/dist/extras/extensions/auto-steer/extension.d.ts.map +1 -0
- package/dist/extras/extensions/auto-steer/extension.js +52 -0
- package/dist/extras/extensions/auto-steer/extension.js.map +1 -0
- package/dist/extras/extensions/auto-steer/extension.json +7 -0
- package/dist/extras/extensions/auto-steer/index.d.ts +3 -0
- package/dist/extras/extensions/auto-steer/index.d.ts.map +1 -0
- package/dist/extras/extensions/auto-steer/index.js +2 -0
- package/dist/extras/extensions/auto-steer/index.js.map +1 -0
- package/dist/extras/extensions/disk-session/extension.d.ts +167 -0
- package/dist/extras/extensions/disk-session/extension.d.ts.map +1 -0
- package/dist/extras/extensions/disk-session/extension.js +492 -0
- package/dist/extras/extensions/disk-session/extension.js.map +1 -0
- package/dist/extras/extensions/disk-session/extension.json +6 -0
- package/dist/extras/extensions/disk-session/extension.test.d.ts +2 -0
- package/dist/extras/extensions/disk-session/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/disk-session/extension.test.js +672 -0
- package/dist/extras/extensions/disk-session/extension.test.js.map +1 -0
- package/dist/extras/extensions/disk-session/index.d.ts +3 -0
- package/dist/extras/extensions/disk-session/index.d.ts.map +1 -0
- package/dist/extras/extensions/disk-session/index.js +2 -0
- package/dist/extras/extensions/disk-session/index.js.map +1 -0
- package/dist/extras/extensions/emoji/extension.d.ts +20 -0
- package/dist/extras/extensions/emoji/extension.d.ts.map +1 -0
- package/dist/extras/extensions/emoji/extension.js +22 -0
- package/dist/extras/extensions/emoji/extension.js.map +1 -0
- package/dist/extras/extensions/emoji/extension.json +7 -0
- package/dist/extras/extensions/emoji/index.d.ts +3 -0
- package/dist/extras/extensions/emoji/index.d.ts.map +1 -0
- package/dist/extras/extensions/emoji/index.js +2 -0
- package/dist/extras/extensions/emoji/index.js.map +1 -0
- package/dist/extras/extensions/filesystem/extension.d.ts +53 -0
- package/dist/extras/extensions/filesystem/extension.d.ts.map +1 -0
- package/dist/extras/extensions/filesystem/extension.js +350 -0
- package/dist/extras/extensions/filesystem/extension.js.map +1 -0
- package/dist/extras/extensions/filesystem/extension.json +6 -0
- package/dist/extras/extensions/filesystem/extension.test.d.ts +2 -0
- package/dist/extras/extensions/filesystem/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/filesystem/extension.test.js +387 -0
- package/dist/extras/extensions/filesystem/extension.test.js.map +1 -0
- package/dist/extras/extensions/filesystem/index.d.ts +2 -0
- package/dist/extras/extensions/filesystem/index.d.ts.map +1 -0
- package/dist/extras/extensions/filesystem/index.js +2 -0
- package/dist/extras/extensions/filesystem/index.js.map +1 -0
- package/dist/extras/extensions/keyword-extractor/extension.d.ts +53 -0
- package/dist/extras/extensions/keyword-extractor/extension.d.ts.map +1 -0
- package/dist/extras/extensions/keyword-extractor/extension.js +61 -0
- package/dist/extras/extensions/keyword-extractor/extension.js.map +1 -0
- package/dist/extras/extensions/keyword-extractor/extension.json +6 -0
- package/dist/extras/extensions/keyword-extractor/extension.test.d.ts +2 -0
- package/dist/extras/extensions/keyword-extractor/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/keyword-extractor/extension.test.js +105 -0
- package/dist/extras/extensions/keyword-extractor/extension.test.js.map +1 -0
- package/dist/extras/extensions/keyword-extractor/index.d.ts +5 -0
- package/dist/extras/extensions/keyword-extractor/index.d.ts.map +1 -0
- package/dist/extras/extensions/keyword-extractor/index.js +3 -0
- package/dist/extras/extensions/keyword-extractor/index.js.map +1 -0
- package/dist/extras/extensions/keyword-extractor/nlp.d.ts +68 -0
- package/dist/extras/extensions/keyword-extractor/nlp.d.ts.map +1 -0
- package/dist/extras/extensions/keyword-extractor/nlp.js +156 -0
- package/dist/extras/extensions/keyword-extractor/nlp.js.map +1 -0
- package/dist/extras/extensions/keyword-extractor/nlp.test.d.ts +2 -0
- package/dist/extras/extensions/keyword-extractor/nlp.test.d.ts.map +1 -0
- package/dist/extras/extensions/keyword-extractor/nlp.test.js +176 -0
- package/dist/extras/extensions/keyword-extractor/nlp.test.js.map +1 -0
- package/dist/extras/extensions/logger/extension.d.ts +52 -0
- package/dist/extras/extensions/logger/extension.d.ts.map +1 -0
- package/dist/extras/extensions/logger/extension.js +68 -0
- package/dist/extras/extensions/logger/extension.js.map +1 -0
- package/dist/extras/extensions/logger/extension.json +7 -0
- package/dist/extras/extensions/logger/index.d.ts +3 -0
- package/dist/extras/extensions/logger/index.d.ts.map +1 -0
- package/dist/extras/extensions/logger/index.js +2 -0
- package/dist/extras/extensions/logger/index.js.map +1 -0
- package/dist/extras/extensions/mcp/extension.d.ts +63 -0
- package/dist/extras/extensions/mcp/extension.d.ts.map +1 -0
- package/dist/extras/extensions/mcp/extension.js +437 -0
- package/dist/extras/extensions/mcp/extension.js.map +1 -0
- package/dist/extras/extensions/mcp/extension.json +7 -0
- package/dist/extras/extensions/mcp/extension.test.d.ts +2 -0
- package/dist/extras/extensions/mcp/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/mcp/extension.test.js +286 -0
- package/dist/extras/extensions/mcp/extension.test.js.map +1 -0
- package/dist/extras/extensions/mcp/index.d.ts +3 -0
- package/dist/extras/extensions/mcp/index.d.ts.map +1 -0
- package/dist/extras/extensions/mcp/index.js +2 -0
- package/dist/extras/extensions/mcp/index.js.map +1 -0
- package/dist/extras/extensions/mem-session/extension.d.ts +24 -0
- package/dist/extras/extensions/mem-session/extension.d.ts.map +1 -0
- package/dist/extras/extensions/mem-session/extension.js +49 -0
- package/dist/extras/extensions/mem-session/extension.js.map +1 -0
- package/dist/extras/extensions/mem-session/extension.json +6 -0
- package/dist/extras/extensions/mem-session/index.d.ts +2 -0
- package/dist/extras/extensions/mem-session/index.d.ts.map +1 -0
- package/dist/extras/extensions/mem-session/index.js +2 -0
- package/dist/extras/extensions/mem-session/index.js.map +1 -0
- package/dist/extras/extensions/memory/extension.d.ts +54 -0
- package/dist/extras/extensions/memory/extension.d.ts.map +1 -0
- package/dist/extras/extensions/memory/extension.js +143 -0
- package/dist/extras/extensions/memory/extension.js.map +1 -0
- package/dist/extras/extensions/memory/extension.json +7 -0
- package/dist/extras/extensions/memory/index.d.ts +5 -0
- package/dist/extras/extensions/memory/index.d.ts.map +1 -0
- package/dist/extras/extensions/memory/index.js +3 -0
- package/dist/extras/extensions/memory/index.js.map +1 -0
- package/dist/extras/extensions/memory/llm-extractor.d.ts +42 -0
- package/dist/extras/extensions/memory/llm-extractor.d.ts.map +1 -0
- package/dist/extras/extensions/memory/llm-extractor.js +89 -0
- package/dist/extras/extensions/memory/llm-extractor.js.map +1 -0
- package/dist/extras/extensions/memory/types.d.ts +142 -0
- package/dist/extras/extensions/memory/types.d.ts.map +1 -0
- package/dist/extras/extensions/memory/types.js +2 -0
- package/dist/extras/extensions/memory/types.js.map +1 -0
- package/dist/extras/extensions/otel/extension.d.ts +57 -0
- package/dist/extras/extensions/otel/extension.d.ts.map +1 -0
- package/dist/extras/extensions/otel/extension.js +253 -0
- package/dist/extras/extensions/otel/extension.js.map +1 -0
- package/dist/extras/extensions/otel/extension.json +7 -0
- package/dist/extras/extensions/otel/extension.test.d.ts +2 -0
- package/dist/extras/extensions/otel/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/otel/extension.test.js +399 -0
- package/dist/extras/extensions/otel/extension.test.js.map +1 -0
- package/dist/extras/extensions/otel/index.d.ts +4 -0
- package/dist/extras/extensions/otel/index.d.ts.map +1 -0
- package/dist/extras/extensions/otel/index.js +3 -0
- package/dist/extras/extensions/otel/index.js.map +1 -0
- package/dist/extras/extensions/otel/jsonl-span-exporter.d.ts +60 -0
- package/dist/extras/extensions/otel/jsonl-span-exporter.d.ts.map +1 -0
- package/dist/extras/extensions/otel/jsonl-span-exporter.js +134 -0
- package/dist/extras/extensions/otel/jsonl-span-exporter.js.map +1 -0
- package/dist/extras/extensions/scripts/extension.d.ts +180 -0
- package/dist/extras/extensions/scripts/extension.d.ts.map +1 -0
- package/dist/extras/extensions/scripts/extension.js +618 -0
- package/dist/extras/extensions/scripts/extension.js.map +1 -0
- package/dist/extras/extensions/scripts/extension.json +7 -0
- package/dist/extras/extensions/scripts/extension.test.d.ts +2 -0
- package/dist/extras/extensions/scripts/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/scripts/extension.test.js +552 -0
- package/dist/extras/extensions/scripts/extension.test.js.map +1 -0
- package/dist/extras/extensions/scripts/index.d.ts +3 -0
- package/dist/extras/extensions/scripts/index.d.ts.map +1 -0
- package/dist/extras/extensions/scripts/index.js +2 -0
- package/dist/extras/extensions/scripts/index.js.map +1 -0
- package/dist/extras/extensions/skills/extension.d.ts +105 -0
- package/dist/extras/extensions/skills/extension.d.ts.map +1 -0
- package/dist/extras/extensions/skills/extension.js +419 -0
- package/dist/extras/extensions/skills/extension.js.map +1 -0
- package/dist/extras/extensions/skills/extension.json +7 -0
- package/dist/extras/extensions/skills/extension.test.d.ts +2 -0
- package/dist/extras/extensions/skills/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/skills/extension.test.js +184 -0
- package/dist/extras/extensions/skills/extension.test.js.map +1 -0
- package/dist/extras/extensions/skills/index.d.ts +4 -0
- package/dist/extras/extensions/skills/index.d.ts.map +1 -0
- package/dist/extras/extensions/skills/index.js +3 -0
- package/dist/extras/extensions/skills/index.js.map +1 -0
- package/dist/extras/extensions/streaming/extension.d.ts +15 -0
- package/dist/extras/extensions/streaming/extension.d.ts.map +1 -0
- package/dist/extras/extensions/streaming/extension.js +41 -0
- package/dist/extras/extensions/streaming/extension.js.map +1 -0
- package/dist/extras/extensions/streaming/extension.json +6 -0
- package/dist/extras/extensions/streaming/index.d.ts +2 -0
- package/dist/extras/extensions/streaming/index.d.ts.map +1 -0
- package/dist/extras/extensions/streaming/index.js +2 -0
- package/dist/extras/extensions/streaming/index.js.map +1 -0
- package/dist/extras/extensions/structured-output/extension.d.ts +11 -0
- package/dist/extras/extensions/structured-output/extension.d.ts.map +1 -0
- package/dist/extras/extensions/structured-output/extension.js +102 -0
- package/dist/extras/extensions/structured-output/extension.js.map +1 -0
- package/dist/extras/extensions/structured-output/extension.json +7 -0
- package/dist/extras/extensions/structured-output/index.d.ts +3 -0
- package/dist/extras/extensions/structured-output/index.d.ts.map +1 -0
- package/dist/extras/extensions/structured-output/index.js +2 -0
- package/dist/extras/extensions/structured-output/index.js.map +1 -0
- package/dist/extras/extensions/timestamp/extension.d.ts +11 -0
- package/dist/extras/extensions/timestamp/extension.d.ts.map +1 -0
- package/dist/extras/extensions/timestamp/extension.js +21 -0
- package/dist/extras/extensions/timestamp/extension.js.map +1 -0
- package/dist/extras/extensions/timestamp/extension.json +6 -0
- package/dist/extras/extensions/timestamp/index.d.ts +2 -0
- package/dist/extras/extensions/timestamp/index.d.ts.map +1 -0
- package/dist/extras/extensions/timestamp/index.js +2 -0
- package/dist/extras/extensions/timestamp/index.js.map +1 -0
- package/dist/extras/extensions/token-stats/extension.d.ts +50 -0
- package/dist/extras/extensions/token-stats/extension.d.ts.map +1 -0
- package/dist/extras/extensions/token-stats/extension.js +99 -0
- package/dist/extras/extensions/token-stats/extension.js.map +1 -0
- package/dist/extras/extensions/token-stats/extension.json +7 -0
- package/dist/extras/extensions/token-stats/extension.test.d.ts +2 -0
- package/dist/extras/extensions/token-stats/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/token-stats/extension.test.js +197 -0
- package/dist/extras/extensions/token-stats/extension.test.js.map +1 -0
- package/dist/extras/extensions/token-stats/index.d.ts +3 -0
- package/dist/extras/extensions/token-stats/index.d.ts.map +1 -0
- package/dist/extras/extensions/token-stats/index.js +2 -0
- package/dist/extras/extensions/token-stats/index.js.map +1 -0
- package/dist/extras/extensions/tool-buffer/extension.d.ts +89 -0
- package/dist/extras/extensions/tool-buffer/extension.d.ts.map +1 -0
- package/dist/extras/extensions/tool-buffer/extension.js +182 -0
- package/dist/extras/extensions/tool-buffer/extension.js.map +1 -0
- package/dist/extras/extensions/tool-buffer/extension.json +7 -0
- package/dist/extras/extensions/tool-buffer/extension.test.d.ts +2 -0
- package/dist/extras/extensions/tool-buffer/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/tool-buffer/extension.test.js +549 -0
- package/dist/extras/extensions/tool-buffer/extension.test.js.map +1 -0
- package/dist/extras/extensions/tool-buffer/index.d.ts +3 -0
- package/dist/extras/extensions/tool-buffer/index.d.ts.map +1 -0
- package/dist/extras/extensions/tool-buffer/index.js +2 -0
- package/dist/extras/extensions/tool-buffer/index.js.map +1 -0
- package/dist/extras/extensions/weather-tool/extension.d.ts +22 -0
- package/dist/extras/extensions/weather-tool/extension.d.ts.map +1 -0
- package/dist/extras/extensions/weather-tool/extension.js +33 -0
- package/dist/extras/extensions/weather-tool/extension.js.map +1 -0
- package/dist/extras/extensions/weather-tool/extension.json +7 -0
- package/dist/extras/extensions/weather-tool/index.d.ts +3 -0
- package/dist/extras/extensions/weather-tool/index.d.ts.map +1 -0
- package/dist/extras/extensions/weather-tool/index.js +2 -0
- package/dist/extras/extensions/weather-tool/index.js.map +1 -0
- package/dist/extras/models/ai-sdk-resolver.d.ts +15 -0
- package/dist/extras/models/ai-sdk-resolver.d.ts.map +1 -0
- package/dist/extras/models/ai-sdk-resolver.js +57 -0
- package/dist/extras/models/ai-sdk-resolver.js.map +1 -0
- package/dist/extras/models/index.d.ts +5 -0
- package/dist/extras/models/index.d.ts.map +1 -0
- package/dist/extras/models/index.js +3 -0
- package/dist/extras/models/index.js.map +1 -0
- package/dist/extras/models/routing-model.d.ts +18 -0
- package/dist/extras/models/routing-model.d.ts.map +1 -0
- package/dist/extras/models/routing-model.js +24 -0
- package/dist/extras/models/routing-model.js.map +1 -0
- package/dist/extras/openai-provider/index.d.ts +3 -0
- package/dist/extras/openai-provider/index.d.ts.map +1 -0
- package/dist/extras/openai-provider/index.js +2 -0
- package/dist/extras/openai-provider/index.js.map +1 -0
- package/dist/extras/openai-provider/server.d.ts +34 -0
- package/dist/extras/openai-provider/server.d.ts.map +1 -0
- package/dist/extras/openai-provider/server.js +335 -0
- package/dist/extras/openai-provider/server.js.map +1 -0
- package/dist/handle.d.ts +56 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +2 -0
- package/dist/handle.js.map +1 -0
- package/dist/hooks.d.ts +98 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +53 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +75 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +2 -0
- package/dist/model.js.map +1 -0
- package/dist/tool.d.ts +78 -0
- package/dist/tool.d.ts.map +1 -0
- package/dist/tool.js +78 -0
- package/dist/tool.js.map +1 -0
- package/dist/types.d.ts +83 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/package.json +178 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { Extension } from '../../../extension.js';
|
|
2
|
+
/**
|
|
3
|
+
* Skill metadata — loaded at startup for all skills (progressive disclosure
|
|
4
|
+
* level 1: ~100 tokens per skill).
|
|
5
|
+
*/
|
|
6
|
+
export interface SkillMeta {
|
|
7
|
+
/** Skill name (from frontmatter, must match directory name). */
|
|
8
|
+
name: string;
|
|
9
|
+
/** What the skill does and when to use it. */
|
|
10
|
+
description: string;
|
|
11
|
+
/** Optional license. */
|
|
12
|
+
license?: string;
|
|
13
|
+
/** Optional compatibility notes. */
|
|
14
|
+
compatibility?: string;
|
|
15
|
+
/** Optional arbitrary key-value metadata. */
|
|
16
|
+
metadata?: Record<string, string>;
|
|
17
|
+
/** Optional pre-approved tools. */
|
|
18
|
+
allowedTools?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* If true, the skill's content is appended to the system prompt at
|
|
21
|
+
* install time so it's always active without the agent calling
|
|
22
|
+
* use_skill. Set via `autoLoad: true` in SKILL.md frontmatter.
|
|
23
|
+
*/
|
|
24
|
+
autoLoad?: boolean;
|
|
25
|
+
/** Absolute path to the skill directory. */
|
|
26
|
+
dir: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A loaded skill — metadata plus the full SKILL.md body content
|
|
30
|
+
* (progressive disclosure level 2: loaded on activation).
|
|
31
|
+
*/
|
|
32
|
+
export interface Skill extends SkillMeta {
|
|
33
|
+
/** Full markdown body from SKILL.md (after frontmatter). */
|
|
34
|
+
content: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Load skill metadata from a directory containing skill subdirectories.
|
|
38
|
+
*
|
|
39
|
+
* Each subdirectory must contain a `SKILL.md` file with YAML frontmatter.
|
|
40
|
+
* Only metadata (name, description) is loaded at startup — the full body
|
|
41
|
+
* is loaded on demand when the skill is activated (progressive disclosure).
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* skills/
|
|
45
|
+
* code-review/
|
|
46
|
+
* SKILL.md
|
|
47
|
+
* references/
|
|
48
|
+
* scripts/
|
|
49
|
+
* summarize/
|
|
50
|
+
* SKILL.md
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadSkills(skillsDir: string): SkillMeta[];
|
|
53
|
+
/**
|
|
54
|
+
* Config for the skills extension.
|
|
55
|
+
*
|
|
56
|
+
* Passed by the extension loader from the host's config object.
|
|
57
|
+
* The key `skillsDirs` should be declared in extension.json's `configKeys`.
|
|
58
|
+
*/
|
|
59
|
+
export interface SkillsExtensionConfig {
|
|
60
|
+
/** One or more directories to scan for skills. */
|
|
61
|
+
skillsDirs?: string | string[];
|
|
62
|
+
/**
|
|
63
|
+
* Skill names to preload at startup. Preloaded skills have their full
|
|
64
|
+
* SKILL.md content injected into every turn via a `beforeContext` hook,
|
|
65
|
+
* so the agent has the instructions available immediately without
|
|
66
|
+
* needing to call `use_skill` first.
|
|
67
|
+
*
|
|
68
|
+
* Use this for skills that must always be active (e.g. behavior rules,
|
|
69
|
+
* platform conventions) rather than skills that are task-specific.
|
|
70
|
+
*/
|
|
71
|
+
preloadSkills?: string | string[];
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a skill loader extension following the Agent Skills specification.
|
|
75
|
+
*
|
|
76
|
+
* Receives config from the extension loader. The `skillsDirs` key (a path
|
|
77
|
+
* or array of paths) tells the extension where to find skill directories.
|
|
78
|
+
* If no `skillsDirs` is provided, the factory returns `undefined` (opts out).
|
|
79
|
+
*
|
|
80
|
+
* Implements progressive disclosure:
|
|
81
|
+
* 1. **Metadata** (~100 tokens/skill): name + description loaded at startup.
|
|
82
|
+
* 2. **Instructions** (<5000 tokens): full SKILL.md body loaded on activation.
|
|
83
|
+
* 3. **Resources** (as needed): files in scripts/, references/, assets/ loaded on demand.
|
|
84
|
+
*
|
|
85
|
+
* Registers four tools the LLM can call:
|
|
86
|
+
* - `list_skills` — returns available skill names and descriptions.
|
|
87
|
+
* - `use_skill` — loads a skill's full instructions into the conversation.
|
|
88
|
+
* - `read_skill_file` — reads a file from a skill's directory (references, scripts, assets).
|
|
89
|
+
* - `run_skill_script` — runs a pre-existing script from a skill's scripts/ directory.
|
|
90
|
+
*
|
|
91
|
+
* ## Runtime discovery
|
|
92
|
+
*
|
|
93
|
+
* All four tools rescan the skills directories on each invocation, so
|
|
94
|
+
* new skill directories appearing at runtime are immediately visible
|
|
95
|
+
* to `list_skills` and loadable via `use_skill` — no restart needed.
|
|
96
|
+
* The rescan reads only frontmatter (not full bodies), so the cost is
|
|
97
|
+
* negligible even with many skill directories.
|
|
98
|
+
*
|
|
99
|
+
* Skills with `autoLoad: true` in their frontmatter are appended to the
|
|
100
|
+
* system prompt at install time only. A new `autoLoad` skill appearing
|
|
101
|
+
* at runtime will NOT be auto-preloaded — use `preloadSkills` config for
|
|
102
|
+
* startup-time skills and `use_skill` for runtime-discovered ones.
|
|
103
|
+
*/
|
|
104
|
+
export default function createSkillExtension(config?: SkillsExtensionConfig): Extension | undefined;
|
|
105
|
+
//# sourceMappingURL=extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../src/extras/extensions/skills/extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKvD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,KAAM,SAAQ,SAAS;IACtC,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAsED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CAiCzD;AASD;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAC1C,MAAM,CAAC,EAAE,qBAAqB,GAC7B,SAAS,GAAG,SAAS,CAySvB"}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, relative, extname } from 'node:path';
|
|
3
|
+
import { execFile } from 'node:child_process';
|
|
4
|
+
/**
|
|
5
|
+
* Parse YAML frontmatter from a markdown file.
|
|
6
|
+
*
|
|
7
|
+
* Supports a subset of YAML sufficient for SKILL.md frontmatter:
|
|
8
|
+
* - Simple `key: value` pairs
|
|
9
|
+
* - Nested maps under `metadata:`
|
|
10
|
+
* - Values may be quoted or unquoted strings
|
|
11
|
+
*
|
|
12
|
+
* Returns `{ frontmatter, body }` where `body` is the markdown after the
|
|
13
|
+
* closing `---`.
|
|
14
|
+
*/
|
|
15
|
+
function parseFrontmatter(raw) {
|
|
16
|
+
const lines = raw.split('\n');
|
|
17
|
+
if (lines[0]?.trim() !== '---') {
|
|
18
|
+
return { frontmatter: {}, body: raw };
|
|
19
|
+
}
|
|
20
|
+
const fm = {};
|
|
21
|
+
let i = 1;
|
|
22
|
+
let currentMap = null;
|
|
23
|
+
while (i < lines.length && lines[i].trim() !== '---') {
|
|
24
|
+
const line = lines[i];
|
|
25
|
+
// Nested map entry (e.g. under `metadata:`).
|
|
26
|
+
if (line.startsWith(' ') && currentMap) {
|
|
27
|
+
const match = line.trim().match(/^(\w+):\s*(.*)$/);
|
|
28
|
+
if (match) {
|
|
29
|
+
currentMap[match[1]] = stripQuotes(match[2]);
|
|
30
|
+
}
|
|
31
|
+
i++;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const match = line.match(/^(\w+):\s*(.*)$/);
|
|
35
|
+
if (match) {
|
|
36
|
+
const [, key, value] = match;
|
|
37
|
+
if (value === '') {
|
|
38
|
+
// Start of a nested map.
|
|
39
|
+
currentMap = {};
|
|
40
|
+
fm[key] = currentMap;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
currentMap = null;
|
|
44
|
+
fm[key] = stripQuotes(value);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
// Skip the closing `---`.
|
|
50
|
+
const body = lines.slice(i + 1).join('\n').trim();
|
|
51
|
+
return { frontmatter: fm, body };
|
|
52
|
+
}
|
|
53
|
+
function stripQuotes(s) {
|
|
54
|
+
const trimmed = s.trim();
|
|
55
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
56
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
57
|
+
return trimmed.slice(1, -1);
|
|
58
|
+
}
|
|
59
|
+
return trimmed;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Load skill metadata from a directory containing skill subdirectories.
|
|
63
|
+
*
|
|
64
|
+
* Each subdirectory must contain a `SKILL.md` file with YAML frontmatter.
|
|
65
|
+
* Only metadata (name, description) is loaded at startup — the full body
|
|
66
|
+
* is loaded on demand when the skill is activated (progressive disclosure).
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* skills/
|
|
70
|
+
* code-review/
|
|
71
|
+
* SKILL.md
|
|
72
|
+
* references/
|
|
73
|
+
* scripts/
|
|
74
|
+
* summarize/
|
|
75
|
+
* SKILL.md
|
|
76
|
+
*/
|
|
77
|
+
export function loadSkills(skillsDir) {
|
|
78
|
+
if (!existsSync(skillsDir))
|
|
79
|
+
return [];
|
|
80
|
+
const skills = [];
|
|
81
|
+
for (const entry of readdirSync(skillsDir)) {
|
|
82
|
+
const skillDir = join(skillsDir, entry);
|
|
83
|
+
if (!statSync(skillDir).isDirectory())
|
|
84
|
+
continue;
|
|
85
|
+
const skillMdPath = join(skillDir, 'SKILL.md');
|
|
86
|
+
if (!existsSync(skillMdPath))
|
|
87
|
+
continue;
|
|
88
|
+
const raw = readFileSync(skillMdPath, 'utf-8');
|
|
89
|
+
const { frontmatter } = parseFrontmatter(raw);
|
|
90
|
+
const name = frontmatter.name ?? entry;
|
|
91
|
+
const description = frontmatter.description ?? '';
|
|
92
|
+
skills.push({
|
|
93
|
+
name,
|
|
94
|
+
description,
|
|
95
|
+
...(frontmatter.license ? { license: frontmatter.license } : {}),
|
|
96
|
+
...(frontmatter.compatibility ? { compatibility: frontmatter.compatibility } : {}),
|
|
97
|
+
...(frontmatter.metadata ? { metadata: frontmatter.metadata } : {}),
|
|
98
|
+
...(frontmatter['allowed-tools']
|
|
99
|
+
? { allowedTools: frontmatter['allowed-tools'].split(' ').filter(Boolean) }
|
|
100
|
+
: {}),
|
|
101
|
+
...(frontmatter.autoLoad !== undefined ? { autoLoad: frontmatter.autoLoad === true || frontmatter.autoLoad === 'true' } : {}),
|
|
102
|
+
dir: skillDir,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return skills;
|
|
106
|
+
}
|
|
107
|
+
/** Load the full SKILL.md body for a skill (progressive disclosure level 2). */
|
|
108
|
+
function loadSkillContent(skill) {
|
|
109
|
+
const raw = readFileSync(join(skill.dir, 'SKILL.md'), 'utf-8');
|
|
110
|
+
const { body } = parseFrontmatter(raw);
|
|
111
|
+
return body;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a skill loader extension following the Agent Skills specification.
|
|
115
|
+
*
|
|
116
|
+
* Receives config from the extension loader. The `skillsDirs` key (a path
|
|
117
|
+
* or array of paths) tells the extension where to find skill directories.
|
|
118
|
+
* If no `skillsDirs` is provided, the factory returns `undefined` (opts out).
|
|
119
|
+
*
|
|
120
|
+
* Implements progressive disclosure:
|
|
121
|
+
* 1. **Metadata** (~100 tokens/skill): name + description loaded at startup.
|
|
122
|
+
* 2. **Instructions** (<5000 tokens): full SKILL.md body loaded on activation.
|
|
123
|
+
* 3. **Resources** (as needed): files in scripts/, references/, assets/ loaded on demand.
|
|
124
|
+
*
|
|
125
|
+
* Registers four tools the LLM can call:
|
|
126
|
+
* - `list_skills` — returns available skill names and descriptions.
|
|
127
|
+
* - `use_skill` — loads a skill's full instructions into the conversation.
|
|
128
|
+
* - `read_skill_file` — reads a file from a skill's directory (references, scripts, assets).
|
|
129
|
+
* - `run_skill_script` — runs a pre-existing script from a skill's scripts/ directory.
|
|
130
|
+
*
|
|
131
|
+
* ## Runtime discovery
|
|
132
|
+
*
|
|
133
|
+
* All four tools rescan the skills directories on each invocation, so
|
|
134
|
+
* new skill directories appearing at runtime are immediately visible
|
|
135
|
+
* to `list_skills` and loadable via `use_skill` — no restart needed.
|
|
136
|
+
* The rescan reads only frontmatter (not full bodies), so the cost is
|
|
137
|
+
* negligible even with many skill directories.
|
|
138
|
+
*
|
|
139
|
+
* Skills with `autoLoad: true` in their frontmatter are appended to the
|
|
140
|
+
* system prompt at install time only. A new `autoLoad` skill appearing
|
|
141
|
+
* at runtime will NOT be auto-preloaded — use `preloadSkills` config for
|
|
142
|
+
* startup-time skills and `use_skill` for runtime-discovered ones.
|
|
143
|
+
*/
|
|
144
|
+
export default function createSkillExtension(config) {
|
|
145
|
+
const skillsDirs = config?.skillsDirs;
|
|
146
|
+
if (!skillsDirs) {
|
|
147
|
+
console.log('[skills] no skillsDirs in config — skipping skills extension');
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const dirs = Array.isArray(skillsDirs) ? skillsDirs : [skillsDirs];
|
|
151
|
+
// ── Live skill registry ──────────────────────────────────────────
|
|
152
|
+
// The skills array and skillMap are refreshed on every tool call so
|
|
153
|
+
// new skill directories appearing at runtime are immediately visible
|
|
154
|
+
// to list_skills / use_skill / read_skill_file / run_skill_script.
|
|
155
|
+
// The refresh is cheap: readdir + frontmatter parse (bodies are not
|
|
156
|
+
// read until use_skill is called).
|
|
157
|
+
const skills = [];
|
|
158
|
+
let skillMap = new Map();
|
|
159
|
+
function refresh() {
|
|
160
|
+
skills.length = 0;
|
|
161
|
+
for (const dir of dirs) {
|
|
162
|
+
skills.push(...loadSkills(dir));
|
|
163
|
+
}
|
|
164
|
+
skillMap = new Map(skills.map((s) => [s.name, s]));
|
|
165
|
+
}
|
|
166
|
+
// Initial load.
|
|
167
|
+
refresh();
|
|
168
|
+
// Determine which skills to preload:
|
|
169
|
+
// 1. Skills with `autoLoad: true` in their frontmatter (self-declared)
|
|
170
|
+
// 2. Skills explicitly listed in config.preloadSkills (host-declared)
|
|
171
|
+
//
|
|
172
|
+
// Preloading appends to the system prompt at install time. Skills
|
|
173
|
+
// discovered later at runtime are NOT auto-preloaded — use preloadSkills
|
|
174
|
+
// for startup-time skills and use_skill for runtime-discovered ones.
|
|
175
|
+
const explicitPreload = config?.preloadSkills
|
|
176
|
+
? (Array.isArray(config.preloadSkills) ? config.preloadSkills : [config.preloadSkills])
|
|
177
|
+
: [];
|
|
178
|
+
const autoLoadNames = skills.filter((s) => s.autoLoad).map((s) => s.name);
|
|
179
|
+
const preloadNames = [...new Set([...autoLoadNames, ...explicitPreload])];
|
|
180
|
+
const preloadedContent = [];
|
|
181
|
+
for (const name of preloadNames) {
|
|
182
|
+
const skill = skillMap.get(name);
|
|
183
|
+
if (!skill) {
|
|
184
|
+
console.warn(`[skills] preload: skill "${name}" not found — skipping`);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
preloadedContent.push(loadSkillContent(skill));
|
|
188
|
+
console.log(`[skills] preloaded "${name}" — appended to system prompt`);
|
|
189
|
+
}
|
|
190
|
+
console.log(`[skills] loaded ${skills.length} skill(s) from ${dirs.join(', ')}` +
|
|
191
|
+
(skills.length > 0 ? ': ' + skills.map((s) => s.name).join(', ') : ''));
|
|
192
|
+
return {
|
|
193
|
+
name: 'skills',
|
|
194
|
+
priority: 50,
|
|
195
|
+
install(agent) {
|
|
196
|
+
// Level 1: list metadata only.
|
|
197
|
+
// Refreshes on each call so runtime-discovered skills appear.
|
|
198
|
+
agent.tool({
|
|
199
|
+
name: 'list_skills',
|
|
200
|
+
description: 'List available skills with their names and descriptions. Use this first to discover what skills are available.',
|
|
201
|
+
parameters: { type: 'object', properties: {} },
|
|
202
|
+
async execute() {
|
|
203
|
+
refresh();
|
|
204
|
+
if (skills.length === 0) {
|
|
205
|
+
return {
|
|
206
|
+
toolCallId: '',
|
|
207
|
+
content: 'No skills available.',
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const lines = skills.map((s) => `- ${s.name}: ${s.description || '(no description)'}`);
|
|
211
|
+
return {
|
|
212
|
+
toolCallId: '',
|
|
213
|
+
content: `Available skills:\n${lines.join('\n')}`,
|
|
214
|
+
};
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
// Level 2: load full SKILL.md body on activation.
|
|
218
|
+
// Refreshes before lookup so a skill that appeared since the last
|
|
219
|
+
// list_skills call can still be activated.
|
|
220
|
+
agent.tool({
|
|
221
|
+
name: 'use_skill',
|
|
222
|
+
description: 'Activate a skill by loading its full instructions. The SKILL.md content will be returned as context — follow those instructions for the rest of this task.',
|
|
223
|
+
parameters: {
|
|
224
|
+
type: 'object',
|
|
225
|
+
properties: {
|
|
226
|
+
skill: {
|
|
227
|
+
type: 'string',
|
|
228
|
+
description: 'The skill name to activate. Use list_skills to see available options.',
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
required: ['skill'],
|
|
232
|
+
},
|
|
233
|
+
async execute(args) {
|
|
234
|
+
refresh();
|
|
235
|
+
const name = args.skill;
|
|
236
|
+
const skill = skillMap.get(name);
|
|
237
|
+
if (!skill) {
|
|
238
|
+
const available = [...skillMap.keys()].join(', ');
|
|
239
|
+
return {
|
|
240
|
+
toolCallId: '',
|
|
241
|
+
content: `Skill "${name}" not found. Available: ${available}`,
|
|
242
|
+
isError: true,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
const content = loadSkillContent(skill);
|
|
246
|
+
return {
|
|
247
|
+
toolCallId: '',
|
|
248
|
+
content,
|
|
249
|
+
};
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
// Level 3a: read files from a skill's directory on demand.
|
|
253
|
+
agent.tool({
|
|
254
|
+
name: 'read_skill_file',
|
|
255
|
+
description: 'Read a file from a skill directory (e.g. references/REFERENCE.md, scripts/extract.py). Use relative paths from the skill root.',
|
|
256
|
+
parameters: {
|
|
257
|
+
type: 'object',
|
|
258
|
+
properties: {
|
|
259
|
+
skill: {
|
|
260
|
+
type: 'string',
|
|
261
|
+
description: 'The skill name whose file to read.',
|
|
262
|
+
},
|
|
263
|
+
path: {
|
|
264
|
+
type: 'string',
|
|
265
|
+
description: 'Relative path from the skill root (e.g. references/REFERENCE.md).',
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
required: ['skill', 'path'],
|
|
269
|
+
},
|
|
270
|
+
async execute(args) {
|
|
271
|
+
refresh();
|
|
272
|
+
const skillName = args.skill;
|
|
273
|
+
const relPath = args.path;
|
|
274
|
+
const skill = skillMap.get(skillName);
|
|
275
|
+
if (!skill) {
|
|
276
|
+
return {
|
|
277
|
+
toolCallId: '',
|
|
278
|
+
content: `Skill "${skillName}" not found.`,
|
|
279
|
+
isError: true,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const fullPath = join(skill.dir, relPath);
|
|
283
|
+
// Prevent path traversal outside the skill directory.
|
|
284
|
+
const rel = relative(skill.dir, fullPath);
|
|
285
|
+
if (rel.startsWith('..') || rel.includes('..')) {
|
|
286
|
+
return {
|
|
287
|
+
toolCallId: '',
|
|
288
|
+
content: 'Path traversal outside skill directory is not allowed.',
|
|
289
|
+
isError: true,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
if (!existsSync(fullPath)) {
|
|
293
|
+
return {
|
|
294
|
+
toolCallId: '',
|
|
295
|
+
content: `File not found: ${relPath}`,
|
|
296
|
+
isError: true,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
300
|
+
return {
|
|
301
|
+
toolCallId: '',
|
|
302
|
+
content,
|
|
303
|
+
};
|
|
304
|
+
},
|
|
305
|
+
});
|
|
306
|
+
// Level 3b: run a pre-existing script from a skill's scripts/ directory.
|
|
307
|
+
//
|
|
308
|
+
// Security model: the agent cannot write scripts and then execute
|
|
309
|
+
// them, cannot pass arbitrary shell commands, and cannot run anything
|
|
310
|
+
// outside the skill's scripts/ directory. Only files that already
|
|
311
|
+
// exist on disk are executable. Arguments are passed as an array —
|
|
312
|
+
// no shell interpolation. The interpreter is selected by file
|
|
313
|
+
// extension, not by the agent.
|
|
314
|
+
agent.tool({
|
|
315
|
+
name: 'run_skill_script',
|
|
316
|
+
description: 'Run a pre-existing script from a skill\'s scripts/ directory. The script must already exist on disk — you cannot create scripts. Arguments are passed directly to the script (no shell interpolation).',
|
|
317
|
+
parameters: {
|
|
318
|
+
type: 'object',
|
|
319
|
+
properties: {
|
|
320
|
+
skill: {
|
|
321
|
+
type: 'string',
|
|
322
|
+
description: 'The skill name whose script to run.',
|
|
323
|
+
},
|
|
324
|
+
script: {
|
|
325
|
+
type: 'string',
|
|
326
|
+
description: 'Filename of the script in the scripts/ directory (e.g. "extract.py").',
|
|
327
|
+
},
|
|
328
|
+
args: {
|
|
329
|
+
type: 'array',
|
|
330
|
+
items: { type: 'string' },
|
|
331
|
+
description: 'Arguments to pass to the script.',
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
required: ['skill', 'script'],
|
|
335
|
+
},
|
|
336
|
+
async execute(args, ctx) {
|
|
337
|
+
refresh();
|
|
338
|
+
const skillName = args.skill;
|
|
339
|
+
const scriptName = args.script;
|
|
340
|
+
const scriptArgs = args.args ?? [];
|
|
341
|
+
const skill = skillMap.get(skillName);
|
|
342
|
+
if (!skill) {
|
|
343
|
+
return {
|
|
344
|
+
toolCallId: '',
|
|
345
|
+
content: `Skill "${skillName}" not found.`,
|
|
346
|
+
isError: true,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Lock to scripts/ directory — no path traversal, no absolute paths,
|
|
350
|
+
// no subdirectories. Just a flat filename.
|
|
351
|
+
if (scriptName.includes('/') || scriptName.includes('..') || scriptName.includes('\\')) {
|
|
352
|
+
return {
|
|
353
|
+
toolCallId: '',
|
|
354
|
+
content: 'Script name must be a flat filename in scripts/ (no paths).',
|
|
355
|
+
isError: true,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
const scriptPath = join(skill.dir, 'scripts', scriptName);
|
|
359
|
+
if (!existsSync(scriptPath) || !statSync(scriptPath).isFile()) {
|
|
360
|
+
return {
|
|
361
|
+
toolCallId: '',
|
|
362
|
+
content: `Script not found: scripts/${scriptName}`,
|
|
363
|
+
isError: true,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
// Interpreter is selected by extension — the agent has no say.
|
|
367
|
+
const ext = extname(scriptName);
|
|
368
|
+
const runners = {
|
|
369
|
+
'.py': ['python3'],
|
|
370
|
+
'.sh': ['bash'],
|
|
371
|
+
'.js': ['node'],
|
|
372
|
+
'.ts': ['npx', 'tsx'],
|
|
373
|
+
};
|
|
374
|
+
const runner = runners[ext];
|
|
375
|
+
if (!runner) {
|
|
376
|
+
return {
|
|
377
|
+
toolCallId: '',
|
|
378
|
+
content: `Unsupported script type: ${ext}. Supported: ${Object.keys(runners).join(', ')}`,
|
|
379
|
+
isError: true,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
const cmd = [...runner, scriptPath, ...scriptArgs];
|
|
383
|
+
return new Promise((resolve) => {
|
|
384
|
+
execFile(cmd[0], cmd.slice(1), {
|
|
385
|
+
cwd: skill.dir,
|
|
386
|
+
timeout: 30_000,
|
|
387
|
+
signal: ctx.signal,
|
|
388
|
+
maxBuffer: 1024 * 1024,
|
|
389
|
+
}, (error, stdout, stderr) => {
|
|
390
|
+
if (error) {
|
|
391
|
+
resolve({
|
|
392
|
+
toolCallId: '',
|
|
393
|
+
content: `Script failed (${error.name}): ${error.message}\n${stderr}`,
|
|
394
|
+
isError: true,
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
const output = stdout + (stderr ? `\n[stderr]\n${stderr}` : '');
|
|
399
|
+
resolve({
|
|
400
|
+
toolCallId: '',
|
|
401
|
+
content: output || '(script produced no output)',
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
});
|
|
406
|
+
},
|
|
407
|
+
});
|
|
408
|
+
// Preloaded skills: append their content to the system prompt
|
|
409
|
+
// once at install time. This is a one-time operation — the
|
|
410
|
+
// content is part of the system prompt for every turn without
|
|
411
|
+
// any per-turn injection overhead.
|
|
412
|
+
if (preloadedContent.length > 0) {
|
|
413
|
+
const combined = preloadedContent.join('\n\n---\n\n');
|
|
414
|
+
agent.appendSystemPrompt(combined);
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../src/extras/extensions/skills/extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "skills",
|
|
3
|
+
"description": "Skill loader following the Agent Skills spec. Scans skill directories for SKILL.md files and registers list_skills, use_skill, read_skill_file, and run_skill_script tools.",
|
|
4
|
+
"enabled": true,
|
|
5
|
+
"priority": 50,
|
|
6
|
+
"configKeys": ["skillsDirs"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.test.d.ts","sourceRoot":"","sources":["../../../../src/extras/extensions/skills/extension.test.ts"],"names":[],"mappings":""}
|