@agimon-ai/doompi-skill 0.0.1-alpha.46 → 0.0.1-alpha.48

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 (134) hide show
  1. package/README.md +3 -1
  2. package/dist/api-contracts.cjs +1 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +1 -0
  6. package/dist/catalog.cjs +1 -1
  7. package/dist/catalog.d.cts +1 -1
  8. package/dist/catalog.d.mts +1 -1
  9. package/dist/catalog.mjs +1 -1
  10. package/dist/controllers/skillCommands.cjs +2 -0
  11. package/dist/controllers/skillCommands.cjs.map +1 -0
  12. package/dist/controllers/skillCommands.mjs +2 -0
  13. package/dist/controllers/skillCommands.mjs.map +1 -0
  14. package/dist/controllers/skillReadiness.cjs +4 -0
  15. package/dist/controllers/skillReadiness.cjs.map +1 -0
  16. package/dist/controllers/skillReadiness.mjs +4 -0
  17. package/dist/controllers/skillReadiness.mjs.map +1 -0
  18. package/dist/controllers/skillRuntime.cjs +2 -0
  19. package/dist/controllers/skillRuntime.cjs.map +1 -0
  20. package/dist/controllers/skillRuntime.mjs +2 -0
  21. package/dist/controllers/skillRuntime.mjs.map +1 -0
  22. package/dist/controllers/skillServer.cjs +2 -0
  23. package/dist/controllers/skillServer.cjs.map +1 -0
  24. package/dist/controllers/skillServer.mjs +2 -0
  25. package/dist/controllers/skillServer.mjs.map +1 -0
  26. package/dist/controllers/skillsCommand.cjs +2 -0
  27. package/dist/controllers/skillsCommand.cjs.map +1 -0
  28. package/dist/controllers/skillsCommand.mjs +2 -0
  29. package/dist/controllers/skillsCommand.mjs.map +1 -0
  30. package/dist/extensions/pi.cjs +2 -1
  31. package/dist/extensions/pi.cjs.map +1 -0
  32. package/dist/extensions/pi.d.cts +5 -2
  33. package/dist/extensions/pi.d.cts.map +1 -0
  34. package/dist/extensions/pi.d.mts +5 -2
  35. package/dist/extensions/pi.d.mts.map +1 -0
  36. package/dist/extensions/pi.mjs +2 -1
  37. package/dist/extensions/pi.mjs.map +1 -0
  38. package/dist/extensions/server.cjs +2 -0
  39. package/dist/extensions/server.cjs.map +1 -0
  40. package/dist/extensions/server.d.cts +5 -0
  41. package/dist/extensions/server.d.cts.map +1 -0
  42. package/dist/extensions/server.d.mts +5 -0
  43. package/dist/extensions/server.d.mts.map +1 -0
  44. package/dist/extensions/server.mjs +2 -0
  45. package/dist/extensions/server.mjs.map +1 -0
  46. package/dist/index.cjs +1 -1
  47. package/dist/index.d.cts +2 -3
  48. package/dist/index.d.mts +2 -3
  49. package/dist/index.mjs +1 -1
  50. package/dist/schemas/apiContracts.cjs +2 -0
  51. package/dist/schemas/apiContracts.cjs.map +1 -0
  52. package/dist/schemas/apiContracts.d.cts +53 -0
  53. package/dist/schemas/apiContracts.d.cts.map +1 -0
  54. package/dist/schemas/apiContracts.d.mts +53 -0
  55. package/dist/schemas/apiContracts.d.mts.map +1 -0
  56. package/dist/schemas/apiContracts.mjs +2 -0
  57. package/dist/schemas/apiContracts.mjs.map +1 -0
  58. package/dist/services/deferredSkills/index.cjs +12 -0
  59. package/dist/services/deferredSkills/index.cjs.map +1 -0
  60. package/dist/{adapters/deferredSkills.mjs → services/deferredSkills/index.mjs} +1 -1
  61. package/dist/services/deferredSkills/index.mjs.map +1 -0
  62. package/dist/services/helpSkills/index.cjs +2 -0
  63. package/dist/services/helpSkills/index.cjs.map +1 -0
  64. package/dist/services/helpSkills/index.mjs +2 -0
  65. package/dist/services/helpSkills/index.mjs.map +1 -0
  66. package/dist/services/packageResources/index.cjs +2 -0
  67. package/dist/services/packageResources/index.cjs.map +1 -0
  68. package/dist/services/packageResources/index.mjs +2 -0
  69. package/dist/services/packageResources/index.mjs.map +1 -0
  70. package/dist/services/serverInventory/index.cjs +2 -0
  71. package/dist/services/serverInventory/index.cjs.map +1 -0
  72. package/dist/services/serverInventory/index.mjs +2 -0
  73. package/dist/services/serverInventory/index.mjs.map +1 -0
  74. package/dist/services/skillCatalog/index.cjs +2 -0
  75. package/dist/services/skillCatalog/index.cjs.map +1 -0
  76. package/dist/{adapters/skillCatalog.d.cts → services/skillCatalog/index.d.cts} +3 -3
  77. package/dist/services/skillCatalog/index.d.cts.map +1 -0
  78. package/dist/{adapters/skillCatalog.d.mts → services/skillCatalog/index.d.mts} +3 -3
  79. package/dist/services/skillCatalog/index.d.mts.map +1 -0
  80. package/dist/{adapters/skillCatalog.mjs → services/skillCatalog/index.mjs} +2 -2
  81. package/dist/services/skillCatalog/index.mjs.map +1 -0
  82. package/dist/services/skillText/index.cjs +2 -0
  83. package/dist/services/skillText/index.cjs.map +1 -0
  84. package/dist/services/{skillText.d.cts → skillText/index.d.cts} +2 -2
  85. package/dist/services/skillText/index.d.cts.map +1 -0
  86. package/dist/services/{skillText.d.mts → skillText/index.d.mts} +2 -2
  87. package/dist/services/skillText/index.d.mts.map +1 -0
  88. package/dist/services/skillText/index.mjs +2 -0
  89. package/dist/services/skillText/index.mjs.map +1 -0
  90. package/dist/tui/skillsOverlay.cjs +1 -1
  91. package/dist/tui/skillsOverlay.cjs.map +1 -1
  92. package/dist/tui/skillsOverlay.d.cts +2 -2
  93. package/dist/tui/skillsOverlay.d.cts.map +1 -1
  94. package/dist/tui/skillsOverlay.d.mts +2 -2
  95. package/dist/tui/skillsOverlay.d.mts.map +1 -1
  96. package/dist/tui/skillsOverlay.mjs +1 -1
  97. package/dist/tui/skillsOverlay.mjs.map +1 -1
  98. package/dist/types/skills.cjs.map +1 -1
  99. package/dist/types/skills.mjs.map +1 -1
  100. package/package.json +23 -7
  101. package/dist/adapters/deferredSkills.cjs +0 -12
  102. package/dist/adapters/deferredSkills.cjs.map +0 -1
  103. package/dist/adapters/deferredSkills.mjs.map +0 -1
  104. package/dist/adapters/helpSkills.cjs +0 -2
  105. package/dist/adapters/helpSkills.cjs.map +0 -1
  106. package/dist/adapters/helpSkills.mjs +0 -2
  107. package/dist/adapters/helpSkills.mjs.map +0 -1
  108. package/dist/adapters/pi/extension.cjs +0 -2
  109. package/dist/adapters/pi/extension.cjs.map +0 -1
  110. package/dist/adapters/pi/extension.d.cts +0 -7
  111. package/dist/adapters/pi/extension.d.cts.map +0 -1
  112. package/dist/adapters/pi/extension.d.mts +0 -7
  113. package/dist/adapters/pi/extension.d.mts.map +0 -1
  114. package/dist/adapters/pi/extension.mjs +0 -2
  115. package/dist/adapters/pi/extension.mjs.map +0 -1
  116. package/dist/adapters/pi/skillReadiness.cjs +0 -4
  117. package/dist/adapters/pi/skillReadiness.cjs.map +0 -1
  118. package/dist/adapters/pi/skillReadiness.mjs +0 -4
  119. package/dist/adapters/pi/skillReadiness.mjs.map +0 -1
  120. package/dist/adapters/skillCatalog.cjs +0 -2
  121. package/dist/adapters/skillCatalog.cjs.map +0 -1
  122. package/dist/adapters/skillCatalog.d.cts.map +0 -1
  123. package/dist/adapters/skillCatalog.d.mts.map +0 -1
  124. package/dist/adapters/skillCatalog.mjs.map +0 -1
  125. package/dist/commands/skillsCommand.cjs +0 -2
  126. package/dist/commands/skillsCommand.cjs.map +0 -1
  127. package/dist/commands/skillsCommand.mjs +0 -2
  128. package/dist/commands/skillsCommand.mjs.map +0 -1
  129. package/dist/services/skillText.cjs +0 -2
  130. package/dist/services/skillText.cjs.map +0 -1
  131. package/dist/services/skillText.d.cts.map +0 -1
  132. package/dist/services/skillText.d.mts.map +0 -1
  133. package/dist/services/skillText.mjs +0 -2
  134. package/dist/services/skillText.mjs.map +0 -1
package/README.md CHANGED
@@ -26,7 +26,7 @@ diagnostics.
26
26
  ## Contributing skill directories
27
27
 
28
28
  The package provides the session-owned `doom/skill-sources` Cordis service from
29
- `@agimon-ai/doompi-extension-contracts/skills`. Extensions register their directories inside
29
+ `@agimon-ai/doompi-core/skills`. Extensions register their directories inside
30
30
  `ctx.inject([DOOM_SKILL_SOURCES_SERVICE], ...)`; the returned handle is disposed automatically when
31
31
  either the contributor or provider unloads. Contributions are keyed by source, so a replacement
32
32
  generation takes the previous package slot without doubling it.
@@ -45,3 +45,5 @@ it. It is not selectable from `.doom/modes.yaml`.
45
45
  ## License
46
46
 
47
47
  MIT
48
+
49
+ Plugin entries live in `src/extensions`, host event and command controllers in `src/controllers`, and catalog and discovery logic in named `src/services` folders. `src/exports` contains public helpers and types. Pi declares owned service bindings and native events. Its `onStop` invalidates pending discovery generations; final disposal releases the Help view. The server awaits its async declaration factory to discover named skill commands before registration and startup.
@@ -0,0 +1 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./schemas/apiContracts.cjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./schemas/apiContracts.mjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1 @@
1
+ import{apiContracts as e}from"./schemas/apiContracts.mjs";export{e as apiContracts,e as default};
package/dist/catalog.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/skillCatalog.cjs");exports.buildSkillCatalog=e.buildSkillCatalog,exports.counter=e.counter;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/skillCatalog/index.cjs");exports.buildSkillCatalog=e.buildSkillCatalog,exports.counter=e.counter;
@@ -1,2 +1,2 @@
1
- import { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillOwnerNode, buildSkillCatalog, counter } from "./adapters/skillCatalog.cjs";
1
+ import { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillOwnerNode, buildSkillCatalog, counter } from "./services/skillCatalog/index.cjs";
2
2
  export { type SkillCatalog, type SkillCatalogOptions, type SkillEntry, type SkillGroup, type SkillOwnerNode, buildSkillCatalog, counter };
@@ -1,2 +1,2 @@
1
- import { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillOwnerNode, buildSkillCatalog, counter } from "./adapters/skillCatalog.mjs";
1
+ import { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillOwnerNode, buildSkillCatalog, counter } from "./services/skillCatalog/index.mjs";
2
2
  export { type SkillCatalog, type SkillCatalogOptions, type SkillEntry, type SkillGroup, type SkillOwnerNode, buildSkillCatalog, counter };
