@openharness/core 0.3.1 → 0.3.3

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/messages.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,66 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { extractUserInput } from "../messages.js";
3
+ function makeTextMessage(text, role = "user") {
4
+ return {
5
+ id: "msg-1",
6
+ role,
7
+ parts: [{ type: "text", text }],
8
+ };
9
+ }
10
+ function makeFileMessage(mediaType, url, filename, text) {
11
+ const parts = [];
12
+ if (text) {
13
+ parts.push({ type: "text", text });
14
+ }
15
+ parts.push({ type: "file", mediaType, url, filename });
16
+ return {
17
+ id: "msg-2",
18
+ role: "user",
19
+ parts,
20
+ };
21
+ }
22
+ describe("extractUserInput", () => {
23
+ it("returns string for text-only message", async () => {
24
+ const result = await extractUserInput([makeTextMessage("hello world")]);
25
+ expect(result).toBe("hello world");
26
+ });
27
+ it("concatenates multiple text parts", async () => {
28
+ const msg = {
29
+ id: "msg-1",
30
+ role: "user",
31
+ parts: [
32
+ { type: "text", text: "hello " },
33
+ { type: "text", text: "world" },
34
+ ],
35
+ };
36
+ const result = await extractUserInput([msg]);
37
+ expect(result).toBe("hello world");
38
+ });
39
+ it("returns ModelMessage[] for message with file", async () => {
40
+ const msg = makeFileMessage("image/png", "data:image/png;base64,iVBOR", "test.png", "describe this image");
41
+ const result = await extractUserInput([msg]);
42
+ expect(Array.isArray(result)).toBe(true);
43
+ const messages = result;
44
+ expect(messages.length).toBeGreaterThan(0);
45
+ expect(messages[0].role).toBe("user");
46
+ });
47
+ it("returns ModelMessage[] for file-only (no text)", async () => {
48
+ const msg = makeFileMessage("image/jpeg", "data:image/jpeg;base64,/9j/4A");
49
+ const result = await extractUserInput([msg]);
50
+ expect(Array.isArray(result)).toBe(true);
51
+ });
52
+ it("uses only the last message", async () => {
53
+ const result = await extractUserInput([
54
+ makeTextMessage("first message"),
55
+ makeTextMessage("second message"),
56
+ ]);
57
+ expect(result).toBe("second message");
58
+ });
59
+ it("throws on empty array", async () => {
60
+ await expect(extractUserInput([])).rejects.toThrow("messages array is empty");
61
+ });
62
+ it("throws when last message is not from user", async () => {
63
+ await expect(extractUserInput([makeTextMessage("hi", "assistant")])).rejects.toThrow('expected "user"');
64
+ });
65
+ });
66
+ //# sourceMappingURL=messages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../src/__tests__/messages.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skills.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skills.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,293 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import { discoverSkills, scanSkillFiles } from "../skills.js";
6
+ import { createSkillTool } from "../tools/skill.js";
7
+ // ── Helpers ─────────────────────────────────────────────────────────
8
+ let tmpDir;
9
+ beforeEach(async () => {
10
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "oh-skills-test-"));
11
+ });
12
+ afterEach(async () => {
13
+ await fs.rm(tmpDir, { recursive: true, force: true });
14
+ });
15
+ /** Write a SKILL.md file under `tmpDir/<name>/SKILL.md`. */
16
+ async function writeSkill(name, content, extraFiles) {
17
+ const dir = path.join(tmpDir, name);
18
+ await fs.mkdir(dir, { recursive: true });
19
+ await fs.writeFile(path.join(dir, "SKILL.md"), content, "utf-8");
20
+ for (const [filePath, fileContent] of Object.entries(extraFiles ?? {})) {
21
+ const full = path.join(dir, filePath);
22
+ await fs.mkdir(path.dirname(full), { recursive: true });
23
+ await fs.writeFile(full, fileContent, "utf-8");
24
+ }
25
+ return dir;
26
+ }
27
+ // ── discoverSkills ──────────────────────────────────────────────────
28
+ describe("discoverSkills", () => {
29
+ it("discovers a single skill", async () => {
30
+ await writeSkill("my-skill", `---
31
+ name: my-skill
32
+ description: A test skill
33
+ ---
34
+
35
+ # Instructions
36
+
37
+ Do the thing.`);
38
+ const skills = await discoverSkills({ paths: [tmpDir] });
39
+ expect(skills).toHaveLength(1);
40
+ expect(skills[0].name).toBe("my-skill");
41
+ expect(skills[0].description).toBe("A test skill");
42
+ expect(skills[0].content).toBe("# Instructions\n\nDo the thing.");
43
+ expect(skills[0].location).toBe(path.join(tmpDir, "my-skill", "SKILL.md"));
44
+ });
45
+ it("discovers multiple skills", async () => {
46
+ await writeSkill("skill-a", `---
47
+ name: skill-a
48
+ description: First skill
49
+ ---
50
+
51
+ Content A`);
52
+ await writeSkill("skill-b", `---
53
+ name: skill-b
54
+ description: Second skill
55
+ ---
56
+
57
+ Content B`);
58
+ const skills = await discoverSkills({ paths: [tmpDir] });
59
+ expect(skills).toHaveLength(2);
60
+ const names = skills.map((s) => s.name).sort();
61
+ expect(names).toEqual(["skill-a", "skill-b"]);
62
+ });
63
+ it("discovers nested skills", async () => {
64
+ const nestedDir = path.join(tmpDir, "deep", "nested", "my-skill");
65
+ await fs.mkdir(nestedDir, { recursive: true });
66
+ await fs.writeFile(path.join(nestedDir, "SKILL.md"), `---
67
+ name: nested-skill
68
+ description: Found deep
69
+ ---
70
+
71
+ Nested content`, "utf-8");
72
+ const skills = await discoverSkills({ paths: [tmpDir] });
73
+ expect(skills).toHaveLength(1);
74
+ expect(skills[0].name).toBe("nested-skill");
75
+ });
76
+ it("later paths overwrite earlier ones on name collision", async () => {
77
+ const dir1 = path.join(tmpDir, "first");
78
+ const dir2 = path.join(tmpDir, "second");
79
+ await fs.mkdir(path.join(dir1, "my-skill"), { recursive: true });
80
+ await fs.writeFile(path.join(dir1, "my-skill", "SKILL.md"), `---
81
+ name: my-skill
82
+ description: From first
83
+ ---
84
+
85
+ First version`, "utf-8");
86
+ await fs.mkdir(path.join(dir2, "my-skill"), { recursive: true });
87
+ await fs.writeFile(path.join(dir2, "my-skill", "SKILL.md"), `---
88
+ name: my-skill
89
+ description: From second
90
+ ---
91
+
92
+ Second version`, "utf-8");
93
+ const skills = await discoverSkills({ paths: [dir1, dir2] });
94
+ expect(skills).toHaveLength(1);
95
+ expect(skills[0].description).toBe("From second");
96
+ expect(skills[0].content).toBe("Second version");
97
+ });
98
+ it("returns empty array for empty paths", async () => {
99
+ const skills = await discoverSkills({ paths: [] });
100
+ expect(skills).toEqual([]);
101
+ });
102
+ it("returns empty array when paths is undefined", async () => {
103
+ const skills = await discoverSkills({});
104
+ expect(skills).toEqual([]);
105
+ });
106
+ it("silently skips non-existent directories", async () => {
107
+ const skills = await discoverSkills({
108
+ paths: [path.join(tmpDir, "does-not-exist")],
109
+ });
110
+ expect(skills).toEqual([]);
111
+ });
112
+ it("skips SKILL.md with missing frontmatter", async () => {
113
+ await writeSkill("bad", "# No frontmatter here\n\nJust content.");
114
+ const skills = await discoverSkills({ paths: [tmpDir] });
115
+ expect(skills).toEqual([]);
116
+ });
117
+ it("skips SKILL.md with missing name", async () => {
118
+ await writeSkill("no-name", `---
119
+ description: Has description but no name
120
+ ---
121
+
122
+ Content`);
123
+ const skills = await discoverSkills({ paths: [tmpDir] });
124
+ expect(skills).toEqual([]);
125
+ });
126
+ it("skips SKILL.md with missing description", async () => {
127
+ await writeSkill("no-desc", `---
128
+ name: no-desc
129
+ ---
130
+
131
+ Content`);
132
+ const skills = await discoverSkills({ paths: [tmpDir] });
133
+ expect(skills).toEqual([]);
134
+ });
135
+ it("skips SKILL.md with invalid name format", async () => {
136
+ await writeSkill("bad-name", `---
137
+ name: UPPER_CASE
138
+ description: Invalid name
139
+ ---
140
+
141
+ Content`);
142
+ const skills = await discoverSkills({ paths: [tmpDir] });
143
+ expect(skills).toEqual([]);
144
+ });
145
+ it("rejects names starting with a hyphen", async () => {
146
+ await writeSkill("hyphen", `---
147
+ name: -leading
148
+ description: Bad
149
+ ---
150
+
151
+ Content`);
152
+ const skills = await discoverSkills({ paths: [tmpDir] });
153
+ expect(skills).toEqual([]);
154
+ });
155
+ it("rejects names with consecutive hyphens", async () => {
156
+ await writeSkill("double", `---
157
+ name: foo--bar
158
+ description: Bad
159
+ ---
160
+
161
+ Content`);
162
+ const skills = await discoverSkills({ paths: [tmpDir] });
163
+ expect(skills).toEqual([]);
164
+ });
165
+ it("preserves colons in description values", async () => {
166
+ await writeSkill("colon", `---
167
+ name: colon-test
168
+ description: Build AI agents: stateful workflows
169
+ ---
170
+
171
+ Content`);
172
+ const skills = await discoverSkills({ paths: [tmpDir] });
173
+ expect(skills).toHaveLength(1);
174
+ expect(skills[0].description).toBe("Build AI agents: stateful workflows");
175
+ });
176
+ });
177
+ // ── scanSkillFiles ──────────────────────────────────────────────────
178
+ describe("scanSkillFiles", () => {
179
+ it("returns auxiliary files excluding SKILL.md", async () => {
180
+ const dir = await writeSkill("with-files", `---
181
+ name: with-files
182
+ description: Has extra files
183
+ ---
184
+
185
+ Content`, {
186
+ "references/api.md": "# API docs",
187
+ "scripts/setup.sh": "#!/bin/bash\necho hi",
188
+ });
189
+ const files = await scanSkillFiles(dir);
190
+ expect(files).toHaveLength(2);
191
+ const basenames = files.map((f) => path.relative(dir, f)).sort();
192
+ expect(basenames).toEqual(["references/api.md", "scripts/setup.sh"]);
193
+ });
194
+ it("excludes SKILL.md from results", async () => {
195
+ const dir = await writeSkill("only-skill", `---
196
+ name: only-skill
197
+ description: Just the skill file
198
+ ---
199
+
200
+ Content`);
201
+ const files = await scanSkillFiles(dir);
202
+ expect(files).toEqual([]);
203
+ });
204
+ it("respects the limit parameter", async () => {
205
+ const extras = {};
206
+ for (let i = 0; i < 15; i++) {
207
+ extras[`file-${String(i).padStart(2, "0")}.txt`] = `content ${i}`;
208
+ }
209
+ const dir = await writeSkill("many-files", `---
210
+ name: many-files
211
+ description: Lots of files
212
+ ---
213
+
214
+ Content`, extras);
215
+ const files = await scanSkillFiles(dir, 5);
216
+ expect(files).toHaveLength(5);
217
+ });
218
+ it("returns empty array for non-existent directory", async () => {
219
+ const files = await scanSkillFiles(path.join(tmpDir, "nope"));
220
+ expect(files).toEqual([]);
221
+ });
222
+ });
223
+ // ── createSkillTool ─────────────────────────────────────────────────
224
+ describe("createSkillTool", () => {
225
+ const baseSkill = {
226
+ name: "test-skill",
227
+ description: "A test skill",
228
+ location: "/fake/test-skill/SKILL.md",
229
+ content: "# Test\n\nDo the thing.",
230
+ };
231
+ it("creates a tool with available skills in description", () => {
232
+ const skillTool = createSkillTool([baseSkill]);
233
+ expect(skillTool.description).toContain("test-skill");
234
+ expect(skillTool.description).toContain("A test skill");
235
+ expect(skillTool.description).toContain("<available_skills>");
236
+ });
237
+ it("lists multiple skills in description", () => {
238
+ const skills = [
239
+ baseSkill,
240
+ { name: "other-skill", description: "Another one", location: "/fake/other/SKILL.md", content: "Other" },
241
+ ];
242
+ const skillTool = createSkillTool(skills);
243
+ expect(skillTool.description).toContain("test-skill");
244
+ expect(skillTool.description).toContain("other-skill");
245
+ });
246
+ it("executes and returns skill content", async () => {
247
+ const dir = await writeSkill("real-skill", `---
248
+ name: real-skill
249
+ description: Real
250
+ ---
251
+
252
+ # Instructions
253
+
254
+ Follow these steps.`, { "ref.md": "# Reference" });
255
+ const skill = {
256
+ name: "real-skill",
257
+ description: "Real",
258
+ location: path.join(dir, "SKILL.md"),
259
+ content: "# Instructions\n\nFollow these steps.",
260
+ };
261
+ const skillTool = createSkillTool([skill]);
262
+ const result = await skillTool.execute({ name: "real-skill" }, { toolCallId: "test", messages: [], abortSignal: undefined });
263
+ expect(result).toContain("<skill_content name=\"real-skill\">");
264
+ expect(result).toContain("# Skill: real-skill");
265
+ expect(result).toContain("Follow these steps.");
266
+ expect(result).toContain(`Base directory for this skill: ${dir}`);
267
+ expect(result).toContain("<skill_files>");
268
+ expect(result).toContain("ref.md</file>");
269
+ expect(result).toContain("</skill_content>");
270
+ });
271
+ it("omits skill_files section when no auxiliary files exist", async () => {
272
+ const dir = await writeSkill("bare-skill", `---
273
+ name: bare-skill
274
+ description: Bare
275
+ ---
276
+
277
+ Content only`);
278
+ const skill = {
279
+ name: "bare-skill",
280
+ description: "Bare",
281
+ location: path.join(dir, "SKILL.md"),
282
+ content: "Content only",
283
+ };
284
+ const skillTool = createSkillTool([skill]);
285
+ const result = await skillTool.execute({ name: "bare-skill" }, { toolCallId: "test", messages: [], abortSignal: undefined });
286
+ expect(result).not.toContain("<skill_files>");
287
+ });
288
+ it("throws for unknown skill name", async () => {
289
+ const skillTool = createSkillTool([baseSkill]);
290
+ await expect(skillTool.execute({ name: "nope" }, { toolCallId: "test", messages: [], abortSignal: undefined })).rejects.toThrow('Skill "nope" not found');
291
+ });
292
+ });
293
+ //# sourceMappingURL=skills.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.test.js","sourceRoot":"","sources":["../../src/__tests__/skills.test.ts"],"names":[],"mappings":"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"}
package/dist/agent.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { type LanguageModel, type ToolSet, type ModelMessage } from "ai";
2
2
  import { type MCPServerConfig } from "./mcp.js";
