@agimon-ai/doompi-skill 0.0.1-alpha.53 → 0.0.1-alpha.54

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 (138) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/api-contracts.cjs +7 -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 +2 -0
  6. package/dist/catalog.cjs +4 -0
  7. package/dist/catalog.d.cts +2 -0
  8. package/dist/catalog.d.mts +2 -0
  9. package/dist/catalog.mjs +2 -0
  10. package/dist/extensions/pi.cjs +41 -0
  11. package/dist/extensions/pi.cjs.map +1 -0
  12. package/dist/extensions/pi.d.cts +5 -0
  13. package/dist/extensions/pi.d.cts.map +1 -0
  14. package/dist/extensions/pi.d.mts +5 -0
  15. package/dist/extensions/pi.d.mts.map +1 -0
  16. package/dist/extensions/pi.mjs +36 -0
  17. package/dist/extensions/pi.mjs.map +1 -0
  18. package/dist/extensions/server.cjs +42 -0
  19. package/dist/extensions/server.cjs.map +1 -0
  20. package/dist/extensions/server.d.cts +5 -0
  21. package/dist/extensions/server.d.cts.map +1 -0
  22. package/dist/extensions/server.d.mts +5 -0
  23. package/dist/extensions/server.d.mts.map +1 -0
  24. package/dist/extensions/server.mjs +37 -0
  25. package/dist/extensions/server.mjs.map +1 -0
  26. package/dist/index.cjs +11 -0
  27. package/dist/index.d.cts +4 -0
  28. package/dist/index.d.mts +4 -0
  29. package/dist/index.mjs +4 -0
  30. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.cjs +46 -0
  31. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.cjs.map +1 -0
  32. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.mjs +46 -0
  33. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.mjs.map +1 -0
  34. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.cjs +110 -0
  35. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.cjs.map +1 -0
  36. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.mjs +109 -0
  37. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.mjs.map +1 -0
  38. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.cjs +105 -0
  39. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.cjs.map +1 -0
  40. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.mjs +105 -0
  41. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.mjs.map +1 -0
  42. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.cjs +23 -0
  43. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.cjs.map +1 -0
  44. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.mjs +23 -0
  45. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.mjs.map +1 -0
  46. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.cjs +37 -0
  47. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.cjs.map +1 -0
  48. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.mjs +37 -0
  49. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.mjs.map +1 -0
  50. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.cjs +6 -0
  51. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.cjs.map +1 -0
  52. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.mjs +7 -0
  53. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.mjs.map +1 -0
  54. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.cjs +6 -0
  55. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.cjs.map +1 -0
  56. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.mjs +7 -0
  57. package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.mjs.map +1 -0
  58. package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.cjs +6 -0
  59. package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.cjs.map +1 -0
  60. package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.mjs +7 -0
  61. package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.mjs.map +1 -0
  62. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs +6 -0
  63. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs.map +1 -0
  64. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs +7 -0
  65. package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs.map +1 -0
  66. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs +6 -0
  67. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs.map +1 -0
  68. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs +7 -0
  69. package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs.map +1 -0
  70. package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.cjs +17 -0
  71. package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.cjs.map +1 -0
  72. package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.mjs +18 -0
  73. package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.mjs.map +1 -0
  74. package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.cjs +6 -0
  75. package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.cjs.map +1 -0
  76. package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.mjs +7 -0
  77. package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.mjs.map +1 -0
  78. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +18 -0
  79. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
  80. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +19 -0
  81. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
  82. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +12 -0
  83. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
  84. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +13 -0
  85. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
  86. package/dist/src/schemas/apiContracts.cjs +13 -0
  87. package/dist/src/schemas/apiContracts.cjs.map +1 -0
  88. package/dist/src/schemas/apiContracts.d.cts +53 -0
  89. package/dist/src/schemas/apiContracts.d.cts.map +1 -0
  90. package/dist/src/schemas/apiContracts.d.mts +53 -0
  91. package/dist/src/schemas/apiContracts.d.mts.map +1 -0
  92. package/dist/src/schemas/apiContracts.mjs +13 -0
  93. package/dist/src/schemas/apiContracts.mjs.map +1 -0
  94. package/dist/src/services/deferredSkills/index.cjs +175 -0
  95. package/dist/src/services/deferredSkills/index.cjs.map +1 -0
  96. package/dist/src/services/deferredSkills/index.mjs +170 -0
  97. package/dist/src/services/deferredSkills/index.mjs.map +1 -0
  98. package/dist/src/services/helpSkills/index.cjs +96 -0
  99. package/dist/src/services/helpSkills/index.cjs.map +1 -0
  100. package/dist/src/services/helpSkills/index.mjs +95 -0
  101. package/dist/src/services/helpSkills/index.mjs.map +1 -0
  102. package/dist/src/services/serverInventory/index.cjs +105 -0
  103. package/dist/src/services/serverInventory/index.cjs.map +1 -0
  104. package/dist/src/services/serverInventory/index.mjs +102 -0
  105. package/dist/src/services/serverInventory/index.mjs.map +1 -0
  106. package/dist/src/services/skillCatalog/index.cjs +193 -0
  107. package/dist/src/services/skillCatalog/index.cjs.map +1 -0
  108. package/dist/src/services/skillCatalog/index.d.cts +65 -0
  109. package/dist/src/services/skillCatalog/index.d.cts.map +1 -0
  110. package/dist/src/services/skillCatalog/index.d.mts +65 -0
  111. package/dist/src/services/skillCatalog/index.d.mts.map +1 -0
  112. package/dist/src/services/skillCatalog/index.mjs +188 -0
  113. package/dist/src/services/skillCatalog/index.mjs.map +1 -0
  114. package/dist/src/services/skillText/index.cjs +17 -0
  115. package/dist/src/services/skillText/index.cjs.map +1 -0
  116. package/dist/src/services/skillText/index.d.cts +12 -0
  117. package/dist/src/services/skillText/index.d.cts.map +1 -0
  118. package/dist/src/services/skillText/index.d.mts +12 -0
  119. package/dist/src/services/skillText/index.d.mts.map +1 -0
  120. package/dist/src/services/skillText/index.mjs +17 -0
  121. package/dist/src/services/skillText/index.mjs.map +1 -0
  122. package/dist/src/tui/skillsOverlay.cjs +361 -0
  123. package/dist/src/tui/skillsOverlay.cjs.map +1 -0
  124. package/dist/src/tui/skillsOverlay.d.cts +17 -0
  125. package/dist/src/tui/skillsOverlay.d.cts.map +1 -0
  126. package/dist/src/tui/skillsOverlay.d.mts +17 -0
  127. package/dist/src/tui/skillsOverlay.d.mts.map +1 -0
  128. package/dist/src/tui/skillsOverlay.mjs +356 -0
  129. package/dist/src/tui/skillsOverlay.mjs.map +1 -0
  130. package/dist/src/types/skills.cjs +36 -0
  131. package/dist/src/types/skills.cjs.map +1 -0
  132. package/dist/src/types/skills.d.cts +32 -0
  133. package/dist/src/types/skills.d.cts.map +1 -0
  134. package/dist/src/types/skills.d.mts +32 -0
  135. package/dist/src/types/skills.d.mts.map +1 -0
  136. package/dist/src/types/skills.mjs +32 -0
  137. package/dist/src/types/skills.mjs.map +1 -0
  138. package/package.json +8 -8