package/dist/catalog.mjs CHANGED
@@ -1 +1 @@
1
- import{buildSkillCatalog as e,counter as t}from"./adapters/skillCatalog.mjs";export{e as buildSkillCatalog,t as counter};
1
+ import{buildSkillCatalog as e,counter as t}from"./services/skillCatalog/index.mjs";export{e as buildSkillCatalog,t as counter};
@@ -0,0 +1,2 @@
1
+ const e=require("../types/skills.cjs"),t=require("../services/deferredSkills/index.cjs");function n(n,r){return[{name:e.SKILLS_COMMAND,description:`List discovered skills or invoke one by name.`,async execute(e,i){let a=e.trim();if(a){await i.session.prompt(t.expandDeferredSkillCommand(`/skill:${a}`,n.skills));return}await i.client.notify({title:`DoomPi skills`,body:r,level:`info`})}},...n.skills.map(e=>({name:`skill:${e.name}`,description:e.description,execute:async(r,i)=>{let a=`/skill:${e.name}${r?` ${r}`:``}`,o=t.expandDeferredSkillCommand(a,n.skills);if(o===a)throw Error(`Skill '${e.name}' is no longer readable.`);await i.session.prompt(o)}}))]}exports.createSkillCommands=n;
2
+ //# sourceMappingURL=skillCommands.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCommands.cjs","names":["SKILLS_COMMAND","expandDeferredSkillCommand"],"sources":["../../src/controllers/skillCommands.ts"],"sourcesContent":["import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\n\nimport { expandDeferredSkillCommand, type DeferredSkillSnapshot } from '../services/deferredSkills';\nimport { SKILLS_COMMAND } from '../types/skills';\nexport function createSkillCommands(inventory: DeferredSkillSnapshot, catalog: string): readonly DoomHeadlessCommand[] {\n return [\n {\n name: SKILLS_COMMAND,\n description: 'List discovered skills or invoke one by name.',\n async execute(args, execution) {\n const requested = args.trim();\n if (requested) {\n await execution.session.prompt(expandDeferredSkillCommand(`/skill:${requested}`, inventory.skills));\n return;\n }\n await execution.client.notify({\n title: 'DoomPi skills',\n body: catalog,\n level: 'info',\n });\n },\n },\n ...inventory.skills.map((skill): DoomHeadlessCommand => ({\n name: `skill:${skill.name}`,\n description: skill.description,\n execute: async (args, execution) => {\n const text = `/skill:${skill.name}${args ? ` ${args}` : ''}`;\n const expanded = expandDeferredSkillCommand(text, inventory.skills);\n if (expanded === text) throw new Error(`Skill '${skill.name}' is no longer readable.`);\n await execution.session.prompt(expanded);\n },\n })),\n ];\n}\n"],"mappings":"yFAIA,SAAgB,EAAoB,EAAkC,EAAiD,CACrH,MAAO,CACL,CACE,KAAMA,EAAAA,eACN,YAAa,gDACb,MAAM,QAAQ,EAAM,EAAW,CAC7B,IAAM,EAAY,EAAK,KAAK,EAC5B,GAAI,EAAW,CACb,MAAM,EAAU,QAAQ,OAAOC,EAAAA,2BAA2B,UAAU,IAAa,EAAU,MAAM,CAAC,EAClG,MACF,CACA,MAAM,EAAU,OAAO,OAAO,CAC5B,MAAO,gBACP,KAAM,EACN,MAAO,MACT,CAAC,CACH,CACF,EACA,GAAG,EAAU,OAAO,IAAK,IAAgC,CACvD,KAAM,SAAS,EAAM,OACrB,YAAa,EAAM,YACnB,QAAS,MAAO,EAAM,IAAc,CAClC,IAAM,EAAO,UAAU,EAAM,OAAO,EAAO,IAAI,IAAS,KAClD,EAAWA,EAAAA,2BAA2B,EAAM,EAAU,MAAM,EAClE,GAAI,IAAa,EAAM,MAAU,MAAM,UAAU,EAAM,KAAK,yBAAyB,EACrF,MAAM,EAAU,QAAQ,OAAO,CAAQ,CACzC,CACF,EAAE,CACJ,CACF"}
@@ -0,0 +1,2 @@
1
+ import{SKILLS_COMMAND as e}from"../types/skills.mjs";import{expandDeferredSkillCommand as t}from"../services/deferredSkills/index.mjs";function n(n,r){return[{name:e,description:`List discovered skills or invoke one by name.`,async execute(e,i){let a=e.trim();if(a){await i.session.prompt(t(`/skill:${a}`,n.skills));return}await i.client.notify({title:`DoomPi skills`,body:r,level:`info`})}},...n.skills.map(e=>({name:`skill:${e.name}`,description:e.description,execute:async(r,i)=>{let a=`/skill:${e.name}${r?` ${r}`:``}`,o=t(a,n.skills);if(o===a)throw Error(`Skill '${e.name}' is no longer readable.`);await i.session.prompt(o)}}))]}export{n as createSkillCommands};
2
+ //# sourceMappingURL=skillCommands.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCommands.mjs","names":[],"sources":["../../src/controllers/skillCommands.ts"],"sourcesContent":["import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\n\nimport { expandDeferredSkillCommand, type DeferredSkillSnapshot } from '../services/deferredSkills';\nimport { SKILLS_COMMAND } from '../types/skills';\nexport function createSkillCommands(inventory: DeferredSkillSnapshot, catalog: string): readonly DoomHeadlessCommand[] {\n return [\n {\n name: SKILLS_COMMAND,\n description: 'List discovered skills or invoke one by name.',\n async execute(args, execution) {\n const requested = args.trim();\n if (requested) {\n await execution.session.prompt(expandDeferredSkillCommand(`/skill:${requested}`, inventory.skills));\n return;\n }\n await execution.client.notify({\n title: 'DoomPi skills',\n body: catalog,\n level: 'info',\n });\n },\n },\n ...inventory.skills.map((skill): DoomHeadlessCommand => ({\n name: `skill:${skill.name}`,\n description: skill.description,\n execute: async (args, execution) => {\n const text = `/skill:${skill.name}${args ? ` ${args}` : ''}`;\n const expanded = expandDeferredSkillCommand(text, inventory.skills);\n if (expanded === text) throw new Error(`Skill '${skill.name}' is no longer readable.`);\n await execution.session.prompt(expanded);\n },\n })),\n ];\n}\n"],"mappings":"uIAIA,SAAgB,EAAoB,EAAkC,EAAiD,CACrH,MAAO,CACL,CACE,KAAM,EACN,YAAa,gDACb,MAAM,QAAQ,EAAM,EAAW,CAC7B,IAAM,EAAY,EAAK,KAAK,EAC5B,GAAI,EAAW,CACb,MAAM,EAAU,QAAQ,OAAO,EAA2B,UAAU,IAAa,EAAU,MAAM,CAAC,EAClG,MACF,CACA,MAAM,EAAU,OAAO,OAAO,CAC5B,MAAO,gBACP,KAAM,EACN,MAAO,MACT,CAAC,CACH,CACF,EACA,GAAG,EAAU,OAAO,IAAK,IAAgC,CACvD,KAAM,SAAS,EAAM,OACrB,YAAa,EAAM,YACnB,QAAS,MAAO,EAAM,IAAc,CAClC,IAAM,EAAO,UAAU,EAAM,OAAO,EAAO,IAAI,IAAS,KAClD,EAAW,EAA2B,EAAM,EAAU,MAAM,EAClE,GAAI,IAAa,EAAM,MAAU,MAAM,UAAU,EAAM,KAAK,yBAAyB,EACrF,MAAM,EAAU,QAAQ,OAAO,CAAQ,CACzC,CACF,EAAE,CACJ,CACF"}
@@ -0,0 +1,4 @@
1
+ const e=require("../types/skills.cjs");let t=require("@agimon-ai/doompi-config/piContext");const n=`warning`;function r(t){return typeof t.getCommands==`function`?t.getCommands().filter(e=>e.source===`skill`&&e.name.startsWith(`skill:`)).map(t=>t.name.slice(e.SKILL_COMMAND_PREFIX.length)):[]}function i(e,t){return{skills:[],diagnostics:[`${e}: ${t instanceof Error?t.message:String(t)}`]}}function a(e,a,o,s){let c=0,l,u=``,d=async e=>{let t=await e.ready;return l===e?t:void 0};return{events:{session_start:(e,n)=>{let r=(0,t.requireDoomConfigContext)(s()).harness;l={id:++c,ready:o().then(({DeferredSkillLoader:e})=>new e({cwd:n.cwd,skillPaths:r.skillDirectories}).start()).catch(e=>i(n.cwd,e)),diagnosticsShown:!1},u=``},input:async t=>{if(!t.text.startsWith(`/skill:`))return{action:`continue`};let n=l;if(!n)return{action:`continue`};let i=await d(n);if(!i)return{action:`continue`};let s=a.merge({normalSkills:[],deferredSkills:i.skills,normalSkillNames:r(e)}),{expandDeferredSkillCommand:c}=await o(),u=c(t.text,s.additionalSkills);return u===t.text?{action:`continue`}:{action:`transform`,text:u,images:t.images}},before_agent_start:async(e,t)=>{let r=l;if(!r)return;let i=await d(r);if(!i)return;!r.diagnosticsShown&&i.diagnostics.length>0&&(r.diagnosticsShown=!0,t.ui.notify(`Skill discovery:\n${i.diagnostics.join(`
2
+ `)}`,n));let s=a.merge({normalSkills:e.systemPromptOptions.skills??[],deferredSkills:i.skills});if(s.diagnosticKey!==u&&(u=s.diagnosticKey,s.diagnostics.length>0&&t.ui.notify(`Package Help:\n${s.diagnostics.join(`
3
+ `)}`,n)),s.additionalSkills.length===0)return;let{buildPromptWithDeferredSkills:c}=await o();return{systemPrompt:c(e.systemPrompt,e.systemPromptOptions,[...s.additionalSkills])}}},onStop(){l=void 0},current:async()=>l?d(l):void 0}}function o(e,t){return async n=>{let r=await t.current(),i=e.merge({normalSkills:n.getSystemPromptOptions().skills??[],deferredSkills:r?.skills??[]});return{helpSkills:i.helpSkills,diagnostics:i.diagnostics}}}exports.createSkillReadiness=a,exports.skillInventory=o;
4
+ //# sourceMappingURL=skillReadiness.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillReadiness.cjs","names":["SKILL_COMMAND_PREFIX","requireDoomConfigContext"],"sources":["../../src/controllers/skillReadiness.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { PiEventHandlers } from '@agimon-ai/doompi-core/pi-extension';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, Skill } from '@earendil-works/pi-coding-agent';\n\nimport type { DeferredSkillSnapshot } from '../services/deferredSkills';\nimport type { createActiveHelpSkillView } from '../services/helpSkills';\nimport { SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from '../types/skills';\n\nconst WARNING = 'warning';\n\ntype HelpSkillView = ReturnType<typeof createActiveHelpSkillView>;\n\ninterface SkillReadinessGeneration {\n readonly id: number;\n readonly ready: Promise<DeferredSkillSnapshot>;\n diagnosticsShown: boolean;\n}\n\nexport interface SkillReadiness {\n readonly events: PiEventHandlers;\n onStop(this: void): void;\n /** The snapshot for the live generation, or undefined once it is superseded. */\n current(): Promise<DeferredSkillSnapshot | undefined>;\n}\n\nfunction loadedSkillCommandNames(pi: ExtensionAPI): string[] {\n if (typeof pi.getCommands !== 'function') return [];\n return pi\n .getCommands()\n .filter((command) => command.source === 'skill' && command.name.startsWith(SKILL_COMMAND_PREFIX))\n .map((command) => command.name.slice(SKILL_COMMAND_PREFIX.length));\n}\n\nfunction failedSnapshot(cwd: string, error: unknown): DeferredSkillSnapshot {\n return {\n skills: [],\n diagnostics: [`${cwd}: ${error instanceof Error ? error.message : String(error)}`],\n };\n}\n\n/**\n * Discovery that starts with the session and is awaited only when something\n * needs it.\n *\n * Scanning every skill directory is the slowest thing this package does, so it\n * runs as a generation started on session_start. A reload starts a new one, and\n * a snapshot from a superseded generation is discarded rather than shown.\n */\nexport function createSkillReadiness(\n pi: ExtensionAPI,\n helpSkillView: HelpSkillView,\n loadDeferredSkills: () => Promise<typeof import('../services/deferredSkills')>,\n cordisContext: () => Context,\n): SkillReadiness {\n let generationSequence = 0;\n let currentGeneration: SkillReadinessGeneration | undefined;\n let shownHelpDiagnosticKey = '';\n\n const currentSnapshot = async (generation: SkillReadinessGeneration): Promise<DeferredSkillSnapshot | undefined> => {\n const snapshot = await generation.ready;\n return currentGeneration === generation ? snapshot : undefined;\n };\n\n return {\n events: {\n session_start: (_event, ctx) => {\n const state = requireDoomConfigContext(cordisContext()).harness;\n const id = ++generationSequence;\n const ready = loadDeferredSkills()\n .then(({ DeferredSkillLoader }) =>\n new DeferredSkillLoader({ cwd: ctx.cwd, skillPaths: state.skillDirectories }).start(),\n )\n .catch((error: unknown) => failedSnapshot(ctx.cwd, error));\n currentGeneration = { id, ready, diagnosticsShown: false };\n shownHelpDiagnosticKey = '';\n },\n input: async (event) => {\n if (!event.text.startsWith(SKILL_INVOCATION_PREFIX)) return { action: 'continue' };\n\n const generation = currentGeneration;\n if (!generation) return { action: 'continue' };\n const snapshot = await currentSnapshot(generation);\n if (!snapshot) return { action: 'continue' };\n\n const inventory = helpSkillView.merge({\n normalSkills: [],\n deferredSkills: snapshot.skills,\n normalSkillNames: loadedSkillCommandNames(pi),\n });\n const { expandDeferredSkillCommand } = await loadDeferredSkills();\n const text = expandDeferredSkillCommand(event.text, inventory.additionalSkills);\n return text === event.text ? { action: 'continue' } : { action: 'transform', text, images: event.images };\n },\n before_agent_start: async (event, ctx) => {\n const generation = currentGeneration;\n if (!generation) return undefined;\n const snapshot = await currentSnapshot(generation);\n if (!snapshot) return undefined;\n\n if (!generation.diagnosticsShown && snapshot.diagnostics.length > 0) {\n generation.diagnosticsShown = true;\n ctx.ui.notify(`Skill discovery:\\n${snapshot.diagnostics.join('\\n')}`, WARNING);\n }\n const inventory = helpSkillView.merge({\n normalSkills: event.systemPromptOptions.skills ?? [],\n deferredSkills: snapshot.skills,\n });\n if (inventory.diagnosticKey !== shownHelpDiagnosticKey) {\n shownHelpDiagnosticKey = inventory.diagnosticKey;\n if (inventory.diagnostics.length > 0) {\n ctx.ui.notify(`Package Help:\\n${inventory.diagnostics.join('\\n')}`, WARNING);\n }\n }\n if (inventory.additionalSkills.length === 0) return undefined;\n\n const { buildPromptWithDeferredSkills } = await loadDeferredSkills();\n return {\n systemPrompt: buildPromptWithDeferredSkills(event.systemPrompt, event.systemPromptOptions, [\n ...inventory.additionalSkills,\n ]),\n };\n },\n },\n onStop() {\n currentGeneration = undefined;\n },\n current: async () => (currentGeneration ? currentSnapshot(currentGeneration) : undefined),\n };\n}\n\n/** The merged skill inventory the /skills catalogue is built from. */\nexport function skillInventory(helpSkillView: HelpSkillView, readiness: SkillReadiness) {\n return async (ctx: ExtensionContext) => {\n const snapshot = await readiness.current();\n const inventory = helpSkillView.merge({\n // Present on the runtime context; absent from the published ExtensionContext type.\n normalSkills:\n (ctx as unknown as { getSystemPromptOptions(): { skills?: Skill[] } }).getSystemPromptOptions().skills ?? [],\n deferredSkills: snapshot?.skills ?? [],\n });\n return { helpSkills: inventory.helpSkills, diagnostics: inventory.diagnostics };\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import{SKILL_COMMAND_PREFIX as e}from"../types/skills.mjs";import{requireDoomConfigContext as t}from"@agimon-ai/doompi-config/piContext";const n=`warning`;function r(t){return typeof t.getCommands==`function`?t.getCommands().filter(e=>e.source===`skill`&&e.name.startsWith(`skill:`)).map(t=>t.name.slice(e.length)):[]}function i(e,t){return{skills:[],diagnostics:[`${e}: ${t instanceof Error?t.message:String(t)}`]}}function a(e,a,o,s){let c=0,l,u=``,d=async e=>{let t=await e.ready;return l===e?t:void 0};return{events:{session_start:(e,n)=>{let r=t(s()).harness;l={id:++c,ready:o().then(({DeferredSkillLoader:e})=>new e({cwd:n.cwd,skillPaths:r.skillDirectories}).start()).catch(e=>i(n.cwd,e)),diagnosticsShown:!1},u=``},input:async t=>{if(!t.text.startsWith(`/skill:`))return{action:`continue`};let n=l;if(!n)return{action:`continue`};let i=await d(n);if(!i)return{action:`continue`};let s=a.merge({normalSkills:[],deferredSkills:i.skills,normalSkillNames:r(e)}),{expandDeferredSkillCommand:c}=await o(),u=c(t.text,s.additionalSkills);return u===t.text?{action:`continue`}:{action:`transform`,text:u,images:t.images}},before_agent_start:async(e,t)=>{let r=l;if(!r)return;let i=await d(r);if(!i)return;!r.diagnosticsShown&&i.diagnostics.length>0&&(r.diagnosticsShown=!0,t.ui.notify(`Skill discovery:\n${i.diagnostics.join(`
2
+ `)}`,n));let s=a.merge({normalSkills:e.systemPromptOptions.skills??[],deferredSkills:i.skills});if(s.diagnosticKey!==u&&(u=s.diagnosticKey,s.diagnostics.length>0&&t.ui.notify(`Package Help:\n${s.diagnostics.join(`
3
+ `)}`,n)),s.additionalSkills.length===0)return;let{buildPromptWithDeferredSkills:c}=await o();return{systemPrompt:c(e.systemPrompt,e.systemPromptOptions,[...s.additionalSkills])}}},onStop(){l=void 0},current:async()=>l?d(l):void 0}}function o(e,t){return async n=>{let r=await t.current(),i=e.merge({normalSkills:n.getSystemPromptOptions().skills??[],deferredSkills:r?.skills??[]});return{helpSkills:i.helpSkills,diagnostics:i.diagnostics}}}export{a as createSkillReadiness,o as skillInventory};
4
+ //# sourceMappingURL=skillReadiness.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillReadiness.mjs","names":[],"sources":["../../src/controllers/skillReadiness.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { PiEventHandlers } from '@agimon-ai/doompi-core/pi-extension';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext, Skill } from '@earendil-works/pi-coding-agent';\n\nimport type { DeferredSkillSnapshot } from '../services/deferredSkills';\nimport type { createActiveHelpSkillView } from '../services/helpSkills';\nimport { SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from '../types/skills';\n\nconst WARNING = 'warning';\n\ntype HelpSkillView = ReturnType<typeof createActiveHelpSkillView>;\n\ninterface SkillReadinessGeneration {\n readonly id: number;\n readonly ready: Promise<DeferredSkillSnapshot>;\n diagnosticsShown: boolean;\n}\n\nexport interface SkillReadiness {\n readonly events: PiEventHandlers;\n onStop(this: void): void;\n /** The snapshot for the live generation, or undefined once it is superseded. */\n current(): Promise<DeferredSkillSnapshot | undefined>;\n}\n\nfunction loadedSkillCommandNames(pi: ExtensionAPI): string[] {\n if (typeof pi.getCommands !== 'function') return [];\n return pi\n .getCommands()\n .filter((command) => command.source === 'skill' && command.name.startsWith(SKILL_COMMAND_PREFIX))\n .map((command) => command.name.slice(SKILL_COMMAND_PREFIX.length));\n}\n\nfunction failedSnapshot(cwd: string, error: unknown): DeferredSkillSnapshot {\n return {\n skills: [],\n diagnostics: [`${cwd}: ${error instanceof Error ? error.message : String(error)}`],\n };\n}\n\n/**\n * Discovery that starts with the session and is awaited only when something\n * needs it.\n *\n * Scanning every skill directory is the slowest thing this package does, so it\n * runs as a generation started on session_start. A reload starts a new one, and\n * a snapshot from a superseded generation is discarded rather than shown.\n */\nexport function createSkillReadiness(\n pi: ExtensionAPI,\n helpSkillView: HelpSkillView,\n loadDeferredSkills: () => Promise<typeof import('../services/deferredSkills')>,\n cordisContext: () => Context,\n): SkillReadiness {\n let generationSequence = 0;\n let currentGeneration: SkillReadinessGeneration | undefined;\n let shownHelpDiagnosticKey = '';\n\n const currentSnapshot = async (generation: SkillReadinessGeneration): Promise<DeferredSkillSnapshot | undefined> => {\n const snapshot = await generation.ready;\n return currentGeneration === generation ? snapshot : undefined;\n };\n\n return {\n events: {\n session_start: (_event, ctx) => {\n const state = requireDoomConfigContext(cordisContext()).harness;\n const id = ++generationSequence;\n const ready = loadDeferredSkills()\n .then(({ DeferredSkillLoader }) =>\n new DeferredSkillLoader({ cwd: ctx.cwd, skillPaths: state.skillDirectories }).start(),\n )\n .catch((error: unknown) => failedSnapshot(ctx.cwd, error));\n currentGeneration = { id, ready, diagnosticsShown: false };\n shownHelpDiagnosticKey = '';\n },\n input: async (event) => {\n if (!event.text.startsWith(SKILL_INVOCATION_PREFIX)) return { action: 'continue' };\n\n const generation = currentGeneration;\n if (!generation) return { action: 'continue' };\n const snapshot = await currentSnapshot(generation);\n if (!snapshot) return { action: 'continue' };\n\n const inventory = helpSkillView.merge({\n normalSkills: [],\n deferredSkills: snapshot.skills,\n normalSkillNames: loadedSkillCommandNames(pi),\n });\n const { expandDeferredSkillCommand } = await loadDeferredSkills();\n const text = expandDeferredSkillCommand(event.text, inventory.additionalSkills);\n return text === event.text ? { action: 'continue' } : { action: 'transform', text, images: event.images };\n },\n before_agent_start: async (event, ctx) => {\n const generation = currentGeneration;\n if (!generation) return undefined;\n const snapshot = await currentSnapshot(generation);\n if (!snapshot) return undefined;\n\n if (!generation.diagnosticsShown && snapshot.diagnostics.length > 0) {\n generation.diagnosticsShown = true;\n ctx.ui.notify(`Skill discovery:\\n${snapshot.diagnostics.join('\\n')}`, WARNING);\n }\n const inventory = helpSkillView.merge({\n normalSkills: event.systemPromptOptions.skills ?? [],\n deferredSkills: snapshot.skills,\n });\n if (inventory.diagnosticKey !== shownHelpDiagnosticKey) {\n shownHelpDiagnosticKey = inventory.diagnosticKey;\n if (inventory.diagnostics.length > 0) {\n ctx.ui.notify(`Package Help:\\n${inventory.diagnostics.join('\\n')}`, WARNING);\n }\n }\n if (inventory.additionalSkills.length === 0) return undefined;\n\n const { buildPromptWithDeferredSkills } = await loadDeferredSkills();\n return {\n systemPrompt: buildPromptWithDeferredSkills(event.systemPrompt, event.systemPromptOptions, [\n ...inventory.additionalSkills,\n ]),\n };\n },\n },\n onStop() {\n currentGeneration = undefined;\n },\n current: async () => (currentGeneration ? currentSnapshot(currentGeneration) : undefined),\n };\n}\n\n/** The merged skill inventory the /skills catalogue is built from. */\nexport function skillInventory(helpSkillView: HelpSkillView, readiness: SkillReadiness) {\n return async (ctx: ExtensionContext) => {\n const snapshot = await readiness.current();\n const inventory = helpSkillView.merge({\n // Present on the runtime context; absent from the published ExtensionContext type.\n normalSkills:\n (ctx as unknown as { getSystemPromptOptions(): { skills?: Skill[] } }).getSystemPromptOptions().skills ?? [],\n deferredSkills: snapshot?.skills ?? [],\n });\n return { helpSkills: inventory.helpSkills, diagnostics: inventory.diagnostics };\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("../types/skills.cjs"),t=require("../services/helpSkills/index.cjs"),n=require("./skillReadiness.cjs"),r=require("./skillsCommand.cjs");let i=require("@agimon-ai/doompi-config"),a=require("@agimon-ai/doompi-config/harnessStore"),o=require("@agimon-ai/doompi-core/config"),s=require("@agimon-ai/doompi-core/cordis-host"),c=require("@agimon-ai/doompi-core/help"),l=require("@agimon-ai/doompi-core/skills"),u=require("@agimon-ai/doompi-core/ui-hub");function d(){let e,t;return{catalog:()=>e??=Promise.resolve().then(()=>require("../services/skillCatalog/index.cjs")),deferred:()=>t??=Promise.resolve().then(()=>require("../services/deferredSkills/index.cjs"))}}function f({pi:f,openOverlay:p}){let m=d(),h,g,_=e=>{e.inject([o.DOOM_CONFIG_SERVICE],e=>(h=e,()=>{h===e&&(h=void 0)}))},v=()=>{if(!h)throw Error(`Doom skill runtime is waiting for the session config service.`);return h},y=()=>{if(!g)throw Error(`Doom skill sources are waiting for the active session service.`);return g},b=e=>{e.inject([s.DOOM_CORDIS_SESSION_SERVICE],e=>{let t=e.get(s.DOOM_CORDIS_SESSION_SERVICE),n=(0,l.createDoomSkillSourcesService)(`${t.generation}:skill-sources`);return e.provide(l.DOOM_SKILL_SOURCES_SERVICE,n),g=n,()=>{g===n&&(g=void 0),n.dispose()}})},x=t.createActiveHelpSkillView(),S=e=>{e.inject([c.DOOM_HELP_SERVICE],e=>{let t=(0,c.requireDoomHelpService)(e),n=x.bind(t);return()=>{n()}})},C=t=>{t.inject([u.DOOM_UI_HUB_SERVICE],t=>{let n=(0,u.requireDoomUiHub)(t).registerLeader(e.SKILLS_LEADER_CONTRIBUTION);return()=>n.dispose()})},w=n.createSkillReadiness(f,x,m.deferred,v);return{services:[_,b,S,C],commands:[r.createSkillsCommand({cordisContext:v,extensionSources:()=>y().list(),inventory:async e=>n.skillInventory(x,w)(e),repositoryRoot:async e=>(0,a.requireHarnessRoot)((0,i.requireDoomConfigContext)(v()).harness),buildCatalog:async e=>(await m.catalog()).buildSkillCatalog(e),openOverlay:p})],events:w.events,onStop:w.onStop,onDispose(){x.dispose()}}}exports.createSkillRuntime=f;
2
+ //# sourceMappingURL=skillRuntime.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillRuntime.cjs","names":["DOOM_CONFIG_SERVICE","DOOM_CORDIS_SESSION_SERVICE","createDoomSkillSourcesService","DOOM_SKILL_SOURCES_SERVICE","createActiveHelpSkillView","DOOM_HELP_SERVICE","requireDoomHelpService","DOOM_UI_HUB_SERVICE","requireDoomUiHub","SKILLS_LEADER_CONTRIBUTION","createSkillReadiness","createSkillsCommand","skillInventory","requireHarnessRoot","requireDoomConfigContext"],"sources":["../../src/controllers/skillRuntime.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-core/help';\nimport { type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport {\n createDoomSkillSourcesService,\n DOOM_SKILL_SOURCES_SERVICE,\n type DoomSkillSourcesService,\n} from '@agimon-ai/doompi-core/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { createActiveHelpSkillView } from '../services/helpSkills';\nimport { SKILLS_LEADER_CONTRIBUTION } from '../types/skills';\nimport { createSkillReadiness, skillInventory } from './skillReadiness';\nimport { createSkillsCommand, type SkillsCommandDependencies } from './skillsCommand';\n\n/**\n * The catalogue and the overlay load on first use.\n *\n * Discovery has to start with the session, but building the catalogue and\n * rendering it are only reached by `/skills`, so they stay off the startup path.\n */\nfunction lazyModules() {\n let catalog: Promise<typeof import('../services/skillCatalog')> | undefined;\n let deferred: Promise<typeof import('../services/deferredSkills')> | undefined;\n return {\n catalog: () => (catalog ??= import('../services/skillCatalog')),\n deferred: () => (deferred ??= import('../services/deferredSkills')),\n };\n}\n\ninterface SkillPluginConfig {\n readonly pi: ExtensionAPI;\n readonly openOverlay: SkillsCommandDependencies['openOverlay'];\n}\n\nexport function createSkillRuntime({ pi, openOverlay }: SkillPluginConfig): PiPluginContributions {\n const load = lazyModules();\n let activeContext: Context | undefined;\n let activeSources: DoomSkillSourcesService | undefined;\n const bindConfig = (cordis: Context) => {\n cordis.inject([DOOM_CONFIG_SERVICE], (context) => {\n activeContext = context;\n return () => {\n if (activeContext === context) activeContext = undefined;\n };\n });\n };\n const requireRuntimeContext = (): Context => {\n if (!activeContext) throw new Error('Doom skill runtime is waiting for the session config service.');\n return activeContext;\n };\n const requireSkillSources = (): DoomSkillSourcesService => {\n if (!activeSources) throw new Error('Doom skill sources are waiting for the active session service.');\n return activeSources;\n };\n const bindSources = (cordis: Context) => {\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const service = createDoomSkillSourcesService(`${session.generation}:skill-sources`);\n sessionContext.provide(DOOM_SKILL_SOURCES_SERVICE, service);\n activeSources = service;\n return () => {\n if (activeSources === service) activeSources = undefined;\n service.dispose();\n };\n });\n };\n const helpSkillView = createActiveHelpSkillView();\n\n const bindHelp = (cordis: Context) => {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const help = requireDoomHelpService(helpContext);\n const unbind = helpSkillView.bind(help);\n return () => {\n unbind();\n };\n });\n };\n const bindUi = (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(SKILLS_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n };\n const readiness = createSkillReadiness(pi, helpSkillView, load.deferred, requireRuntimeContext);\n return {\n services: [bindConfig, bindSources, bindHelp, bindUi],\n commands: [\n createSkillsCommand({\n cordisContext: requireRuntimeContext,\n extensionSources: () => requireSkillSources().list(),\n inventory: async (ctx) => {\n return skillInventory(helpSkillView, readiness)(ctx);\n },\n repositoryRoot: async (_ctx: ExtensionContext) =>\n requireHarnessRoot(requireDoomConfigContext(requireRuntimeContext()).harness),\n buildCatalog: async (request) => (await load.catalog()).buildSkillCatalog(request),\n openOverlay,\n }),\n ],\n events: readiness.events,\n onStop: readiness.onStop,\n onDispose() {\n helpSkillView.dispose();\n },\n };\n}\n"],"mappings":"+cA0BA,SAAS,GAAc,CACrB,IAAI,EACA,EACJ,MAAO,CACL,YAAgB,IAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAY,oCAAA,CAAA,EAC5B,aAAiB,IAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAa,sCAAA,CAAA,CAChC,CACF,CAOA,SAAgB,EAAmB,CAAE,KAAI,eAAyD,CAChG,IAAM,EAAO,EAAY,EACrB,EACA,EACE,EAAc,GAAoB,CACtC,EAAO,OAAO,CAACA,EAAAA,mBAAmB,EAAI,IACpC,EAAgB,MACH,CACP,IAAkB,IAAS,EAAgB,IAAA,GACjD,EACD,CACH,EACM,MAAuC,CAC3C,GAAI,CAAC,EAAe,MAAU,MAAM,+DAA+D,EACnG,OAAO,CACT,EACM,MAAqD,CACzD,GAAI,CAAC,EAAe,MAAU,MAAM,gEAAgE,EACpG,OAAO,CACT,EACM,EAAe,GAAoB,CACvC,EAAO,OAAO,CAACC,EAAAA,2BAA2B,EAAI,GAAmB,CAC/D,IAAM,EAAU,EAAe,IAAIA,EAAAA,2BAA2B,EACxD,GAAA,EAAUC,EAAAA,8BAAAA,CAA8B,GAAG,EAAQ,WAAW,eAAe,EAGnF,OAFA,EAAe,QAAQC,EAAAA,2BAA4B,CAAO,EAC1D,EAAgB,MACH,CACP,IAAkB,IAAS,EAAgB,IAAA,IAC/C,EAAQ,QAAQ,CAClB,CACF,CAAC,CACH,EACM,EAAgBC,EAAAA,0BAA0B,EAE1C,EAAY,GAAoB,CACpC,EAAO,OAAO,CAACC,EAAAA,iBAAiB,EAAI,GAAgB,CAClD,IAAM,GAAA,EAAOC,EAAAA,uBAAAA,CAAuB,CAAW,EACzC,EAAS,EAAc,KAAK,CAAI,EACtC,UAAa,CACX,EAAO,CACT,CACF,CAAC,CACH,EACM,EAAU,GAAoB,CAClC,EAAO,OAAO,CAACC,EAAAA,mBAAmB,EAAI,GAAc,CAClD,IAAM,GAAA,EAAeC,EAAAA,iBAAAA,CAAiB,CAAS,CAAC,CAAC,eAAeC,EAAAA,0BAA0B,EAC1F,UAAa,EAAa,QAAQ,CACpC,CAAC,CACH,EACM,EAAYC,EAAAA,qBAAqB,EAAI,EAAe,EAAK,SAAU,CAAqB,EAC9F,MAAO,CACL,SAAU,CAAC,EAAY,EAAa,EAAU,CAAM,EACpD,SAAU,CACRC,EAAAA,oBAAoB,CAClB,cAAe,EACf,qBAAwB,EAAoB,CAAC,CAAC,KAAK,EACnD,UAAW,KAAO,IACTC,EAAAA,eAAe,EAAe,CAAS,CAAC,CAAC,CAAG,EAErD,eAAgB,KAAO,KAAA,EACrBC,EAAAA,mBAAAA,EAAAA,EAAmBC,EAAAA,yBAAAA,CAAyB,EAAsB,CAAC,CAAC,CAAC,OAAO,EAC9E,aAAc,KAAO,KAAa,MAAM,EAAK,QAAQ,EAAA,CAAG,kBAAkB,CAAO,EACjF,aACF,CAAC,CACH,EACA,OAAQ,EAAU,OAClB,OAAQ,EAAU,OAClB,WAAY,CACV,EAAc,QAAQ,CACxB,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ import{SKILLS_LEADER_CONTRIBUTION as e}from"../types/skills.mjs";import{createActiveHelpSkillView as t}from"../services/helpSkills/index.mjs";import{createSkillReadiness as n,skillInventory as r}from"./skillReadiness.mjs";import{createSkillsCommand as i}from"./skillsCommand.mjs";import{requireDoomConfigContext as a}from"@agimon-ai/doompi-config";import{requireHarnessRoot as o}from"@agimon-ai/doompi-config/harnessStore";import{DOOM_CONFIG_SERVICE as s}from"@agimon-ai/doompi-core/config";import{DOOM_CORDIS_SESSION_SERVICE as c}from"@agimon-ai/doompi-core/cordis-host";import{DOOM_HELP_SERVICE as l,requireDoomHelpService as u}from"@agimon-ai/doompi-core/help";import{DOOM_SKILL_SOURCES_SERVICE as d,createDoomSkillSourcesService as f}from"@agimon-ai/doompi-core/skills";import{DOOM_UI_HUB_SERVICE as p,requireDoomUiHub as m}from"@agimon-ai/doompi-core/ui-hub";function h(){let e,t;return{catalog:()=>e??=import(`../services/skillCatalog/index.mjs`),deferred:()=>t??=import(`../services/deferredSkills/index.mjs`)}}function g({pi:g,openOverlay:_}){let v=h(),y,b,x=e=>{e.inject([s],e=>(y=e,()=>{y===e&&(y=void 0)}))},S=()=>{if(!y)throw Error(`Doom skill runtime is waiting for the session config service.`);return y},C=()=>{if(!b)throw Error(`Doom skill sources are waiting for the active session service.`);return b},w=e=>{e.inject([c],e=>{let t=e.get(c),n=f(`${t.generation}:skill-sources`);return e.provide(d,n),b=n,()=>{b===n&&(b=void 0),n.dispose()}})},T=t(),E=e=>{e.inject([l],e=>{let t=u(e),n=T.bind(t);return()=>{n()}})},D=t=>{t.inject([p],t=>{let n=m(t).registerLeader(e);return()=>n.dispose()})},O=n(g,T,v.deferred,S);return{services:[x,w,E,D],commands:[i({cordisContext:S,extensionSources:()=>C().list(),inventory:async e=>r(T,O)(e),repositoryRoot:async e=>o(a(S()).harness),buildCatalog:async e=>(await v.catalog()).buildSkillCatalog(e),openOverlay:_})],events:O.events,onStop:O.onStop,onDispose(){T.dispose()}}}export{g as createSkillRuntime};
2
+ //# sourceMappingURL=skillRuntime.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillRuntime.mjs","names":[],"sources":["../../src/controllers/skillRuntime.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config';\nimport { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { DOOM_CORDIS_SESSION_SERVICE, type DoomCordisSessionService } from '@agimon-ai/doompi-core/cordis-host';\nimport { DOOM_HELP_SERVICE, requireDoomHelpService } from '@agimon-ai/doompi-core/help';\nimport { type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport {\n createDoomSkillSourcesService,\n DOOM_SKILL_SOURCES_SERVICE,\n type DoomSkillSourcesService,\n} from '@agimon-ai/doompi-core/skills';\nimport { DOOM_UI_HUB_SERVICE, requireDoomUiHub } from '@agimon-ai/doompi-core/ui-hub';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { createActiveHelpSkillView } from '../services/helpSkills';\nimport { SKILLS_LEADER_CONTRIBUTION } from '../types/skills';\nimport { createSkillReadiness, skillInventory } from './skillReadiness';\nimport { createSkillsCommand, type SkillsCommandDependencies } from './skillsCommand';\n\n/**\n * The catalogue and the overlay load on first use.\n *\n * Discovery has to start with the session, but building the catalogue and\n * rendering it are only reached by `/skills`, so they stay off the startup path.\n */\nfunction lazyModules() {\n let catalog: Promise<typeof import('../services/skillCatalog')> | undefined;\n let deferred: Promise<typeof import('../services/deferredSkills')> | undefined;\n return {\n catalog: () => (catalog ??= import('../services/skillCatalog')),\n deferred: () => (deferred ??= import('../services/deferredSkills')),\n };\n}\n\ninterface SkillPluginConfig {\n readonly pi: ExtensionAPI;\n readonly openOverlay: SkillsCommandDependencies['openOverlay'];\n}\n\nexport function createSkillRuntime({ pi, openOverlay }: SkillPluginConfig): PiPluginContributions {\n const load = lazyModules();\n let activeContext: Context | undefined;\n let activeSources: DoomSkillSourcesService | undefined;\n const bindConfig = (cordis: Context) => {\n cordis.inject([DOOM_CONFIG_SERVICE], (context) => {\n activeContext = context;\n return () => {\n if (activeContext === context) activeContext = undefined;\n };\n });\n };\n const requireRuntimeContext = (): Context => {\n if (!activeContext) throw new Error('Doom skill runtime is waiting for the session config service.');\n return activeContext;\n };\n const requireSkillSources = (): DoomSkillSourcesService => {\n if (!activeSources) throw new Error('Doom skill sources are waiting for the active session service.');\n return activeSources;\n };\n const bindSources = (cordis: Context) => {\n cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n const service = createDoomSkillSourcesService(`${session.generation}:skill-sources`);\n sessionContext.provide(DOOM_SKILL_SOURCES_SERVICE, service);\n activeSources = service;\n return () => {\n if (activeSources === service) activeSources = undefined;\n service.dispose();\n };\n });\n };\n const helpSkillView = createActiveHelpSkillView();\n\n const bindHelp = (cordis: Context) => {\n cordis.inject([DOOM_HELP_SERVICE], (helpContext) => {\n const help = requireDoomHelpService(helpContext);\n const unbind = helpSkillView.bind(help);\n return () => {\n unbind();\n };\n });\n };\n const bindUi = (cordis: Context) => {\n cordis.inject([DOOM_UI_HUB_SERVICE], (uiContext) => {\n const contribution = requireDoomUiHub(uiContext).registerLeader(SKILLS_LEADER_CONTRIBUTION);\n return () => contribution.dispose();\n });\n };\n const readiness = createSkillReadiness(pi, helpSkillView, load.deferred, requireRuntimeContext);\n return {\n services: [bindConfig, bindSources, bindHelp, bindUi],\n commands: [\n createSkillsCommand({\n cordisContext: requireRuntimeContext,\n extensionSources: () => requireSkillSources().list(),\n inventory: async (ctx) => {\n return skillInventory(helpSkillView, readiness)(ctx);\n },\n repositoryRoot: async (_ctx: ExtensionContext) =>\n requireHarnessRoot(requireDoomConfigContext(requireRuntimeContext()).harness),\n buildCatalog: async (request) => (await load.catalog()).buildSkillCatalog(request),\n openOverlay,\n }),\n ],\n events: readiness.events,\n onStop: readiness.onStop,\n onDispose() {\n helpSkillView.dispose();\n },\n };\n}\n"],"mappings":"g2BA0BA,SAAS,GAAc,CACrB,IAAI,EACA,EACJ,MAAO,CACL,YAAgB,IAAY,OAAO,sCACnC,aAAiB,IAAa,OAAO,uCACvC,CACF,CAOA,SAAgB,EAAmB,CAAE,KAAI,eAAyD,CAChG,IAAM,EAAO,EAAY,EACrB,EACA,EACE,EAAc,GAAoB,CACtC,EAAO,OAAO,CAAC,CAAmB,EAAI,IACpC,EAAgB,MACH,CACP,IAAkB,IAAS,EAAgB,IAAA,GACjD,EACD,CACH,EACM,MAAuC,CAC3C,GAAI,CAAC,EAAe,MAAU,MAAM,+DAA+D,EACnG,OAAO,CACT,EACM,MAAqD,CACzD,GAAI,CAAC,EAAe,MAAU,MAAM,gEAAgE,EACpG,OAAO,CACT,EACM,EAAe,GAAoB,CACvC,EAAO,OAAO,CAAC,CAA2B,EAAI,GAAmB,CAC/D,IAAM,EAAU,EAAe,IAAI,CAA2B,EACxD,EAAU,EAA8B,GAAG,EAAQ,WAAW,eAAe,EAGnF,OAFA,EAAe,QAAQ,EAA4B,CAAO,EAC1D,EAAgB,MACH,CACP,IAAkB,IAAS,EAAgB,IAAA,IAC/C,EAAQ,QAAQ,CAClB,CACF,CAAC,CACH,EACM,EAAgB,EAA0B,EAE1C,EAAY,GAAoB,CACpC,EAAO,OAAO,CAAC,CAAiB,EAAI,GAAgB,CAClD,IAAM,EAAO,EAAuB,CAAW,EACzC,EAAS,EAAc,KAAK,CAAI,EACtC,UAAa,CACX,EAAO,CACT,CACF,CAAC,CACH,EACM,EAAU,GAAoB,CAClC,EAAO,OAAO,CAAC,CAAmB,EAAI,GAAc,CAClD,IAAM,EAAe,EAAiB,CAAS,CAAC,CAAC,eAAe,CAA0B,EAC1F,UAAa,EAAa,QAAQ,CACpC,CAAC,CACH,EACM,EAAY,EAAqB,EAAI,EAAe,EAAK,SAAU,CAAqB,EAC9F,MAAO,CACL,SAAU,CAAC,EAAY,EAAa,EAAU,CAAM,EACpD,SAAU,CACR,EAAoB,CAClB,cAAe,EACf,qBAAwB,EAAoB,CAAC,CAAC,KAAK,EACnD,UAAW,KAAO,IACT,EAAe,EAAe,CAAS,CAAC,CAAC,CAAG,EAErD,eAAgB,KAAO,IACrB,EAAmB,EAAyB,EAAsB,CAAC,CAAC,CAAC,OAAO,EAC9E,aAAc,KAAO,KAAa,MAAM,EAAK,QAAQ,EAAA,CAAG,kBAAkB,CAAO,EACjF,aACF,CAAC,CACH,EACA,OAAQ,EAAU,OAClB,OAAQ,EAAU,OAClB,WAAY,CACV,EAAc,QAAQ,CACxB,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ const e=require("../services/packageResources/index.cjs"),t=require("../services/serverInventory/index.cjs"),n=require("./skillCommands.cjs");async function r(r,i){let{inventory:a,catalog:o}=await t.discoverServerSkills(r.context,i);return{commands:n.createSkillCommands(a,o),resources:[{name:`doompi/skills`,kind:`skill`,read:()=>o},...[`doompi-author-skill`,`doompi-use-skill`].map(t=>({name:t,kind:`skill`,read:()=>e.readPackageResource(`src/prompts/${t}/SKILL.md`)}))]}}exports.createSkillServer=r;
2
+ //# sourceMappingURL=skillServer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillServer.cjs","names":["discoverServerSkills","createSkillCommands","readPackageResource"],"sources":["../../src/controllers/skillServer.ts"],"sourcesContent":["import type { DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { readPackageResource } from '../services/packageResources';\nimport { discoverServerSkills } from '../services/serverInventory';\nimport { createSkillCommands } from './skillCommands';\nexport async function createSkillServer(\n agent: DoomHeadlessHostService,\n signal: AbortSignal,\n): Promise<DoomServerSessionPlugin> {\n const { inventory, catalog } = await discoverServerSkills(agent.context, signal);\n return {\n commands: createSkillCommands(inventory, catalog),\n resources: [\n { name: 'doompi/skills', kind: 'skill', read: () => catalog },\n ...['doompi-author-skill', 'doompi-use-skill'].map((name) => ({\n name,\n kind: 'skill' as const,\n read: () => readPackageResource(`src/prompts/${name}/SKILL.md`),\n })),\n ],\n };\n}\n"],"mappings":"8IAMA,eAAsB,EACpB,EACA,EACkC,CAClC,GAAM,CAAE,YAAW,WAAY,MAAMA,EAAAA,qBAAqB,EAAM,QAAS,CAAM,EAC/E,MAAO,CACL,SAAUC,EAAAA,oBAAoB,EAAW,CAAO,EAChD,UAAW,CACT,CAAE,KAAM,gBAAiB,KAAM,QAAS,SAAY,CAAQ,EAC5D,GAAG,CAAC,sBAAuB,kBAAkB,CAAC,CAAC,IAAK,IAAU,CAC5D,OACA,KAAM,QACN,SAAYC,EAAAA,oBAAoB,eAAe,EAAK,UAAU,CAChE,EAAE,CACJ,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ import{readPackageResource as e}from"../services/packageResources/index.mjs";import{discoverServerSkills as t}from"../services/serverInventory/index.mjs";import{createSkillCommands as n}from"./skillCommands.mjs";async function r(r,i){let{inventory:a,catalog:o}=await t(r.context,i);return{commands:n(a,o),resources:[{name:`doompi/skills`,kind:`skill`,read:()=>o},...[`doompi-author-skill`,`doompi-use-skill`].map(t=>({name:t,kind:`skill`,read:()=>e(`src/prompts/${t}/SKILL.md`)}))]}}export{r as createSkillServer};
2
+ //# sourceMappingURL=skillServer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillServer.mjs","names":[],"sources":["../../src/controllers/skillServer.ts"],"sourcesContent":["import type { DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport type { DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { readPackageResource } from '../services/packageResources';\nimport { discoverServerSkills } from '../services/serverInventory';\nimport { createSkillCommands } from './skillCommands';\nexport async function createSkillServer(\n agent: DoomHeadlessHostService,\n signal: AbortSignal,\n): Promise<DoomServerSessionPlugin> {\n const { inventory, catalog } = await discoverServerSkills(agent.context, signal);\n return {\n commands: createSkillCommands(inventory, catalog),\n resources: [\n { name: 'doompi/skills', kind: 'skill', read: () => catalog },\n ...['doompi-author-skill', 'doompi-use-skill'].map((name) => ({\n name,\n kind: 'skill' as const,\n read: () => readPackageResource(`src/prompts/${name}/SKILL.md`),\n })),\n ],\n };\n}\n"],"mappings":"oNAMA,eAAsB,EACpB,EACA,EACkC,CAClC,GAAM,CAAE,YAAW,WAAY,MAAM,EAAqB,EAAM,QAAS,CAAM,EAC/E,MAAO,CACL,SAAU,EAAoB,EAAW,CAAO,EAChD,UAAW,CACT,CAAE,KAAM,gBAAiB,KAAM,QAAS,SAAY,CAAQ,EAC5D,GAAG,CAAC,sBAAuB,kBAAkB,CAAC,CAAC,IAAK,IAAU,CAC5D,OACA,KAAM,QACN,SAAY,EAAoB,eAAe,EAAK,UAAU,CAChE,EAAE,CACJ,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ const e=require("../types/skills.cjs"),t=require("../services/skillText/index.cjs");let n=require("@agimon-ai/doompi-config/piContext");function r(r){return[e.SKILLS_COMMAND,{description:`Browse the skills this session loaded, and what other domains would add`,handler:async(e,i)=>{if(!i.hasUI||i.mode!==`tui`){i.ui.notify(`/skills requires interactive mode`,`error`);return}let a=(0,n.requireDoomConfigContext)(r.cordisContext()).harness,[o,s]=await Promise.all([r.repositoryRoot(i),r.inventory(i)]),c=await r.buildCatalog({repoRoot:o,activeSkillDirectories:a.skillDirectories,extensionSources:r.extensionSources(),helpSkills:s.helpSkills,helpDiagnostics:[...s.diagnostics]}),l=await r.openOverlay(i,{catalog:c,repoRoot:o});l&&(i.ui.setEditorText(t.skillInvocation(l.skill.name)),i.ui.notify(`Loaded ${l.skill.name} into the prompt. Press enter to run it.`,`info`))}}]}exports.createSkillsCommand=r;
2
+ //# sourceMappingURL=skillsCommand.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillsCommand.cjs","names":["SKILLS_COMMAND","requireDoomConfigContext","skillInvocation"],"sources":["../../src/controllers/skillsCommand.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { SkillCatalog, SkillCatalogOptions } from '../services/skillCatalog';\nimport { skillInvocation } from '../services/skillText';\nimport type { SkillsOverlayResult } from '../tui/skillsOverlay';\nimport { SKILLS_COMMAND } from '../types/skills';\n\nconst INFO = 'info';\nconst ERROR = 'error';\n\nexport interface SkillsCommandDependencies {\n readonly cordisContext: () => Context;\n /** Skill directories every loaded extension has contributed this session. */\n readonly extensionSources: () => readonly { source: string; directories: readonly string[] }[];\n /** Merged view of normal, deferred and package Help skills. */\n readonly inventory: (ctx: ExtensionContext) => Promise<{\n readonly helpSkills: SkillCatalogOptions['helpSkills'];\n readonly diagnostics: readonly string[];\n }>;\n readonly repositoryRoot: (ctx: ExtensionContext) => Promise<string>;\n readonly buildCatalog: (request: SkillCatalogOptions) => Promise<SkillCatalog>;\n readonly openOverlay: (\n ctx: ExtensionContext,\n options: { catalog: SkillCatalog; repoRoot: string },\n ) => Promise<SkillsOverlayResult | undefined>;\n}\n\nexport function createSkillsCommand(\n dependencies: SkillsCommandDependencies,\n): Parameters<ExtensionAPI['registerCommand']> {\n return [\n SKILLS_COMMAND,\n {\n description: 'Browse the skills this session loaded, and what other domains would add',\n handler: async (_args, ctx) => {\n if (!ctx.hasUI || ctx.mode !== 'tui') {\n ctx.ui.notify('/skills requires interactive mode', ERROR);\n return;\n }\n\n const state = requireDoomConfigContext(dependencies.cordisContext()).harness;\n const [repoRoot, inventory] = await Promise.all([\n dependencies.repositoryRoot(ctx),\n dependencies.inventory(ctx),\n ]);\n const catalog = await dependencies.buildCatalog({\n repoRoot,\n activeSkillDirectories: state.skillDirectories,\n extensionSources: dependencies.extensionSources(),\n helpSkills: inventory.helpSkills,\n helpDiagnostics: [...inventory.diagnostics],\n });\n\n const result = await dependencies.openOverlay(ctx, { catalog, repoRoot });\n if (!result) return;\n ctx.ui.setEditorText(skillInvocation(result.skill.name));\n ctx.ui.notify(`Loaded ${result.skill.name} into the prompt. Press enter to run it.`, INFO);\n },\n },\n ];\n}\n"],"mappings":"wIA6BA,SAAgB,EACd,EAC6C,CAC7C,MAAO,CACLA,EAAAA,eACA,CACE,YAAa,0EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,GAAI,CAAC,EAAI,OAAS,EAAI,OAAS,MAAO,CACpC,EAAI,GAAG,OAAO,oCAAqC,OAAK,EACxD,MACF,CAEA,IAAM,GAAA,EAAQC,EAAAA,yBAAAA,CAAyB,EAAa,cAAc,CAAC,CAAC,CAAC,QAC/D,CAAC,EAAU,GAAa,MAAM,QAAQ,IAAI,CAC9C,EAAa,eAAe,CAAG,EAC/B,EAAa,UAAU,CAAG,CAC5B,CAAC,EACK,EAAU,MAAM,EAAa,aAAa,CAC9C,WACA,uBAAwB,EAAM,iBAC9B,iBAAkB,EAAa,iBAAiB,EAChD,WAAY,EAAU,WACtB,gBAAiB,CAAC,GAAG,EAAU,WAAW,CAC5C,CAAC,EAEK,EAAS,MAAM,EAAa,YAAY,EAAK,CAAE,UAAS,UAAS,CAAC,EACnE,IACL,EAAI,GAAG,cAAcC,EAAAA,gBAAgB,EAAO,MAAM,IAAI,CAAC,EACvD,EAAI,GAAG,OAAO,UAAU,EAAO,MAAM,KAAK,0CAA2C,MAAI,EAC3F,CACF,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ import{SKILLS_COMMAND as e}from"../types/skills.mjs";import{skillInvocation as t}from"../services/skillText/index.mjs";import{requireDoomConfigContext as n}from"@agimon-ai/doompi-config/piContext";function r(r){return[e,{description:`Browse the skills this session loaded, and what other domains would add`,handler:async(e,i)=>{if(!i.hasUI||i.mode!==`tui`){i.ui.notify(`/skills requires interactive mode`,`error`);return}let a=n(r.cordisContext()).harness,[o,s]=await Promise.all([r.repositoryRoot(i),r.inventory(i)]),c=await r.buildCatalog({repoRoot:o,activeSkillDirectories:a.skillDirectories,extensionSources:r.extensionSources(),helpSkills:s.helpSkills,helpDiagnostics:[...s.diagnostics]}),l=await r.openOverlay(i,{catalog:c,repoRoot:o});l&&(i.ui.setEditorText(t(l.skill.name)),i.ui.notify(`Loaded ${l.skill.name} into the prompt. Press enter to run it.`,`info`))}}]}export{r as createSkillsCommand};
2
+ //# sourceMappingURL=skillsCommand.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillsCommand.mjs","names":[],"sources":["../../src/controllers/skillsCommand.ts"],"sourcesContent":["import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport type { SkillCatalog, SkillCatalogOptions } from '../services/skillCatalog';\nimport { skillInvocation } from '../services/skillText';\nimport type { SkillsOverlayResult } from '../tui/skillsOverlay';\nimport { SKILLS_COMMAND } from '../types/skills';\n\nconst INFO = 'info';\nconst ERROR = 'error';\n\nexport interface SkillsCommandDependencies {\n readonly cordisContext: () => Context;\n /** Skill directories every loaded extension has contributed this session. */\n readonly extensionSources: () => readonly { source: string; directories: readonly string[] }[];\n /** Merged view of normal, deferred and package Help skills. */\n readonly inventory: (ctx: ExtensionContext) => Promise<{\n readonly helpSkills: SkillCatalogOptions['helpSkills'];\n readonly diagnostics: readonly string[];\n }>;\n readonly repositoryRoot: (ctx: ExtensionContext) => Promise<string>;\n readonly buildCatalog: (request: SkillCatalogOptions) => Promise<SkillCatalog>;\n readonly openOverlay: (\n ctx: ExtensionContext,\n options: { catalog: SkillCatalog; repoRoot: string },\n ) => Promise<SkillsOverlayResult | undefined>;\n}\n\nexport function createSkillsCommand(\n dependencies: SkillsCommandDependencies,\n): Parameters<ExtensionAPI['registerCommand']> {\n return [\n SKILLS_COMMAND,\n {\n description: 'Browse the skills this session loaded, and what other domains would add',\n handler: async (_args, ctx) => {\n if (!ctx.hasUI || ctx.mode !== 'tui') {\n ctx.ui.notify('/skills requires interactive mode', ERROR);\n return;\n }\n\n const state = requireDoomConfigContext(dependencies.cordisContext()).harness;\n const [repoRoot, inventory] = await Promise.all([\n dependencies.repositoryRoot(ctx),\n dependencies.inventory(ctx),\n ]);\n const catalog = await dependencies.buildCatalog({\n repoRoot,\n activeSkillDirectories: state.skillDirectories,\n extensionSources: dependencies.extensionSources(),\n helpSkills: inventory.helpSkills,\n helpDiagnostics: [...inventory.diagnostics],\n });\n\n const result = await dependencies.openOverlay(ctx, { catalog, repoRoot });\n if (!result) return;\n ctx.ui.setEditorText(skillInvocation(result.skill.name));\n ctx.ui.notify(`Loaded ${result.skill.name} into the prompt. Press enter to run it.`, INFO);\n },\n },\n ];\n}\n"],"mappings":"qMA6BA,SAAgB,EACd,EAC6C,CAC7C,MAAO,CACL,EACA,CACE,YAAa,0EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,GAAI,CAAC,EAAI,OAAS,EAAI,OAAS,MAAO,CACpC,EAAI,GAAG,OAAO,oCAAqC,OAAK,EACxD,MACF,CAEA,IAAM,EAAQ,EAAyB,EAAa,cAAc,CAAC,CAAC,CAAC,QAC/D,CAAC,EAAU,GAAa,MAAM,QAAQ,IAAI,CAC9C,EAAa,eAAe,CAAG,EAC/B,EAAa,UAAU,CAAG,CAC5B,CAAC,EACK,EAAU,MAAM,EAAa,aAAa,CAC9C,WACA,uBAAwB,EAAM,iBAC9B,iBAAkB,EAAa,iBAAiB,EAChD,WAAY,EAAU,WACtB,gBAAiB,CAAC,GAAG,EAAU,WAAW,CAC5C,CAAC,EAEK,EAAS,MAAM,EAAa,YAAY,EAAK,CAAE,UAAS,UAAS,CAAC,EACnE,IACL,EAAI,GAAG,cAAc,EAAgB,EAAO,MAAM,IAAI,CAAC,EACvD,EAAI,GAAG,OAAO,UAAU,EAAO,MAAM,KAAK,0CAA2C,MAAI,EAC3F,CACF,CACF,CACF"}
@@ -1 +1,2 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../adapters/pi/extension.cjs");exports.default=e.default,exports.skillsExtension=e.default;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../types/skills.cjs"),t=require("../controllers/skillRuntime.cjs"),n=(0,require("@agimon-ai/doompi-core/pi-extension").definePiExtension)(e.LEADER_SOURCE,({pi:n})=>({...t.createSkillRuntime({pi:n,openOverlay:async(e,t)=>(await Promise.resolve().then(()=>require("../tui/skillsOverlay.cjs"))).openSkillsOverlay(e,t)}),resources:[{source:e.LEADER_SOURCE,moduleUrl:require("url").pathToFileURL(__filename).href,skills:[{name:`doompi-author-skill`,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.`},{name:`doompi-use-skill`,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.`}]}]}));exports.default=n,exports.skillsExtension=n;
2
+ //# sourceMappingURL=pi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.cjs","names":["definePiExtension","LEADER_SOURCE","createSkillRuntime"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { createSkillRuntime } from '../controllers/skillRuntime';\nimport { LEADER_SOURCE } from '../types/skills';\nexport const skillsExtension = definePiExtension(LEADER_SOURCE, ({ pi }) => ({\n ...createSkillRuntime({\n pi,\n openOverlay: async (context, options) => (await import('../tui/skillsOverlay')).openSkillsOverlay(context, options),\n }),\n resources: [\n {\n source: LEADER_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\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 },\n {\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 },\n ],\n },\n ],\n}));\nexport default skillsExtension;\n"],"mappings":"mLAIa,GAAA,+CAAkBA,CAAAA,CAAAA,kBAAAA,CAAkBC,EAAAA,eAAgB,CAAE,SAAU,CAC3E,GAAGC,EAAAA,mBAAmB,CACpB,KACA,YAAa,MAAO,EAAS,KAAa,MAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAM,0BAAA,CAAA,EAAA,CAAgC,kBAAkB,EAAS,CAAO,CACpH,CAAC,EACD,UAAW,CACT,CACE,OAAQD,EAAAA,cACR,UAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,KACA,OAAQ,CACN,CACE,KAAM,sBACN,YACE,6OACJ,EACA,CACE,KAAM,mBACN,YACE,oNACJ,CACF,CACF,CACF,CACF,EAAE"}
@@ -1,2 +1,5 @@
1
- import skillsExtension from "../adapters/pi/extension.cjs";
2
- export { skillsExtension as default, skillsExtension };
1
+ //#region src/extensions/pi.d.ts
2
+ export declare const skillsExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
+ //#endregion
4
+ export { skillsExtension as default };
5
+ //# sourceMappingURL=pi.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";qBAIa,uEAAe"}
@@ -1,2 +1,5 @@
1
- import skillsExtension from "../adapters/pi/extension.mjs";
2
- export { skillsExtension as default, skillsExtension };
1
+ //#region src/extensions/pi.d.ts
2
+ export declare const skillsExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
+ //#endregion
4
+ export { skillsExtension as default };
5
+ //# sourceMappingURL=pi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";qBAIa,uEAAe"}
@@ -1 +1,2 @@
1
- import e from"../adapters/pi/extension.mjs";export{e as default,e as skillsExtension};
1
+ import{LEADER_SOURCE as e}from"../types/skills.mjs";import{createSkillRuntime as t}from"../controllers/skillRuntime.mjs";import{definePiExtension as n}from"@agimon-ai/doompi-core/pi-extension";const r=n(e,({pi:n})=>({...t({pi:n,openOverlay:async(e,t)=>(await import(`../tui/skillsOverlay.mjs`)).openSkillsOverlay(e,t)}),resources:[{source:e,moduleUrl:import.meta.url,skills:[{name:`doompi-author-skill`,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.`},{name:`doompi-use-skill`,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.`}]}]}));export{r as default,r as skillsExtension};
2
+ //# sourceMappingURL=pi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { createSkillRuntime } from '../controllers/skillRuntime';\nimport { LEADER_SOURCE } from '../types/skills';\nexport const skillsExtension = definePiExtension(LEADER_SOURCE, ({ pi }) => ({\n ...createSkillRuntime({\n pi,\n openOverlay: async (context, options) => (await import('../tui/skillsOverlay')).openSkillsOverlay(context, options),\n }),\n resources: [\n {\n source: LEADER_SOURCE,\n moduleUrl: import.meta.url,\n skills: [\n {\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 },\n {\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 },\n ],\n },\n ],\n}));\nexport default skillsExtension;\n"],"mappings":"iMAIA,MAAa,EAAkB,EAAkB,GAAgB,CAAE,SAAU,CAC3E,GAAG,EAAmB,CACpB,KACA,YAAa,MAAO,EAAS,KAAa,MAAM,OAAO,4BAAA,CAAyB,kBAAkB,EAAS,CAAO,CACpH,CAAC,EACD,UAAW,CACT,CACE,OAAQ,EACR,UAAW,YAAY,IACvB,OAAQ,CACN,CACE,KAAM,sBACN,YACE,6OACJ,EACA,CACE,KAAM,mBACN,YACE,oNACJ,CACF,CACF,CACF,CACF,EAAE"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../types/skills.cjs"),t=require("../controllers/skillServer.cjs"),n=(0,require("@agimon-ai/doompi-core/server-facet").defineServerPlugin)({name:e.LEADER_SOURCE,session:({agent:e,signal:n})=>e?t.createSkillServer(e,n):{}});exports.default=n,exports.skillServerFacet=n;
2
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","names":["defineServerPlugin","LEADER_SOURCE","createSkillServer"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { createSkillServer } from '../controllers/skillServer';\nimport { LEADER_SOURCE } from '../types/skills';\nexport const skillServerFacet = defineServerPlugin({\n name: LEADER_SOURCE,\n session: ({ agent, signal }) => (agent ? createSkillServer(agent, signal) : {}),\n});\n\nexport default skillServerFacet;\n"],"mappings":"kLAIa,GAAA,+CAAmBA,CAAAA,CAAAA,mBAAAA,CAAmB,CACjD,KAAMC,EAAAA,cACN,SAAU,CAAE,QAAO,YAAc,EAAQC,EAAAA,kBAAkB,EAAO,CAAM,EAAI,CAAC,CAC/E,CAAC"}
@@ -0,0 +1,5 @@
1
+ //#region src/extensions/server.d.ts
2
+ export declare const skillServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { skillServerFacet as default };
5
+ //# sourceMappingURL=server.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAIa,gEAAgB"}
@@ -0,0 +1,5 @@
1
+ //#region src/extensions/server.d.ts
2
+ export declare const skillServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { skillServerFacet as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAIa,gEAAgB"}
@@ -0,0 +1,2 @@
1
+ import{LEADER_SOURCE as e}from"../types/skills.mjs";import{createSkillServer as t}from"../controllers/skillServer.mjs";import{defineServerPlugin as n}from"@agimon-ai/doompi-core/server-facet";const r=n({name:e,session:({agent:e,signal:n})=>e?t(e,n):{}});export{r as default,r as skillServerFacet};
2
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { createSkillServer } from '../controllers/skillServer';\nimport { LEADER_SOURCE } from '../types/skills';\nexport const skillServerFacet = defineServerPlugin({\n name: LEADER_SOURCE,\n session: ({ agent, signal }) => (agent ? createSkillServer(agent, signal) : {}),\n});\n\nexport default skillServerFacet;\n"],"mappings":"gMAIA,MAAa,EAAmB,EAAmB,CACjD,KAAM,EACN,SAAU,CAAE,QAAO,YAAc,EAAQ,EAAkB,EAAO,CAAM,EAAI,CAAC,CAC/E,CAAC"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types/skills.cjs"),t=require("./services/skillText.cjs"),n=require("./adapters/pi/extension.cjs"),r=require("./tui/skillsOverlay.cjs");exports.LEADER_SOURCE=e.LEADER_SOURCE,exports.SKILLS_COMMAND=e.SKILLS_COMMAND,exports.SKILLS_LEADER_CONTRIBUTION=e.SKILLS_LEADER_CONTRIBUTION,exports.SKILL_COMMAND_PREFIX=e.SKILL_COMMAND_PREFIX,exports.SKILL_INVOCATION_PREFIX=e.SKILL_INVOCATION_PREFIX,exports.openSkillsOverlay=r.openSkillsOverlay,exports.skillInvocation=t.skillInvocation,exports.skillsExtension=n.default;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types/skills.cjs"),t=require("./services/skillText/index.cjs"),n=require("./tui/skillsOverlay.cjs");exports.LEADER_SOURCE=e.LEADER_SOURCE,exports.SKILLS_COMMAND=e.SKILLS_COMMAND,exports.SKILLS_LEADER_CONTRIBUTION=e.SKILLS_LEADER_CONTRIBUTION,exports.SKILL_COMMAND_PREFIX=e.SKILL_COMMAND_PREFIX,exports.SKILL_INVOCATION_PREFIX=e.SKILL_INVOCATION_PREFIX,exports.openSkillsOverlay=n.openSkillsOverlay,exports.skillInvocation=t.skillInvocation;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,4 @@
1
- import skillsExtension from "./adapters/pi/extension.cjs";
2
- import { skillInvocation } from "./services/skillText.cjs";
1
+ import { skillInvocation } from "./services/skillText/index.cjs";
3
2
  import { SkillsOverlayResult, openSkillsOverlay } from "./tui/skillsOverlay.cjs";
