daycare-cli 0.0.15 → 0.0.17
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/engine/agents/agent.d.ts.map +1 -1
- package/dist/engine/agents/agent.js +4 -1
- package/dist/engine/agents/agent.js.map +1 -1
- package/dist/engine/agents/ops/agentLoopRun.d.ts +2 -0
- package/dist/engine/agents/ops/agentLoopRun.d.ts.map +1 -1
- package/dist/engine/agents/ops/agentLoopRun.js +2 -1
- package/dist/engine/agents/ops/agentLoopRun.js.map +1 -1
- package/dist/engine/agents/ops/agentLoopRun.spec.js +1 -0
- package/dist/engine/agents/ops/agentLoopRun.spec.js.map +1 -1
- package/dist/engine/engine.d.ts.map +1 -1
- package/dist/engine/engine.js +3 -1
- package/dist/engine/engine.js.map +1 -1
- package/dist/engine/engine.spec.js +16 -0
- package/dist/engine/engine.spec.js.map +1 -1
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.d.ts +2 -1
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.d.ts.map +1 -1
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.js +18 -1
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.js.map +1 -1
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.spec.d.ts +2 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.spec.d.ts.map +1 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.spec.js +32 -0
- package/dist/engine/modules/rlm/rlmToolDescriptionBuild.spec.js.map +1 -0
- package/dist/engine/modules/tools/skillToolBuild.d.ts +3 -0
- package/dist/engine/modules/tools/skillToolBuild.d.ts.map +1 -0
- package/dist/engine/modules/tools/skillToolBuild.js +113 -0
- package/dist/engine/modules/tools/skillToolBuild.js.map +1 -0
- package/dist/engine/modules/tools/skillToolBuild.spec.d.ts +2 -0
- package/dist/engine/modules/tools/skillToolBuild.spec.d.ts.map +1 -0
- package/dist/engine/modules/tools/skillToolBuild.spec.js +198 -0
- package/dist/engine/modules/tools/skillToolBuild.spec.js.map +1 -0
- package/dist/engine/modules/tools/toolListContextBuild.d.ts +2 -0
- package/dist/engine/modules/tools/toolListContextBuild.d.ts.map +1 -1
- package/dist/engine/modules/tools/toolListContextBuild.js +3 -3
- package/dist/engine/modules/tools/toolListContextBuild.js.map +1 -1
- package/dist/engine/modules/tools/toolListContextBuild.spec.js +12 -0
- package/dist/engine/modules/tools/toolListContextBuild.spec.js.map +1 -1
- package/dist/engine/modules/tools/types.d.ts +2 -0
- package/dist/engine/modules/tools/types.d.ts.map +1 -1
- package/dist/engine/skills/skillContentLoad.d.ts +7 -0
- package/dist/engine/skills/skillContentLoad.d.ts.map +1 -0
- package/dist/engine/skills/skillContentLoad.js +19 -0
- package/dist/engine/skills/skillContentLoad.js.map +1 -0
- package/dist/engine/skills/skillContentLoad.spec.d.ts +2 -0
- package/dist/engine/skills/skillContentLoad.spec.d.ts.map +1 -0
- package/dist/engine/skills/skillContentLoad.spec.js +52 -0
- package/dist/engine/skills/skillContentLoad.spec.js.map +1 -0
- package/dist/engine/skills/skillPromptFormat.d.ts.map +1 -1
- package/dist/engine/skills/skillPromptFormat.js +9 -5
- package/dist/engine/skills/skillPromptFormat.js.map +1 -1
- package/dist/engine/skills/skillPromptFormat.spec.js +5 -2
- package/dist/engine/skills/skillPromptFormat.spec.js.map +1 -1
- package/dist/engine/skills/skillResolve.d.ts.map +1 -1
- package/dist/engine/skills/skillResolve.js +35 -91
- package/dist/engine/skills/skillResolve.js.map +1 -1
- package/dist/engine/skills/skillResolve.spec.d.ts +2 -0
- package/dist/engine/skills/skillResolve.spec.d.ts.map +1 -0
- package/dist/engine/skills/skillResolve.spec.js +63 -0
- package/dist/engine/skills/skillResolve.spec.js.map +1 -0
- package/dist/engine/skills/skillTypes.d.ts +2 -0
- package/dist/engine/skills/skillTypes.d.ts.map +1 -1
- package/dist/prompts/SYSTEM.md +6 -1
- package/dist/skills/skills/skill-creator/SKILL.md +7 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { skillContentLoad } from "./skillContentLoad.js";
|
|
6
|
+
describe("skillContentLoad", () => {
|
|
7
|
+
it("strips YAML frontmatter and returns body", async () => {
|
|
8
|
+
const skillPath = await skillFileCreate("---\nname: deploy\ndescription: Deploy\n---\n\n# Deploy\nUse script.");
|
|
9
|
+
try {
|
|
10
|
+
await expect(skillContentLoad(skillPath)).resolves.toBe("# Deploy\nUse script.");
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
await fs.rm(path.dirname(skillPath), { recursive: true, force: true });
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
it("returns full content when frontmatter is absent", async () => {
|
|
17
|
+
const skillPath = await skillFileCreate("# No Frontmatter\nBody");
|
|
18
|
+
try {
|
|
19
|
+
await expect(skillContentLoad(skillPath)).resolves.toBe("# No Frontmatter\nBody");
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await fs.rm(path.dirname(skillPath), { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it("returns empty string when body is empty", async () => {
|
|
26
|
+
const skillPath = await skillFileCreate("---\nname: empty\n---\n");
|
|
27
|
+
try {
|
|
28
|
+
await expect(skillContentLoad(skillPath)).resolves.toBe("");
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await fs.rm(path.dirname(skillPath), { recursive: true, force: true });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
it("keeps body content that contains --- delimiters", async () => {
|
|
35
|
+
const skillPath = await skillFileCreate("---\nname: dash\n---\n\n# Title\n---\nStill body.");
|
|
36
|
+
try {
|
|
37
|
+
await expect(skillContentLoad(skillPath)).resolves.toBe("# Title\n---\nStill body.");
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await fs.rm(path.dirname(skillPath), { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
async function skillFileCreate(content) {
|
|
45
|
+
const baseDir = await fs.mkdtemp(path.join(os.tmpdir(), "daycare-skill-content-"));
|
|
46
|
+
const skillDir = path.join(baseDir, "skill");
|
|
47
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
48
|
+
const skillPath = path.join(skillDir, "SKILL.md");
|
|
49
|
+
await fs.writeFile(skillPath, content);
|
|
50
|
+
return skillPath;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=skillContentLoad.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillContentLoad.spec.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillContentLoad.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillPromptFormat.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillPromptFormat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"skillPromptFormat.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillPromptFormat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAkD9D"}
|
|
@@ -20,11 +20,13 @@ export function skillPromptFormat(skills) {
|
|
|
20
20
|
"## Skills (mandatory)",
|
|
21
21
|
"",
|
|
22
22
|
"Before replying, scan the skill descriptions below:",
|
|
23
|
-
"- If exactly one skill clearly applies:
|
|
24
|
-
"- If multiple could apply: choose the most specific one, then
|
|
25
|
-
"- If none clearly apply: do not
|
|
23
|
+
"- If exactly one skill clearly applies: call the `skill` tool with that skill name.",
|
|
24
|
+
"- If multiple could apply: choose the most specific one, then call `skill` once.",
|
|
25
|
+
"- If none clearly apply: do not call `skill`.",
|
|
26
26
|
"",
|
|
27
|
-
"
|
|
27
|
+
"Tool behavior:",
|
|
28
|
+
"- Non-sandbox skill: `skill` returns instructions. Follow them in this context.",
|
|
29
|
+
"- Sandbox skill (`<sandbox>true</sandbox>`): `skill` runs autonomously and returns results.",
|
|
28
30
|
"",
|
|
29
31
|
"<available_skills>"
|
|
30
32
|
];
|
|
@@ -40,7 +42,9 @@ export function skillPromptFormat(skills) {
|
|
|
40
42
|
lines.push(` <description>${description}</description>`);
|
|
41
43
|
}
|
|
42
44
|
lines.push(` <source>${xmlEscape(sourceLabel)}</source>`);
|
|
43
|
-
|
|
45
|
+
if (skill.sandbox === true) {
|
|
46
|
+
lines.push(" <sandbox>true</sandbox>");
|
|
47
|
+
}
|
|
44
48
|
lines.push(" </skill>");
|
|
45
49
|
}
|
|
46
50
|
lines.push("</available_skills>");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillPromptFormat.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillPromptFormat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,uBAAuB;QACvB,EAAE;QACF,qDAAqD;QACrD,
|
|
1
|
+
{"version":3,"file":"skillPromptFormat.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillPromptFormat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,uBAAuB;QACvB,EAAE;QACF,qDAAqD;QACrD,qFAAqF;QACrF,kFAAkF;QAClF,+CAA+C;QAC/C,EAAE;QACF,gBAAgB;QAChB,iFAAiF;QACjF,6FAA6F;QAC7F,EAAE;QACF,oBAAoB;KACrB,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,WAAW,GACf,KAAK,CAAC,MAAM,KAAK,QAAQ;YACvB,CAAC,CAAC,UAAU,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE;YACzC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACnB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC;QACvC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,WAAW,gBAAgB,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAElC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -8,7 +8,8 @@ describe("skillPromptFormat", () => {
|
|
|
8
8
|
name: "deploy",
|
|
9
9
|
description: "Use <cron> & heartbeat",
|
|
10
10
|
path: "/tmp/deploy/SKILL.md",
|
|
11
|
-
source: "core"
|
|
11
|
+
source: "core",
|
|
12
|
+
sandbox: true
|
|
12
13
|
},
|
|
13
14
|
{
|
|
14
15
|
id: "plugin:alpha/tooling",
|
|
@@ -33,7 +34,9 @@ describe("skillPromptFormat", () => {
|
|
|
33
34
|
expect(prompt).toContain("<name>deploy</name>");
|
|
34
35
|
expect(prompt).toContain("Use <cron> & heartbeat");
|
|
35
36
|
expect(prompt).toContain("<source>plugin:alpha</source>");
|
|
36
|
-
expect(prompt).toContain("
|
|
37
|
+
expect(prompt).toContain("<sandbox>true</sandbox>");
|
|
38
|
+
expect(prompt).not.toContain("/tmp/deploy/SKILL.md");
|
|
39
|
+
expect(prompt).toContain("call the `skill` tool");
|
|
37
40
|
expect(prompt.match(/<name>deploy<\/name>/g)).toHaveLength(1);
|
|
38
41
|
});
|
|
39
42
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillPromptFormat.spec.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillPromptFormat.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAiB;YAC3B;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"skillPromptFormat.spec.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillPromptFormat.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAiB;YAC3B;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI;aACd;YACD;gBACE,EAAE,EAAE,sBAAsB;gBAC1B,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,4BAA4B;gBAClC,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,OAAO;aAClB;YACD;gBACE,EAAE,EAAE,aAAa;gBACjB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wBAAwB;gBACrC,IAAI,EAAE,sBAAsB;gBAC5B,MAAM,EAAE,MAAM;aACf;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillResolve.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillResolve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skillResolve.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillResolve.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAW/D;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA+B5B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { constants as fsConstants, promises as fs } from "node:fs";
|
|
3
|
+
import matter from "gray-matter";
|
|
3
4
|
import { getLogger } from "../../log.js";
|
|
4
5
|
import { SKILL_FILENAME } from "./skillConstants.js";
|
|
5
6
|
const logger = getLogger("engine.skills");
|
|
@@ -31,6 +32,8 @@ export async function skillResolve(filePath, source, root) {
|
|
|
31
32
|
id,
|
|
32
33
|
name,
|
|
33
34
|
description,
|
|
35
|
+
sandbox: metadata.sandbox,
|
|
36
|
+
permissions: metadata.permissions,
|
|
34
37
|
path: resolvedPath,
|
|
35
38
|
source: source.source,
|
|
36
39
|
pluginId: source.source === "plugin" ? source.pluginId : undefined
|
|
@@ -54,109 +57,50 @@ async function skillFileReadable(filePath) {
|
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
59
|
function skillFrontmatterParse(content) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return {};
|
|
61
|
-
}
|
|
62
|
-
const frontmatter = [];
|
|
63
|
-
for (let i = 1; i < lines.length; i += 1) {
|
|
64
|
-
const line = lines[i] ?? "";
|
|
65
|
-
if (line.trim() === "---" || line.trim() === "...") {
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
frontmatter.push(line);
|
|
60
|
+
try {
|
|
61
|
+
const parsed = matter(content);
|
|
62
|
+
return skillFrontmatterNormalize(parsed.data);
|
|
69
63
|
}
|
|
70
|
-
|
|
64
|
+
catch {
|
|
71
65
|
return {};
|
|
72
66
|
}
|
|
73
|
-
return skillYamlFrontmatterParse(frontmatter);
|
|
74
67
|
}
|
|
75
|
-
function
|
|
68
|
+
function skillFrontmatterNormalize(data) {
|
|
76
69
|
const result = {};
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (!line || line.trim().length === 0 || line.trim().startsWith("#")) {
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
82
|
-
const match = line.match(/^([A-Za-z0-9_-]+)\s*:\s*(.*)$/);
|
|
83
|
-
if (!match) {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
const key = match[1];
|
|
87
|
-
let value = match[2] ?? "";
|
|
88
|
-
if (value === "|" || value === ">" || value.trim().length === 0) {
|
|
89
|
-
const block = skillYamlBlockCollect(lines, i + 1);
|
|
90
|
-
i = block.nextIndex - 1;
|
|
91
|
-
value = value === ">" ? block.value.replace(/\n/g, " ") : block.value;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
value = value.trim();
|
|
95
|
-
}
|
|
96
|
-
const normalized = skillYamlValueNormalize(value);
|
|
97
|
-
if (key === "name") {
|
|
98
|
-
result.name = normalized;
|
|
99
|
-
}
|
|
100
|
-
if (key === "description") {
|
|
101
|
-
result.description = normalized;
|
|
102
|
-
}
|
|
70
|
+
if (typeof data.name === "string") {
|
|
71
|
+
result.name = data.name;
|
|
103
72
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
function skillYamlBlockCollect(lines, startIndex) {
|
|
107
|
-
const blockLines = [];
|
|
108
|
-
let minIndent = null;
|
|
109
|
-
let index = startIndex;
|
|
110
|
-
for (; index < lines.length; index += 1) {
|
|
111
|
-
const line = lines[index] ?? "";
|
|
112
|
-
if (line.trim().length === 0) {
|
|
113
|
-
blockLines.push("");
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
const match = line.match(/^(\s+)/);
|
|
117
|
-
if (!match) {
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
const indentMatch = match[1];
|
|
121
|
-
if (!indentMatch) {
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
const indent = indentMatch.length;
|
|
125
|
-
if (minIndent === null || indent < minIndent) {
|
|
126
|
-
minIndent = indent;
|
|
127
|
-
}
|
|
128
|
-
blockLines.push(line);
|
|
73
|
+
if (typeof data.description === "string") {
|
|
74
|
+
result.description = data.description;
|
|
129
75
|
}
|
|
130
|
-
if (
|
|
131
|
-
|
|
76
|
+
if (typeof data.sandbox === "boolean") {
|
|
77
|
+
result.sandbox = data.sandbox;
|
|
132
78
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
79
|
+
else if (typeof data.sandbox === "string") {
|
|
80
|
+
const normalized = data.sandbox.trim().toLowerCase();
|
|
81
|
+
if (normalized === "true") {
|
|
82
|
+
result.sandbox = true;
|
|
83
|
+
}
|
|
84
|
+
else if (normalized === "false") {
|
|
85
|
+
result.sandbox = false;
|
|
136
86
|
}
|
|
137
|
-
return line.trim();
|
|
138
|
-
});
|
|
139
|
-
return { value: trimmed.join("\n").trimEnd(), nextIndex: index };
|
|
140
|
-
}
|
|
141
|
-
function skillYamlValueNormalize(value) {
|
|
142
|
-
if (value.length === 0) {
|
|
143
|
-
return value;
|
|
144
87
|
}
|
|
145
|
-
if (
|
|
146
|
-
|
|
88
|
+
if (Array.isArray(data.permissions)) {
|
|
89
|
+
const permissions = data.permissions
|
|
90
|
+
.filter((value) => typeof value === "string")
|
|
91
|
+
.map((value) => value.trim())
|
|
92
|
+
.filter((value) => value.length > 0);
|
|
93
|
+
if (permissions.length > 0) {
|
|
94
|
+
result.permissions = Array.from(new Set(permissions));
|
|
95
|
+
}
|
|
147
96
|
}
|
|
148
|
-
if (
|
|
149
|
-
|
|
97
|
+
else if (typeof data.permissions === "string") {
|
|
98
|
+
const permission = data.permissions.trim();
|
|
99
|
+
if (permission.length > 0) {
|
|
100
|
+
result.permissions = [permission];
|
|
101
|
+
}
|
|
150
102
|
}
|
|
151
|
-
return
|
|
152
|
-
}
|
|
153
|
-
function skillYamlDoubleUnescape(value) {
|
|
154
|
-
return value
|
|
155
|
-
.replace(/\\n/g, "\n")
|
|
156
|
-
.replace(/\\t/g, "\t")
|
|
157
|
-
.replace(/\\r/g, "\r")
|
|
158
|
-
.replace(/\\"/g, '"')
|
|
159
|
-
.replace(/\\\\/g, "\\");
|
|
103
|
+
return result;
|
|
160
104
|
}
|
|
161
105
|
function skillIdBuild(filePath, source, root) {
|
|
162
106
|
const fileName = path.basename(filePath).toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillResolve.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillResolve.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"skillResolve.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillResolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillResolve.spec.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillResolve.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { skillResolve } from "./skillResolve.js";
|
|
6
|
+
describe("skillResolve", () => {
|
|
7
|
+
it("parses sandbox true and permissions from frontmatter", async () => {
|
|
8
|
+
const baseDir = await fs.mkdtemp(path.join(os.tmpdir(), "daycare-skill-resolve-"));
|
|
9
|
+
try {
|
|
10
|
+
const skillDir = path.join(baseDir, "deploy");
|
|
11
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
12
|
+
const skillPath = path.join(skillDir, "SKILL.md");
|
|
13
|
+
await fs.writeFile(skillPath, [
|
|
14
|
+
"---",
|
|
15
|
+
"name: deploy",
|
|
16
|
+
"description: Deploy project",
|
|
17
|
+
"sandbox: true",
|
|
18
|
+
"permissions:",
|
|
19
|
+
" - \"@read:/workspace\"",
|
|
20
|
+
" - \"@network\"",
|
|
21
|
+
"---",
|
|
22
|
+
"",
|
|
23
|
+
"# Deploy"
|
|
24
|
+
].join("\n"));
|
|
25
|
+
const skill = await skillResolve(skillPath, { source: "config", root: baseDir }, baseDir);
|
|
26
|
+
expect(skill?.sandbox).toBe(true);
|
|
27
|
+
expect(skill?.permissions).toEqual(["@read:/workspace", "@network"]);
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it("parses sandbox false from frontmatter", async () => {
|
|
34
|
+
const baseDir = await fs.mkdtemp(path.join(os.tmpdir(), "daycare-skill-resolve-"));
|
|
35
|
+
try {
|
|
36
|
+
const skillDir = path.join(baseDir, "plan");
|
|
37
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
38
|
+
const skillPath = path.join(skillDir, "SKILL.md");
|
|
39
|
+
await fs.writeFile(skillPath, "---\nname: plan\ndescription: Plan work\nsandbox: false\n---\n\n# Plan");
|
|
40
|
+
const skill = await skillResolve(skillPath, { source: "config", root: baseDir }, baseDir);
|
|
41
|
+
expect(skill?.sandbox).toBe(false);
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it("leaves sandbox undefined when frontmatter omits it", async () => {
|
|
48
|
+
const baseDir = await fs.mkdtemp(path.join(os.tmpdir(), "daycare-skill-resolve-"));
|
|
49
|
+
try {
|
|
50
|
+
const skillDir = path.join(baseDir, "review");
|
|
51
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
52
|
+
const skillPath = path.join(skillDir, "SKILL.md");
|
|
53
|
+
await fs.writeFile(skillPath, "---\nname: review\ndescription: Review code\n---\n\n# Review");
|
|
54
|
+
const skill = await skillResolve(skillPath, { source: "config", root: baseDir }, baseDir);
|
|
55
|
+
expect(skill?.sandbox).toBeUndefined();
|
|
56
|
+
expect(skill?.permissions).toBeUndefined();
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await fs.rm(baseDir, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=skillResolve.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillResolve.spec.js","sourceRoot":"","sources":["../../../sources/engine/skills/skillResolve.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillTypes.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"skillTypes.d.ts","sourceRoot":"","sources":["../../../sources/engine/skills/skillTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
package/dist/prompts/SYSTEM.md
CHANGED
|
@@ -139,7 +139,12 @@ Use channels for persistent group coordination where agent mentions and shared h
|
|
|
139
139
|
|
|
140
140
|
## Skills
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
Invoke skills via the `skill` tool. Do not read `SKILL.md` files directly.
|
|
143
|
+
|
|
144
|
+
- Non-sandbox skills: `skill` returns instructions; follow them in this context.
|
|
145
|
+
- Sandbox skills: `skill` runs autonomously in a subagent and returns results.
|
|
146
|
+
|
|
147
|
+
For local skill authoring: create/edit in `{{workspace}}/skills/<name>/` first, then deploy atomically to `{{configDir}}/skills/` with `rm -rf {{configDir}}/skills/<name> && cp -r {{workspace}}/skills/<name> {{configDir}}/skills/`.
|
|
143
148
|
|
|
144
149
|
---
|
|
145
150
|
|
|
@@ -65,9 +65,15 @@ skill-name/
|
|
|
65
65
|
|
|
66
66
|
Every SKILL.md consists of:
|
|
67
67
|
|
|
68
|
-
- **Frontmatter** (YAML): Contains `name` and `description` fields
|
|
68
|
+
- **Frontmatter** (YAML): Contains required `name` and `description` fields, plus optional execution fields like `sandbox` and `permissions`.
|
|
69
69
|
- **Body** (Markdown): Instructions and guidance for using the skill. Only loaded AFTER the skill triggers (if at all).
|
|
70
70
|
|
|
71
|
+
Frontmatter fields used by Daycare:
|
|
72
|
+
- `name` (required): skill selector shown in prompt metadata.
|
|
73
|
+
- `description` (required): when/why to use the skill.
|
|
74
|
+
- `sandbox` (optional boolean): when `true`, runs the skill in a forked subagent.
|
|
75
|
+
- `permissions` (optional string array): permission tags (for example `@read:/workspace`, `@write:/workspace`, `@network`) granted to sandbox subagent; must be a subset of caller permissions.
|
|
76
|
+
|
|
71
77
|
#### Bundled Resources (optional)
|
|
72
78
|
|
|
73
79
|
##### Scripts (`scripts/`)
|
package/dist/types.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export type { AgentDescriptor, AgentFetchStrategy } from "./engine/agents/ops/ag
|
|
|
9
9
|
export type { InferenceClient, InferenceProvider, InferenceProviderOptions } from "./engine/modules/inference/types.js";
|
|
10
10
|
export type { ImageGenerationProvider } from "./engine/modules/images/types.js";
|
|
11
11
|
export type { ToolDefinition, ToolExecutionContext, ToolExecutionResult } from "./engine/modules/tools/types.js";
|
|
12
|
+
export type { AgentSkill } from "./engine/skills/skillTypes.js";
|
|
12
13
|
export type { Config } from "./config/configTypes.js";
|
|
13
14
|
export type { Signal, DelayedSignal, DelayedSignalCancelRepeatKeyInput, DelayedSignalScheduleInput, SignalGenerateInput, SignalSource, SignalSubscription, SignalSubscribeInput, SignalUnsubscribeInput } from "./engine/signals/signalTypes.js";
|
|
14
15
|
export type { Channel, ChannelMember, ChannelMessage, ChannelSignalData } from "./engine/channels/channelTypes.js";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../sources/types.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAGjF,YAAY,EACV,SAAS,EACT,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAG9C,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,YAAY,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACrB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAGvG,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAG7C,YAAY,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAGhF,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,YAAY,EACV,MAAM,EACN,aAAa,EACb,iCAAiC,EACjC,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,OAAO,EACP,aAAa,EACb,cAAc,EACd,iBAAiB,EAClB,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../sources/types.ts"],"names":[],"mappings":"AAIA,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAGjF,YAAY,EACV,SAAS,EACT,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAClB,MAAM,sCAAsC,CAAC;AAG9C,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,YAAY,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAGnC,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACrB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAGvG,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACzB,MAAM,qCAAqC,CAAC;AAG7C,YAAY,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAGhF,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,YAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAGtD,YAAY,EACV,MAAM,EACN,aAAa,EACb,iCAAiC,EACjC,0BAA0B,EAC1B,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAGzC,YAAY,EACV,OAAO,EACP,aAAa,EACb,cAAc,EACd,iBAAiB,EAClB,MAAM,mCAAmC,CAAC"}
|