@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.
Files changed (118) hide show
  1. package/README.md +3 -1
  2. package/dist/apiContracts.cjs +17 -0
  3. package/dist/apiContracts.cjs.map +1 -0
  4. package/dist/apiContracts.d.mts +53 -0
  5. package/dist/apiContracts.d.mts.map +1 -0
  6. package/dist/apiContracts.mjs +13 -0
  7. package/dist/apiContracts.mjs.map +1 -0
  8. package/dist/catalog.cjs +4 -1
  9. package/dist/catalog.d.mts +1 -1
  10. package/dist/catalog.mjs +2 -1
  11. package/dist/deferredSkills-BzhyXnJ4.mjs +176 -0
  12. package/dist/{adapters/deferredSkills.cjs.map → deferredSkills-BzhyXnJ4.mjs.map} +1 -1
  13. package/dist/deferredSkills-DF6UCAsk.cjs +195 -0
  14. package/dist/deferredSkills-DF6UCAsk.cjs.map +1 -0
  15. package/dist/extensions/mcp-ui.mjs +31 -0
  16. package/dist/extensions/mcp-ui.mjs.map +1 -0
  17. package/dist/extensions/mcp.cjs +130 -0
  18. package/dist/extensions/mcp.cjs.map +1 -0
  19. package/dist/extensions/mcp.d.mts +5 -0
  20. package/dist/extensions/mcp.d.mts.map +1 -0
  21. package/dist/extensions/mcp.mjs +125 -0
  22. package/dist/extensions/mcp.mjs.map +1 -0
  23. package/dist/extensions/pi.cjs +411 -1
  24. package/dist/extensions/pi.cjs.map +1 -0
  25. package/dist/extensions/pi.d.mts +5 -2
  26. package/dist/extensions/pi.d.mts.map +1 -0
  27. package/dist/extensions/pi.mjs +406 -1
  28. package/dist/extensions/pi.mjs.map +1 -0
  29. package/dist/extensions/server.cjs +367 -0
  30. package/dist/extensions/server.cjs.map +1 -0
  31. package/dist/extensions/server.d.mts +5 -0
  32. package/dist/extensions/server.d.mts.map +1 -0
  33. package/dist/extensions/server.mjs +359 -0
  34. package/dist/extensions/server.mjs.map +1 -0
  35. package/dist/{adapters/skillCatalog.d.cts → index-6I1f9Ola.d.mts} +12 -4
  36. package/dist/index-6I1f9Ola.d.mts.map +1 -0
  37. package/dist/index.cjs +11 -1
  38. package/dist/index.d.mts +60 -5
  39. package/dist/index.d.mts.map +1 -0
  40. package/dist/index.mjs +4 -1
  41. package/dist/rolldown-runtime-C0BPl7ul.cjs +43 -0
  42. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  43. package/dist/skillCatalog-DLuYFuS6.cjs +213 -0
  44. package/dist/skillCatalog-DLuYFuS6.cjs.map +1 -0
  45. package/dist/skillCatalog-DYpoSsdD.mjs +194 -0
  46. package/dist/skillCatalog-DYpoSsdD.mjs.map +1 -0
  47. package/dist/skillText-B8muK9HZ.mjs +17 -0
  48. package/dist/skillText-B8muK9HZ.mjs.map +1 -0
  49. package/dist/skillText-C5OuRtBY.cjs +22 -0
  50. package/dist/skillText-C5OuRtBY.cjs.map +1 -0
  51. package/dist/skills-CjL1THn-.cjs +61 -0
  52. package/dist/skills-CjL1THn-.cjs.map +1 -0
  53. package/dist/skills-DAabEcff.mjs +32 -0
  54. package/dist/skills-DAabEcff.mjs.map +1 -0
  55. package/dist/skillsOverlay-C-VBauyr.mjs +362 -0
  56. package/dist/skillsOverlay-C-VBauyr.mjs.map +1 -0
  57. package/dist/skillsOverlay-CYRvtxbp.cjs +375 -0
  58. package/dist/skillsOverlay-CYRvtxbp.cjs.map +1 -0
  59. package/package.json +70 -19
  60. package/src/prompts/doompi-author-skill/SKILL.md +6 -2
  61. package/dist/_virtual/_rolldown/runtime.cjs +0 -1
  62. package/dist/adapters/deferredSkills.cjs +0 -12
  63. package/dist/adapters/deferredSkills.mjs +0 -12
  64. package/dist/adapters/deferredSkills.mjs.map +0 -1
  65. package/dist/adapters/helpSkills.cjs +0 -2
  66. package/dist/adapters/helpSkills.cjs.map +0 -1
  67. package/dist/adapters/helpSkills.mjs +0 -2
  68. package/dist/adapters/helpSkills.mjs.map +0 -1
  69. package/dist/adapters/pi/extension.cjs +0 -2
  70. package/dist/adapters/pi/extension.cjs.map +0 -1
  71. package/dist/adapters/pi/extension.d.cts +0 -7
  72. package/dist/adapters/pi/extension.d.cts.map +0 -1
  73. package/dist/adapters/pi/extension.d.mts +0 -7
  74. package/dist/adapters/pi/extension.d.mts.map +0 -1
  75. package/dist/adapters/pi/extension.mjs +0 -2
  76. package/dist/adapters/pi/extension.mjs.map +0 -1
  77. package/dist/adapters/pi/skillReadiness.cjs +0 -4
  78. package/dist/adapters/pi/skillReadiness.cjs.map +0 -1
  79. package/dist/adapters/pi/skillReadiness.mjs +0 -4
  80. package/dist/adapters/pi/skillReadiness.mjs.map +0 -1
  81. package/dist/adapters/skillCatalog.cjs +0 -2
  82. package/dist/adapters/skillCatalog.cjs.map +0 -1
  83. package/dist/adapters/skillCatalog.d.cts.map +0 -1
  84. package/dist/adapters/skillCatalog.d.mts +0 -58
  85. package/dist/adapters/skillCatalog.d.mts.map +0 -1
  86. package/dist/adapters/skillCatalog.mjs +0 -2
  87. package/dist/adapters/skillCatalog.mjs.map +0 -1
  88. package/dist/catalog.d.cts +0 -2
  89. package/dist/commands/skillsCommand.cjs +0 -2
  90. package/dist/commands/skillsCommand.cjs.map +0 -1
  91. package/dist/commands/skillsCommand.mjs +0 -2
  92. package/dist/commands/skillsCommand.mjs.map +0 -1
  93. package/dist/extensions/pi.d.cts +0 -2
  94. package/dist/index.d.cts +0 -5
  95. package/dist/services/skillText.cjs +0 -2
  96. package/dist/services/skillText.cjs.map +0 -1
  97. package/dist/services/skillText.d.cts +0 -13
  98. package/dist/services/skillText.d.cts.map +0 -1
  99. package/dist/services/skillText.d.mts +0 -13
  100. package/dist/services/skillText.d.mts.map +0 -1
  101. package/dist/services/skillText.mjs +0 -2
  102. package/dist/services/skillText.mjs.map +0 -1
  103. package/dist/tui/skillsOverlay.cjs +0 -4
  104. package/dist/tui/skillsOverlay.cjs.map +0 -1
  105. package/dist/tui/skillsOverlay.d.cts +0 -18
  106. package/dist/tui/skillsOverlay.d.cts.map +0 -1
  107. package/dist/tui/skillsOverlay.d.mts +0 -18
  108. package/dist/tui/skillsOverlay.d.mts.map +0 -1
  109. package/dist/tui/skillsOverlay.mjs +0 -4
  110. package/dist/tui/skillsOverlay.mjs.map +0 -1
  111. package/dist/types/skills.cjs +0 -2
  112. package/dist/types/skills.cjs.map +0 -1
  113. package/dist/types/skills.d.cts +0 -32
  114. package/dist/types/skills.d.cts.map +0 -1
  115. package/dist/types/skills.d.mts +0 -32
  116. package/dist/types/skills.d.mts.map +0 -1
  117. package/dist/types/skills.mjs +0 -2
  118. 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,5 @@
1
+ //#region generated/mcp.d.ts
2
+ export declare const mcp: import("@agimon-ai/doompi-core/mcpFacet").DoomMcpPluginDefinition;
3
+ //#endregion
4
+ export { mcp as default };
5
+ //# sourceMappingURL=mcp.d.mts.map
@@ -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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"}