4
3
  import { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from "./types/skills.cjs";
5
- export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, type SkillsOverlayResult, openSkillsOverlay, skillInvocation, skillsExtension };
4
+ export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, type SkillsOverlayResult, openSkillsOverlay, skillInvocation };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,4 @@
1
- import skillsExtension from "./adapters/pi/extension.mjs";
2
- import { skillInvocation } from "./services/skillText.mjs";
1
+ import { skillInvocation } from "./services/skillText/index.mjs";
3
2
  import { SkillsOverlayResult, openSkillsOverlay } from "./tui/skillsOverlay.mjs";
4
3
  import { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from "./types/skills.mjs";
5
- export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, type SkillsOverlayResult, openSkillsOverlay, skillInvocation, skillsExtension };
4
+ export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, type SkillsOverlayResult, openSkillsOverlay, skillInvocation };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{LEADER_SOURCE as e,SKILLS_COMMAND as t,SKILLS_LEADER_CONTRIBUTION as n,SKILL_COMMAND_PREFIX as r,SKILL_INVOCATION_PREFIX as i}from"./types/skills.mjs";import{skillInvocation as a}from"./services/skillText.mjs";import o from"./adapters/pi/extension.mjs";import{openSkillsOverlay as s}from"./tui/skillsOverlay.mjs";export{e as LEADER_SOURCE,t as SKILLS_COMMAND,n as SKILLS_LEADER_CONTRIBUTION,r as SKILL_COMMAND_PREFIX,i as SKILL_INVOCATION_PREFIX,s as openSkillsOverlay,a as skillInvocation,o as skillsExtension};
1
+ import{LEADER_SOURCE as e,SKILLS_COMMAND as t,SKILLS_LEADER_CONTRIBUTION as n,SKILL_COMMAND_PREFIX as r,SKILL_INVOCATION_PREFIX as i}from"./types/skills.mjs";import{skillInvocation as a}from"./services/skillText/index.mjs";import{openSkillsOverlay as o}from"./tui/skillsOverlay.mjs";export{e as LEADER_SOURCE,t as SKILLS_COMMAND,n as SKILLS_LEADER_CONTRIBUTION,r as SKILL_COMMAND_PREFIX,i as SKILL_INVOCATION_PREFIX,o as openSkillsOverlay,a as skillInvocation};
@@ -0,0 +1,2 @@
1
+ const e=(0,require("@agimon-ai/doompi-core/api-contracts").defineApiContract)({version:1,http:[],sockets:[],dynamic:[]});exports.apiContracts=e,exports.default=e;
2
+ //# sourceMappingURL=apiContracts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":"AAGA,MAAa,GAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
@@ -0,0 +1,53 @@
1
+ //#region src/schemas/apiContracts.d.ts
2
+ /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.cts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -0,0 +1,53 @@
1
+ //#region src/schemas/apiContracts.d.ts
2
+ /** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
@@ -0,0 +1,2 @@
1
+ import{defineApiContract as e}from"@agimon-ai/doompi-core/api-contracts";const t=e({version:1,http:[],sockets:[],dynamic:[]});export{t as apiContracts,t as default};
2
+ //# sourceMappingURL=apiContracts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/api-contracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":"yEAGA,MAAa,EAAe,EAAkB,CAAE,QAAS,EAAG,KAAM,CAAC,EAAG,QAAS,CAAC,EAAG,QAAS,CAAC,CAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ const e=require("../../_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);let n=require("node:path");n=e.__toESM(n,1);let r=require("@earendil-works/pi-coding-agent"),i=require("node:url"),a=require("node:worker_threads");const o=`@earendil-works/pi-coding-agent`,s=`package.json`;function c(){let e=[process.argv[1],(0,i.fileURLToPath)(require("url").pathToFileURL(__filename).href),n.default.join(process.cwd(),s)];for(let r of e){if(!r)continue;let e=n.default.dirname(n.default.resolve(r));for(;;){let r=n.default.join(e,`node_modules`,o),a=n.default.join(r,s);try{let e=JSON.parse(t.default.readFileSync(a,`utf8`));if(typeof e.main==`string`){let a=n.default.resolve(r,e.main);if(t.default.existsSync(a))return(0,i.pathToFileURL)(a).href}}catch{}let c=n.default.dirname(e);if(c===e)break;e=c}}throw Error(`Cannot resolve ${o} from the DoomPi or host module trees`)}var l=class{#e;#t;constructor(e){this.#e=e}start(){if(this.#t)return this.#t;if(!this.#e.schedule&&!this.#e.load)return this.#t=this.#o(),this.#t;let e=this.#e.schedule??(e=>setImmediate(e));return this.#t=new Promise(t=>{let n=e=>{t(this.#i(e))};try{e(()=>{try{t(this.#a())}catch(e){n(e)}})}catch(e){n(e)}}),this.#t}ready(){return this.start()}#n(){return{cwd:this.#e.cwd,agentDir:this.#e.agentDir??(0,r.getAgentDir)(),skillPaths:[...this.#e.skillPaths],includeDefaults:!1}}#r(e){return{skills:e.skills,diagnostics:e.diagnostics.map(e=>`${e.path??this.#e.cwd}: ${e.message}`)}}#i(e){return{skills:[],diagnostics:[`${this.#e.cwd}: ${e instanceof Error?e.message:String(e)}`]}}#a(){return this.#r((this.#e.load??r.loadSkills)(this.#n()))}#o(){return new Promise(e=>{let t=!1,n=n=>{t||(t=!0,e(n))},r;try{r=new a.Worker(`
2
+ const { parentPort, workerData } = require('node:worker_threads');
3
+ void (async () => {
4
+ try {
5
+ const { loadSkills } = await import(workerData.piModuleUrl);
6
+ parentPort.postMessage({ ok: true, result: loadSkills(workerData.loadOptions) });
7
+ } catch (error) {
8
+ parentPort.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) });
9
+ }
10
+ })();
11
+ `,{eval:!0,workerData:{piModuleUrl:this.#e.piModuleUrl??c(),loadOptions:this.#n()}})}catch(e){n(this.#i(e));return}r.unref(),r.once(`message`,e=>{if(!e.ok||!e.result){n(this.#i(e.error??`Skill worker failed`));return}n(this.#r(e.result))}),r.once(`error`,e=>n(this.#i(e))),r.once(`exit`,e=>{e!==0&&n(this.#i(`Skill worker exited with code ${e}`))})})}};function u(e,t,n){return t.selectedTools&&!t.selectedTools.includes(`read`)?e:`${e}${(0,r.formatSkillsForPrompt)(n)}`}function d(e,n){if(!e.startsWith(`/skill:`))return e;let i=e.indexOf(` `),a=i===-1?e.slice(7):e.slice(7,i),o=n.find(e=>e.name===a);if(!o)return e;try{let n=i===-1?``:e.slice(i+1).trim(),a=(0,r.stripFrontmatter)(t.default.readFileSync(o.filePath,`utf8`)).trim(),s=`<skill name="${o.name}" location="${o.filePath}">\nReferences are relative to ${o.baseDir}.\n\n${a}\n</skill>`;return n?`${s}\n\n${n}`:s}catch{return e}}exports.DeferredSkillLoader=l,exports.buildPromptWithDeferredSkills=u,exports.expandDeferredSkillCommand=d;
12
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["fileURLToPath","path","fs","pathToFileURL","getAgentDir","loadSkills","Worker","formatSkillsForPrompt","stripFrontmatter"],"sources":["../../../src/services/deferredSkills/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { Worker } from 'node:worker_threads';\n\nimport {\n type BuildSystemPromptOptions,\n formatSkillsForPrompt,\n getAgentDir,\n loadSkills,\n type Skill,\n stripFrontmatter,\n} from '@earendil-works/pi-coding-agent';\n\nexport interface DeferredSkillSnapshot {\n skills: Skill[];\n diagnostics: string[];\n}\n\nconst PI_PACKAGE = '@earendil-works/pi-coding-agent';\nconst PACKAGE_MANIFEST = 'package.json';\nconst SKILL_WORKER_SOURCE = `\nconst { parentPort, workerData } = require('node:worker_threads');\nvoid (async () => {\n try {\n const { loadSkills } = await import(workerData.piModuleUrl);\n parentPort.postMessage({ ok: true, result: loadSkills(workerData.loadOptions) });\n } catch (error) {\n parentPort.postMessage({ ok: false, error: error instanceof Error ? error.message : String(error) });\n }\n})();\n`;\n\nfunction installedPiModuleUrl(): string {\n const anchors = [process.argv[1], fileURLToPath(import.meta.url), path.join(process.cwd(), PACKAGE_MANIFEST)];\n for (const anchor of anchors) {\n if (!anchor) continue;\n let directory = path.dirname(path.resolve(anchor));\n while (true) {\n const packageRoot = path.join(directory, 'node_modules', PI_PACKAGE);\n const manifestPath = path.join(packageRoot, PACKAGE_MANIFEST);\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as { main?: unknown };\n if (typeof manifest.main === 'string') {\n const entry = path.resolve(packageRoot, manifest.main);\n if (fs.existsSync(entry)) return pathToFileURL(entry).href;\n }\n } catch {\n // This anchor does not expose Pi at this level; continue up its module chain.\n }\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n }\n throw new Error(`Cannot resolve ${PI_PACKAGE} from the DoomPi or host module trees`);\n}\n\ninterface SkillWorkerResult {\n ok: boolean;\n result?: { skills: Skill[]; diagnostics: Array<{ path?: string; message: string }> };\n error?: string;\n}\n\nexport interface DeferredSkillLoaderOptions {\n cwd: string;\n skillPaths: readonly string[];\n agentDir?: string;\n piModuleUrl?: string;\n schedule?: (load: () => void) => void;\n load?: (options: { cwd: string; agentDir: string; skillPaths: string[]; includeDefaults: boolean }) => {\n skills: Skill[];\n diagnostics: Array<{ path?: string; message: string }>;\n };\n}\n\n/**\n * One session's Doom-selected skill inventory.\n *\n * Construction is deliberately cheap. `start()` schedules the synchronous Pi\n * walker after session_start returns, while `ready()` is the single promise the\n * first input awaits before Pi expands `/skill:name`.\n */\nexport class DeferredSkillLoader {\n readonly #options: DeferredSkillLoaderOptions;\n #promise: Promise<DeferredSkillSnapshot> | undefined;\n\n constructor(options: DeferredSkillLoaderOptions) {\n this.#options = options;\n }\n\n start(): Promise<DeferredSkillSnapshot> {\n if (this.#promise) return this.#promise;\n\n if (!this.#options.schedule && !this.#options.load) {\n this.#promise = this.#loadInWorker();\n return this.#promise;\n }\n\n const schedule = this.#options.schedule ?? ((load: () => void) => setImmediate(load));\n this.#promise = new Promise((resolve) => {\n const fail = (error: unknown): void => {\n resolve(this.#failure(error));\n };\n try {\n schedule(() => {\n try {\n resolve(this.#load());\n } catch (error) {\n fail(error);\n }\n });\n } catch (error) {\n fail(error);\n }\n });\n return this.#promise;\n }\n\n ready(): Promise<DeferredSkillSnapshot> {\n return this.start();\n }\n\n #loadOptions(): { cwd: string; agentDir: string; skillPaths: string[]; includeDefaults: boolean } {\n return {\n cwd: this.#options.cwd,\n agentDir: this.#options.agentDir ?? getAgentDir(),\n skillPaths: [...this.#options.skillPaths],\n includeDefaults: false,\n };\n }\n\n #snapshot(result: {\n skills: Skill[];\n diagnostics: Array<{ path?: string; message: string }>;\n }): DeferredSkillSnapshot {\n return {\n skills: result.skills,\n diagnostics: result.diagnostics.map(\n (diagnostic) => `${diagnostic.path ?? this.#options.cwd}: ${diagnostic.message}`,\n ),\n };\n }\n\n #failure(error: unknown): DeferredSkillSnapshot {\n return {\n skills: [],\n diagnostics: [`${this.#options.cwd}: ${error instanceof Error ? error.message : String(error)}`],\n };\n }\n\n #load(): DeferredSkillSnapshot {\n return this.#snapshot((this.#options.load ?? loadSkills)(this.#loadOptions()));\n }\n\n #loadInWorker(): Promise<DeferredSkillSnapshot> {\n return new Promise((resolve) => {\n let settled = false;\n const settle = (snapshot: DeferredSkillSnapshot): void => {\n if (settled) return;\n settled = true;\n resolve(snapshot);\n };\n let worker: Worker;\n try {\n worker = new Worker(SKILL_WORKER_SOURCE, {\n eval: true,\n workerData: {\n piModuleUrl: this.#options.piModuleUrl ?? installedPiModuleUrl(),\n loadOptions: this.#loadOptions(),\n },\n });\n } catch (error) {\n settle(this.#failure(error));\n return;\n }\n worker.unref();\n worker.once('message', (message: SkillWorkerResult) => {\n if (!message.ok || !message.result) {\n settle(this.#failure(message.error ?? 'Skill worker failed'));\n return;\n }\n settle(this.#snapshot(message.result));\n });\n worker.once('error', (error) => settle(this.#failure(error)));\n worker.once('exit', (code) => {\n if (code !== 0) settle(this.#failure(`Skill worker exited with code ${code}`));\n });\n });\n }\n}\n\n/** Appends only the inventory Pi would append for these deferred skills. */\nexport function buildPromptWithDeferredSkills(\n systemPrompt: string,\n options: BuildSystemPromptOptions,\n skills: Skill[],\n): string {\n if (options.selectedTools && !options.selectedTools.includes('read')) return systemPrompt;\n return `${systemPrompt}${formatSkillsForPrompt(skills)}`;\n}\n\n/** Expands a deferred `/skill:name` before Pi consults its synchronous inventory. */\nexport function expandDeferredSkillCommand(text: string, skills: readonly Skill[]): string {\n if (!text.startsWith('/skill:')) return text;\n const spaceIndex = text.indexOf(' ');\n const skillName = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);\n const skill = skills.find((candidate) => candidate.name === skillName);\n if (!skill) return text;\n\n try {\n const args = spaceIndex === -1 ? '' : text.slice(spaceIndex + 1).trim();\n const body = stripFrontmatter(fs.readFileSync(skill.filePath, 'utf8')).trim();\n const skillBlock = `<skill name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${body}\\n</skill>`;\n return args ? `${skillBlock}\\n\\n${args}` : skillBlock;\n } catch {\n // Pi uses the same literal-text fallback if a skill disappears between\n // discovery and submission; the agent can still respond to the command.\n return text;\n }\n}\n"],"mappings":"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"}
@@ -9,4 +9,4 @@ void (async () => {
9
9
  }
10
10
  })();