@@ -0,0 +1,23 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ exports.__toESM = __toESM;
@@ -0,0 +1,7 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_apiContracts = require("./src/schemas/apiContracts.cjs");
6
+ exports.apiContracts = require_apiContracts.apiContracts;
7
+ exports.default = require_apiContracts.apiContracts;
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./src/schemas/apiContracts.cjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./src/schemas/apiContracts.mjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,2 @@
1
+ import { apiContracts } from "./src/schemas/apiContracts.mjs";
2
+ export { apiContracts, apiContracts as default };
@@ -0,0 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_index = require("./src/services/skillCatalog/index.cjs");
3
+ exports.buildSkillCatalog = require_index.buildSkillCatalog;
4
+ exports.counter = require_index.counter;
@@ -0,0 +1,2 @@
1
+ import { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillOwnerNode, buildSkillCatalog, counter } from "./src/services/skillCatalog/index.cjs";
2
+ export { type SkillCatalog, type SkillCatalogOptions, type SkillEntry, type SkillGroup, type SkillOwnerNode, buildSkillCatalog, counter };
@@ -0,0 +1,2 @@
1
+ import { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillOwnerNode, buildSkillCatalog, counter } from "./src/services/skillCatalog/index.mjs";
2
+ export { type SkillCatalog, type SkillCatalogOptions, type SkillEntry, type SkillGroup, type SkillOwnerNode, buildSkillCatalog, counter };
@@ -0,0 +1,2 @@
1
+ import { buildSkillCatalog, counter } from "./src/services/skillCatalog/index.mjs";
2
+ export { buildSkillCatalog, counter };
@@ -0,0 +1,41 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_root_cli = require("../src/extensions/workspaces/sessions/(backend)/root.cli.cjs");
6
+ const require_skills_cli = require("../src/extensions/workspaces/sessions/(backend)/command/skills.cli.cjs");
7
+ const require_beforeAgentStart_cli = require("../src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.cjs");
8
+ const require_input_cli = require("../src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs");
9
+ const require_sessionStart_cli = require("../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs");
10
+ const require_help_cli = require("../src/extensions/workspaces/sessions/(backend)/resource/help.cli.cjs");
11
+ let _agimon_ai_doompi_core_pi_extension = require("@agimon-ai/doompi-core/pi-extension");
12
+ let _agimon_ai_doompi_core_extension_file = require("@agimon-ai/doompi-core/extension-file");
13
+ //#region generated/pi.ts
14
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
15
+ const extension = (0, _agimon_ai_doompi_core_pi_extension.definePiExtension)("@agimon-ai/doompi-skill", async (context) => {
16
+ const scopeSession = await require_root_cli.default(context);
17
+ const contextSession = {
18
+ ...context,
19
+ root: scopeSession.value
20
+ };
21
+ return {
22
+ ...(0, _agimon_ai_doompi_core_extension_file.composeRootHooks)(scopeSession),
23
+ get commands() {
24
+ return [at(require_skills_cli.default, contextSession)];
25
+ },
26
+ events: {
27
+ before_agent_start: at(require_beforeAgentStart_cli.default, contextSession),
28
+ input: at(require_input_cli.default, contextSession),
29
+ session_start: at(require_sessionStart_cli.default, contextSession)
30
+ },
31
+ get resources() {
32
+ return [at(require_help_cli.default, contextSession)];
33
+ },
34
+ services: [...scopeSession.services ?? []]
35
+ };
36
+ });
37
+ //#endregion
38
+ exports.default = extension;
39
+ exports.extension = extension;
40
+
41
+ //# sourceMappingURL=pi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.cjs","names":["definePiExtension","rootSession","composeRootHooks","commandSkills","hookBeforeAgentStart","hookInput","hookSessionStart","resourceHelp"],"sources":["../../generated/pi.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandSkills from '../src/extensions/workspaces/sessions/(backend)/command/skills.cli';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli';\nimport hookInput from '../src/extensions/workspaces/sessions/(backend)/hook/input.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport resourceHelp from '../src/extensions/workspaces/sessions/(backend)/resource/help.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandSkills> | OptionsOf<typeof hookBeforeAgentStart> | OptionsOf<typeof hookInput> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof resourceHelp>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-skill', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandSkills, contextSession)]; },\n events: {\n before_agent_start: at(hookBeforeAgentStart, contextSession) as NonNullable<PiPluginContributions['events']>['before_agent_start'],\n input: at(hookInput, contextSession) as NonNullable<PiPluginContributions['events']>['input'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n },\n get resources(): PiPluginContributions['resources'] { return [at(resourceHelp, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;;;;;;;;;AAkBA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,aAAA,GAAYA,oCAAAA,kBAAAA,CAAoC,2BAA2B,OAAO,YAAY;CACzG,MAAM,eAAe,MAAMC,iBAAAA,QAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,IAAA,GAAGC,sCAAAA,iBAAAA,CAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,mBAAAA,SAAe,cAAc,CAAC;EAAG;EAChG,QAAQ;GACN,oBAAoB,GAAGC,6BAAAA,SAAsB,cAAc;GAC3D,OAAO,GAAGC,kBAAAA,SAAW,cAAc;GACnC,eAAe,GAAGC,yBAAAA,SAAkB,cAAc;EACpD;EACA,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,iBAAAA,SAAc,cAAc,CAAC;EAAG;EACjG,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ //#region generated/pi.d.ts
2
+ export declare const extension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
+ //#endregion
4
+ export { extension as default };
5
+ //# sourceMappingURL=pi.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.cts","names":[],"sources":["../../generated/pi.ts"],"mappings":";qBAqBa,iEAAS"}
@@ -0,0 +1,5 @@
1
+ //#region generated/pi.d.ts
2
+ export declare const extension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<undefined>;
3
+ //#endregion
4
+ export { extension as default };
5
+ //# sourceMappingURL=pi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.mts","names":[],"sources":["../../generated/pi.ts"],"mappings":";qBAqBa,iEAAS"}
@@ -0,0 +1,36 @@
1
+ import root_cli_default from "../src/extensions/workspaces/sessions/(backend)/root.cli.mjs";
2
+ import skills_cli_default from "../src/extensions/workspaces/sessions/(backend)/command/skills.cli.mjs";
3
+ import beforeAgentStart_cli_default from "../src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.mjs";
4
+ import input_cli_default from "../src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs";
5
+ import sessionStart_cli_default from "../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs";
6
+ import help_cli_default from "../src/extensions/workspaces/sessions/(backend)/resource/help.cli.mjs";
7
+ import { definePiExtension } from "@agimon-ai/doompi-core/pi-extension";
8
+ import { composeRootHooks } from "@agimon-ai/doompi-core/extension-file";
9
+ //#region generated/pi.ts
10
+ const at = (value, context) => typeof value === "function" ? value(context) : value;
11
+ const extension = definePiExtension("@agimon-ai/doompi-skill", async (context) => {
12
+ const scopeSession = await root_cli_default(context);
13
+ const contextSession = {
14
+ ...context,
15
+ root: scopeSession.value
16
+ };
17
+ return {
18
+ ...composeRootHooks(scopeSession),
19
+ get commands() {
20
+ return [at(skills_cli_default, contextSession)];
21
+ },
22
+ events: {
23
+ before_agent_start: at(beforeAgentStart_cli_default, contextSession),
24
+ input: at(input_cli_default, contextSession),
25
+ session_start: at(sessionStart_cli_default, contextSession)
26
+ },
27
+ get resources() {
28
+ return [at(help_cli_default, contextSession)];
29
+ },
30
+ services: [...scopeSession.services ?? []]
31
+ };
32
+ });
33
+ //#endregion
34
+ export { extension as default, extension };
35
+
36
+ //# sourceMappingURL=pi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.mjs","names":["rootSession","commandSkills","hookBeforeAgentStart","hookInput","hookSessionStart","resourceHelp"],"sources":["../../generated/pi.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/pi-extension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandSkills from '../src/extensions/workspaces/sessions/(backend)/command/skills.cli';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli';\nimport hookInput from '../src/extensions/workspaces/sessions/(backend)/hook/input.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport resourceHelp from '../src/extensions/workspaces/sessions/(backend)/resource/help.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandSkills> | OptionsOf<typeof hookBeforeAgentStart> | OptionsOf<typeof hookInput> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof resourceHelp>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-skill', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): PiPluginContributions['commands'] { return [at(commandSkills, contextSession)]; },\n events: {\n before_agent_start: at(hookBeforeAgentStart, contextSession) as NonNullable<PiPluginContributions['events']>['before_agent_start'],\n input: at(hookInput, contextSession) as NonNullable<PiPluginContributions['events']>['input'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n },\n get resources(): PiPluginContributions['resources'] { return [at(resourceHelp, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":";;;;;;;;;AAkBA,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,YAAY,kBAAoC,2BAA2B,OAAO,YAAY;CACzG,MAAM,eAAe,MAAMA,iBAAY,OAAO;CAC9C,MAAM,iBAAiB;EAAE,GAAG;EAAS,MAAM,aAAa;CAAM;CAC9D,OAAO;EACL,GAAG,iBAAiB,YAAY;EAChC,IAAI,WAA8C;GAAE,OAAO,CAAC,GAAGC,oBAAe,cAAc,CAAC;EAAG;EAChG,QAAQ;GACN,oBAAoB,GAAGC,8BAAsB,cAAc;GAC3D,OAAO,GAAGC,mBAAW,cAAc;GACnC,eAAe,GAAGC,0BAAkB,cAAc;EACpD;EACA,IAAI,YAAgD;GAAE,OAAO,CAAC,GAAGC,kBAAc,cAAc,CAAC;EAAG;EACjG,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;CAC7C;AACF,CAAC"}
@@ -0,0 +1,42 @@
1
+ Object.defineProperties(exports, {
2
+ __esModule: { value: true },
3
+ [Symbol.toStringTag]: { value: "Module" }
4
+ });
5
+ const require_root_server = require("../src/extensions/workspaces/sessions/(backend)/root.server.cjs");
6
+ const require_skills_server = require("../src/extensions/workspaces/sessions/(backend)/command/skills.server.cjs");
7
+ const require_skills_server$1 = require("../src/extensions/workspaces/sessions/(backend)/resource/skills.server.cjs");
8
+ let _agimon_ai_doompi_core_extension_file = require("@agimon-ai/doompi-core/extension-file");
9
+ let _agimon_ai_doompi_core_server_facet = require("@agimon-ai/doompi-core/server-facet");
10
+ //#region generated/server.ts
11
+ const many = (value, context) => {
12
+ const resolved = typeof value === "function" ? value(context) : value;
13
+ return Array.isArray(resolved) ? resolved : [resolved];
14
+ };
15
+ const facet = (0, _agimon_ai_doompi_core_server_facet.defineServerPlugin)({
16
+ name: "@agimon-ai/doompi-skill",
17
+ session: async (context) => {
18
+ const scopeSession = await require_root_server.default(context);
19
+ const contextSession = {
20
+ ...context,
21
+ root: scopeSession.value
22
+ };
23
+ return {
24
+ ...(0, _agimon_ai_doompi_core_extension_file.composeRootHooks)(scopeSession),
25
+ get commands() {
26
+ return [...many(require_skills_server.default, contextSession)];
27
+ },
28
+ get resources() {
29
+ return [...many(require_skills_server$1.default, contextSession)];
30
+ },
31
+ services: [...scopeSession.services ?? []],
32
+ get activities() {
33
+ return [...scopeSession.activities ?? []];
34
+ }
35
+ };
36
+ }
37
+ });
38
+ //#endregion
39
+ exports.default = facet;
40
+ exports.facet = facet;
41
+
42
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","names":["defineServerPlugin","rootSession","composeRootHooks","commandSkills","resourceSkills"],"sources":["../../generated/server.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandSkills from '../src/extensions/workspaces/sessions/(backend)/command/skills.server';\nimport resourceSkills from '../src/extensions/workspaces/sessions/(backend)/resource/skills.server';\n\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-skill',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return [...many(commandSkills, contextSession)]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceSkills, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":";;;;;;;;;;AASA,MAAM,QAAc,OAA6C,YAA6B;CAC5F,MAAM,WAAW,OAAO,UAAU,aAAc,MAA4B,OAAO,IAAI;CACvF,OAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAa;AAC5D;AAEA,MAAa,SAAA,GAAQA,oCAAAA,mBAAAA,CAAmB;CACtC,MAAM;CACN,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAMC,oBAAAA,QAAY,OAAO;EAC9C,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,IAAA,GAAGC,sCAAAA,iBAAAA,CAAiB,YAAY;GAChC,IAAI,WAAgD;IAAE,OAAO,CAAC,GAAG,KAAKC,sBAAAA,SAAe,cAAc,CAAC;GAAG;GACvG,IAAI,YAAkD;IAAE,OAAO,CAAC,GAAG,KAAKC,wBAAAA,SAAgB,cAAc,CAAC;GAAG;GAC1G,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAoD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACzG;CACF;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ //#region generated/server.d.ts
2
+ export declare const facet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { facet as default };
5
+ //# sourceMappingURL=server.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAca,qDAAK"}
@@ -0,0 +1,5 @@
1
+ //#region generated/server.d.ts
2
+ export declare const facet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { facet as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAca,qDAAK"}
@@ -0,0 +1,37 @@
1
+ import root_server_default from "../src/extensions/workspaces/sessions/(backend)/root.server.mjs";
2
+ import skills_server_default from "../src/extensions/workspaces/sessions/(backend)/command/skills.server.mjs";
3
+ import skills_server_default$1 from "../src/extensions/workspaces/sessions/(backend)/resource/skills.server.mjs";
4
+ import { composeRootHooks } from "@agimon-ai/doompi-core/extension-file";
5
+ import { defineServerPlugin } from "@agimon-ai/doompi-core/server-facet";
6
+ //#region generated/server.ts
7
+ const many = (value, context) => {
8
+ const resolved = typeof value === "function" ? value(context) : value;
9
+ return Array.isArray(resolved) ? resolved : [resolved];
10
+ };
11
+ const facet = defineServerPlugin({
12
+ name: "@agimon-ai/doompi-skill",
13
+ session: async (context) => {
14
+ const scopeSession = await root_server_default(context);
15
+ const contextSession = {
16
+ ...context,
17
+ root: scopeSession.value
18
+ };
19
+ return {
20
+ ...composeRootHooks(scopeSession),
21
+ get commands() {
22
+ return [...many(skills_server_default, contextSession)];
23
+ },
24
+ get resources() {
25
+ return [...many(skills_server_default$1, contextSession)];
26
+ },
27
+ services: [...scopeSession.services ?? []],
28
+ get activities() {
29
+ return [...scopeSession.activities ?? []];
30
+ }
31
+ };
32
+ }
33
+ });
34
+ //#endregion
35
+ export { facet as default, facet };
36
+
37
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":["rootSession","commandSkills","resourceSkills"],"sources":["../../generated/server.ts"],"sourcesContent":["// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/server-facet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extension-file';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandSkills from '../src/extensions/workspaces/sessions/(backend)/command/skills.server';\nimport resourceSkills from '../src/extensions/workspaces/sessions/(backend)/resource/skills.server';\n\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-skill',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return [...many(commandSkills, contextSession)]; },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceSkills, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":";;;;;;AASA,MAAM,QAAc,OAA6C,YAA6B;CAC5F,MAAM,WAAW,OAAO,UAAU,aAAc,MAA4B,OAAO,IAAI;CACvF,OAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAa;AAC5D;AAEA,MAAa,QAAQ,mBAAmB;CACtC,MAAM;CACN,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAMA,oBAAY,OAAO;EAC9C,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,GAAG,iBAAiB,YAAY;GAChC,IAAI,WAAgD;IAAE,OAAO,CAAC,GAAG,KAAKC,uBAAe,cAAc,CAAC;GAAG;GACvG,IAAI,YAAkD;IAAE,OAAO,CAAC,GAAG,KAAKC,yBAAgB,cAAc,CAAC;GAAG;GAC1G,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAoD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACzG;CACF;AACF,CAAC"}
package/dist/index.cjs ADDED
@@ -0,0 +1,11 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_skills = require("./src/types/skills.cjs");
3
+ const require_index = require("./src/services/skillText/index.cjs");
4
+ const require_skillsOverlay = require("./src/tui/skillsOverlay.cjs");
5
+ exports.LEADER_SOURCE = require_skills.LEADER_SOURCE;
6
+ exports.SKILLS_COMMAND = require_skills.SKILLS_COMMAND;
7
+ exports.SKILLS_LEADER_CONTRIBUTION = require_skills.SKILLS_LEADER_CONTRIBUTION;
8
+ exports.SKILL_COMMAND_PREFIX = require_skills.SKILL_COMMAND_PREFIX;
9
+ exports.SKILL_INVOCATION_PREFIX = require_skills.SKILL_INVOCATION_PREFIX;
10
+ exports.openSkillsOverlay = require_skillsOverlay.openSkillsOverlay;
11
+ exports.skillInvocation = require_index.skillInvocation;
@@ -0,0 +1,4 @@
1
+ import { skillInvocation } from "./src/services/skillText/index.cjs";
2
+ import { SkillsOverlayResult, openSkillsOverlay } from "./src/tui/skillsOverlay.cjs";
3
+ import { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from "./src/types/skills.cjs";
4
+ export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, type SkillsOverlayResult, openSkillsOverlay, skillInvocation };
@@ -0,0 +1,4 @@
1
+ import { skillInvocation } from "./src/services/skillText/index.mjs";
2
+ import { SkillsOverlayResult, openSkillsOverlay } from "./src/tui/skillsOverlay.mjs";
3
+ import { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from "./src/types/skills.mjs";
4
+ export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, type SkillsOverlayResult, openSkillsOverlay, skillInvocation };
package/dist/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from "./src/types/skills.mjs";
2
+ import { skillInvocation } from "./src/services/skillText/index.mjs";
3
+ import { openSkillsOverlay } from "./src/tui/skillsOverlay.mjs";
4
+ export { LEADER_SOURCE, SKILLS_COMMAND, SKILLS_LEADER_CONTRIBUTION, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, openSkillsOverlay, skillInvocation };
@@ -0,0 +1,46 @@
1
+ const require_skills = require("../../../../../types/skills.cjs");
2
+ const require_index = require("../../../../../services/deferredSkills/index.cjs");
3
+ //#region src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.ts
4
+ /**
5
+ * One command per skill, gated by whatever activates that skill.
6
+ *
7
+ * Expansion always reads the full inventory, not the group: a command is only
8
+ * dispatchable while its condition holds, so by the time one runs its skill is
9
+ * active, and looking it up in the union keeps one lookup table instead of one
10
+ * per domain.
11
+ */
12
+ function skillCommand(skill, domain, inventory) {
13
+ return {
14
+ ...domain === void 0 ? {} : { when: { domain } },
15
+ name: `${require_skills.SKILL_COMMAND_PREFIX}${skill.name}`,
16
+ description: skill.description,
17
+ execute: async (args, execution) => {
18
+ const text = `${require_skills.SKILL_INVOCATION_PREFIX}${skill.name}${args ? ` ${args}` : ""}`;
19
+ const expanded = require_index.expandDeferredSkillCommand(text, inventory.skills);
20
+ if (expanded === text) throw new Error(`Skill '${skill.name}' is no longer readable.`);
21
+ await execution.session.prompt(expanded);
22
+ }
23
+ };
24
+ }
25
+ function createSkillCommands(inventory, catalog, groups) {
26
+ return [{
27
+ name: require_skills.SKILLS_COMMAND,
28
+ description: "List discovered skills or invoke one by name.",
29
+ async execute(args, execution) {
30
+ const requested = args.trim();
31
+ if (requested) {
32
+ await execution.session.prompt(require_index.expandDeferredSkillCommand(`${require_skills.SKILL_INVOCATION_PREFIX}${requested}`, inventory.skills));
33
+ return;
34
+ }
35
+ await execution.client.notify({
36
+ title: "DoomPi skills",
37
+ body: catalog,
38
+ level: "info"
39
+ });
40
+ }
41
+ }, ...groups.flatMap((group) => group.skills.map((skill) => skillCommand(skill, group.domain, inventory)))];
42
+ }
43
+ //#endregion
44
+ exports.createSkillCommands = createSkillCommands;
45
+
46
+ //# sourceMappingURL=skillCommands.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCommands.cjs","names":["SKILL_COMMAND_PREFIX","SKILL_INVOCATION_PREFIX","expandDeferredSkillCommand","SKILLS_COMMAND"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.ts"],"sourcesContent":["import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\nimport type { Skill } from '@earendil-works/pi-coding-agent';\n\nimport { expandDeferredSkillCommand, type DeferredSkillSnapshot } from '../../../../../services/deferredSkills';\nimport type { ServerSkillGroup } from '../../../../../services/serverInventory';\nimport { SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, SKILLS_COMMAND } from '../../../../../types/skills';\n\n/**\n * One command per skill, gated by whatever activates that skill.\n *\n * Expansion always reads the full inventory, not the group: a command is only\n * dispatchable while its condition holds, so by the time one runs its skill is\n * active, and looking it up in the union keeps one lookup table instead of one\n * per domain.\n */\nfunction skillCommand(skill: Skill, domain: string | undefined, inventory: DeferredSkillSnapshot): DoomHeadlessCommand {\n return {\n ...(domain === undefined ? {} : { when: { domain } }),\n name: `${SKILL_COMMAND_PREFIX}${skill.name}`,\n description: skill.description,\n execute: async (args, execution) => {\n const text = `${SKILL_INVOCATION_PREFIX}${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\nexport function createSkillCommands(\n inventory: DeferredSkillSnapshot,\n catalog: string,\n groups: readonly ServerSkillGroup[],\n): 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(\n expandDeferredSkillCommand(`${SKILL_INVOCATION_PREFIX}${requested}`, inventory.skills),\n );\n return;\n }\n await execution.client.notify({\n title: 'DoomPi skills',\n body: catalog,\n level: 'info',\n });\n },\n },\n ...groups.flatMap((group) => group.skills.map((skill) => skillCommand(skill, group.domain, inventory))),\n ];\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAS,aAAa,OAAc,QAA4B,WAAuD;CACrH,OAAO;EACL,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;EACnD,MAAM,GAAGA,eAAAA,uBAAuB,MAAM;EACtC,aAAa,MAAM;EACnB,SAAS,OAAO,MAAM,cAAc;GAClC,MAAM,OAAO,GAAGC,eAAAA,0BAA0B,MAAM,OAAO,OAAO,IAAI,SAAS;GAC3E,MAAM,WAAWC,cAAAA,2BAA2B,MAAM,UAAU,MAAM;GAClE,IAAI,aAAa,MAAM,MAAM,IAAI,MAAM,UAAU,MAAM,KAAK,yBAAyB;GACrF,MAAM,UAAU,QAAQ,OAAO,QAAQ;EACzC;CACF;AACF;AAEA,SAAgB,oBACd,WACA,SACA,QACgC;CAChC,OAAO,CACL;EACE,MAAMC,eAAAA;EACN,aAAa;EACb,MAAM,QAAQ,MAAM,WAAW;GAC7B,MAAM,YAAY,KAAK,KAAK;GAC5B,IAAI,WAAW;IACb,MAAM,UAAU,QAAQ,OACtBD,cAAAA,2BAA2B,GAAGD,eAAAA,0BAA0B,aAAa,UAAU,MAAM,CACvF;IACA;GACF;GACA,MAAM,UAAU,OAAO,OAAO;IAC5B,OAAO;IACP,MAAM;IACN,OAAO;GACT,CAAC;EACH;CACF,GACA,GAAG,OAAO,SAAS,UAAU,MAAM,OAAO,KAAK,UAAU,aAAa,OAAO,MAAM,QAAQ,SAAS,CAAC,CAAC,CACxG;AACF"}
@@ -0,0 +1,46 @@
1
+ import { SKILLS_COMMAND, SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX } from "../../../../../types/skills.mjs";
2
+ import { expandDeferredSkillCommand } from "../../../../../services/deferredSkills/index.mjs";
3
+ //#region src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.ts
4
+ /**
5
+ * One command per skill, gated by whatever activates that skill.
6
+ *
7
+ * Expansion always reads the full inventory, not the group: a command is only
8
+ * dispatchable while its condition holds, so by the time one runs its skill is
9
+ * active, and looking it up in the union keeps one lookup table instead of one
10
+ * per domain.
11
+ */
12
+ function skillCommand(skill, domain, inventory) {
13
+ return {
14
+ ...domain === void 0 ? {} : { when: { domain } },
15
+ name: `${SKILL_COMMAND_PREFIX}${skill.name}`,
16
+ description: skill.description,
17
+ execute: async (args, execution) => {
18
+ const text = `${SKILL_INVOCATION_PREFIX}${skill.name}${args ? ` ${args}` : ""}`;
19
+ const expanded = expandDeferredSkillCommand(text, inventory.skills);
20
+ if (expanded === text) throw new Error(`Skill '${skill.name}' is no longer readable.`);
21
+ await execution.session.prompt(expanded);
22
+ }
23
+ };
24
+ }
25
+ function createSkillCommands(inventory, catalog, groups) {
26
+ return [{
27
+ name: SKILLS_COMMAND,
28
+ description: "List discovered skills or invoke one by name.",
29
+ async execute(args, execution) {
30
+ const requested = args.trim();
31
+ if (requested) {
32
+ await execution.session.prompt(expandDeferredSkillCommand(`${SKILL_INVOCATION_PREFIX}${requested}`, inventory.skills));
33
+ return;
34
+ }
35
+ await execution.client.notify({
36
+ title: "DoomPi skills",
37
+ body: catalog,
38
+ level: "info"
39
+ });
40
+ }
41
+ }, ...groups.flatMap((group) => group.skills.map((skill) => skillCommand(skill, group.domain, inventory)))];
42
+ }
43
+ //#endregion
44
+ export { createSkillCommands };
45
+
46
+ //# sourceMappingURL=skillCommands.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillCommands.mjs","names":[],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.ts"],"sourcesContent":["import type { DoomHeadlessCommand } from '@agimon-ai/doompi-core/headless';\nimport type { Skill } from '@earendil-works/pi-coding-agent';\n\nimport { expandDeferredSkillCommand, type DeferredSkillSnapshot } from '../../../../../services/deferredSkills';\nimport type { ServerSkillGroup } from '../../../../../services/serverInventory';\nimport { SKILL_COMMAND_PREFIX, SKILL_INVOCATION_PREFIX, SKILLS_COMMAND } from '../../../../../types/skills';\n\n/**\n * One command per skill, gated by whatever activates that skill.\n *\n * Expansion always reads the full inventory, not the group: a command is only\n * dispatchable while its condition holds, so by the time one runs its skill is\n * active, and looking it up in the union keeps one lookup table instead of one\n * per domain.\n */\nfunction skillCommand(skill: Skill, domain: string | undefined, inventory: DeferredSkillSnapshot): DoomHeadlessCommand {\n return {\n ...(domain === undefined ? {} : { when: { domain } }),\n name: `${SKILL_COMMAND_PREFIX}${skill.name}`,\n description: skill.description,\n execute: async (args, execution) => {\n const text = `${SKILL_INVOCATION_PREFIX}${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\nexport function createSkillCommands(\n inventory: DeferredSkillSnapshot,\n catalog: string,\n groups: readonly ServerSkillGroup[],\n): 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(\n expandDeferredSkillCommand(`${SKILL_INVOCATION_PREFIX}${requested}`, inventory.skills),\n );\n return;\n }\n await execution.client.notify({\n title: 'DoomPi skills',\n body: catalog,\n level: 'info',\n });\n },\n },\n ...groups.flatMap((group) => group.skills.map((skill) => skillCommand(skill, group.domain, inventory))),\n ];\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAS,aAAa,OAAc,QAA4B,WAAuD;CACrH,OAAO;EACL,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;EACnD,MAAM,GAAG,uBAAuB,MAAM;EACtC,aAAa,MAAM;EACnB,SAAS,OAAO,MAAM,cAAc;GAClC,MAAM,OAAO,GAAG,0BAA0B,MAAM,OAAO,OAAO,IAAI,SAAS;GAC3E,MAAM,WAAW,2BAA2B,MAAM,UAAU,MAAM;GAClE,IAAI,aAAa,MAAM,MAAM,IAAI,MAAM,UAAU,MAAM,KAAK,yBAAyB;GACrF,MAAM,UAAU,QAAQ,OAAO,QAAQ;EACzC;CACF;AACF;AAEA,SAAgB,oBACd,WACA,SACA,QACgC;CAChC,OAAO,CACL;EACE,MAAM;EACN,aAAa;EACb,MAAM,QAAQ,MAAM,WAAW;GAC7B,MAAM,YAAY,KAAK,KAAK;GAC5B,IAAI,WAAW;IACb,MAAM,UAAU,QAAQ,OACtB,2BAA2B,GAAG,0BAA0B,aAAa,UAAU,MAAM,CACvF;IACA;GACF;GACA,MAAM,UAAU,OAAO,OAAO;IAC5B,OAAO;IACP,MAAM;IACN,OAAO;GACT,CAAC;EACH;CACF,GACA,GAAG,OAAO,SAAS,UAAU,MAAM,OAAO,KAAK,UAAU,aAAa,OAAO,MAAM,QAAQ,SAAS,CAAC,CAAC,CACxG;AACF"}
@@ -0,0 +1,110 @@
1
+ const require_skills = require("../../../../../types/skills.cjs");
2
+ let _agimon_ai_doompi_config_piContext = require("@agimon-ai/doompi-config/piContext");
3
+ //#region src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.ts
4
+ const WARNING = "warning";
5
+ function loadedSkillCommandNames(pi) {
6
+ if (typeof pi.getCommands !== "function") return [];
7
+ return pi.getCommands().filter((command) => command.source === "skill" && command.name.startsWith("skill:")).map((command) => command.name.slice(require_skills.SKILL_COMMAND_PREFIX.length));
8
+ }
9
+ function failedSnapshot(cwd, error) {
10
+ return {
11
+ skills: [],
12
+ diagnostics: [`${cwd}: ${error instanceof Error ? error.message : String(error)}`]
13
+ };
14
+ }
15
+ /**
16
+ * Discovery that starts with the session and is awaited only when something
17
+ * needs it.
18
+ *
19
+ * Scanning every skill directory is the slowest thing this package does, so it
20
+ * runs as a generation started on session_start. A reload starts a new one, and
21
+ * a snapshot from a superseded generation is discarded rather than shown.
22
+ */
23
+ function createSkillReadiness(pi, helpSkillView, loadDeferredSkills, cordisContext) {
24
+ let generationSequence = 0;
25
+ let currentGeneration;
26
+ let shownHelpDiagnosticKey = "";
27
+ const currentSnapshot = async (generation) => {
28
+ const snapshot = await generation.ready;
29
+ return currentGeneration === generation ? snapshot : void 0;
30
+ };
31
+ return {
32
+ events: {
33
+ session_start: (_event, ctx) => {
34
+ const state = (0, _agimon_ai_doompi_config_piContext.requireDoomConfigContext)(cordisContext()).harness;
35
+ currentGeneration = {
36
+ id: ++generationSequence,
37
+ ready: loadDeferredSkills().then(({ DeferredSkillLoader }) => new DeferredSkillLoader({
38
+ cwd: ctx.cwd,
39
+ skillPaths: state.skillDirectories
40
+ }).start()).catch((error) => failedSnapshot(ctx.cwd, error)),
41
+ diagnosticsShown: false
42
+ };
43
+ shownHelpDiagnosticKey = "";
44
+ },
45
+ input: async (event) => {
46
+ if (!event.text.startsWith("/skill:")) return { action: "continue" };
47
+ const generation = currentGeneration;
48
+ if (!generation) return { action: "continue" };
49
+ const snapshot = await currentSnapshot(generation);
50
+ if (!snapshot) return { action: "continue" };
51
+ const inventory = helpSkillView.merge({
52
+ normalSkills: [],
53
+ deferredSkills: snapshot.skills,
54
+ normalSkillNames: loadedSkillCommandNames(pi)
55
+ });
56
+ const { expandDeferredSkillCommand } = await loadDeferredSkills();
57
+ const text = expandDeferredSkillCommand(event.text, inventory.additionalSkills);
58
+ return text === event.text ? { action: "continue" } : {
59
+ action: "transform",
60
+ text,
61
+ images: event.images
62
+ };
63
+ },
64
+ before_agent_start: async (event, ctx) => {
65
+ const generation = currentGeneration;
66
+ if (!generation) return void 0;
67
+ const snapshot = await currentSnapshot(generation);
68
+ if (!snapshot) return void 0;
69
+ if (!generation.diagnosticsShown && snapshot.diagnostics.length > 0) {
70
+ generation.diagnosticsShown = true;
71
+ ctx.ui.notify(`Skill discovery:\n${snapshot.diagnostics.join("\n")}`, WARNING);
72
+ }
73
+ const inventory = helpSkillView.merge({
74
+ normalSkills: event.systemPromptOptions.skills ?? [],
75
+ deferredSkills: snapshot.skills
76
+ });
77
+ if (inventory.diagnosticKey !== shownHelpDiagnosticKey) {
78
+ shownHelpDiagnosticKey = inventory.diagnosticKey;
79
+ if (inventory.diagnostics.length > 0) ctx.ui.notify(`Package Help:\n${inventory.diagnostics.join("\n")}`, WARNING);
80
+ }
81
+ if (inventory.additionalSkills.length === 0) return void 0;
82
+ const { buildPromptWithDeferredSkills } = await loadDeferredSkills();
83
+ return { systemPrompt: buildPromptWithDeferredSkills(event.systemPrompt, event.systemPromptOptions, [...inventory.additionalSkills]) };
84
+ }
85
+ },
86
+ onStop() {
87
+ currentGeneration = void 0;
88
+ },
89
+ current: async () => currentGeneration ? currentSnapshot(currentGeneration) : void 0
90
+ };
91
+ }
92
+ /** The merged skill inventory the /skills catalogue is built from. */
93
+ function skillInventory(helpSkillView, readiness) {
94
+ return async (ctx) => {
95
+ const snapshot = await readiness.current();
96
+ const inventory = helpSkillView.merge({
97
+ normalSkills: ctx.getSystemPromptOptions().skills ?? [],
98
+ deferredSkills: snapshot?.skills ?? []
99
+ });
100
+ return {
101
+ helpSkills: inventory.helpSkills,
102
+ diagnostics: inventory.diagnostics
103
+ };
104
+ };
105
+ }
106
+ //#endregion
107
+ exports.createSkillReadiness = createSkillReadiness;
108
+ exports.skillInventory = skillInventory;
109
+
110
+ //# sourceMappingURL=skillReadiness.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillReadiness.cjs","names":["SKILL_COMMAND_PREFIX","requireDoomConfigContext"],"sources":["../../../../../../../src/extensions/workspaces/sessions/(backend)/_lib/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":";;;AASA,MAAM,UAAU;AAiBhB,SAAS,wBAAwB,IAA4B;CAC3D,IAAI,OAAO,GAAG,gBAAgB,YAAY,OAAO,CAAC;CAClD,OAAO,GACJ,YAAY,CAAC,CACb,QAAQ,YAAY,QAAQ,WAAW,WAAW,QAAQ,KAAK,WAAA,QAA+B,CAAC,CAAC,CAChG,KAAK,YAAY,QAAQ,KAAK,MAAMA,eAAAA,qBAAqB,MAAM,CAAC;AACrE;AAEA,SAAS,eAAe,KAAa,OAAuC;CAC1E,OAAO;EACL,QAAQ,CAAC;EACT,aAAa,CAAC,GAAG,IAAI,IAAI,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;CACnF;AACF;;;;;;;;;AAUA,SAAgB,qBACd,IACA,eACA,oBACA,eACgB;CAChB,IAAI,qBAAqB;CACzB,IAAI;CACJ,IAAI,yBAAyB;CAE7B,MAAM,kBAAkB,OAAO,eAAqF;EAClH,MAAM,WAAW,MAAM,WAAW;EAClC,OAAO,sBAAsB,aAAa,WAAW,KAAA;CACvD;CAEA,OAAO;EACL,QAAQ;GACN,gBAAgB,QAAQ,QAAQ;IAC9B,MAAM,SAAA,GAAQC,mCAAAA,yBAAAA,CAAyB,cAAc,CAAC,CAAC,CAAC;IAOxD,oBAAoB;KAAE,IAAA,EANT;KAMa,OALZ,mBAAmB,CAAC,CAC/B,MAAM,EAAE,0BACP,IAAI,oBAAoB;MAAE,KAAK,IAAI;MAAK,YAAY,MAAM;KAAiB,CAAC,CAAC,CAAC,MAAM,CACtF,CAAC,CACA,OAAO,UAAmB,eAAe,IAAI,KAAK,KAAK,CAC5B;KAAG,kBAAkB;IAAM;IACzD,yBAAyB;GAC3B;GACA,OAAO,OAAO,UAAU;IACtB,IAAI,CAAC,MAAM,KAAK,WAAA,SAAkC,GAAG,OAAO,EAAE,QAAQ,WAAW;IAEjF,MAAM,aAAa;IACnB,IAAI,CAAC,YAAY,OAAO,EAAE,QAAQ,WAAW;IAC7C,MAAM,WAAW,MAAM,gBAAgB,UAAU;IACjD,IAAI,CAAC,UAAU,OAAO,EAAE,QAAQ,WAAW;IAE3C,MAAM,YAAY,cAAc,MAAM;KACpC,cAAc,CAAC;KACf,gBAAgB,SAAS;KACzB,kBAAkB,wBAAwB,EAAE;IAC9C,CAAC;IACD,MAAM,EAAE,+BAA+B,MAAM,mBAAmB;IAChE,MAAM,OAAO,2BAA2B,MAAM,MAAM,UAAU,gBAAgB;IAC9E,OAAO,SAAS,MAAM,OAAO,EAAE,QAAQ,WAAW,IAAI;KAAE,QAAQ;KAAa;KAAM,QAAQ,MAAM;IAAO;GAC1G;GACA,oBAAoB,OAAO,OAAO,QAAQ;IACxC,MAAM,aAAa;IACnB,IAAI,CAAC,YAAY,OAAO,KAAA;IACxB,MAAM,WAAW,MAAM,gBAAgB,UAAU;IACjD,IAAI,CAAC,UAAU,OAAO,KAAA;IAEtB,IAAI,CAAC,WAAW,oBAAoB,SAAS,YAAY,SAAS,GAAG;KACnE,WAAW,mBAAmB;KAC9B,IAAI,GAAG,OAAO,qBAAqB,SAAS,YAAY,KAAK,IAAI,KAAK,OAAO;IAC/E;IACA,MAAM,YAAY,cAAc,MAAM;KACpC,cAAc,MAAM,oBAAoB,UAAU,CAAC;KACnD,gBAAgB,SAAS;IAC3B,CAAC;IACD,IAAI,UAAU,kBAAkB,wBAAwB;KACtD,yBAAyB,UAAU;KACnC,IAAI,UAAU,YAAY,SAAS,GACjC,IAAI,GAAG,OAAO,kBAAkB,UAAU,YAAY,KAAK,IAAI,KAAK,OAAO;IAE/E;IACA,IAAI,UAAU,iBAAiB,WAAW,GAAG,OAAO,KAAA;IAEpD,MAAM,EAAE,kCAAkC,MAAM,mBAAmB;IACnE,OAAO,EACL,cAAc,8BAA8B,MAAM,cAAc,MAAM,qBAAqB,CACzF,GAAG,UAAU,gBACf,CAAC,EACH;GACF;EACF;EACA,SAAS;GACP,oBAAoB,KAAA;EACtB;EACA,SAAS,YAAa,oBAAoB,gBAAgB,iBAAiB,IAAI,KAAA;CACjF;AACF;;AAGA,SAAgB,eAAe,eAA8B,WAA2B;CACtF,OAAO,OAAO,QAA0B;EACtC,MAAM,WAAW,MAAM,UAAU,QAAQ;EACzC,MAAM,YAAY,cAAc,MAAM;GAEpC,cACG,IAAsE,uBAAuB,CAAC,CAAC,UAAU,CAAC;GAC7G,gBAAgB,UAAU,UAAU,CAAC;EACvC,CAAC;EACD,OAAO;GAAE,YAAY,UAAU;GAAY,aAAa,UAAU;EAAY;CAChF;AACF"}