psadk 1.3.7 → 1.4.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.
- package/CHANGELOG.md +52 -0
- package/README.md +150 -0
- package/build/main/index.d.ts +1 -0
- package/build/main/index.js +2 -1
- package/build/main/lib/PSAI.d.ts +16 -1
- package/build/main/lib/PSAI.js +264 -79
- package/build/main/lib/PSAgent.js +77 -60
- package/build/main/lib/PSAgentConfig.d.ts +3 -0
- package/build/main/lib/PSAgentLogger.js +12 -9
- package/build/main/lib/PSAgentTask.js +4 -1
- package/build/main/lib/PSAgentTool.js +12 -2
- package/build/main/lib/agent-core/agent-loop.d.ts +23 -0
- package/build/main/lib/agent-core/agent-loop.js +483 -0
- package/build/main/lib/agent-core/agent.d.ts +124 -0
- package/build/main/lib/agent-core/agent.js +419 -0
- package/build/main/lib/agent-core/harness/agent-harness.d.ts +84 -0
- package/build/main/lib/agent-core/harness/agent-harness.js +772 -0
- package/build/main/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
- package/build/main/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
- package/build/main/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
- package/build/main/lib/agent-core/harness/compaction/compaction.js +637 -0
- package/build/main/lib/agent-core/harness/compaction/utils.d.ts +37 -0
- package/build/main/lib/agent-core/harness/compaction/utils.js +153 -0
- package/build/main/lib/agent-core/harness/env/nodejs.d.ts +43 -0
- package/build/main/lib/agent-core/harness/env/nodejs.js +353 -0
- package/build/main/lib/agent-core/harness/execution-env.d.ts +3 -0
- package/build/main/lib/agent-core/harness/execution-env.js +3 -0
- package/build/main/lib/agent-core/harness/messages.d.ts +50 -0
- package/build/main/lib/agent-core/harness/messages.js +116 -0
- package/build/main/lib/agent-core/harness/prompt-templates.d.ts +44 -0
- package/build/main/lib/agent-core/harness/prompt-templates.js +204 -0
- package/build/main/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
- package/build/main/lib/agent-core/harness/session/repo/jsonl.js +98 -0
- package/build/main/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
- package/build/main/lib/agent-core/harness/session/repo/memory.js +46 -0
- package/build/main/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
- package/build/main/lib/agent-core/harness/session/repo/shared.js +31 -0
- package/build/main/lib/agent-core/harness/session/session.d.ts +31 -0
- package/build/main/lib/agent-core/harness/session/session.js +199 -0
- package/build/main/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
- package/build/main/lib/agent-core/harness/session/storage/jsonl.js +170 -0
- package/build/main/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
- package/build/main/lib/agent-core/harness/session/storage/memory.js +94 -0
- package/build/main/lib/agent-core/harness/skills.d.ts +40 -0
- package/build/main/lib/agent-core/harness/skills.js +266 -0
- package/build/main/lib/agent-core/harness/system-prompt.d.ts +2 -0
- package/build/main/lib/agent-core/harness/system-prompt.js +30 -0
- package/build/main/lib/agent-core/harness/types.d.ts +524 -0
- package/build/main/lib/agent-core/harness/types.js +16 -0
- package/build/main/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
- package/build/main/lib/agent-core/harness/utils/shell-output.js +101 -0
- package/build/main/lib/agent-core/harness/utils/truncate.d.ts +69 -0
- package/build/main/lib/agent-core/harness/utils/truncate.js +208 -0
- package/build/main/lib/agent-core/index.d.ts +19 -0
- package/build/main/lib/agent-core/index.js +25 -0
- package/build/main/lib/agent-core/package.json +3 -0
- package/build/main/lib/agent-core/proxy.d.ts +68 -0
- package/build/main/lib/agent-core/proxy.js +294 -0
- package/build/main/lib/agent-core/types.d.ts +385 -0
- package/build/main/lib/agent-core/types.js +2 -0
- package/build/main/lib/skills/constants.js +6 -4
- package/build/main/lib/skills/skillParser.js +2 -2
- package/build/main/lib/skills/utils.js +8 -10
- package/build/main/lib/tools/BraveWebSearchTool.js +4 -3
- package/build/main/lib/tools/PSArtifactTool.js +3 -3
- package/build/main/lib/tools/PSClarifyTool.js +3 -2
- package/build/main/lib/tools/PSCommandLineTool.js +8 -7
- package/build/main/lib/tools/PSMemoryTool.js +9 -7
- package/build/main/lib/tools/PSReadFileTool.js +3 -3
- package/build/main/lib/tools/PSRetrievalTool.d.ts +127 -0
- package/build/main/lib/tools/PSRetrievalTool.js +172 -0
- package/build/main/lib/tools/PSSkillTool.js +6 -4
- package/build/main/lib/tools/PSSubAgentTool.js +4 -5
- package/build/main/lib/tools/PSWriteFileTool.js +3 -3
- package/build/main/lib/tools/TodoTool.js +8 -4
- package/build/main/lib/utils/helpers.d.ts +34 -0
- package/build/main/lib/utils/helpers.js +281 -13
- package/build/module/index.d.ts +1 -0
- package/build/module/index.js +2 -1
- package/build/module/lib/PSAI.d.ts +16 -1
- package/build/module/lib/PSAI.js +229 -85
- package/build/module/lib/PSAgentConfig.d.ts +3 -0
- package/build/module/lib/agent-core/agent-loop.d.ts +23 -0
- package/build/module/lib/agent-core/agent-loop.js +483 -0
- package/build/module/lib/agent-core/agent.d.ts +124 -0
- package/build/module/lib/agent-core/agent.js +419 -0
- package/build/module/lib/agent-core/harness/agent-harness.d.ts +84 -0
- package/build/module/lib/agent-core/harness/agent-harness.js +772 -0
- package/build/module/lib/agent-core/harness/compaction/branch-summarization.d.ts +87 -0
- package/build/module/lib/agent-core/harness/compaction/branch-summarization.js +246 -0
- package/build/module/lib/agent-core/harness/compaction/compaction.d.ts +121 -0
- package/build/module/lib/agent-core/harness/compaction/compaction.js +637 -0
- package/build/module/lib/agent-core/harness/compaction/utils.d.ts +37 -0
- package/build/module/lib/agent-core/harness/compaction/utils.js +153 -0
- package/build/module/lib/agent-core/harness/env/nodejs.d.ts +43 -0
- package/build/module/lib/agent-core/harness/env/nodejs.js +353 -0
- package/build/module/lib/agent-core/harness/execution-env.d.ts +3 -0
- package/build/module/lib/agent-core/harness/execution-env.js +3 -0
- package/build/module/lib/agent-core/harness/messages.d.ts +50 -0
- package/build/module/lib/agent-core/harness/messages.js +116 -0
- package/build/module/lib/agent-core/harness/prompt-templates.d.ts +44 -0
- package/build/module/lib/agent-core/harness/prompt-templates.js +204 -0
- package/build/module/lib/agent-core/harness/session/repo/jsonl.d.ts +19 -0
- package/build/module/lib/agent-core/harness/session/repo/jsonl.js +98 -0
- package/build/module/lib/agent-core/harness/session/repo/memory.d.ts +17 -0
- package/build/module/lib/agent-core/harness/session/repo/memory.js +46 -0
- package/build/module/lib/agent-core/harness/session/repo/shared.d.ts +9 -0
- package/build/module/lib/agent-core/harness/session/repo/shared.js +31 -0
- package/build/module/lib/agent-core/harness/session/session.d.ts +31 -0
- package/build/module/lib/agent-core/harness/session/session.js +199 -0
- package/build/module/lib/agent-core/harness/session/storage/jsonl.d.ts +29 -0
- package/build/module/lib/agent-core/harness/session/storage/jsonl.js +170 -0
- package/build/module/lib/agent-core/harness/session/storage/memory.d.ts +25 -0
- package/build/module/lib/agent-core/harness/session/storage/memory.js +94 -0
- package/build/module/lib/agent-core/harness/skills.d.ts +40 -0
- package/build/module/lib/agent-core/harness/skills.js +266 -0
- package/build/module/lib/agent-core/harness/system-prompt.d.ts +2 -0
- package/build/module/lib/agent-core/harness/system-prompt.js +30 -0
- package/build/module/lib/agent-core/harness/types.d.ts +524 -0
- package/build/module/lib/agent-core/harness/types.js +16 -0
- package/build/module/lib/agent-core/harness/utils/shell-output.d.ts +13 -0
- package/build/module/lib/agent-core/harness/utils/shell-output.js +101 -0
- package/build/module/lib/agent-core/harness/utils/truncate.d.ts +69 -0
- package/build/module/lib/agent-core/harness/utils/truncate.js +208 -0
- package/build/module/lib/agent-core/index.d.ts +19 -0
- package/build/module/lib/agent-core/index.js +25 -0
- package/build/module/lib/agent-core/proxy.d.ts +68 -0
- package/build/module/lib/agent-core/proxy.js +294 -0
- package/build/module/lib/agent-core/types.d.ts +385 -0
- package/build/module/lib/agent-core/types.js +2 -0
- package/build/module/lib/tools/PSRetrievalTool.d.ts +127 -0
- package/build/module/lib/tools/PSRetrievalTool.js +172 -0
- package/build/module/lib/tools/PSSkillTool.js +1 -1
- package/build/module/lib/utils/helpers.d.ts +34 -0
- package/build/module/lib/utils/helpers.js +280 -1
- package/package.json +20 -3
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import ignore from 'ignore';
|
|
2
|
+
import { parse } from 'yaml';
|
|
3
|
+
const MAX_NAME_LENGTH = 64;
|
|
4
|
+
const MAX_DESCRIPTION_LENGTH = 1024;
|
|
5
|
+
const IGNORE_FILE_NAMES = ['.gitignore', '.ignore', '.fdignore'];
|
|
6
|
+
/** Format a skill invocation prompt, optionally appending additional user instructions. */
|
|
7
|
+
export function formatSkillInvocation(skill, additionalInstructions) {
|
|
8
|
+
const skillBlock = `<skill name="${skill.name}" location="${skill.filePath}">\nReferences are relative to ${dirnameEnvPath(skill.filePath)}.\n\n${skill.content}\n</skill>`;
|
|
9
|
+
return additionalInstructions
|
|
10
|
+
? `${skillBlock}\n\n${additionalInstructions}`
|
|
11
|
+
: skillBlock;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Load skills from one or more directories.
|
|
15
|
+
*
|
|
16
|
+
* Traverses directories recursively, loads `SKILL.md` files, loads direct root `.md` files as skills, honors ignore files,
|
|
17
|
+
* and returns diagnostics for invalid skill files. Missing input directories are skipped.
|
|
18
|
+
*/
|
|
19
|
+
export async function loadSkills(env, dirs) {
|
|
20
|
+
const skills = [];
|
|
21
|
+
const diagnostics = [];
|
|
22
|
+
for (const dir of Array.isArray(dirs) ? dirs : [dirs]) {
|
|
23
|
+
const rootInfo = await safeFileInfo(env, dir);
|
|
24
|
+
if (!rootInfo || (await resolveKind(env, rootInfo)) !== 'directory')
|
|
25
|
+
continue;
|
|
26
|
+
const result = await loadSkillsFromDirInternal(env, rootInfo.path, true, ignore(), rootInfo.path);
|
|
27
|
+
skills.push(...result.skills);
|
|
28
|
+
diagnostics.push(...result.diagnostics);
|
|
29
|
+
}
|
|
30
|
+
return { skills, diagnostics };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Load skills from source-tagged directories.
|
|
34
|
+
*
|
|
35
|
+
* Source values are preserved exactly and attached to every loaded skill and diagnostic. The agent package does not
|
|
36
|
+
* interpret source values; applications define their own provenance shape.
|
|
37
|
+
*/
|
|
38
|
+
export async function loadSourcedSkills(env, inputs, mapSkill) {
|
|
39
|
+
const skills = [];
|
|
40
|
+
const diagnostics = [];
|
|
41
|
+
for (const input of inputs) {
|
|
42
|
+
const result = await loadSkills(env, input.path);
|
|
43
|
+
for (const skill of result.skills) {
|
|
44
|
+
skills.push({
|
|
45
|
+
skill: mapSkill ? mapSkill(skill, input.source) : skill,
|
|
46
|
+
source: input.source,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
for (const diagnostic of result.diagnostics)
|
|
50
|
+
diagnostics.push({ ...diagnostic, source: input.source });
|
|
51
|
+
}
|
|
52
|
+
return { skills, diagnostics };
|
|
53
|
+
}
|
|
54
|
+
async function loadSkillsFromDirInternal(env, dir, includeRootFiles, ignoreMatcher, rootDir) {
|
|
55
|
+
const skills = [];
|
|
56
|
+
const diagnostics = [];
|
|
57
|
+
if (!(await env.exists(dir)))
|
|
58
|
+
return { skills, diagnostics };
|
|
59
|
+
const dirInfo = await safeFileInfo(env, dir);
|
|
60
|
+
if (!dirInfo || (await resolveKind(env, dirInfo)) !== 'directory')
|
|
61
|
+
return { skills, diagnostics };
|
|
62
|
+
await addIgnoreRules(env, ignoreMatcher, dir, rootDir);
|
|
63
|
+
let entries;
|
|
64
|
+
try {
|
|
65
|
+
entries = await env.listDir(dir);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return { skills, diagnostics };
|
|
69
|
+
}
|
|
70
|
+
for (const entry of entries) {
|
|
71
|
+
if (entry.name !== 'SKILL.md')
|
|
72
|
+
continue;
|
|
73
|
+
const fullPath = entry.path;
|
|
74
|
+
const kind = await resolveKind(env, entry);
|
|
75
|
+
if (kind !== 'file')
|
|
76
|
+
continue;
|
|
77
|
+
const relPath = relativeEnvPath(rootDir, fullPath);
|
|
78
|
+
if (ignoreMatcher.ignores(relPath))
|
|
79
|
+
continue;
|
|
80
|
+
const result = await loadSkillFromFile(env, fullPath);
|
|
81
|
+
if (result.skill)
|
|
82
|
+
skills.push(result.skill);
|
|
83
|
+
diagnostics.push(...result.diagnostics);
|
|
84
|
+
return { skills, diagnostics };
|
|
85
|
+
}
|
|
86
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
87
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules')
|
|
88
|
+
continue;
|
|
89
|
+
const fullPath = entry.path;
|
|
90
|
+
const kind = await resolveKind(env, entry);
|
|
91
|
+
if (!kind)
|
|
92
|
+
continue;
|
|
93
|
+
const relPath = relativeEnvPath(rootDir, fullPath);
|
|
94
|
+
const ignorePath = kind === 'directory' ? `${relPath}/` : relPath;
|
|
95
|
+
if (ignoreMatcher.ignores(ignorePath))
|
|
96
|
+
continue;
|
|
97
|
+
if (kind === 'directory') {
|
|
98
|
+
const result = await loadSkillsFromDirInternal(env, fullPath, false, ignoreMatcher, rootDir);
|
|
99
|
+
skills.push(...result.skills);
|
|
100
|
+
diagnostics.push(...result.diagnostics);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (kind !== 'file' || !includeRootFiles || !entry.name.endsWith('.md'))
|
|
104
|
+
continue;
|
|
105
|
+
const result = await loadSkillFromFile(env, fullPath);
|
|
106
|
+
if (result.skill)
|
|
107
|
+
skills.push(result.skill);
|
|
108
|
+
diagnostics.push(...result.diagnostics);
|
|
109
|
+
}
|
|
110
|
+
return { skills, diagnostics };
|
|
111
|
+
}
|
|
112
|
+
async function addIgnoreRules(env, ig, dir, rootDir) {
|
|
113
|
+
const relativeDir = relativeEnvPath(rootDir, dir);
|
|
114
|
+
const prefix = relativeDir ? `${relativeDir}/` : '';
|
|
115
|
+
for (const filename of IGNORE_FILE_NAMES) {
|
|
116
|
+
const ignorePath = joinEnvPath(dir, filename);
|
|
117
|
+
const info = await safeFileInfo(env, ignorePath);
|
|
118
|
+
if (info?.kind !== 'file')
|
|
119
|
+
continue;
|
|
120
|
+
try {
|
|
121
|
+
const content = await env.readTextFile(ignorePath);
|
|
122
|
+
const patterns = content
|
|
123
|
+
.split(/\r?\n/)
|
|
124
|
+
.map((line) => prefixIgnorePattern(line, prefix))
|
|
125
|
+
.filter((line) => Boolean(line));
|
|
126
|
+
if (patterns.length > 0)
|
|
127
|
+
ig.add(patterns);
|
|
128
|
+
}
|
|
129
|
+
catch { }
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function prefixIgnorePattern(line, prefix) {
|
|
133
|
+
const trimmed = line.trim();
|
|
134
|
+
if (!trimmed)
|
|
135
|
+
return null;
|
|
136
|
+
if (trimmed.startsWith('#') && !trimmed.startsWith('\\#'))
|
|
137
|
+
return null;
|
|
138
|
+
let pattern = line;
|
|
139
|
+
let negated = false;
|
|
140
|
+
if (pattern.startsWith('!')) {
|
|
141
|
+
negated = true;
|
|
142
|
+
pattern = pattern.slice(1);
|
|
143
|
+
}
|
|
144
|
+
else if (pattern.startsWith('\\!')) {
|
|
145
|
+
pattern = pattern.slice(1);
|
|
146
|
+
}
|
|
147
|
+
if (pattern.startsWith('/'))
|
|
148
|
+
pattern = pattern.slice(1);
|
|
149
|
+
const prefixed = prefix ? `${prefix}${pattern}` : pattern;
|
|
150
|
+
return negated ? `!${prefixed}` : prefixed;
|
|
151
|
+
}
|
|
152
|
+
async function loadSkillFromFile(env, filePath) {
|
|
153
|
+
const diagnostics = [];
|
|
154
|
+
try {
|
|
155
|
+
const rawContent = await env.readTextFile(filePath);
|
|
156
|
+
const { frontmatter, body } = parseFrontmatter(rawContent);
|
|
157
|
+
const skillDir = dirnameEnvPath(filePath);
|
|
158
|
+
const parentDirName = basenameEnvPath(skillDir);
|
|
159
|
+
for (const error of validateDescription(frontmatter.description)) {
|
|
160
|
+
diagnostics.push({ type: 'warning', message: error, path: filePath });
|
|
161
|
+
}
|
|
162
|
+
const name = frontmatter.name || parentDirName;
|
|
163
|
+
for (const error of validateName(name, parentDirName)) {
|
|
164
|
+
diagnostics.push({ type: 'warning', message: error, path: filePath });
|
|
165
|
+
}
|
|
166
|
+
if (!frontmatter.description || frontmatter.description.trim() === '') {
|
|
167
|
+
return { skill: null, diagnostics };
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
skill: {
|
|
171
|
+
name,
|
|
172
|
+
description: frontmatter.description,
|
|
173
|
+
content: body,
|
|
174
|
+
filePath,
|
|
175
|
+
disableModelInvocation: frontmatter['disable-model-invocation'] === true,
|
|
176
|
+
},
|
|
177
|
+
diagnostics,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const message = error instanceof Error ? error.message : 'failed to parse skill file';
|
|
182
|
+
diagnostics.push({ type: 'warning', message, path: filePath });
|
|
183
|
+
return { skill: null, diagnostics };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function validateName(name, parentDirName) {
|
|
187
|
+
const errors = [];
|
|
188
|
+
if (name !== parentDirName)
|
|
189
|
+
errors.push(`name "${name}" does not match parent directory "${parentDirName}"`);
|
|
190
|
+
if (name.length > MAX_NAME_LENGTH)
|
|
191
|
+
errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);
|
|
192
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
193
|
+
errors.push('name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)');
|
|
194
|
+
}
|
|
195
|
+
if (name.startsWith('-') || name.endsWith('-'))
|
|
196
|
+
errors.push('name must not start or end with a hyphen');
|
|
197
|
+
if (name.includes('--'))
|
|
198
|
+
errors.push('name must not contain consecutive hyphens');
|
|
199
|
+
return errors;
|
|
200
|
+
}
|
|
201
|
+
function validateDescription(description) {
|
|
202
|
+
const errors = [];
|
|
203
|
+
if (!description || description.trim() === '') {
|
|
204
|
+
errors.push('description is required');
|
|
205
|
+
}
|
|
206
|
+
else if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
207
|
+
errors.push(`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`);
|
|
208
|
+
}
|
|
209
|
+
return errors;
|
|
210
|
+
}
|
|
211
|
+
function parseFrontmatter(content) {
|
|
212
|
+
const normalized = content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
213
|
+
if (!normalized.startsWith('---'))
|
|
214
|
+
return { frontmatter: {}, body: normalized };
|
|
215
|
+
const endIndex = normalized.indexOf('\n---', 3);
|
|
216
|
+
if (endIndex === -1)
|
|
217
|
+
return { frontmatter: {}, body: normalized };
|
|
218
|
+
const yamlString = normalized.slice(4, endIndex);
|
|
219
|
+
const body = normalized.slice(endIndex + 4).trim();
|
|
220
|
+
return { frontmatter: (parse(yamlString) ?? {}), body };
|
|
221
|
+
}
|
|
222
|
+
async function safeFileInfo(env, path) {
|
|
223
|
+
try {
|
|
224
|
+
return await env.fileInfo(path);
|
|
225
|
+
}
|
|
226
|
+
catch {
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
async function resolveKind(env, info) {
|
|
231
|
+
if (info.kind === 'file' || info.kind === 'directory')
|
|
232
|
+
return info.kind;
|
|
233
|
+
try {
|
|
234
|
+
const realPath = await env.realPath(info.path);
|
|
235
|
+
const target = await env.fileInfo(realPath);
|
|
236
|
+
return target.kind === 'file' || target.kind === 'directory'
|
|
237
|
+
? target.kind
|
|
238
|
+
: undefined;
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return undefined;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function joinEnvPath(base, child) {
|
|
245
|
+
return `${base.replace(/\/+$/, '')}/${child.replace(/^\/+/, '')}`;
|
|
246
|
+
}
|
|
247
|
+
function dirnameEnvPath(path) {
|
|
248
|
+
const normalized = path.replace(/\/+$/, '');
|
|
249
|
+
const slashIndex = normalized.lastIndexOf('/');
|
|
250
|
+
return slashIndex <= 0 ? '/' : normalized.slice(0, slashIndex);
|
|
251
|
+
}
|
|
252
|
+
function basenameEnvPath(path) {
|
|
253
|
+
const normalized = path.replace(/\/+$/, '');
|
|
254
|
+
const slashIndex = normalized.lastIndexOf('/');
|
|
255
|
+
return slashIndex === -1 ? normalized : normalized.slice(slashIndex + 1);
|
|
256
|
+
}
|
|
257
|
+
function relativeEnvPath(root, path) {
|
|
258
|
+
const normalizedRoot = root.replace(/\/+$/, '');
|
|
259
|
+
const normalizedPath = path.replace(/\/+$/, '');
|
|
260
|
+
if (normalizedPath === normalizedRoot)
|
|
261
|
+
return '';
|
|
262
|
+
return normalizedPath.startsWith(`${normalizedRoot}/`)
|
|
263
|
+
? normalizedPath.slice(normalizedRoot.length + 1)
|
|
264
|
+
: normalizedPath.replace(/^\/+/, '');
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9hZ2VudC1jb3JlL2hhcm5lc3Mvc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTdCLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQztBQUNwQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQXFCakUsMkZBQTJGO0FBQzNGLE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsS0FBWSxFQUNaLHNCQUErQjtJQUUvQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsS0FBSyxDQUFDLElBQUksZUFBZSxLQUFLLENBQUMsUUFBUSxrQ0FBa0MsY0FBYyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLENBQUMsT0FBTyxZQUFZLENBQUM7SUFDNUssT0FBTyxzQkFBc0I7UUFDM0IsQ0FBQyxDQUFDLEdBQUcsVUFBVSxPQUFPLHNCQUFzQixFQUFFO1FBQzlDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxVQUFVLENBQzlCLEdBQWlCLEVBQ2pCLElBQXVCO0lBRXZCLE1BQU0sTUFBTSxHQUFZLEVBQUUsQ0FBQztJQUMzQixNQUFNLFdBQVcsR0FBc0IsRUFBRSxDQUFDO0lBQzFDLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxZQUFZ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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function formatSkillsForSystemPrompt(skills) {
|
|
2
|
+
const visibleSkills = skills.filter((skill) => !skill.disableModelInvocation);
|
|
3
|
+
if (visibleSkills.length === 0)
|
|
4
|
+
return '';
|
|
5
|
+
const lines = [
|
|
6
|
+
'The following skills provide specialized instructions for specific tasks.',
|
|
7
|
+
'Read the full skill file when the task matches its description.',
|
|
8
|
+
'When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.',
|
|
9
|
+
'',
|
|
10
|
+
'<available_skills>',
|
|
11
|
+
];
|
|
12
|
+
for (const skill of visibleSkills) {
|
|
13
|
+
lines.push(' <skill>');
|
|
14
|
+
lines.push(` <name>${escapeXml(skill.name)}</name>`);
|
|
15
|
+
lines.push(` <description>${escapeXml(skill.description)}</description>`);
|
|
16
|
+
lines.push(` <location>${escapeXml(skill.filePath)}</location>`);
|
|
17
|
+
lines.push(' </skill>');
|
|
18
|
+
}
|
|
19
|
+
lines.push('</available_skills>');
|
|
20
|
+
return lines.join('\n');
|
|
21
|
+
}
|
|
22
|
+
function escapeXml(value) {
|
|
23
|
+
return value
|
|
24
|
+
.replace(/&/g, '&')
|
|
25
|
+
.replace(/</g, '<')
|
|
26
|
+
.replace(/>/g, '>')
|
|
27
|
+
.replace(/"/g, '"')
|
|
28
|
+
.replace(/'/g, ''');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXByb21wdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvYWdlbnQtY29yZS9oYXJuZXNzL3N5c3RlbS1wcm9tcHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLDJCQUEyQixDQUFDLE1BQWU7SUFDekQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM5RSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHO1FBQ1osMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUNqRSw4S0FBOEs7UUFDOUssRUFBRTtRQUNGLG9CQUFvQjtLQUNyQixDQUFDO0lBRUYsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RCxLQUFLLENBQUMsSUFBSSxDQUNSLG9CQUFvQixTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FDakUsQ0FBQztRQUNGLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUNsQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWE7SUFDOUIsT0FBTyxLQUFLO1NBQ1QsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7U0FDdEIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUM7U0FDdkIsT0FBTyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM3QixDQUFDIn0=
|