@agimon-ai/doompi-domain 0.0.1-alpha.62 → 0.0.1-alpha.63
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/dist/apply.cjs +1 -1
- package/dist/apply.mjs +1 -1
- package/dist/{applyDomains-ilQ3j-RJ.mjs → applyDomains-CSdAZe5P.mjs} +2 -2
- package/dist/{applyDomains-ilQ3j-RJ.mjs.map → applyDomains-CSdAZe5P.mjs.map} +1 -1
- package/dist/{applyDomains-DY2FCwyW.cjs → applyDomains-L5ywYh8d.cjs} +2 -2
- package/dist/{applyDomains-DY2FCwyW.cjs.map → applyDomains-L5ywYh8d.cjs.map} +1 -1
- package/dist/extensions/pi.cjs +1 -1
- package/dist/extensions/pi.mjs +1 -1
- package/dist/extensions/server.cjs +42 -26
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.mjs +42 -27
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/mcp.d.mts +1 -1
- package/dist/{resourceCollector-CABxbOYj.cjs → resourceCollector-Bj_pmQ4Q.cjs} +11 -6
- package/dist/resourceCollector-Bj_pmQ4Q.cjs.map +1 -0
- package/dist/{resourceCollector-Rp68la05.mjs → resourceCollector-D4b4QO6b.mjs} +11 -6
- package/dist/resourceCollector-D4b4QO6b.mjs.map +1 -0
- package/dist/{resources-BlKmrq97.d.mts → resources-C2ZA4jRJ.d.mts} +2 -1
- package/dist/resources-C2ZA4jRJ.d.mts.map +1 -0
- package/dist/resources.cjs +1 -1
- package/dist/resources.d.mts +4 -2
- package/dist/resources.d.mts.map +1 -1
- package/dist/resources.mjs +1 -1
- package/package.json +8 -8
- package/dist/resourceCollector-CABxbOYj.cjs.map +0 -1
- package/dist/resourceCollector-Rp68la05.mjs.map +0 -1
- package/dist/resources-BlKmrq97.d.mts.map +0 -1
package/dist/apply.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_applyDomains = require("./applyDomains-
|
|
2
|
+
const require_applyDomains = require("./applyDomains-L5ywYh8d.cjs");
|
|
3
3
|
exports.applyDomains = require_applyDomains.applyDomains;
|
package/dist/apply.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as applyDomains } from "./applyDomains-
|
|
1
|
+
import { t as applyDomains } from "./applyDomains-CSdAZe5P.mjs";
|
|
2
2
|
export { applyDomains };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { o as resolveMcpAllowlist } from "./mcpFilter-ChoM_vWa.mjs";
|
|
2
2
|
import { t as materializePluginEntries } from "./pluginMaterializer-D9qFOmKW.mjs";
|
|
3
|
-
import { r as collectResources } from "./resourceCollector-
|
|
3
|
+
import { r as collectResources } from "./resourceCollector-D4b4QO6b.mjs";
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { resolvePluginEntries, resolveSharedSkills } from "@agimon-ai/doompi-config/domains";
|
|
@@ -82,4 +82,4 @@ async function applyDomains(domainNames, state) {
|
|
|
82
82
|
//#endregion
|
|
83
83
|
export { applyDomains_exports as n, applyDomains as t };
|
|
84
84
|
|
|
85
|
-
//# sourceMappingURL=applyDomains-
|
|
85
|
+
//# sourceMappingURL=applyDomains-CSdAZe5P.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyDomains-
|
|
1
|
+
{"version":3,"file":"applyDomains-CSdAZe5P.mjs","names":[],"sources":["../src/services/applyDomains/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport { requireHarnessPaths, updateHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport type { DoomHarnessContext, HarnessState } from '@agimon-ai/doompi-config/types';\n\nimport { resolveMcpAllowlist } from '../mcpFilter';\nimport { materializePluginEntries } from '../pluginMaterializer';\nimport { collectResources } from '../resourceCollector';\n\n/**\n * Live domain switching: skills, plugin hooks, MCP config and subagent directories.\n *\n * Writes through the harness state module and relies on Pi's reload\n * re-executing extension modules. The replacement Config factory publishes the\n * persisted MCP projection on the new session's Cordis root.\n *\n * What reload cannot do is change the SET of loaded extensions: Pi freezes the\n * CLI --extension list at construction and re-resolves that same array on every\n * reload. Callers report those parts as needing a relaunch instead of pretending\n * they applied.\n *\n * The major-mode and profile switches live in\n * @agimon-ai/doompi-config/selectionSwitch: they are config writes with no\n * resource staging, and the synced startup path applies them before any command\n * exists to run. Domains stays here because it stages plugins, skills and MCP\n * config.\n */\nexport async function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const pluginEntries = await materializePluginEntries(\n resolvePluginEntries(root, domainNames, [...state.pluginDirectories]),\n );\n const mcpAllowlist = resolveMcpAllowlist(root, domainNames);\n // Keep the active generation untouched while the candidate is parsed and\n // normalized. Pi's reload later removes the whole process-owned run root, so\n // retired generations need no eager destructive cleanup here.\n const candidateDirectory = await fs.promises.mkdtemp(path.join(temporaryDirectory, 'domains-'));\n let resources: Awaited<ReturnType<typeof collectResources>>;\n try {\n resources = await collectResources(root, pluginEntries, {\n agents: state.agents,\n mcp: state.mcp,\n temporaryDirectory: candidateDirectory,\n sharedSkills: resolveSharedSkills(root, domainNames),\n mcpAllowlist,\n });\n } catch (error) {\n await fs.promises.rm(candidateDirectory, { recursive: true, force: true });\n throw error;\n }\n\n let updated: HarnessState;\n try {\n updated = updateHarnessState({\n domains: domainNames,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n pluginHooks: resources.pluginHooks,\n mcpConfigPath: resources.mcpConfigPath,\n mcpProjection: resources.mcpProjection,\n });\n } catch (error) {\n await fs.promises.rm(candidateDirectory, { recursive: true, force: true });\n throw error;\n }\n process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n return updated;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,aAAa,aAAuB,OAAkD;CAC1G,MAAM,EAAE,MAAM,uBAAuB,oBAAoB,KAAK;CAE9D,MAAM,gBAAgB,MAAM,yBAC1B,qBAAqB,MAAM,aAAa,CAAC,GAAG,MAAM,iBAAiB,CAAC,CACtE;CACA,MAAM,eAAe,oBAAoB,MAAM,WAAW;CAI1D,MAAM,qBAAqB,MAAM,GAAG,SAAS,QAAQ,KAAK,KAAK,oBAAoB,UAAU,CAAC;CAC9F,IAAI;CACJ,IAAI;EACF,YAAY,MAAM,iBAAiB,MAAM,eAAe;GACtD,QAAQ,MAAM;GACd,KAAK,MAAM;GACX,oBAAoB;GACpB,cAAc,oBAAoB,MAAM,WAAW;GACnD;EACF,CAAC;CACH,SAAS,OAAO;EACd,MAAM,GAAG,SAAS,GAAG,oBAAoB;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EACzE,MAAM;CACR;CAEA,IAAI;CACJ,IAAI;EACF,UAAU,mBAAmB;GAC3B,SAAS;GACT,kBAAkB,UAAU;GAC5B,kBAAkB,UAAU;GAC5B,aAAa,UAAU;GACvB,eAAe,UAAU;GACzB,eAAe,UAAU;EAC3B,CAAC;CACH,SAAS,OAAO;EACd,MAAM,GAAG,SAAS,GAAG,oBAAoB;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EACzE,MAAM;CACR;CACA,QAAQ,IAAI,+BAA+B,UAAU,iBAAiB,KAAK,KAAK,SAAS;CACzF,QAAQ,IAAI,+BAA+B,UAAU,iBAAiB,KAAK,KAAK,SAAS;CACzF,OAAO;AACT"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
|
|
2
2
|
const require_mcpFilter = require("./mcpFilter-CsTk699I.cjs");
|
|
3
3
|
const require_pluginMaterializer = require("./pluginMaterializer-D4xOC_Oc.cjs");
|
|
4
|
-
const require_resourceCollector = require("./resourceCollector-
|
|
4
|
+
const require_resourceCollector = require("./resourceCollector-Bj_pmQ4Q.cjs");
|
|
5
5
|
let node_fs = require("node:fs");
|
|
6
6
|
node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
|
|
7
7
|
let node_path = require("node:path");
|
|
@@ -84,4 +84,4 @@ Object.defineProperty(exports, "applyDomains_exports", {
|
|
|
84
84
|
}
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
-
//# sourceMappingURL=applyDomains-
|
|
87
|
+
//# sourceMappingURL=applyDomains-L5ywYh8d.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applyDomains-
|
|
1
|
+
{"version":3,"file":"applyDomains-L5ywYh8d.cjs","names":["requireHarnessPaths","materializePluginEntries","resolvePluginEntries","resolveMcpAllowlist","fs","path","collectResources","resolveSharedSkills","updateHarnessState"],"sources":["../src/services/applyDomains/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport { requireHarnessPaths, updateHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport type { DoomHarnessContext, HarnessState } from '@agimon-ai/doompi-config/types';\n\nimport { resolveMcpAllowlist } from '../mcpFilter';\nimport { materializePluginEntries } from '../pluginMaterializer';\nimport { collectResources } from '../resourceCollector';\n\n/**\n * Live domain switching: skills, plugin hooks, MCP config and subagent directories.\n *\n * Writes through the harness state module and relies on Pi's reload\n * re-executing extension modules. The replacement Config factory publishes the\n * persisted MCP projection on the new session's Cordis root.\n *\n * What reload cannot do is change the SET of loaded extensions: Pi freezes the\n * CLI --extension list at construction and re-resolves that same array on every\n * reload. Callers report those parts as needing a relaunch instead of pretending\n * they applied.\n *\n * The major-mode and profile switches live in\n * @agimon-ai/doompi-config/selectionSwitch: they are config writes with no\n * resource staging, and the synced startup path applies them before any command\n * exists to run. Domains stays here because it stages plugins, skills and MCP\n * config.\n */\nexport async function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const pluginEntries = await materializePluginEntries(\n resolvePluginEntries(root, domainNames, [...state.pluginDirectories]),\n );\n const mcpAllowlist = resolveMcpAllowlist(root, domainNames);\n // Keep the active generation untouched while the candidate is parsed and\n // normalized. Pi's reload later removes the whole process-owned run root, so\n // retired generations need no eager destructive cleanup here.\n const candidateDirectory = await fs.promises.mkdtemp(path.join(temporaryDirectory, 'domains-'));\n let resources: Awaited<ReturnType<typeof collectResources>>;\n try {\n resources = await collectResources(root, pluginEntries, {\n agents: state.agents,\n mcp: state.mcp,\n temporaryDirectory: candidateDirectory,\n sharedSkills: resolveSharedSkills(root, domainNames),\n mcpAllowlist,\n });\n } catch (error) {\n await fs.promises.rm(candidateDirectory, { recursive: true, force: true });\n throw error;\n }\n\n let updated: HarnessState;\n try {\n updated = updateHarnessState({\n domains: domainNames,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n pluginHooks: resources.pluginHooks,\n mcpConfigPath: resources.mcpConfigPath,\n mcpProjection: resources.mcpProjection,\n });\n } catch (error) {\n await fs.promises.rm(candidateDirectory, { recursive: true, force: true });\n throw error;\n }\n process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n return updated;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,eAAsB,aAAa,aAAuB,OAAkD;CAC1G,MAAM,EAAE,MAAM,wBAAA,GAAuBA,sCAAAA,oBAAAA,CAAoB,KAAK;CAE9D,MAAM,gBAAgB,MAAMC,2BAAAA,0BAAAA,GAC1BC,iCAAAA,qBAAAA,CAAqB,MAAM,aAAa,CAAC,GAAG,MAAM,iBAAiB,CAAC,CACtE;CACA,MAAM,eAAeC,kBAAAA,oBAAoB,MAAM,WAAW;CAI1D,MAAM,qBAAqB,MAAMC,QAAAA,QAAG,SAAS,QAAQC,UAAAA,QAAK,KAAK,oBAAoB,UAAU,CAAC;CAC9F,IAAI;CACJ,IAAI;EACF,YAAY,MAAMC,0BAAAA,iBAAiB,MAAM,eAAe;GACtD,QAAQ,MAAM;GACd,KAAK,MAAM;GACX,oBAAoB;GACpB,eAAA,GAAcC,iCAAAA,oBAAAA,CAAoB,MAAM,WAAW;GACnD;EACF,CAAC;CACH,SAAS,OAAO;EACd,MAAMH,QAAAA,QAAG,SAAS,GAAG,oBAAoB;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EACzE,MAAM;CACR;CAEA,IAAI;CACJ,IAAI;EACF,WAAA,GAAUI,sCAAAA,mBAAAA,CAAmB;GAC3B,SAAS;GACT,kBAAkB,UAAU;GAC5B,kBAAkB,UAAU;GAC5B,aAAa,UAAU;GACvB,eAAe,UAAU;GACzB,eAAe,UAAU;EAC3B,CAAC;CACH,SAAS,OAAO;EACd,MAAMJ,QAAAA,QAAG,SAAS,GAAG,oBAAoB;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EACzE,MAAM;CACR;CACA,QAAQ,IAAI,+BAA+B,UAAU,iBAAiB,KAAKC,UAAAA,QAAK,SAAS;CACzF,QAAQ,IAAI,+BAA+B,UAAU,iBAAiB,KAAKA,UAAAA,QAAK,SAAS;CACzF,OAAO;AACT"}
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -308,7 +308,7 @@ function lazyModules() {
|
|
|
308
308
|
let journal;
|
|
309
309
|
let picker;
|
|
310
310
|
return {
|
|
311
|
-
apply: () => apply ??= Promise.resolve().then(() => require("../applyDomains-
|
|
311
|
+
apply: () => apply ??= Promise.resolve().then(() => require("../applyDomains-L5ywYh8d.cjs")).then((n) => n.applyDomains_exports),
|
|
312
312
|
journal: () => journal ??= import("@agimon-ai/doompi-config/piContext"),
|
|
313
313
|
picker: () => picker ??= import("@agimon-ai/doompi-ui/matrixPicker")
|
|
314
314
|
};
|
package/dist/extensions/pi.mjs
CHANGED
|
@@ -304,7 +304,7 @@ function lazyModules() {
|
|
|
304
304
|
let journal;
|
|
305
305
|
let picker;
|
|
306
306
|
return {
|
|
307
|
-
apply: () => apply ??= import("../applyDomains-
|
|
307
|
+
apply: () => apply ??= import("../applyDomains-CSdAZe5P.mjs").then((n) => n.n),
|
|
308
308
|
journal: () => journal ??= import("@agimon-ai/doompi-config/piContext"),
|
|
309
309
|
picker: () => picker ??= import("@agimon-ai/doompi-ui/matrixPicker")
|
|
310
310
|
};
|
|
@@ -4,46 +4,57 @@ Object.defineProperties(exports, {
|
|
|
4
4
|
});
|
|
5
5
|
const require_rolldown_runtime = require("../rolldown-runtime-C0BPl7ul.cjs");
|
|
6
6
|
const require_pluginMaterializer = require("../pluginMaterializer-D4xOC_Oc.cjs");
|
|
7
|
-
const require_resourceCollector = require("../resourceCollector-
|
|
7
|
+
const require_resourceCollector = require("../resourceCollector-Bj_pmQ4Q.cjs");
|
|
8
8
|
const require_domainText = require("../domainText-DOsRzOiP.cjs");
|
|
9
|
+
let node_path = require("node:path");
|
|
10
|
+
node_path = require_rolldown_runtime.__toESM(node_path, 1);
|
|
9
11
|
let _agimon_ai_doompi_config_domains = require("@agimon-ai/doompi-config/domains");
|
|
10
12
|
let node_os = require("node:os");
|
|
11
13
|
node_os = require_rolldown_runtime.__toESM(node_os, 1);
|
|
12
14
|
let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
|
|
15
|
+
let _agimon_ai_doompi_core_skills = require("@agimon-ai/doompi-core/skills");
|
|
13
16
|
let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
|
|
14
17
|
let node_fs_promises = require("node:fs/promises");
|
|
15
18
|
//#region src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts
|
|
16
|
-
/**
|
|
19
|
+
/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */
|
|
17
20
|
async function domainServerResources(context) {
|
|
18
21
|
const resources = [];
|
|
19
22
|
const home = context.environment.HOME ?? node_os.default.homedir();
|
|
20
23
|
for (const domain of (0, _agimon_ai_doompi_config_domains.listDomainNames)(context.repoRoot, home)) {
|
|
21
|
-
const
|
|
22
|
-
const collected = await require_resourceCollector.collectResources(context.repoRoot, plugins, {
|
|
23
|
-
agents: false,
|
|
24
|
-
mcp: false,
|
|
25
|
-
sharedSkills: false
|
|
26
|
-
});
|
|
24
|
+
const temporaryDirectory = await (0, node_fs_promises.mkdtemp)(node_path.default.join(node_os.default.tmpdir(), "doom-domain-"));
|
|
27
25
|
try {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
26
|
+
const plugins = await require_pluginMaterializer.materializePluginEntries((0, _agimon_ai_doompi_config_domains.resolvePluginEntries)(context.repoRoot, [domain], [], home));
|
|
27
|
+
const collected = await require_resourceCollector.collectResources(context.repoRoot, plugins, {
|
|
28
|
+
agents: false,
|
|
29
|
+
mcp: false,
|
|
30
|
+
sharedSkills: false,
|
|
31
|
+
temporaryDirectory
|
|
32
|
+
});
|
|
33
|
+
for (const skill of collected.skillSources) resources.push({
|
|
34
|
+
name: skill.name,
|
|
35
|
+
description: skill.description,
|
|
36
|
+
path: skill.path,
|
|
37
|
+
kind: "skill",
|
|
38
|
+
when: {
|
|
39
|
+
domain,
|
|
40
|
+
attribution: {
|
|
41
|
+
kind: "domain",
|
|
42
|
+
mode: domain
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
read: () => (0, node_fs_promises.readFile)(skill.path, "utf8")
|
|
46
|
+
});
|
|
47
|
+
} catch (error) {
|
|
48
|
+
await context.client.notify({
|
|
49
|
+
title: `DoomPi domain ${domain} unavailable`,
|
|
50
|
+
body: error instanceof Error ? error.message : String(error),
|
|
51
|
+
level: "warning"
|
|
52
|
+
});
|
|
45
53
|
} finally {
|
|
46
|
-
await
|
|
54
|
+
await (0, node_fs_promises.rm)(temporaryDirectory, {
|
|
55
|
+
recursive: true,
|
|
56
|
+
force: true
|
|
57
|
+
});
|
|
47
58
|
}
|
|
48
59
|
}
|
|
49
60
|
return resources;
|
|
@@ -85,6 +96,11 @@ function createDomainServerCommand(host) {
|
|
|
85
96
|
axis: "domains",
|
|
86
97
|
domains: requested
|
|
87
98
|
});
|
|
99
|
+
const projection = {
|
|
100
|
+
version: 1,
|
|
101
|
+
revision: Date.now()
|
|
102
|
+
};
|
|
103
|
+
await execution.session.appendCustomEntry(_agimon_ai_doompi_core_skills.DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);
|
|
88
104
|
}
|
|
89
105
|
};
|
|
90
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["os","listDomainNames","materializePluginEntries","resolvePluginEntries","collectResources","readFile","defineRoot","DOMAIN_COMMAND","listDomainNames","splitDomains","pickerTitle","domainToggleOptions","toggledDomains","toggleOptionDomain","normalizeDomainNames","defineRoutedContribution","defineRoutedContribution","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","rootSession","composeRootHooks","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport os from 'node:os';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Register configured skills with domain conditions so selection changes reconcile them. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n });\n try {\n for (const file of collected.skillDirectories) {\n const text = await readFile(file, 'utf8');\n const name = /^name:\\s*[\"']?([^\\n\"']+)/m.exec(text)?.[1]?.trim();\n if (!name) throw new Error(`Domain skill has no name: ${file}`);\n resources.push({\n name,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => text,\n });\n }\n } finally {\n await collected.cleanup();\n }\n }\n return resources;\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent }: DoomServerPluginContext) => ({\n value: {\n resources: agent ? await domainServerResources(agent.context) : [],\n } satisfies DomainServerScope,\n}));\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\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 defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["os","listDomainNames","mkdtemp","path","materializePluginEntries","resolvePluginEntries","collectResources","readFile","rm","defineRoot","DOMAIN_COMMAND","listDomainNames","splitDomains","pickerTitle","domainToggleOptions","toggledDomains","toggleOptionDomain","normalizeDomainNames","DOOM_RESOURCE_CATALOG_ENTRY_TYPE","defineRoutedContribution","defineRoutedContribution","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","rootSession","composeRootHooks","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-'));\n try {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n temporaryDirectory,\n });\n for (const skill of collected.skillSources) {\n resources.push({\n name: skill.name,\n description: skill.description,\n path: skill.path,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => readFile(skill.path, 'utf8'),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `DoomPi domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n return resources;\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent }: DoomServerPluginContext) => ({\n value: {\n resources: agent ? await domainServerResources(agent.context) : [],\n } satisfies DomainServerScope,\n}));\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/doompi-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n // The web composer caches get_commands for `$` completion. Signal only after\n // the headless host has reconciled commands so the re-read sees this selection.\n const projection: ResourceCatalogProjection = { version: 1, revision: Date.now() };\n await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\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 defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
@@ -1,43 +1,53 @@
|
|
|
1
1
|
import { t as materializePluginEntries } from "../pluginMaterializer-D9qFOmKW.mjs";
|
|
2
|
-
import { r as collectResources } from "../resourceCollector-
|
|
2
|
+
import { r as collectResources } from "../resourceCollector-D4b4QO6b.mjs";
|
|
3
3
|
import { c as domainToggleOptions, d as pickerTitle, f as splitDomains, h as toggledDomains, m as toggleOptionDomain, t as DOMAIN_COMMAND, u as normalizeDomainNames } from "../domainText-edEmt_4b.mjs";
|
|
4
|
+
import path from "node:path";
|
|
4
5
|
import { listDomainNames, resolvePluginEntries } from "@agimon-ai/doompi-config/domains";
|
|
5
6
|
import os from "node:os";
|
|
6
7
|
import { composeRootHooks, defineResource, defineRoot, defineRoutedContribution } from "@agimon-ai/doompi-core/extensionFile";
|
|
8
|
+
import { DOOM_RESOURCE_CATALOG_ENTRY_TYPE } from "@agimon-ai/doompi-core/skills";
|
|
7
9
|
import { defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/doompi-core/serverFacet";
|
|
8
|
-
import { readFile } from "node:fs/promises";
|
|
10
|
+
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
9
11
|
//#region src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts
|
|
10
|
-
/**
|
|
12
|
+
/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */
|
|
11
13
|
async function domainServerResources(context) {
|
|
12
14
|
const resources = [];
|
|
13
15
|
const home = context.environment.HOME ?? os.homedir();
|
|
14
16
|
for (const domain of listDomainNames(context.repoRoot, home)) {
|
|
15
|
-
const
|
|
16
|
-
const collected = await collectResources(context.repoRoot, plugins, {
|
|
17
|
-
agents: false,
|
|
18
|
-
mcp: false,
|
|
19
|
-
sharedSkills: false
|
|
20
|
-
});
|
|
17
|
+
const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), "doom-domain-"));
|
|
21
18
|
try {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
19
|
+
const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));
|
|
20
|
+
const collected = await collectResources(context.repoRoot, plugins, {
|
|
21
|
+
agents: false,
|
|
22
|
+
mcp: false,
|
|
23
|
+
sharedSkills: false,
|
|
24
|
+
temporaryDirectory
|
|
25
|
+
});
|
|
26
|
+
for (const skill of collected.skillSources) resources.push({
|
|
27
|
+
name: skill.name,
|
|
28
|
+
description: skill.description,
|
|
29
|
+
path: skill.path,
|
|
30
|
+
kind: "skill",
|
|
31
|
+
when: {
|
|
32
|
+
domain,
|
|
33
|
+
attribution: {
|
|
34
|
+
kind: "domain",
|
|
35
|
+
mode: domain
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
read: () => readFile(skill.path, "utf8")
|
|
39
|
+
});
|
|
40
|
+
} catch (error) {
|
|
41
|
+
await context.client.notify({
|
|
42
|
+
title: `DoomPi domain ${domain} unavailable`,
|
|
43
|
+
body: error instanceof Error ? error.message : String(error),
|
|
44
|
+
level: "warning"
|
|
45
|
+
});
|
|
39
46
|
} finally {
|
|
40
|
-
await
|
|
47
|
+
await rm(temporaryDirectory, {
|
|
48
|
+
recursive: true,
|
|
49
|
+
force: true
|
|
50
|
+
});
|
|
41
51
|
}
|
|
42
52
|
}
|
|
43
53
|
return resources;
|
|
@@ -79,6 +89,11 @@ function createDomainServerCommand(host) {
|
|
|
79
89
|
axis: "domains",
|
|
80
90
|
domains: requested
|
|
81
91
|
});
|
|
92
|
+
const projection = {
|
|
93
|
+
version: 1,
|
|
94
|
+
revision: Date.now()
|
|
95
|
+
};
|
|
96
|
+
await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);
|
|
82
97
|
}
|
|
83
98
|
};
|
|
84
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["rootSession","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport os from 'node:os';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Register configured skills with domain conditions so selection changes reconcile them. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n });\n try {\n for (const file of collected.skillDirectories) {\n const text = await readFile(file, 'utf8');\n const name = /^name:\\s*[\"']?([^\\n\"']+)/m.exec(text)?.[1]?.trim();\n if (!name) throw new Error(`Domain skill has no name: ${file}`);\n resources.push({\n name,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => text,\n });\n }\n } finally {\n await collected.cleanup();\n }\n }\n return resources;\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent }: DoomServerPluginContext) => ({\n value: {\n resources: agent ? await domainServerResources(agent.context) : [],\n } satisfies DomainServerScope,\n}));\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\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 defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["rootSession","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-'));\n try {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n temporaryDirectory,\n });\n for (const skill of collected.skillSources) {\n resources.push({\n name: skill.name,\n description: skill.description,\n path: skill.path,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => readFile(skill.path, 'utf8'),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `DoomPi domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n return resources;\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent }: DoomServerPluginContext) => ({\n value: {\n resources: agent ? await domainServerResources(agent.context) : [],\n } satisfies DomainServerScope,\n}));\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/doompi-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n // The web composer caches get_commands for `$` completion. Signal only after\n // the headless host has reconciled commands so the re-read sees this selection.\n const projection: ResourceCatalogProjection = { version: 1, revision: Date.now() };\n await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\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 defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
package/dist/mcp.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as JsonObject } from "./resources-
|
|
1
|
+
import { r as JsonObject } from "./resources-C2ZA4jRJ.mjs";
|
|
2
2
|
import { DomainMcpAllowlist } from "@agimon-ai/doompi-config/domains";
|
|
3
3
|
import { AgentPluginMcpConfigSource, NormalizeAgentPluginMcpOptions, NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource } from "@agimon-ai/doompi-config/agentPluginMcp";
|
|
4
4
|
import { DoomMcpSessionAllowlist } from "@agimon-ai/doompi-core/mcpSession";
|
|
@@ -99,7 +99,7 @@ const DISPATCHER_TOOLS = [
|
|
|
99
99
|
"launch_workflow",
|
|
100
100
|
"list_workflows"
|
|
101
101
|
];
|
|
102
|
-
const SKILL_MANIFEST_VERSION =
|
|
102
|
+
const SKILL_MANIFEST_VERSION = 4;
|
|
103
103
|
const SKILL_MANIFEST_HASH_LENGTH = 16;
|
|
104
104
|
const AGENT_PLUGIN_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
|
|
105
105
|
const PLUGIN_DATA_DIRECTORY = "plugin-data";
|
|
@@ -398,6 +398,7 @@ function scanSkillManifest(root, discovery) {
|
|
|
398
398
|
files.push({
|
|
399
399
|
path: candidate,
|
|
400
400
|
name: skillName(candidate, attributes),
|
|
401
|
+
...typeof attributes.description === "string" ? { description: attributes.description.trim() } : {},
|
|
401
402
|
digest: (0, node_crypto.createHash)("sha256").update(content).digest("hex"),
|
|
402
403
|
size: stat.size,
|
|
403
404
|
mtimeMs: stat.mtimeMs,
|
|
@@ -424,10 +425,11 @@ function discoverSkills(repoRoot, root, discovery = "recursive", cacheDirectory)
|
|
|
424
425
|
const cached = readSkillManifest(manifestPath, root, discovery);
|
|
425
426
|
const manifest = cached ?? scanSkillManifest(root, discovery);
|
|
426
427
|
if (!cached) writeSkillManifest(manifestPath, manifest);
|
|
427
|
-
return manifest.files.map(({ name, path: filePath, digest }) => ({
|
|
428
|
+
return manifest.files.map(({ name, path: filePath, description, digest }) => ({
|
|
428
429
|
name,
|
|
429
430
|
path: filePath,
|
|
430
|
-
digest
|
|
431
|
+
digest,
|
|
432
|
+
...description === void 0 ? {} : { description }
|
|
431
433
|
}));
|
|
432
434
|
}
|
|
433
435
|
async function scanSkillManifestAsync(root, discovery) {
|
|
@@ -466,6 +468,7 @@ async function scanSkillManifestAsync(root, discovery) {
|
|
|
466
468
|
files.push({
|
|
467
469
|
path: candidate,
|
|
468
470
|
name: skillName(candidate, attributes),
|
|
471
|
+
...typeof attributes.description === "string" ? { description: attributes.description.trim() } : {},
|
|
469
472
|
digest: (0, node_crypto.createHash)("sha256").update(content).digest("hex"),
|
|
470
473
|
size: stat.size,
|
|
471
474
|
mtimeMs: stat.mtimeMs,
|
|
@@ -491,10 +494,11 @@ async function discoverSkillsAsync(repoRoot, root, discovery = "recursive", cach
|
|
|
491
494
|
const cached = await readSkillManifestAsync(manifestPath, root, discovery);
|
|
492
495
|
const manifest = cached ?? await scanSkillManifestAsync(root, discovery);
|
|
493
496
|
if (!cached) await writeSkillManifestAsync(manifestPath, manifest);
|
|
494
|
-
return manifest.files.map(({ name, path: filePath, digest }) => ({
|
|
497
|
+
return manifest.files.map(({ name, path: filePath, description, digest }) => ({
|
|
495
498
|
name,
|
|
496
499
|
path: filePath,
|
|
497
|
-
digest
|
|
500
|
+
digest,
|
|
501
|
+
...description === void 0 ? {} : { description }
|
|
498
502
|
}));
|
|
499
503
|
}
|
|
500
504
|
async function markdownFilesAsync(directory) {
|
|
@@ -754,6 +758,7 @@ async function collectResources(repoRoot, plugins, options) {
|
|
|
754
758
|
return {
|
|
755
759
|
temporaryDirectory,
|
|
756
760
|
skillDirectories,
|
|
761
|
+
skillSources,
|
|
757
762
|
skillCount: skillSources.length,
|
|
758
763
|
agentCount: agentSources.length,
|
|
759
764
|
agentDirectories,
|
|
@@ -830,4 +835,4 @@ Object.defineProperty(exports, "stageMcpResources", {
|
|
|
830
835
|
}
|
|
831
836
|
});
|
|
832
837
|
|
|
833
|
-
//# sourceMappingURL=resourceCollector-
|
|
838
|
+
//# sourceMappingURL=resourceCollector-Bj_pmQ4Q.cjs.map
|