@agimon-ai/doompi-skill 0.0.1-alpha.5 → 0.0.1-alpha.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -10
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/api-contracts.cjs +7 -0
- package/dist/api-contracts.d.cts +2 -0
- package/dist/api-contracts.d.mts +2 -0
- package/dist/api-contracts.mjs +2 -0
- package/dist/catalog.cjs +4 -0
- package/dist/catalog.d.cts +2 -0
- package/dist/catalog.d.mts +2 -0
- package/dist/catalog.mjs +2 -0
- package/dist/extensions/pi.cjs +41 -0
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.cts +5 -0
- package/dist/extensions/pi.d.cts.map +1 -0
- package/dist/extensions/pi.d.mts +5 -0
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +36 -0
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +42 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.cts +5 -0
- package/dist/extensions/server.d.cts.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +37 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/index.cjs +11 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.mjs +4 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.cjs +46 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.mjs +46 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillCommands.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.cjs +110 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.mjs +109 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillReadiness.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.cjs +105 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.mjs +105 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillRuntime.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.cjs +23 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.mjs +23 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillServer.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.cjs +37 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.mjs +37 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_lib/skillsCommand.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/skills.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/beforeAgentStart.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/input.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.cjs +17 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.mjs +18 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/help.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/resource/skills.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +18 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +19 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +12 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +13 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.cjs +13 -0
- package/dist/src/schemas/apiContracts.cjs.map +1 -0
- package/dist/src/schemas/apiContracts.d.cts +53 -0
- package/dist/src/schemas/apiContracts.d.cts.map +1 -0
- package/dist/src/schemas/apiContracts.d.mts +53 -0
- package/dist/src/schemas/apiContracts.d.mts.map +1 -0
- package/dist/src/schemas/apiContracts.mjs +13 -0
- package/dist/src/schemas/apiContracts.mjs.map +1 -0
- package/dist/src/services/deferredSkills/index.cjs +175 -0
- package/dist/src/services/deferredSkills/index.cjs.map +1 -0
- package/dist/src/services/deferredSkills/index.mjs +170 -0
- package/dist/src/services/deferredSkills/index.mjs.map +1 -0
- package/dist/src/services/helpSkills/index.cjs +96 -0
- package/dist/src/services/helpSkills/index.cjs.map +1 -0
- package/dist/src/services/helpSkills/index.mjs +95 -0
- package/dist/src/services/helpSkills/index.mjs.map +1 -0
- package/dist/src/services/serverInventory/index.cjs +105 -0
- package/dist/src/services/serverInventory/index.cjs.map +1 -0
- package/dist/src/services/serverInventory/index.mjs +102 -0
- package/dist/src/services/serverInventory/index.mjs.map +1 -0
- package/dist/src/services/skillCatalog/index.cjs +193 -0
- package/dist/src/services/skillCatalog/index.cjs.map +1 -0
- package/dist/src/services/skillCatalog/index.d.cts +65 -0
- package/dist/src/services/skillCatalog/index.d.cts.map +1 -0
- package/dist/src/services/skillCatalog/index.d.mts +65 -0
- package/dist/src/services/skillCatalog/index.d.mts.map +1 -0
- package/dist/src/services/skillCatalog/index.mjs +188 -0
- package/dist/src/services/skillCatalog/index.mjs.map +1 -0
- package/dist/src/services/skillText/index.cjs +17 -0
- package/dist/src/services/skillText/index.cjs.map +1 -0
- package/dist/src/services/skillText/index.d.cts +12 -0
- package/dist/src/services/skillText/index.d.cts.map +1 -0
- package/dist/src/services/skillText/index.d.mts +12 -0
- package/dist/src/services/skillText/index.d.mts.map +1 -0
- package/dist/src/services/skillText/index.mjs +17 -0
- package/dist/src/services/skillText/index.mjs.map +1 -0
- package/dist/src/tui/skillsOverlay.cjs +361 -0
- package/dist/src/tui/skillsOverlay.cjs.map +1 -0
- package/dist/src/tui/skillsOverlay.d.cts +17 -0
- package/dist/src/tui/skillsOverlay.d.cts.map +1 -0
- package/dist/src/tui/skillsOverlay.d.mts +17 -0
- package/dist/src/tui/skillsOverlay.d.mts.map +1 -0
- package/dist/src/tui/skillsOverlay.mjs +356 -0
- package/dist/src/tui/skillsOverlay.mjs.map +1 -0
- package/dist/src/types/skills.cjs +36 -0
- package/dist/src/types/skills.cjs.map +1 -0
- package/dist/src/types/skills.d.cts +32 -0
- package/dist/src/types/skills.d.cts.map +1 -0
- package/dist/src/types/skills.d.mts +32 -0
- package/dist/src/types/skills.d.mts.map +1 -0
- package/dist/src/types/skills.mjs +32 -0
- package/dist/src/types/skills.mjs.map +1 -0
- package/llms.txt +10 -2
- package/package.json +52 -20
- package/src/prompts/doompi-author-skill/SKILL.md +33 -0
- package/src/prompts/doompi-use-skill/SKILL.md +18 -0
package/README.md
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
# @agimon-ai/doompi-skill
|
|
2
2
|
|
|
3
|
-
The session skill
|
|
3
|
+
The session skill catalog for [DoomPi](https://www.npmjs.com/package/@agimon-ai/doompi).
|
|
4
4
|
|
|
5
5
|
Pi loads skills from the directories it is given at startup. DoomPi adds two things on top: skills
|
|
6
|
-
that are discovered lazily rather than loaded eagerly, and a registry other extensions
|
|
7
|
-
own skill directories
|
|
6
|
+
that are discovered lazily rather than loaded eagerly, and a registry where other extensions
|
|
7
|
+
publish their own skill directories.
|
|
8
8
|
|
|
9
9
|
## What it registers
|
|
10
10
|
|
|
11
|
-
| Surface |
|
|
12
|
-
| -------------------- |
|
|
13
|
-
| `/skills` | a fullscreen browser over everything this session loaded and everything
|
|
14
|
-
| `SPC e s` | the leader binding for the same browser
|
|
15
|
-
| `input` hook | expands `/skill:<name>` for a skill that was discovered but not loaded
|
|
16
|
-
| `before_agent_start` | appends discovered skills to the system prompt, and surfaces discovery diagnostics once
|
|
11
|
+
| Surface | Behavior |
|
|
12
|
+
| -------------------- | -------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| `/skills` | a fullscreen browser over everything this session loaded and everything any other domain would add |
|
|
14
|
+
| `SPC e s` | the leader binding for the same browser |
|
|
15
|
+
| `input` hook | expands `/skill:<name>` for a skill that was discovered but not loaded |
|
|
16
|
+
| `before_agent_start` | appends discovered skills to the system prompt, and surfaces discovery diagnostics once |
|
|
17
17
|
|
|
18
18
|
## Deferred discovery
|
|
19
19
|
|
|
@@ -26,11 +26,17 @@ 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-
|
|
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.
|
|
33
33
|
|
|
34
|
+
## Help guidance
|
|
35
|
+
|
|
36
|
+
While the Help minor mode is active, this package contributes `doompi-author-skill` for creating
|
|
37
|
+
and distributing skills and `doompi-use-skill` for browsing, invoking, and diagnosing them. Both
|
|
38
|
+
prompts are published under `src/prompts` and routed through this package's [`llms.txt`](./llms.txt).
|
|
39
|
+
|
|
34
40
|
## Installation
|
|
35
41
|
|
|
36
42
|
DoomPi depends on this package and activates it as fixed host core, so a DoomPi install already has
|
|
@@ -39,3 +45,5 @@ it. It is not selectable from `.doom/modes.yaml`.
|
|
|
39
45
|
## License
|
|
40
46
|
|
|
41
47
|
MIT
|
|
48
|
+
|
|
49
|
+
Plugin entries live in `src/extensions`, host events and commands in routed surfaces, 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,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;
|
package/dist/catalog.cjs
ADDED
|
@@ -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 };
|
package/dist/catalog.mjs
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"pi.d.cts","names":[],"sources":["../../generated/pi.ts"],"mappings":";qBAqBa,iEAAS"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.cts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAca,qDAAK"}
|
|
@@ -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;
|
package/dist/index.d.cts
ADDED
|
@@ -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 };
|
package/dist/index.d.mts
ADDED
|
@@ -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
|