3
+ import { type SkillsConfig } from "./skills.js";
3
4
  export interface TokenUsage {
4
5
  inputTokens: number | undefined;
5
6
  outputTokens: number | undefined;
@@ -86,6 +87,9 @@ export declare class Agent {
86
87
  /** MCP server configs — connected lazily on first run. */
87
88
  private mcpServerConfigs?;
88
89
  private mcpConnection;
90
+ /** Skills config — discovered lazily on first run. */
91
+ private skillsConfig?;
92
+ private cachedSkills;
89
93
  private cachedInstructions;
90
94
  constructor(options: {
91
95
  name: string;
@@ -121,6 +125,12 @@ export declare class Agent {
121
125
  * Keys are server names (used to namespace tools when multiple servers are configured).
122
126
  */
123
127
  mcpServers?: Record<string, MCPServerConfig>;
128
+ /**
129
+ * Skills configuration. Skills are markdown instruction packages (SKILL.md files)
130
+ * that the LLM can load on demand via an auto-generated `skill` tool.
131
+ * Discovered lazily on first run.
132
+ */
133
+ skills?: SkillsConfig;
124
134
  });
125
135
  /**
126
136
  * Close all MCP server connections. Call this when the agent is no longer needed.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -2,6 +2,8 @@ import { tool, streamText, stepCountIs, } from "ai";
2
2
  import { z } from "zod";
3
3
  import { loadInstructions } from "./instructions.js";
4
4
  import { connectMCPServers, closeMCPClients, } from "./mcp.js";
5
+ import { discoverSkills } from "./skills.js";
6
+ import { createSkillTool } from "./tools/skill.js";
5
7
  // ── Agent ────────────────────────────────────────────────────────────
6
8
  export class Agent {
7
9
  name;
@@ -22,6 +24,9 @@ export class Agent {
22
24
  /** MCP server configs — connected lazily on first run. */
23
25
  mcpServerConfigs;
24
26
  mcpConnection = null;
27
+ /** Skills config — discovered lazily on first run. */
28
+ skillsConfig;
29
+ cachedSkills = null; // null = not loaded yet
25
30
  cachedInstructions = null; // null = not loaded yet
26
31
  constructor(options) {
27
32
  this.name = options.name;
@@ -37,6 +42,7 @@ export class Agent {
37
42
  this.onSubagentEvent = options.onSubagentEvent;
38
43
  this.subagents = options.subagents;
39
44
  this.mcpServerConfigs = options.mcpServers;
45
+ this.skillsConfig = options.skills;
40
46
  // Merge the task tool into the toolset when subagents are provided and depth > 0
41
47
  if (options.subagents?.length && this.maxSubagentDepth > 0) {
42
48
  this.tools = {
@@ -74,12 +80,17 @@ export class Agent {
74
80
  if (this.mcpServerConfigs && !this.mcpConnection) {
75
81
  this.mcpConnection = await connectMCPServers(this.mcpServerConfigs);
76
82
  }
83
+ // Discover skills once per agent lifetime
84
+ if (this.skillsConfig && this.cachedSkills === null) {
85
+ this.cachedSkills = await discoverSkills(this.skillsConfig);
86
+ }
77
87
  const systemParts = [this.systemPrompt, this.cachedInstructions].filter(Boolean);
78
88
  const system = systemParts.length > 0 ? systemParts.join("\n\n") : undefined;
79
- // Merge static tools with MCP tools
89
+ // Merge static tools with MCP tools and skill tool
80
90
  const allTools = {
81
- ...(this.tools ?? {}),
91
+ ...(this.cachedSkills?.length ? { skill: createSkillTool(this.cachedSkills) } : {}),
82
92
  ...(this.mcpConnection?.tools ?? {}),
93
+ ...(this.tools ?? {}),
83
94
  };
84
95
  const tools = this.approve && Object.keys(allTools).length > 0
85
96
  ? wrapToolsWithApproval(allTools, this.approve)
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export { Agent, ToolDeniedError, type AgentEvent, type TokenUsage, type ToolCallInfo, type ApproveFn, type SubagentEventFn, } from "./agent.js";
2
2
  export { connectMCPServers, closeMCPClients, type MCPServerConfig, type MCPConnection, type StdioMCPServer, type HttpMCPServer, type SseMCPServer, } from "./mcp.js";
3
3
  export { Session, DefaultCompactionStrategy, type SessionEvent, type SessionLifecycleEvent, type SessionOptions, type CompactionStrategy, type CompactionContext, type CompactionResult, type RetryConfig, type SessionHooks, type TurnInfo, type SessionStore, type CompactionCheckInfo, } from "./session.js";
4
+ export { discoverSkills, scanSkillFiles, type SkillInfo, type SkillsConfig, } from "./skills.js";
5
+ export { createSkillTool } from "./tools/skill.js";
4
6
  export { findInstructions, loadInstructions } from "./instructions.js";
5
7
  export { type OHDataTypes, type OHMetadata, type OHUIMessage, } from "./types/ui-message.js";
6
8
  export { type OHDataPart, type OHSubagentPart, type OHCompactionPart, type OHRetryPart, type OHSessionLifecyclePart, isOHDataPart, isSubagentEvent, isCompactionEvent, isRetryEvent, isSessionLifecycleEvent, formatSSE, formatTextDelta, formatReasoningDelta, formatDataPart, formatToolStart, formatToolResult, formatToolError, formatStepStart, formatStepFinish, formatFinishMessage, formatDone, } from "./types/stream-parts.js";
9
+ export { extractUserInput } from "./messages.js";
7
10
  export { sessionEventsToUIStream } from "./ui-stream.js";
8
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAItB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAG3B,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EAGvB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AAIpB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,UAAU,CAAC;AAIlB,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,cAAc,EACd,cAAc,EACd,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvE,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAG3B,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EAGvB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,9 @@ export { Agent, ToolDeniedError, } from "./agent.js";
4
4
  export { connectMCPServers, closeMCPClients, } from "./mcp.js";
5
5
  // ── Session ─────────────────────────────────────────────────────────
6
6
  export { Session, DefaultCompactionStrategy, } from "./session.js";
7
+ // ── Skills ──────────────────────────────────────────────────────────
8
+ export { discoverSkills, scanSkillFiles, } from "./skills.js";
9
+ export { createSkillTool } from "./tools/skill.js";
7
10
  // ── Instructions ────────────────────────────────────────────────────
8
11
  export { findInstructions, loadInstructions } from "./instructions.js";
9
12
  // ── Stream Parts ────────────────────────────────────────────────────
@@ -12,6 +15,8 @@ export {
12
15
  isOHDataPart, isSubagentEvent, isCompactionEvent, isRetryEvent, isSessionLifecycleEvent,
13
16
  // SSE formatters
14
17
  formatSSE, formatTextDelta, formatReasoningDelta, formatDataPart, formatToolStart, formatToolResult, formatToolError, formatStepStart, formatStepFinish, formatFinishMessage, formatDone, } from "./types/stream-parts.js";
18
+ // ── Message utilities ────────────────────────────────────────────────
19
+ export { extractUserInput } from "./messages.js";
15
20
  // ── UI Stream ───────────────────────────────────────────────────────
16
21
  export { sessionEventsToUIStream } from "./ui-stream.js";
17
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,uEAAuE;AAEvE,OAAO;AAQL,cAAc;AACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB;AAEvB,iBAAiB;AACjB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,uEAAuE;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AAExE,OAAO,EACL,KAAK,EACL,eAAe,GAMhB,MAAM,YAAY,CAAC;AAEpB,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,eAAe,GAMhB,MAAM,UAAU,CAAC;AAElB,uEAAuE;AAEvE,OAAO,EACL,OAAO,EACP,yBAAyB,GAY1B,MAAM,cAAc,CAAC;AAEtB,uEAAuE;AAEvE,OAAO,EACL,cAAc,EACd,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uEAAuE;AAEvE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAUvE,uEAAuE;AAEvE,OAAO;AAQL,cAAc;AACd,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB;AAEvB,iBAAiB;AACjB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GACX,MAAM,yBAAyB,CAAC;AAEjC,wEAAwE;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,uEAAuE;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { UIMessage, ModelMessage } from "ai";
2
+ /**
3
+ * Extract user input from an AI SDK 5 UIMessage array, ready to pass
4
+ * to `session.send()` or `session.toResponse()`.
5
+ *
6
+ * - Text-only → returns `string` (fast path, preserves existing behavior)
7
+ * - Has files → returns `ModelMessage[]` with properly decoded file data
8
+ */
9
+ export declare function extractUserInput(messages: UIMessage[]): Promise<string | ModelMessage[]>;
10
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAElD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,SAAS,EAAE,GACpB,OAAO,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC,CA2ClC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Extract user input from an AI SDK 5 UIMessage array, ready to pass
3
+ * to `session.send()` or `session.toResponse()`.
4
+ *
5
+ * - Text-only → returns `string` (fast path, preserves existing behavior)
6
+ * - Has files → returns `ModelMessage[]` with properly decoded file data
7
+ */
8
+ export async function extractUserInput(messages) {
9
+ if (messages.length === 0) {
10
+ throw new Error("extractUserInput: messages array is empty");
11
+ }
12
+ const lastMessage = messages[messages.length - 1];
13
+ if (lastMessage.role !== "user") {
14
+ throw new Error(`extractUserInput: last message has role "${lastMessage.role}", expected "user"`);
15
+ }
16
+ const hasFiles = lastMessage.parts.some((p) => p.type === "file");
17
+ if (!hasFiles) {
18
+ // Text-only fast path
19
+ return lastMessage.parts
20
+ .filter((p) => p.type === "text")
21
+ .map((p) => p.text)
22
+ .join("");
23
+ }
24
+ // Has files — build ModelMessage manually so data URLs are decoded to
25
+ // raw base64, which is what FilePart.data expects. convertToModelMessages
26
+ // passes data URLs through as-is, causing providers to attempt an HTTP
27
+ // download of the data: scheme which fails.
28
+ const content = [];
29
+ for (const part of lastMessage.parts) {
30
+ if (part.type === "text") {
31
+ content.push({ type: "text", text: part.text });
32
+ }
33
+ else if (part.type === "file") {
34
+ const filePart = part;
35
+ content.push({
36
+ type: "file",
37
+ data: stripDataUrlPrefix(filePart.url),
38
+ mediaType: filePart.mediaType,
39
+ ...(filePart.filename ? { filename: filePart.filename } : {}),
40
+ });
41
+ }
42
+ }
43
+ return [{ role: "user", content }];
44
+ }
45
+ /**
46
+ * Strip the `data:<mediaType>;base64,` prefix from a data URL,
47
+ * returning raw base64. Non-data URLs are returned as-is.
48
+ */
49
+ function stripDataUrlPrefix(url) {
50
+ const match = url.match(/^data:[^;]+;base64,(.*)$/);
51
+ return match ? match[1] : url;
52
+ }
53
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAqB;IAErB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,4CAA4C,WAAW,CAAC,IAAI,oBAAoB,CACjF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAElE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,sBAAsB;QACtB,OAAO,WAAW,CAAC,KAAK;aACrB,MAAM,CAAC,CAAC,CAAC,EAA4C,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAC1E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,uEAAuE;IACvE,4CAA4C;IAC5C,MAAM,OAAO,GAAiH,EAAE,CAAC;IAEjI,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,IAA2E,CAAC;YAC7F,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACtC,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAmB,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAChC,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface SkillInfo {
2
+ /** Unique skill identifier (lowercase, hyphenated). */
3
+ name: string;
4
+ /** Short description of what the skill does. */
5
+ description: string;
6
+ /** Absolute path to the SKILL.md file. */
7
+ location: string;
8
+ /** Markdown body (after frontmatter). */
9
+ content: string;
10
+ }
11
+ export interface SkillsConfig {
12
+ /**
13
+ * Directories to scan for `** /SKILL.md` files.
14
+ * Supports absolute paths, relative paths (resolved from cwd), and `~/…` paths.
15
+ * Later paths take precedence — a skill with the same name overwrites an earlier one.
16
+ */
17
+ paths?: string[];
18
+ }
19
+ /**
20
+ * Scan configured paths for `SKILL.md` files and return parsed skill info.
21
+ * Later paths overwrite earlier ones when names collide.
22
+ */
23
+ export declare function discoverSkills(config: SkillsConfig): Promise<SkillInfo[]>;
24
+ /**
25
+ * List auxiliary files in a skill directory (everything except SKILL.md).
26
+ * Returns up to `limit` absolute paths.
27
+ */
28
+ export declare function scanSkillFiles(dir: string, limit?: number): Promise<string[]>;
29
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAgB/E;AA0GD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB/E"}
package/dist/skills.js ADDED
@@ -0,0 +1,134 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ // ── Discovery ─────────────────────────────────────────────────────────
5
+ const SKILL_NAME_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
6
+ /**
7
+ * Scan configured paths for `SKILL.md` files and return parsed skill info.
8
+ * Later paths overwrite earlier ones when names collide.
9
+ */
10
+ export async function discoverSkills(config) {
11
+ const skills = new Map();
12
+ for (const raw of config.paths ?? []) {
13
+ const resolved = resolvePath(raw);
14
+ const matches = await findSkillFiles(resolved);
15
+ for (const match of matches) {
16
+ const info = await parseSkillFile(match);
17
+ if (info) {
18
+ skills.set(info.name, info);
19
+ }
20
+ }
21
+ }
22
+ return Array.from(skills.values());
23
+ }
24
+ /**
25
+ * Minimal YAML frontmatter parser. Handles the simple `key: value` format
26
+ * used by SKILL.md files without requiring an external dependency.
27
+ */
28
+ function parseFrontmatter(raw) {
29
+ const trimmed = raw.trimStart();
30
+ if (!trimmed.startsWith("---"))
31
+ return null;
32
+ const endIndex = trimmed.indexOf("\n---", 3);
33
+ if (endIndex === -1)
34
+ return null;
35
+ const yamlBlock = trimmed.slice(3, endIndex).trim();
36
+ const content = trimmed.slice(endIndex + 4).trim();
37
+ const data = {};
38
+ for (const line of yamlBlock.split("\n")) {
39
+ const colonIndex = line.indexOf(":");
40
+ if (colonIndex === -1)
41
+ continue;
42
+ const key = line.slice(0, colonIndex).trim();
43
+ // Take everything after the first colon so values containing colons are preserved
44
+ const value = line.slice(colonIndex + 1).trim();
45
+ if (key && value) {
46
+ data[key] = value;
47
+ }
48
+ }
49
+ return { data, content };
50
+ }
51
+ async function parseSkillFile(filePath) {
52
+ let raw;
53
+ try {
54
+ raw = await fs.readFile(filePath, "utf-8");
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ const parsed = parseFrontmatter(raw);
60
+ if (!parsed) {
61
+ console.warn(`[skills] Could not parse frontmatter: ${filePath}`);
62
+ return null;
63
+ }
64
+ const { name, description } = parsed.data;
65
+ if (!name || !description) {
66
+ console.warn(`[skills] Missing name or description in frontmatter: ${filePath}`);
67
+ return null;
68
+ }
69
+ if (!SKILL_NAME_RE.test(name)) {
70
+ console.warn(`[skills] Invalid skill name "${name}" in ${filePath}. ` +
71
+ `Must be lowercase alphanumeric with single hyphens.`);
72
+ return null;
73
+ }
74
+ return {
75
+ name,
76
+ description,
77
+ location: filePath,
78
+ content: parsed.content,
79
+ };
80
+ }
81
+ // ── File system helpers ───────────────────────────────────────────────
82
+ function resolvePath(raw) {
83
+ if (raw.startsWith("~/")) {
84
+ return path.join(os.homedir(), raw.slice(2));
85
+ }
86
+ return path.resolve(raw);
87
+ }
88
+ /**
89
+ * Recursively find all `SKILL.md` files under `dir`.
90
+ */
91
+ async function findSkillFiles(dir) {
92
+ let entries;
93
+ try {
94
+ entries = await fs.readdir(dir, { withFileTypes: true, recursive: true });
95
+ }
96
+ catch {
97
+ // Directory doesn't exist or isn't readable — silently skip
98
+ return [];
99
+ }
100
+ const results = [];
101
+ for (const entry of entries) {
102
+ if (entry.name === "SKILL.md" && !entry.isDirectory()) {
103
+ const parent = entry.parentPath ?? entry.path ?? dir;
104
+ results.push(path.join(parent, entry.name));
105
+ }
106
+ }
107
+ return results;
108
+ }
109
+ /**
110
+ * List auxiliary files in a skill directory (everything except SKILL.md).
111
+ * Returns up to `limit` absolute paths.
112
+ */
113
+ export async function scanSkillFiles(dir, limit = 10) {
114
+ let entries;
115
+ try {
116
+ entries = await fs.readdir(dir, { withFileTypes: true, recursive: true });
117
+ }
118
+ catch {
119
+ return [];
120
+ }
121
+ const files = [];
122
+ for (const entry of entries) {
123
+ if (entry.isDirectory())
124
+ continue;
125
+ if (entry.name === "SKILL.md")
126
+ continue;
127
+ const parent = entry.parentPath ?? entry.path ?? dir;
128
+ files.push(path.join(parent, entry.name));
129
+ if (files.length >= limit)
130
+ break;
131
+ }
132
+ return files;
133
+ }
134
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type SkillInfo } from "../skills.js";
2
+ /**
3
+ * Create a `skill` tool that lets the LLM load skill instructions into the conversation.
4
+ *
5
+ * The tool description includes an XML listing of available skills so the model
6
+ * knows what it can invoke. When called, it returns the skill's markdown body
7
+ * along with a list of auxiliary files in the skill directory.
8
+ */
9
+ export declare function createSkillTool(skills: SkillInfo[]): import("ai").Tool<{
10
+ name: string;
11
+ }, string>;
12
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,cAAc,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE;;WAwDlD"}
@@ -0,0 +1,61 @@
1
+ import { tool } from "ai";
2
+ import { z } from "zod";
3
+ import path from "node:path";
4
+ import { scanSkillFiles } from "../skills.js";
5
+ /**
6
+ * Create a `skill` tool that lets the LLM load skill instructions into the conversation.
7
+ *
8
+ * The tool description includes an XML listing of available skills so the model
9
+ * knows what it can invoke. When called, it returns the skill's markdown body
10
+ * along with a list of auxiliary files in the skill directory.
11
+ */
12
+ export function createSkillTool(skills) {
13
+ const byName = new Map(skills.map((s) => [s.name, s]));
14
+ const listing = skills
15
+ .map((s) => ` <skill><name>${s.name}</name><description>${s.description}</description></skill>`)
16
+ .join("\n");
17
+ const examples = skills
18
+ .slice(0, 3)
19
+ .map((s) => `'${s.name}'`)
20
+ .join(", ");
21
+ return tool({
22
+ description: [
23
+ "Load a skill to get specialized instructions for a task.",
24
+ "",
25
+ "<available_skills>",
26
+ listing,
27
+ "</available_skills>",
28
+ ].join("\n"),
29
+ inputSchema: z.object({
30
+ name: z.string().describe(`The skill name to load (e.g., ${examples})`),
31
+ }),
32
+ execute: async ({ name }) => {
33
+ const skill = byName.get(name);
34
+ if (!skill) {
35
+ const available = skills.map((s) => s.name).join(", ");
36
+ throw new Error(`Skill "${name}" not found. Available skills: ${available}`);
37
+ }
38
+ const dir = path.dirname(skill.location);
39
+ const files = await scanSkillFiles(dir);
40
+ const parts = [
41
+ `<skill_content name="${skill.name}">`,
42
+ `# Skill: ${skill.name}`,
43
+ "",
44
+ skill.content.trim(),
45
+ "",
46
+ `Base directory for this skill: ${dir}`,
47
+ "Relative paths in this skill are relative to this base directory.",
48
+ ];
49
+ if (files.length > 0) {
50
+ parts.push("", "<skill_files>");
51
+ for (const f of files) {
52
+ parts.push(`<file>${f}</file>`);
53
+ }
54
+ parts.push("</skill_files>");
55
+ }
56
+ parts.push("</skill_content>");
57
+ return parts.join("\n");
58
+ },
59
+ });
60
+ }
61
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAkB,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,uBAAuB,CAAC,CAAC,WAAW,wBAAwB,CAAC;SAChG,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,MAAM;SACpB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;SACzB,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,IAAI,CAAC;QACV,WAAW,EAAE;YACX,0DAA0D;YAC1D,EAAE;YACF,oBAAoB;YACpB,OAAO;YACP,qBAAqB;SACtB,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,QAAQ,GAAG,CAAC;SACxE,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAoB,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,kCAAkC,SAAS,EAAE,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;YAExC,MAAM,KAAK,GAAG;gBACZ,wBAAwB,KAAK,CAAC,IAAI,IAAI;gBACtC,YAAY,KAAK,CAAC,IAAI,EAAE;gBACxB,EAAE;gBACF,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;gBACpB,EAAE;gBACF,kCAAkC,GAAG,EAAE;gBACvC,mEAAmE;aACpE,CAAC;YAEF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;gBAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAClC,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/B,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAE/B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openharness/core",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "type": "module",
5
5
  "description": "Building blocks for capable, general-purpose agents",
6
6
  "exports": {