@agimon-ai/doompi-skill 0.0.1-alpha.7 → 0.0.1-alpha.71
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/README.md +3 -1
- package/dist/apiContracts.cjs +17 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +13 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/catalog.cjs +4 -1
- package/dist/catalog.d.mts +1 -1
- package/dist/catalog.mjs +2 -1
- package/dist/deferredSkills-BzhyXnJ4.mjs +176 -0
- package/dist/{adapters/deferredSkills.cjs.map → deferredSkills-BzhyXnJ4.mjs.map} +1 -1
- package/dist/deferredSkills-DF6UCAsk.cjs +195 -0
- package/dist/deferredSkills-DF6UCAsk.cjs.map +1 -0
- package/dist/extensions/mcp-ui.mjs +31 -0
- package/dist/extensions/mcp-ui.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +130 -0
- package/dist/extensions/mcp.cjs.map +1 -0
- package/dist/extensions/mcp.d.mts +5 -0
- package/dist/extensions/mcp.d.mts.map +1 -0
- package/dist/extensions/mcp.mjs +125 -0
- package/dist/extensions/mcp.mjs.map +1 -0
- package/dist/extensions/pi.cjs +411 -1
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.mts +5 -2
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +406 -1
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +367 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +359 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/{adapters/skillCatalog.d.cts → index-6I1f9Ola.d.mts} +12 -4
- package/dist/index-6I1f9Ola.d.mts.map +1 -0
- package/dist/index.cjs +11 -1
- package/dist/index.d.mts +60 -5
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +4 -1
- package/dist/rolldown-runtime-C0BPl7ul.cjs +43 -0
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/dist/skillCatalog-DLuYFuS6.cjs +213 -0
- package/dist/skillCatalog-DLuYFuS6.cjs.map +1 -0
- package/dist/skillCatalog-DYpoSsdD.mjs +194 -0
- package/dist/skillCatalog-DYpoSsdD.mjs.map +1 -0
- package/dist/skillText-B8muK9HZ.mjs +17 -0
- package/dist/skillText-B8muK9HZ.mjs.map +1 -0
- package/dist/skillText-C5OuRtBY.cjs +22 -0
- package/dist/skillText-C5OuRtBY.cjs.map +1 -0
- package/dist/skills-CjL1THn-.cjs +61 -0
- package/dist/skills-CjL1THn-.cjs.map +1 -0
- package/dist/skills-DAabEcff.mjs +32 -0
- package/dist/skills-DAabEcff.mjs.map +1 -0
- package/dist/skillsOverlay-C-VBauyr.mjs +362 -0
- package/dist/skillsOverlay-C-VBauyr.mjs.map +1 -0
- package/dist/skillsOverlay-CYRvtxbp.cjs +375 -0
- package/dist/skillsOverlay-CYRvtxbp.cjs.map +1 -0
- package/package.json +70 -19
- package/src/prompts/doompi-author-skill/SKILL.md +6 -2
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/adapters/deferredSkills.cjs +0 -12
- package/dist/adapters/deferredSkills.mjs +0 -12
- package/dist/adapters/deferredSkills.mjs.map +0 -1
- package/dist/adapters/helpSkills.cjs +0 -2
- package/dist/adapters/helpSkills.cjs.map +0 -1
- package/dist/adapters/helpSkills.mjs +0 -2
- package/dist/adapters/helpSkills.mjs.map +0 -1
- package/dist/adapters/pi/extension.cjs +0 -2
- package/dist/adapters/pi/extension.cjs.map +0 -1
- package/dist/adapters/pi/extension.d.cts +0 -7
- package/dist/adapters/pi/extension.d.cts.map +0 -1
- package/dist/adapters/pi/extension.d.mts +0 -7
- package/dist/adapters/pi/extension.d.mts.map +0 -1
- package/dist/adapters/pi/extension.mjs +0 -2
- package/dist/adapters/pi/extension.mjs.map +0 -1
- package/dist/adapters/pi/skillReadiness.cjs +0 -4
- package/dist/adapters/pi/skillReadiness.cjs.map +0 -1
- package/dist/adapters/pi/skillReadiness.mjs +0 -4
- package/dist/adapters/pi/skillReadiness.mjs.map +0 -1
- package/dist/adapters/skillCatalog.cjs +0 -2
- package/dist/adapters/skillCatalog.cjs.map +0 -1
- package/dist/adapters/skillCatalog.d.cts.map +0 -1
- package/dist/adapters/skillCatalog.d.mts +0 -58
- package/dist/adapters/skillCatalog.d.mts.map +0 -1
- package/dist/adapters/skillCatalog.mjs +0 -2
- package/dist/adapters/skillCatalog.mjs.map +0 -1
- package/dist/catalog.d.cts +0 -2
- package/dist/commands/skillsCommand.cjs +0 -2
- package/dist/commands/skillsCommand.cjs.map +0 -1
- package/dist/commands/skillsCommand.mjs +0 -2
- package/dist/commands/skillsCommand.mjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -2
- package/dist/index.d.cts +0 -5
- package/dist/services/skillText.cjs +0 -2
- package/dist/services/skillText.cjs.map +0 -1
- package/dist/services/skillText.d.cts +0 -13
- package/dist/services/skillText.d.cts.map +0 -1
- package/dist/services/skillText.d.mts +0 -13
- package/dist/services/skillText.d.mts.map +0 -1
- package/dist/services/skillText.mjs +0 -2
- package/dist/services/skillText.mjs.map +0 -1
- package/dist/tui/skillsOverlay.cjs +0 -4
- package/dist/tui/skillsOverlay.cjs.map +0 -1
- package/dist/tui/skillsOverlay.d.cts +0 -18
- package/dist/tui/skillsOverlay.d.cts.map +0 -1
- package/dist/tui/skillsOverlay.d.mts +0 -18
- package/dist/tui/skillsOverlay.d.mts.map +0 -1
- package/dist/tui/skillsOverlay.mjs +0 -4
- package/dist/tui/skillsOverlay.mjs.map +0 -1
- package/dist/types/skills.cjs +0 -2
- package/dist/types/skills.cjs.map +0 -1
- package/dist/types/skills.d.cts +0 -32
- package/dist/types/skills.d.cts.map +0 -1
- package/dist/types/skills.d.mts +0 -32
- package/dist/types/skills.d.mts.map +0 -1
- package/dist/types/skills.mjs +0 -2
- package/dist/types/skills.mjs.map +0 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
let _agimon_ai_doompi_core_mcpFacet = require("@agimon-ai/doompi-core/mcpFacet");
|
|
6
|
+
let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
|
|
7
|
+
let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
|
|
8
|
+
let typebox = require("typebox");
|
|
9
|
+
//#region src/services/mcpSkills/index.ts
|
|
10
|
+
const MCP_SKILLS_SERVICE = "doom/discovered-mcp-skills";
|
|
11
|
+
function bindMcpSkills(context) {
|
|
12
|
+
const provider = context.services.get(MCP_SKILLS_SERVICE);
|
|
13
|
+
if (!provider) throw new Error("Discovered MCP skills are unavailable.");
|
|
14
|
+
return provider.list(context);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/discovered.mcp.ts
|
|
18
|
+
var discovered_mcp_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoutedContribution)(bindMcpSkills, { cardinality: "many" });
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-author-skill.mcp.ts
|
|
21
|
+
var doompi_author_skill_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpSkill)({
|
|
22
|
+
name: "doompi-author-skill",
|
|
23
|
+
description: "Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.",
|
|
24
|
+
read: () => (0, _agimon_ai_doompi_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/doompi-author-skill/SKILL.md")
|
|
25
|
+
});
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-skill.mcp.ts
|
|
28
|
+
var doompi_use_skill_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpSkill)({
|
|
29
|
+
name: "doompi-use-skill",
|
|
30
|
+
description: "Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.",
|
|
31
|
+
read: () => (0, _agimon_ai_doompi_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/doompi-use-skill/SKILL.md")
|
|
32
|
+
});
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/schemas/mcpSkillTools.ts
|
|
35
|
+
const searchSkillsParameters = typebox.Type.Object({ query: typebox.Type.Optional(typebox.Type.String()) });
|
|
36
|
+
const loadSkillParameters = typebox.Type.Object({ name: typebox.Type.String() });
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/services/mcpSkillTools/index.ts
|
|
39
|
+
function text(text) {
|
|
40
|
+
return { content: [{
|
|
41
|
+
type: "text",
|
|
42
|
+
text
|
|
43
|
+
}] };
|
|
44
|
+
}
|
|
45
|
+
function skills(context) {
|
|
46
|
+
if (context.mcpSkills === void 0) throw new Error("Remote skill access is unavailable.");
|
|
47
|
+
return context.mcpSkills;
|
|
48
|
+
}
|
|
49
|
+
function createSearchSkillsTool() {
|
|
50
|
+
return {
|
|
51
|
+
name: "search_skills",
|
|
52
|
+
label: "Search skills",
|
|
53
|
+
description: "Discover repository and active-domain skills available to this remote connection.",
|
|
54
|
+
parameters: searchSkillsParameters,
|
|
55
|
+
annotations: {
|
|
56
|
+
readOnlyHint: true,
|
|
57
|
+
destructiveHint: false,
|
|
58
|
+
openWorldHint: false
|
|
59
|
+
},
|
|
60
|
+
async execute(_toolCallId, { query }, _signal, _onUpdate, context) {
|
|
61
|
+
const needle = query?.trim().toLocaleLowerCase();
|
|
62
|
+
const available = await skills(context).list();
|
|
63
|
+
const matches = needle === void 0 || needle === "" ? available : available.filter(({ name, description }) => `${name}\n${description}`.toLocaleLowerCase().includes(needle));
|
|
64
|
+
return {
|
|
65
|
+
...text(JSON.stringify(matches)),
|
|
66
|
+
structuredContent: { skills: matches }
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function createLoadSkillTool() {
|
|
72
|
+
return {
|
|
73
|
+
name: "load_skill",
|
|
74
|
+
label: "Load skill",
|
|
75
|
+
description: "Load the full Markdown instructions for an available remote skill by exact name.",
|
|
76
|
+
parameters: loadSkillParameters,
|
|
77
|
+
annotations: {
|
|
78
|
+
readOnlyHint: true,
|
|
79
|
+
destructiveHint: false,
|
|
80
|
+
openWorldHint: false
|
|
81
|
+
},
|
|
82
|
+
async execute(_toolCallId, { name }, _signal, _onUpdate, context) {
|
|
83
|
+
return text(await skills(context).read(name));
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//#endregion
|
|
88
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/load_skill.mcp.ts
|
|
89
|
+
var load_skill_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpTool)(createLoadSkillTool());
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/search_skills.mcp.ts
|
|
92
|
+
var search_skills_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpTool)(createSearchSkillsTool());
|
|
93
|
+
//#endregion
|
|
94
|
+
//#region generated/mcp.ts
|
|
95
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
96
|
+
const many = (value, context) => {
|
|
97
|
+
const resolved = typeof value === "function" ? value(context) : value;
|
|
98
|
+
return Array.isArray(resolved) ? resolved : [resolved];
|
|
99
|
+
};
|
|
100
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
101
|
+
...identity,
|
|
102
|
+
...value
|
|
103
|
+
};
|
|
104
|
+
const withWidget = (key, value) => value === void 0 ? value : {
|
|
105
|
+
...value,
|
|
106
|
+
_meta: {
|
|
107
|
+
...value._meta,
|
|
108
|
+
["doompi/widget"]: key
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const mcp = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpPlugin)({
|
|
112
|
+
name: "@agimon-ai/doompi-skill",
|
|
113
|
+
session: (context) => ({
|
|
114
|
+
get skills() {
|
|
115
|
+
return [
|
|
116
|
+
...many(discovered_mcp_default, context),
|
|
117
|
+
at(doompi_author_skill_mcp_default, context),
|
|
118
|
+
at(doompi_use_skill_mcp_default, context)
|
|
119
|
+
];
|
|
120
|
+
},
|
|
121
|
+
get tools() {
|
|
122
|
+
return [withWidget("@agimon-ai/doompi-skill/load_skill", via({ name: "load_skill" }, at(load_skill_mcp_default, context))), withWidget("@agimon-ai/doompi-skill/search_skills", via({ name: "search_skills" }, at(search_skills_mcp_default, context)))];
|
|
123
|
+
}
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
//#endregion
|
|
127
|
+
exports.default = mcp;
|
|
128
|
+
exports.mcp = mcp;
|
|
129
|
+
|
|
130
|
+
//# sourceMappingURL=mcp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["defineRoutedContribution","defineMcpSkill","readPackageResource","defineMcpSkill","readPackageResource","Type","defineMcpTool","defineMcpTool","defineMcpPlugin","skillDiscovered","skillDoompiAuthorSkill","skillDoompiUseSkill","toolLoadSkill","toolSearchSkills"],"sources":["../../src/services/mcpSkills/index.ts","../../src/extensions/workspaces/sessions/(backend)/skill/discovered.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-skill.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-skill.mcp.ts","../../src/schemas/mcpSkillTools.ts","../../src/services/mcpSkillTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/load_skill.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/search_skills.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport type { DoomMcpPluginContext, DoomMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { ServerSkillGroup } from '../serverInventory';\n\nexport const MCP_SKILLS_SERVICE = 'doom/discovered-mcp-skills';\n\nexport interface McpSkillProvider {\n list(context: DoomMcpPluginContext): readonly DoomMcpSkill[];\n}\n\n/** Explicit remote provider, never a projection of the local resource registry. */\nexport function mountMcpSkills(groups: readonly ServerSkillGroup[], signal: AbortSignal) {\n return (context: Context): void => {\n context.provide(MCP_SKILLS_SERVICE, {\n list(remote) {\n signal.throwIfAborted();\n remote.signal.throwIfAborted();\n const domains = remote.selection.read().domains;\n const skills = new Map<string, DoomMcpSkill>();\n for (const group of groups) {\n if (group.domain !== undefined && !domains.includes(group.domain)) continue;\n for (const skill of group.skills) {\n // Match command precedence, including shared copies across domains.\n if (skills.has(skill.name)) continue;\n skills.set(skill.name, {\n name: skill.name,\n description: skill.description,\n async read() {\n const readSignal = AbortSignal.any([signal, remote.signal]);\n readSignal.throwIfAborted();\n const text = await readFile(skill.filePath, { encoding: 'utf8', signal: readSignal });\n readSignal.throwIfAborted();\n return text;\n },\n });\n }\n }\n return [...skills.values()];\n },\n } satisfies McpSkillProvider);\n };\n}\n\nexport function bindMcpSkills(context: DoomMcpPluginContext): readonly DoomMcpSkill[] {\n const provider = context.services.get<McpSkillProvider>(MCP_SKILLS_SERVICE);\n if (!provider) throw new Error('Discovered MCP skills are unavailable.');\n return provider.list(context);\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { bindMcpSkills } from '../../../../../services/mcpSkills';\n\nexport default defineRoutedContribution(bindMcpSkills, { cardinality: 'many' });\n","import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'doompi-author-skill',\n description:\n 'Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-skill/SKILL.md'),\n});\n","import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'doompi-use-skill',\n description:\n \"Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.\",\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-skill/SKILL.md'),\n});\n","import { Type } from 'typebox';\n\nexport const searchSkillsParameters = Type.Object({ query: Type.Optional(Type.String()) });\nexport const loadSkillParameters = Type.Object({ name: Type.String() });\n","import type { DoomHeadlessHostService, DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\n\nimport { loadSkillParameters, searchSkillsParameters } from '../../schemas/mcpSkillTools';\n\nfunction text(text: string) {\n return { content: [{ type: 'text' as const, text }] };\n}\n\nfunction skills(context: Parameters<DoomHeadlessTool['execute']>[4]) {\n if (context.mcpSkills === undefined) throw new Error('Remote skill access is unavailable.');\n return context.mcpSkills;\n}\n\nexport function createSearchSkillsTool(): DoomHeadlessTool<typeof searchSkillsParameters> {\n return {\n // web-plugin-tool-renderers: ignore search_skills (remote MCP only)\n name: 'search_skills',\n label: 'Search skills',\n description: 'Discover repository and active-domain skills available to this remote connection.',\n parameters: searchSkillsParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { query }, _signal, _onUpdate, context) {\n const needle = query?.trim().toLocaleLowerCase();\n const available = await skills(context).list();\n const matches =\n needle === undefined || needle === ''\n ? available\n : available.filter(({ name, description }) => `${name}\\n${description}`.toLocaleLowerCase().includes(needle));\n return { ...text(JSON.stringify(matches)), structuredContent: { skills: matches } };\n },\n };\n}\n\n/**\n * The session agent's way into a skill. Its skills are listed in the prompt, which DoomPi\n * controls, so it needs no search; a remote agent's prompt is not ours, hence the pair above.\n */\nexport function createSessionLoadSkillTool(\n host: Pick<DoomHeadlessHostService, 'readSkill'>,\n): DoomHeadlessTool<typeof loadSkillParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_skill (server session only, shown as a generic call)\n // DOOM_LOAD_SKILL_TOOL, spelled out so the renderer rule can read it.\n name: 'load_skill',\n label: 'Load skill',\n description: 'Load the full instructions of a skill from the available skills list by exact name.',\n parameters: loadSkillParameters,\n executionMode: 'parallel',\n async execute(_toolCallId, { name }) {\n const body = host.readSkill(name);\n if (body === undefined) return { ...text(`No skill named ${name} is available in this session.`), isError: true };\n return text(body);\n },\n };\n}\n\nexport function createLoadSkillTool(): DoomHeadlessTool<typeof loadSkillParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_skill (remote MCP only)\n name: 'load_skill',\n label: 'Load skill',\n description: 'Load the full Markdown instructions for an available remote skill by exact name.',\n parameters: loadSkillParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { name }, _signal, _onUpdate, context) {\n return text(await skills(context).read(name));\n },\n };\n}\n","import { defineMcpTool } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createLoadSkillTool } from '../../../../../services/mcpSkillTools';\n\nexport default defineMcpTool(createLoadSkillTool());\n","import { defineMcpTool } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createSearchSkillsTool } from '../../../../../services/mcpSkillTools';\n\nexport default defineMcpTool(createSearchSkillsTool());\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDiscovered from '../src/extensions/workspaces/sessions/(backend)/skill/discovered.mcp';\nimport skillDoompiAuthorSkill from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-skill.mcp';\nimport skillDoompiUseSkill from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-skill.mcp';\nimport toolLoadSkill from '../src/extensions/workspaces/sessions/(backend)/tool/load_skill.mcp';\nimport toolSearchSkills from '../src/extensions/workspaces/sessions/(backend)/tool/search_skills.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"doompi/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-skill',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [...many(skillDiscovered, context), at(skillDoompiAuthorSkill, context), at(skillDoompiUseSkill, context)]; },\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/doompi-skill/load_skill\", via({ name: 'load_skill' }, at(toolLoadSkill, context))), withWidget(\"@agimon-ai/doompi-skill/search_skills\", via({ name: 'search_skills' }, at(toolSearchSkills, context)))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBAwBa,+CAAG"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { defineMcpPlugin, defineMcpSkill, defineMcpTool } from "@agimon-ai/doompi-core/mcpFacet";
|
|
2
|
+
import { defineRoutedContribution } from "@agimon-ai/doompi-core/extensionFile";
|
|
3
|
+
import { readPackageResource } from "@agimon-ai/doompi-core/serverFacet";
|
|
4
|
+
import { Type } from "typebox";
|
|
5
|
+
//#region src/services/mcpSkills/index.ts
|
|
6
|
+
const MCP_SKILLS_SERVICE = "doom/discovered-mcp-skills";
|
|
7
|
+
function bindMcpSkills(context) {
|
|
8
|
+
const provider = context.services.get(MCP_SKILLS_SERVICE);
|
|
9
|
+
if (!provider) throw new Error("Discovered MCP skills are unavailable.");
|
|
10
|
+
return provider.list(context);
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/discovered.mcp.ts
|
|
14
|
+
var discovered_mcp_default = defineRoutedContribution(bindMcpSkills, { cardinality: "many" });
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-author-skill.mcp.ts
|
|
17
|
+
var doompi_author_skill_mcp_default = defineMcpSkill({
|
|
18
|
+
name: "doompi-author-skill",
|
|
19
|
+
description: "Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.",
|
|
20
|
+
read: () => readPackageResource(import.meta.url, "src/prompts/doompi-author-skill/SKILL.md")
|
|
21
|
+
});
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-use-skill.mcp.ts
|
|
24
|
+
var doompi_use_skill_mcp_default = defineMcpSkill({
|
|
25
|
+
name: "doompi-use-skill",
|
|
26
|
+
description: "Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.",
|
|
27
|
+
read: () => readPackageResource(import.meta.url, "src/prompts/doompi-use-skill/SKILL.md")
|
|
28
|
+
});
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/schemas/mcpSkillTools.ts
|
|
31
|
+
const searchSkillsParameters = Type.Object({ query: Type.Optional(Type.String()) });
|
|
32
|
+
const loadSkillParameters = Type.Object({ name: Type.String() });
|
|
33
|
+
//#endregion
|
|
34
|
+
//#region src/services/mcpSkillTools/index.ts
|
|
35
|
+
function text(text) {
|
|
36
|
+
return { content: [{
|
|
37
|
+
type: "text",
|
|
38
|
+
text
|
|
39
|
+
}] };
|
|
40
|
+
}
|
|
41
|
+
function skills(context) {
|
|
42
|
+
if (context.mcpSkills === void 0) throw new Error("Remote skill access is unavailable.");
|
|
43
|
+
return context.mcpSkills;
|
|
44
|
+
}
|
|
45
|
+
function createSearchSkillsTool() {
|
|
46
|
+
return {
|
|
47
|
+
name: "search_skills",
|
|
48
|
+
label: "Search skills",
|
|
49
|
+
description: "Discover repository and active-domain skills available to this remote connection.",
|
|
50
|
+
parameters: searchSkillsParameters,
|
|
51
|
+
annotations: {
|
|
52
|
+
readOnlyHint: true,
|
|
53
|
+
destructiveHint: false,
|
|
54
|
+
openWorldHint: false
|
|
55
|
+
},
|
|
56
|
+
async execute(_toolCallId, { query }, _signal, _onUpdate, context) {
|
|
57
|
+
const needle = query?.trim().toLocaleLowerCase();
|
|
58
|
+
const available = await skills(context).list();
|
|
59
|
+
const matches = needle === void 0 || needle === "" ? available : available.filter(({ name, description }) => `${name}\n${description}`.toLocaleLowerCase().includes(needle));
|
|
60
|
+
return {
|
|
61
|
+
...text(JSON.stringify(matches)),
|
|
62
|
+
structuredContent: { skills: matches }
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function createLoadSkillTool() {
|
|
68
|
+
return {
|
|
69
|
+
name: "load_skill",
|
|
70
|
+
label: "Load skill",
|
|
71
|
+
description: "Load the full Markdown instructions for an available remote skill by exact name.",
|
|
72
|
+
parameters: loadSkillParameters,
|
|
73
|
+
annotations: {
|
|
74
|
+
readOnlyHint: true,
|
|
75
|
+
destructiveHint: false,
|
|
76
|
+
openWorldHint: false
|
|
77
|
+
},
|
|
78
|
+
async execute(_toolCallId, { name }, _signal, _onUpdate, context) {
|
|
79
|
+
return text(await skills(context).read(name));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/load_skill.mcp.ts
|
|
85
|
+
var load_skill_mcp_default = defineMcpTool(createLoadSkillTool());
|
|
86
|
+
//#endregion
|
|
87
|
+
//#region src/extensions/workspaces/sessions/(backend)/tool/search_skills.mcp.ts
|
|
88
|
+
var search_skills_mcp_default = defineMcpTool(createSearchSkillsTool());
|
|
89
|
+
//#endregion
|
|
90
|
+
//#region generated/mcp.ts
|
|
91
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
92
|
+
const many = (value, context) => {
|
|
93
|
+
const resolved = typeof value === "function" ? value(context) : value;
|
|
94
|
+
return Array.isArray(resolved) ? resolved : [resolved];
|
|
95
|
+
};
|
|
96
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
97
|
+
...identity,
|
|
98
|
+
...value
|
|
99
|
+
};
|
|
100
|
+
const withWidget = (key, value) => value === void 0 ? value : {
|
|
101
|
+
...value,
|
|
102
|
+
_meta: {
|
|
103
|
+
...value._meta,
|
|
104
|
+
["doompi/widget"]: key
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const mcp = defineMcpPlugin({
|
|
108
|
+
name: "@agimon-ai/doompi-skill",
|
|
109
|
+
session: (context) => ({
|
|
110
|
+
get skills() {
|
|
111
|
+
return [
|
|
112
|
+
...many(discovered_mcp_default, context),
|
|
113
|
+
at(doompi_author_skill_mcp_default, context),
|
|
114
|
+
at(doompi_use_skill_mcp_default, context)
|
|
115
|
+
];
|
|
116
|
+
},
|
|
117
|
+
get tools() {
|
|
118
|
+
return [withWidget("@agimon-ai/doompi-skill/load_skill", via({ name: "load_skill" }, at(load_skill_mcp_default, context))), withWidget("@agimon-ai/doompi-skill/search_skills", via({ name: "search_skills" }, at(search_skills_mcp_default, context)))];
|
|
119
|
+
}
|
|
120
|
+
})
|
|
121
|
+
});
|
|
122
|
+
//#endregion
|
|
123
|
+
export { mcp as default, mcp };
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=mcp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["skillDiscovered","skillDoompiAuthorSkill","skillDoompiUseSkill","toolLoadSkill","toolSearchSkills"],"sources":["../../src/services/mcpSkills/index.ts","../../src/extensions/workspaces/sessions/(backend)/skill/discovered.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-skill.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-skill.mcp.ts","../../src/schemas/mcpSkillTools.ts","../../src/services/mcpSkillTools/index.ts","../../src/extensions/workspaces/sessions/(backend)/tool/load_skill.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/search_skills.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\n\nimport type { DoomMcpPluginContext, DoomMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { ServerSkillGroup } from '../serverInventory';\n\nexport const MCP_SKILLS_SERVICE = 'doom/discovered-mcp-skills';\n\nexport interface McpSkillProvider {\n list(context: DoomMcpPluginContext): readonly DoomMcpSkill[];\n}\n\n/** Explicit remote provider, never a projection of the local resource registry. */\nexport function mountMcpSkills(groups: readonly ServerSkillGroup[], signal: AbortSignal) {\n return (context: Context): void => {\n context.provide(MCP_SKILLS_SERVICE, {\n list(remote) {\n signal.throwIfAborted();\n remote.signal.throwIfAborted();\n const domains = remote.selection.read().domains;\n const skills = new Map<string, DoomMcpSkill>();\n for (const group of groups) {\n if (group.domain !== undefined && !domains.includes(group.domain)) continue;\n for (const skill of group.skills) {\n // Match command precedence, including shared copies across domains.\n if (skills.has(skill.name)) continue;\n skills.set(skill.name, {\n name: skill.name,\n description: skill.description,\n async read() {\n const readSignal = AbortSignal.any([signal, remote.signal]);\n readSignal.throwIfAborted();\n const text = await readFile(skill.filePath, { encoding: 'utf8', signal: readSignal });\n readSignal.throwIfAborted();\n return text;\n },\n });\n }\n }\n return [...skills.values()];\n },\n } satisfies McpSkillProvider);\n };\n}\n\nexport function bindMcpSkills(context: DoomMcpPluginContext): readonly DoomMcpSkill[] {\n const provider = context.services.get<McpSkillProvider>(MCP_SKILLS_SERVICE);\n if (!provider) throw new Error('Discovered MCP skills are unavailable.');\n return provider.list(context);\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { bindMcpSkills } from '../../../../../services/mcpSkills';\n\nexport default defineRoutedContribution(bindMcpSkills, { cardinality: 'many' });\n","import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'doompi-author-skill',\n description:\n 'Author and distribute DoomPi agent skills. Use when creating a SKILL.md, adding supporting references or scripts, contributing a runtime skill directory through Cordis, or publishing activation-gated Help prompts from a DoomPi package.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-skill/SKILL.md'),\n});\n","import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\n name: 'doompi-use-skill',\n description:\n \"Use DoomPi's skill catalog and deferred discovery. Use when browsing available skills, invoking /skill:name, understanding Help and extension-owned skill groups, or diagnosing why a skill is absent or shadowed.\",\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-use-skill/SKILL.md'),\n});\n","import { Type } from 'typebox';\n\nexport const searchSkillsParameters = Type.Object({ query: Type.Optional(Type.String()) });\nexport const loadSkillParameters = Type.Object({ name: Type.String() });\n","import type { DoomHeadlessHostService, DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\n\nimport { loadSkillParameters, searchSkillsParameters } from '../../schemas/mcpSkillTools';\n\nfunction text(text: string) {\n return { content: [{ type: 'text' as const, text }] };\n}\n\nfunction skills(context: Parameters<DoomHeadlessTool['execute']>[4]) {\n if (context.mcpSkills === undefined) throw new Error('Remote skill access is unavailable.');\n return context.mcpSkills;\n}\n\nexport function createSearchSkillsTool(): DoomHeadlessTool<typeof searchSkillsParameters> {\n return {\n // web-plugin-tool-renderers: ignore search_skills (remote MCP only)\n name: 'search_skills',\n label: 'Search skills',\n description: 'Discover repository and active-domain skills available to this remote connection.',\n parameters: searchSkillsParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { query }, _signal, _onUpdate, context) {\n const needle = query?.trim().toLocaleLowerCase();\n const available = await skills(context).list();\n const matches =\n needle === undefined || needle === ''\n ? available\n : available.filter(({ name, description }) => `${name}\\n${description}`.toLocaleLowerCase().includes(needle));\n return { ...text(JSON.stringify(matches)), structuredContent: { skills: matches } };\n },\n };\n}\n\n/**\n * The session agent's way into a skill. Its skills are listed in the prompt, which DoomPi\n * controls, so it needs no search; a remote agent's prompt is not ours, hence the pair above.\n */\nexport function createSessionLoadSkillTool(\n host: Pick<DoomHeadlessHostService, 'readSkill'>,\n): DoomHeadlessTool<typeof loadSkillParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_skill (server session only, shown as a generic call)\n // DOOM_LOAD_SKILL_TOOL, spelled out so the renderer rule can read it.\n name: 'load_skill',\n label: 'Load skill',\n description: 'Load the full instructions of a skill from the available skills list by exact name.',\n parameters: loadSkillParameters,\n executionMode: 'parallel',\n async execute(_toolCallId, { name }) {\n const body = host.readSkill(name);\n if (body === undefined) return { ...text(`No skill named ${name} is available in this session.`), isError: true };\n return text(body);\n },\n };\n}\n\nexport function createLoadSkillTool(): DoomHeadlessTool<typeof loadSkillParameters> {\n return {\n // web-plugin-tool-renderers: ignore load_skill (remote MCP only)\n name: 'load_skill',\n label: 'Load skill',\n description: 'Load the full Markdown instructions for an available remote skill by exact name.',\n parameters: loadSkillParameters,\n annotations: { readOnlyHint: true, destructiveHint: false, openWorldHint: false },\n async execute(_toolCallId, { name }, _signal, _onUpdate, context) {\n return text(await skills(context).read(name));\n },\n };\n}\n","import { defineMcpTool } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createLoadSkillTool } from '../../../../../services/mcpSkillTools';\n\nexport default defineMcpTool(createLoadSkillTool());\n","import { defineMcpTool } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport { createSearchSkillsTool } from '../../../../../services/mcpSkillTools';\n\nexport default defineMcpTool(createSearchSkillsTool());\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDiscovered from '../src/extensions/workspaces/sessions/(backend)/skill/discovered.mcp';\nimport skillDoompiAuthorSkill from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-skill.mcp';\nimport skillDoompiUseSkill from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-use-skill.mcp';\nimport toolLoadSkill from '../src/extensions/workspaces/sessions/(backend)/tool/load_skill.mcp';\nimport toolSearchSkills from '../src/extensions/workspaces/sessions/(backend)/tool/search_skills.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"doompi/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-skill',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [...many(skillDiscovered, context), at(skillDoompiAuthorSkill, context), at(skillDoompiUseSkill, context)]; },\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/doompi-skill/load_skill\", via({ name: 'load_skill' }, at(toolLoadSkill, context))), withWidget(\"@agimon-ai/doompi-skill/search_skills\", via({ name: 'search_skills' }, at(toolSearchSkills, context)))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":"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"}
|