@webskill/sdk 0.1.0 → 0.1.2
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/dist/browser.d.ts +2 -2
- package/dist/browser.js +5 -3
- package/dist/{dist-CiYRkm71.js → dist-DRsnVw6A.js} +64 -26
- package/dist/{memoryArtifactStore-C9lFVqPF-U8nXvqL9.js → dist-DS1sfgHa.js} +1 -48
- package/dist/dist-DxGyAznR.js +1058 -0
- package/dist/{dist-DfKKj86A.js → dist-SarUS8EP.js} +4 -2
- package/dist/governance.d.ts +3 -3
- package/dist/governance.js +2 -2
- package/dist/{index-DuodMfQw.d.ts → index-DkPK44Ji.d.ts} +2 -2
- package/dist/{index-S8uza3ld.d.ts → index-fjRF4H5o.d.ts} +3 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/mcp.d.ts +7 -2
- package/dist/mcp.js +5 -3
- package/dist/memoryArtifactStore-C9lFVqPF-yFz6yJj0.js +48 -0
- package/dist/node.d.ts +3 -3
- package/dist/node.js +3 -3
- package/dist/{testing-pn3NhXSV.js → testing-CbM6rJ-E.js} +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +2 -2
- package/dist/{types-CgNC-oQu-DCklnS0h.d.ts → types-CgNC-oQu-Dq_A1yA-.d.ts} +2 -2
- package/dist/ui-react.d.ts +1 -1
- package/dist/ui-react.js +1 -1
- package/dist/ui-vue.d.ts +1 -1
- package/dist/ui-vue.js +1 -1
- package/dist/ui.d.ts +3 -12
- package/dist/ui.js +2 -2
- package/package.json +1 -1
- package/dist/dist-Dv4a1Jkm.js +0 -15628
package/dist/browser.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { H as SkillsLockfile, L as SkillManifest, P as SkillInstallSource, S as FileSystemProvider, W as VerifyResult, _ as RenderResultRequest, a as InteractionPolicy, c as LlmClient, d as LlmResponse, f as LlmStreamEvent, o as InteractionRequest, s as InteractionResponse, v as UiBridge, x as FileStat } from "./types-CgNC-oQu-
|
|
2
|
-
import { K as ScriptExecutionContext, Y as ToolDefinition, Z as ToolResult, _ as ExternalToolSource, _t as parseBridgeRequest, c as ApprovalScope, d as BridgeRequest, f as BridgeResponse, g as ExternalSkillProvider, k as NetworkPolicy, l as BridgeCapabilities, ot as bridgeError, q as ScriptExecutor, rt as WebSkillApi } from "./index-
|
|
1
|
+
import { H as SkillsLockfile, L as SkillManifest, P as SkillInstallSource, S as FileSystemProvider, W as VerifyResult, _ as RenderResultRequest, a as InteractionPolicy, c as LlmClient, d as LlmResponse, f as LlmStreamEvent, o as InteractionRequest, s as InteractionResponse, v as UiBridge, x as FileStat } from "./types-CgNC-oQu-Dq_A1yA-.js";
|
|
2
|
+
import { K as ScriptExecutionContext, Y as ToolDefinition, Z as ToolResult, _ as ExternalToolSource, _t as parseBridgeRequest, c as ApprovalScope, d as BridgeRequest, f as BridgeResponse, g as ExternalSkillProvider, k as NetworkPolicy, l as BridgeCapabilities, ot as bridgeError, q as ScriptExecutor, rt as WebSkillApi } from "./index-fjRF4H5o.js";
|
|
3
3
|
//#region ../browser/dist/index.d.ts
|
|
4
4
|
//#region src/fs/featureDetection.d.ts
|
|
5
5
|
/** 检测当前环境是否可用 OPFS(navigator.storage.getDirectory) */
|
package/dist/browser.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { A as normalizeToolContent, C as createWebSkillApi, D as isNetworkAllowed, O as mergeCatalogEntries, _ as RUN_SNAPSHOT_SCHEMA_VERSION, a as CapabilityApproval, b as bridgeError, c as FsMemoryStore, f as OpenAiCompatibleClient, i as AgentLoop, j as parseBridgeRequest, k as networkUrlHost, l as FsRunSnapshotStore, p as ProgressiveRouter, s as FsArtifactStore } from "./dist-
|
|
3
|
-
import { n as MockLlmClient } from "./testing-
|
|
1
|
+
import { E as verifyManifest, T as validateSkills, _ as isValidSkillName, b as parseSkillMarkdown, d as buildManifest, g as exportSkills, l as WebSkillError, n as SKILLS_LOCKFILE, o as SKILL_PACK_FILE, r as SKILL_MANIFEST_FILE, s as SkillDiscovery, u as buildCatalog, w as resolveInsideRoot, x as parseSkillPackManifest } from "./dist-DS1sfgHa.js";
|
|
2
|
+
import { A as normalizeToolContent, C as createWebSkillApi, D as isNetworkAllowed, O as mergeCatalogEntries, _ as RUN_SNAPSHOT_SCHEMA_VERSION, a as CapabilityApproval, b as bridgeError, c as FsMemoryStore, f as OpenAiCompatibleClient, i as AgentLoop, j as parseBridgeRequest, k as networkUrlHost, l as FsRunSnapshotStore, p as ProgressiveRouter, s as FsArtifactStore } from "./dist-DRsnVw6A.js";
|
|
3
|
+
import { n as MockLlmClient } from "./testing-CbM6rJ-E.js";
|
|
4
4
|
import { unzipSync } from "fflate";
|
|
5
5
|
|
|
6
6
|
//#region ../browser/dist/index.js
|
|
@@ -499,6 +499,7 @@ var BrowserSkillManager = class {
|
|
|
499
499
|
} catch (e) {
|
|
500
500
|
throw new WebSkillError("INSTALL_FAILED", `Failed to read skill name from SKILL.md: ${messageOf$1(e)}`, e);
|
|
501
501
|
}
|
|
502
|
+
if (!isValidSkillName(name)) throw new WebSkillError("INSTALL_FAILED", `Invalid skill name in SKILL.md (path traversal rejected): ${JSON.stringify(name)}`);
|
|
502
503
|
const finalRoot = `${stagingRoot}/final`;
|
|
503
504
|
const finalDir = `${finalRoot}/${name}`;
|
|
504
505
|
await copyDir(fs, skillDir, finalDir);
|
|
@@ -540,6 +541,7 @@ var BrowserSkillManager = class {
|
|
|
540
541
|
try {
|
|
541
542
|
const versions = /* @__PURE__ */ new Map();
|
|
542
543
|
for (const entry of pack.manifest.skills) {
|
|
544
|
+
if (!isValidSkillName(entry.name)) throw new WebSkillError("INSTALL_FAILED", `Invalid skill name in skill pack manifest (path traversal rejected): ${JSON.stringify(entry.name)}`);
|
|
543
545
|
const skillDir = `${pack.contentDir}/${entry.name}`;
|
|
544
546
|
if (!await fs.exists(`${skillDir}/SKILL.md`)) throw new WebSkillError("INSTALL_FAILED", `Skill pack is missing a directory for skill "${entry.name}"`);
|
|
545
547
|
let name;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S as renderAvailableSkillsXml, T as validateSkills, b as parseSkillMarkdown, c as SkillReader, l as WebSkillError, s as SkillDiscovery, u as buildCatalog, w as resolveInsideRoot } from "./dist-DS1sfgHa.js";
|
|
2
|
+
import { t as MemoryArtifactStore } from "./memoryArtifactStore-C9lFVqPF-yFz6yJj0.js";
|
|
2
3
|
|
|
3
4
|
//#region ../runtime/dist/index.js
|
|
4
5
|
const toOpenAiMessage = (msg) => {
|
|
@@ -421,7 +422,7 @@ const ASK_USER_TOOL = {
|
|
|
421
422
|
* 不暴露 fs 本体(沙箱语义,对齐 deferred-items D1)。
|
|
422
423
|
*/
|
|
423
424
|
function createScriptContext(deps) {
|
|
424
|
-
const { fs, artifactStore, skillName, skillRoot, runId, confirm, onWarning } = deps;
|
|
425
|
+
const { fs, artifactStore, skillName, skillRoot, runId, confirm, onWarning, onArtifactCreated } = deps;
|
|
425
426
|
return {
|
|
426
427
|
skillName,
|
|
427
428
|
runId,
|
|
@@ -429,17 +430,19 @@ function createScriptContext(deps) {
|
|
|
429
430
|
return fs.readText(resolveInsideRoot(skillRoot, `references/${relativePath}`));
|
|
430
431
|
},
|
|
431
432
|
async writeArtifact(path, content, options) {
|
|
432
|
-
|
|
433
|
+
const artifact = typeof content === "string" ? await artifactStore.createTextArtifact({
|
|
433
434
|
runId,
|
|
434
435
|
path,
|
|
435
436
|
content,
|
|
436
437
|
mimeType: options?.mimeType
|
|
437
|
-
}) : artifactStore.createBinaryArtifact({
|
|
438
|
+
}) : await artifactStore.createBinaryArtifact({
|
|
438
439
|
runId,
|
|
439
440
|
path,
|
|
440
441
|
content,
|
|
441
442
|
mimeType: options?.mimeType
|
|
442
443
|
});
|
|
444
|
+
onArtifactCreated?.(artifact);
|
|
445
|
+
return artifact;
|
|
443
446
|
},
|
|
444
447
|
...confirm ? { confirm } : {},
|
|
445
448
|
...onWarning ? { onWarning } : {}
|
|
@@ -1136,7 +1139,7 @@ var AgentLoop = class {
|
|
|
1136
1139
|
try {
|
|
1137
1140
|
const text = await state.reader.readSkillFile(skillName, pathArg);
|
|
1138
1141
|
let note = "";
|
|
1139
|
-
if (pathArg === "SKILL.md" && !state.activated.has(skillName)) note = await this.#activateSkill(skillName, state);
|
|
1142
|
+
if (pathArg === "SKILL.md" && !state.activated.has(skillName)) note = await this.#activateSkill(skillName, state, void 0, text);
|
|
1140
1143
|
return {
|
|
1141
1144
|
ok: true,
|
|
1142
1145
|
content: [{
|
|
@@ -1190,7 +1193,7 @@ var AgentLoop = class {
|
|
|
1190
1193
|
return toolError("SKILL_NOT_FOUND", `Skill not found via external providers: ${skillKey}`);
|
|
1191
1194
|
}
|
|
1192
1195
|
/** 首次读到 SKILL.md 时激活技能:加载其 scripts 工具定义,供后续轮次使用;dependencies 级联激活(via 记录来源) */
|
|
1193
|
-
async #activateSkill(skillName, state, via) {
|
|
1196
|
+
async #activateSkill(skillName, state, via, skillMdText) {
|
|
1194
1197
|
state.activated.add(skillName);
|
|
1195
1198
|
state.trace.record("skill.activated", { data: {
|
|
1196
1199
|
skillName,
|
|
@@ -1203,11 +1206,11 @@ var AgentLoop = class {
|
|
|
1203
1206
|
let allowedTools;
|
|
1204
1207
|
let dependencies = [];
|
|
1205
1208
|
try {
|
|
1206
|
-
const { metadata } = parseSkillMarkdown(await this.#deps.fs.readText(`${root}/SKILL.md`));
|
|
1209
|
+
const { metadata } = parseSkillMarkdown(skillMdText ?? await this.#deps.fs.readText(`${root}/SKILL.md`));
|
|
1207
1210
|
const rawDeps = metadata["dependencies"];
|
|
1208
1211
|
if (Array.isArray(rawDeps)) dependencies = rawDeps.filter((d) => typeof d === "string");
|
|
1209
|
-
const
|
|
1210
|
-
if (
|
|
1212
|
+
const rawAllowed = metadata["allowed-tools"];
|
|
1213
|
+
if (rawAllowed !== void 0) if (Array.isArray(rawAllowed)) allowedTools = rawAllowed.filter((e) => typeof e === "string");
|
|
1211
1214
|
else state.trace.record("run.warning", { message: `Skill "${skillName}" has a non-array "allowed-tools" metadata entry; ignored` });
|
|
1212
1215
|
} catch {}
|
|
1213
1216
|
const executor = this.#deps.executor;
|
|
@@ -1290,6 +1293,7 @@ var AgentLoop = class {
|
|
|
1290
1293
|
if (e instanceof BridgeRequestError) return toolError("UI_UNAVAILABLE", `Parameter form failed: ${e.message}`);
|
|
1291
1294
|
throw e;
|
|
1292
1295
|
}
|
|
1296
|
+
const createdIds = /* @__PURE__ */ new Set();
|
|
1293
1297
|
const context = createScriptContext({
|
|
1294
1298
|
fs: this.#deps.fs,
|
|
1295
1299
|
artifactStore: this.#deps.artifactStore,
|
|
@@ -1297,10 +1301,10 @@ var AgentLoop = class {
|
|
|
1297
1301
|
skillRoot: root,
|
|
1298
1302
|
runId: state.runId,
|
|
1299
1303
|
confirm: (message) => this.#confirm(message, state),
|
|
1300
|
-
onWarning: (message) => state.trace.record("run.warning", { message })
|
|
1304
|
+
onWarning: (message) => state.trace.record("run.warning", { message }),
|
|
1305
|
+
onArtifactCreated: (artifact) => createdIds.add(artifact.id)
|
|
1301
1306
|
});
|
|
1302
1307
|
try {
|
|
1303
|
-
const before = new Set((await this.#deps.artifactStore.listArtifacts(state.runId)).map((a) => a.id));
|
|
1304
1308
|
const result = await this.#deps.executor.execute({
|
|
1305
1309
|
skillRoot: root,
|
|
1306
1310
|
scriptName,
|
|
@@ -1308,8 +1312,10 @@ var AgentLoop = class {
|
|
|
1308
1312
|
context,
|
|
1309
1313
|
timeoutMs: state.toolTimeoutMs
|
|
1310
1314
|
});
|
|
1311
|
-
|
|
1312
|
-
|
|
1315
|
+
if (createdIds.size > 0) {
|
|
1316
|
+
const fresh = (await this.#deps.artifactStore.listArtifacts(state.runId)).filter((a) => createdIds.has(a.id));
|
|
1317
|
+
if (fresh.length > 0) result.artifacts = [...result.artifacts ?? [], ...fresh];
|
|
1318
|
+
}
|
|
1313
1319
|
await this.#bumpSkillStat(skillName, result.ok ? "successes" : "failures", state);
|
|
1314
1320
|
return result;
|
|
1315
1321
|
} catch (e) {
|
|
@@ -1623,6 +1629,16 @@ var WebSkillRuntime = class {
|
|
|
1623
1629
|
function createWebSkillApi(deps) {
|
|
1624
1630
|
const { fs, roots } = deps;
|
|
1625
1631
|
let runtime;
|
|
1632
|
+
const discoveries = /* @__PURE__ */ new Map();
|
|
1633
|
+
const discoveryFor = (paths) => {
|
|
1634
|
+
const key = paths.join("");
|
|
1635
|
+
let discovery = discoveries.get(key);
|
|
1636
|
+
if (!discovery) {
|
|
1637
|
+
discovery = new SkillDiscovery(fs, paths);
|
|
1638
|
+
discoveries.set(key, discovery);
|
|
1639
|
+
}
|
|
1640
|
+
return discovery;
|
|
1641
|
+
};
|
|
1626
1642
|
const lazyRuntime = () => {
|
|
1627
1643
|
runtime ??= new WebSkillRuntime({
|
|
1628
1644
|
fs,
|
|
@@ -1640,11 +1656,11 @@ function createWebSkillApi(deps) {
|
|
|
1640
1656
|
};
|
|
1641
1657
|
return {
|
|
1642
1658
|
async discover(path) {
|
|
1643
|
-
const { entries } = await
|
|
1659
|
+
const { entries } = await discoveryFor([path]).discover();
|
|
1644
1660
|
return buildCatalog(entries);
|
|
1645
1661
|
},
|
|
1646
1662
|
async read(name) {
|
|
1647
|
-
const { entries } = await
|
|
1663
|
+
const { entries } = await discoveryFor(roots).discover();
|
|
1648
1664
|
const entry = entries.find((e) => e.name === name);
|
|
1649
1665
|
if (!entry) throw new WebSkillError("SKILL_NOT_FOUND", `Unknown skill: ${name}`);
|
|
1650
1666
|
const skillMdPath = `${entry.root}/SKILL.md`;
|
|
@@ -1679,13 +1695,21 @@ function createWebSkillApi(deps) {
|
|
|
1679
1695
|
}
|
|
1680
1696
|
};
|
|
1681
1697
|
}
|
|
1682
|
-
/** install URL 分派:http(s)….zip → http;….git → git(无 git 能力的 manager 自行 TOOL_UNSUPPORTED
|
|
1698
|
+
/** install URL 分派:http(s)….zip → http;….git → git(无 git 能力的 manager 自行 TOOL_UNSUPPORTED);
|
|
1699
|
+
* 其余 http(s) URL → INSTALL_FAILED(不静默当 local);非 URL → local */
|
|
1683
1700
|
function sourceFromUrl(url) {
|
|
1684
1701
|
const bare = url.split("?")[0] ?? url;
|
|
1685
|
-
if (/^https?:\/\//.test(url)
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1702
|
+
if (/^https?:\/\//.test(url)) {
|
|
1703
|
+
if (bare.endsWith(".zip")) return {
|
|
1704
|
+
type: "http",
|
|
1705
|
+
url
|
|
1706
|
+
};
|
|
1707
|
+
if (bare.endsWith(".git")) return {
|
|
1708
|
+
type: "git",
|
|
1709
|
+
url
|
|
1710
|
+
};
|
|
1711
|
+
throw new WebSkillError("INSTALL_FAILED", `Unsupported install URL "${url}" (supported: http(s) URLs ending in .zip or .git, or local paths)`);
|
|
1712
|
+
}
|
|
1689
1713
|
if (bare.endsWith(".git")) return {
|
|
1690
1714
|
type: "git",
|
|
1691
1715
|
url
|
|
@@ -1758,7 +1782,12 @@ var FsMemoryStore = class {
|
|
|
1758
1782
|
async get(scope, key) {
|
|
1759
1783
|
const path = this.#keyPath(scope, key);
|
|
1760
1784
|
if (!await this.#fs.exists(path)) return void 0;
|
|
1761
|
-
|
|
1785
|
+
try {
|
|
1786
|
+
return JSON.parse(await this.#fs.readText(path));
|
|
1787
|
+
} catch {
|
|
1788
|
+
await this.#fs.remove(path);
|
|
1789
|
+
return;
|
|
1790
|
+
}
|
|
1762
1791
|
}
|
|
1763
1792
|
async set(scope, key, value) {
|
|
1764
1793
|
await this.#fs.writeText(this.#keyPath(scope, key), JSON.stringify(value, null, 2));
|
|
@@ -1775,10 +1804,14 @@ var FsMemoryStore = class {
|
|
|
1775
1804
|
if (entry.type !== "file" || !entry.path.endsWith(".json")) continue;
|
|
1776
1805
|
const fileName = entry.path.split("/").pop() ?? "";
|
|
1777
1806
|
const key = decodeURIComponent(fileName.replace(/\.json$/, ""));
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1807
|
+
try {
|
|
1808
|
+
out.push({
|
|
1809
|
+
key,
|
|
1810
|
+
value: JSON.parse(await this.#fs.readText(entry.path))
|
|
1811
|
+
});
|
|
1812
|
+
} catch {
|
|
1813
|
+
await this.#fs.remove(entry.path);
|
|
1814
|
+
}
|
|
1782
1815
|
}
|
|
1783
1816
|
return out.sort((a, b) => a.key.localeCompare(b.key));
|
|
1784
1817
|
}
|
|
@@ -1826,7 +1859,12 @@ var FsArtifactStore = class {
|
|
|
1826
1859
|
const indexPath = `${this.#root}/${runId}/${INDEX_FILE}`;
|
|
1827
1860
|
if (!await this.#fs.exists(indexPath)) return [];
|
|
1828
1861
|
const raw = await this.#fs.readText(indexPath);
|
|
1829
|
-
|
|
1862
|
+
try {
|
|
1863
|
+
return JSON.parse(raw).artifacts ?? [];
|
|
1864
|
+
} catch {
|
|
1865
|
+
await this.#fs.remove(indexPath);
|
|
1866
|
+
return [];
|
|
1867
|
+
}
|
|
1830
1868
|
}
|
|
1831
1869
|
#artifactPath(runId, artifactPath) {
|
|
1832
1870
|
return resolveInsideRoot(`${this.#root}/${runId}`, artifactPath);
|
|
@@ -587,51 +587,4 @@ const xmlRenderer = {
|
|
|
587
587
|
};
|
|
588
588
|
|
|
589
589
|
//#endregion
|
|
590
|
-
|
|
591
|
-
/** 内存 ArtifactStore:测试与浏览器降级用;索引随进程生命周期存在 */
|
|
592
|
-
var MemoryArtifactStore = class {
|
|
593
|
-
#byRun = /* @__PURE__ */ new Map();
|
|
594
|
-
#seq = 0;
|
|
595
|
-
async createTextArtifact(input) {
|
|
596
|
-
return this.#record({
|
|
597
|
-
runId: input.runId,
|
|
598
|
-
path: input.path,
|
|
599
|
-
type: "text",
|
|
600
|
-
size: new TextEncoder().encode(input.content).length,
|
|
601
|
-
mimeType: input.mimeType,
|
|
602
|
-
metadata: input.metadata
|
|
603
|
-
});
|
|
604
|
-
}
|
|
605
|
-
async createBinaryArtifact(input) {
|
|
606
|
-
return this.#record({
|
|
607
|
-
runId: input.runId,
|
|
608
|
-
path: input.path,
|
|
609
|
-
type: "binary",
|
|
610
|
-
size: input.content.length,
|
|
611
|
-
mimeType: input.mimeType,
|
|
612
|
-
metadata: input.metadata
|
|
613
|
-
});
|
|
614
|
-
}
|
|
615
|
-
async listArtifacts(runId) {
|
|
616
|
-
return [...this.#byRun.get(runId) ?? []];
|
|
617
|
-
}
|
|
618
|
-
#record(input) {
|
|
619
|
-
const artifact = {
|
|
620
|
-
id: `art-${++this.#seq}`,
|
|
621
|
-
runId: input.runId,
|
|
622
|
-
path: input.path,
|
|
623
|
-
type: input.type,
|
|
624
|
-
mimeType: input.mimeType,
|
|
625
|
-
size: input.size,
|
|
626
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
627
|
-
metadata: input.metadata
|
|
628
|
-
};
|
|
629
|
-
const list = this.#byRun.get(input.runId) ?? [];
|
|
630
|
-
list.push(artifact);
|
|
631
|
-
this.#byRun.set(input.runId, list);
|
|
632
|
-
return artifact;
|
|
633
|
-
}
|
|
634
|
-
};
|
|
635
|
-
|
|
636
|
-
//#endregion
|
|
637
|
-
export { renderAvailableSkillsXml as C, verifyManifest as D, validateSkills as E, xmlRenderer as O, parseSkillPackManifest as S, resolveInsideRoot as T, exportSkills as _, SKILL_NAME_MAX_LENGTH as a, normalizePath as b, SkillDiscovery as c, buildCatalog as d, buildManifest as f, escapeXml as g, computeDigest as h, SKILL_MANIFEST_FILE as i, SkillReader as l, checkSkillRules as m, MemoryFS as n, SKILL_NAME_PATTERN as o, checkDependencyCycles as p, SKILLS_LOCKFILE as r, SKILL_PACK_FILE as s, MemoryArtifactStore as t, WebSkillError as u, isValidSkillName as v, renderCatalogJson as w, parseSkillMarkdown as x, jsonRenderer as y };
|
|
590
|
+
export { renderCatalogJson as C, xmlRenderer as D, verifyManifest as E, renderAvailableSkillsXml as S, validateSkills as T, isValidSkillName as _, SKILL_NAME_PATTERN as a, parseSkillMarkdown as b, SkillReader as c, buildManifest as d, checkDependencyCycles as f, exportSkills as g, escapeXml as h, SKILL_NAME_MAX_LENGTH as i, WebSkillError as l, computeDigest as m, SKILLS_LOCKFILE as n, SKILL_PACK_FILE as o, checkSkillRules as p, SKILL_MANIFEST_FILE as r, SkillDiscovery as s, MemoryFS as t, buildCatalog as u, jsonRenderer as v, resolveInsideRoot as w, parseSkillPackManifest as x, normalizePath as y };
|