11
11
  `,{eval:!0,workerData:{piModuleUrl:this.#e.piModuleUrl??d(),loadOptions:this.#n()}})}catch(e){n(this.#i(e));return}r.unref(),r.once(`message`,e=>{if(!e.ok||!e.result){n(this.#i(e.error??`Skill worker failed`));return}n(this.#r(e.result))}),r.once(`error`,e=>n(this.#i(e))),r.once(`exit`,e=>{e!==0&&n(this.#i(`Skill worker exited with code ${e}`))})})}};function p(e,t,r){return t.selectedTools&&!t.selectedTools.includes(`read`)?e:`${e}${n(r)}`}function m(t,n){if(!t.startsWith(`/skill:`))return t;let r=t.indexOf(` `),i=r===-1?t.slice(7):t.slice(7,r),o=n.find(e=>e.name===i);if(!o)return t;try{let n=r===-1?``:t.slice(r+1).trim(),i=a(e.readFileSync(o.filePath,`utf8`)).trim(),s=`<skill name="${o.name}" location="${o.filePath}">\nReferences are relative to ${o.baseDir}.\n\n${i}\n</skill>`;return n?`${s}\n\n${n}`:s}catch{return t}}export{f as DeferredSkillLoader,p as buildPromptWithDeferredSkills,m as expandDeferredSkillCommand};
12
- //# sourceMappingURL=deferredSkills.mjs.map
12
+ //# sourceMappingURL=index.mjs.map