@agimon-ai/po-domain 0.0.0-alpha.21 → 0.0.0-alpha.23

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 CHANGED
@@ -2,13 +2,15 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
3
3
  const require_mcpFilter = require("./mcpFilter-CghXZ2K-.cjs");
4
4
  const require_pluginMaterializer = require("./pluginMaterializer-C8IZ1PSY.cjs");
5
- const require_resourceCollector = require("./resourceCollector-YOEwhNIR.cjs");
5
+ const require_resourceCollector = require("./resourceCollector-DRvsbqfZ.cjs");
6
6
  let node_fs = require("node:fs");
7
7
  node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
8
8
  let node_path = require("node:path");
9
9
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
10
+ let _agimon_ai_po_config_config = require("@agimon-ai/po-config/config");
10
11
  let _agimon_ai_po_config_domains = require("@agimon-ai/po-config/domains");
11
12
  let _agimon_ai_po_config_harnessStore = require("@agimon-ai/po-config/harnessStore");
13
+ let _agimon_ai_po_core_mcpProjection = require("@agimon-ai/po-core/mcpProjection");
12
14
  //#region src/services/applyDomains/index.ts
13
15
  /**
14
16
  * Live domain switching: skills, plugin hooks, MCP config and subagent directories.
@@ -40,7 +42,8 @@ async function applyDomains(domainNames, state) {
40
42
  mcp: state.mcp,
41
43
  temporaryDirectory: candidateDirectory,
42
44
  sharedSkills: (0, _agimon_ai_po_config_domains.resolveSharedSkills)(root, domainNames),
43
- mcpAllowlist
45
+ mcpAllowlist,
46
+ userMcpConfigPath: node_path.default.join((0, _agimon_ai_po_config_config.globalPoConfigDirectory)(), _agimon_ai_po_core_mcpProjection.PO_USER_MCP_CONFIG_FILE)
44
47
  });
45
48
  } catch (error) {
46
49
  await node_fs.default.promises.rm(candidateDirectory, {
@@ -1 +1 @@
1
- {"version":3,"file":"apply.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/po-config/domains';\nimport { requireHarnessPaths, updateHarnessState } from '@agimon-ai/po-config/harnessStore';\nimport type { PoHarnessContext, HarnessState } from '@agimon-ai/po-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/po-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: PoHarnessContext): 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,OAAgD;CACxG,MAAM,EAAE,MAAM,wBAAA,GAAuBA,kCAAAA,oBAAAA,CAAoB,KAAK;CAE9D,MAAM,gBAAgB,MAAMC,2BAAAA,0BAAAA,GAC1BC,6BAAAA,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,6BAAAA,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,kCAAAA,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"}
1
+ {"version":3,"file":"apply.cjs","names":["requireHarnessPaths","materializePluginEntries","resolvePluginEntries","resolveMcpAllowlist","fs","path","collectResources","resolveSharedSkills","globalPoConfigDirectory","PO_USER_MCP_CONFIG_FILE","updateHarnessState"],"sources":["../src/services/applyDomains/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { globalPoConfigDirectory } from '@agimon-ai/po-config/config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/po-config/domains';\nimport { requireHarnessPaths, updateHarnessState } from '@agimon-ai/po-config/harnessStore';\nimport type { PoHarnessContext, HarnessState } from '@agimon-ai/po-config/types';\nimport { PO_USER_MCP_CONFIG_FILE } from '@agimon-ai/po-core/mcpProjection';\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/po-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: PoHarnessContext): 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 userMcpConfigPath: path.join(globalPoConfigDirectory(), PO_USER_MCP_CONFIG_FILE),\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,eAAsB,aAAa,aAAuB,OAAgD;CACxG,MAAM,EAAE,MAAM,wBAAA,GAAuBA,kCAAAA,oBAAAA,CAAoB,KAAK;CAE9D,MAAM,gBAAgB,MAAMC,2BAAAA,0BAAAA,GAC1BC,6BAAAA,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,6BAAAA,oBAAAA,CAAoB,MAAM,WAAW;GACnD;GACA,mBAAmBF,UAAAA,QAAK,MAAA,GAAKG,4BAAAA,wBAAAA,CAAwB,GAAGC,iCAAAA,uBAAuB;EACjF,CAAC;CACH,SAAS,OAAO;EACd,MAAML,QAAAA,QAAG,SAAS,GAAG,oBAAoB;GAAE,WAAW;GAAM,OAAO;EAAK,CAAC;EACzE,MAAM;CACR;CAEA,IAAI;CACJ,IAAI;EACF,WAAA,GAAUM,kCAAAA,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,MAAMN,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"apply.d.mts","names":[],"sources":["../src/services/applyDomains/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;wBA6BsB,aAAa,uBAAuB,OAAO,mBAAmB,QAAQ"}
1
+ {"version":3,"file":"apply.d.mts","names":[],"sources":["../src/services/applyDomains/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;wBA+BsB,aAAa,uBAAuB,OAAO,mBAAmB,QAAQ"}
package/dist/apply.mjs CHANGED
@@ -1,10 +1,12 @@
1
1
  import { r as resolveMcpAllowlist } from "./mcpFilter-CKUbKmxz.mjs";
2
2
  import { t as materializePluginEntries } from "./pluginMaterializer-D9-oDF-b.mjs";
3
- import { t as collectResources } from "./resourceCollector-CLxre4tE.mjs";
3
+ import { t as collectResources } from "./resourceCollector-DjZ0FvjL.mjs";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
+ import { globalPoConfigDirectory } from "@agimon-ai/po-config/config";
6
7
  import { resolvePluginEntries, resolveSharedSkills } from "@agimon-ai/po-config/domains";
7
8
  import { requireHarnessPaths, updateHarnessState } from "@agimon-ai/po-config/harnessStore";
9
+ import { PO_USER_MCP_CONFIG_FILE } from "@agimon-ai/po-core/mcpProjection";
8
10
  //#region src/services/applyDomains/index.ts
9
11
  /**
10
12
  * Live domain switching: skills, plugin hooks, MCP config and subagent directories.
@@ -36,7 +38,8 @@ async function applyDomains(domainNames, state) {
36
38
  mcp: state.mcp,
37
39
  temporaryDirectory: candidateDirectory,
38
40
  sharedSkills: resolveSharedSkills(root, domainNames),
39
- mcpAllowlist
41
+ mcpAllowlist,
42
+ userMcpConfigPath: path.join(globalPoConfigDirectory(), PO_USER_MCP_CONFIG_FILE)
40
43
  });
41
44
  } catch (error) {
42
45
  await fs.promises.rm(candidateDirectory, {
@@ -1 +1 @@
1
- {"version":3,"file":"apply.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/po-config/domains';\nimport { requireHarnessPaths, updateHarnessState } from '@agimon-ai/po-config/harnessStore';\nimport type { PoHarnessContext, HarnessState } from '@agimon-ai/po-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/po-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: PoHarnessContext): 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,OAAgD;CACxG,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
+ {"version":3,"file":"apply.mjs","names":[],"sources":["../src/services/applyDomains/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { globalPoConfigDirectory } from '@agimon-ai/po-config/config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/po-config/domains';\nimport { requireHarnessPaths, updateHarnessState } from '@agimon-ai/po-config/harnessStore';\nimport type { PoHarnessContext, HarnessState } from '@agimon-ai/po-config/types';\nimport { PO_USER_MCP_CONFIG_FILE } from '@agimon-ai/po-core/mcpProjection';\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/po-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: PoHarnessContext): 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 userMcpConfigPath: path.join(globalPoConfigDirectory(), PO_USER_MCP_CONFIG_FILE),\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,eAAsB,aAAa,aAAuB,OAAgD;CACxG,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;GACA,mBAAmB,KAAK,KAAK,wBAAwB,GAAG,uBAAuB;EACjF,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"}
@@ -4,11 +4,12 @@ Object.defineProperties(exports, {
4
4
  });
5
5
  const require_mcpFilter = require("../mcpFilter-CghXZ2K-.cjs");
6
6
  const require_pluginMaterializer = require("../pluginMaterializer-C8IZ1PSY.cjs");
7
- const require_resourceCollector = require("../resourceCollector-YOEwhNIR.cjs");
7
+ const require_resourceCollector = require("../resourceCollector-DRvsbqfZ.cjs");
8
8
  const require_domainText = require("../domainText-CbpBLX_M.cjs");
9
9
  let _agimon_ai_po_config_domains = require("@agimon-ai/po-config/domains");
10
10
  let _agimon_ai_po_config_harnessStore = require("@agimon-ai/po-config/harnessStore");
11
11
  let _agimon_ai_po_core_mcpProjection = require("@agimon-ai/po-core/mcpProjection");
12
+ let _agimon_ai_po_core_piSettings = require("@agimon-ai/po-core/piSettings");
12
13
  let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
13
14
  let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
14
15
  let _agimon_ai_po_core_platform = require("@agimon-ai/po-core/platform");
@@ -75,7 +76,8 @@ var root_server_default = (0, _agimon_ai_po_core_extensionFile.defineRoot)(async
75
76
  projection: (await require_resourceCollector.stageMcpResources(execution.repoRoot, plugins, {
76
77
  enabled: true,
77
78
  temporaryDirectory: directory,
78
- mcpAllowlist: await require_mcpFilter.resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io)
79
+ mcpAllowlist: await require_mcpFilter.resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io),
80
+ userMcpConfigPath: `${(0, _agimon_ai_po_core_piSettings.poHomeDirectory)(home, execution.environment)}/${_agimon_ai_po_core_mcpProjection.PO_USER_MCP_CONFIG_FILE}`
79
81
  })).mcpProjection,
80
82
  cleanup: () => (0, _agimon_ai_po_core_platform.removePath)(fs, directory, _agimon_ai_po_core_platform.BACKGROUND_CONTEXT)
81
83
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["nodeHost","listDomainNamesAsync","getOrThrow","materializePluginEntries","resolvePluginEntriesAsync","collectResources","BACKGROUND_CONTEXT","removePath","defineRoot","requirePoFs","withAbortSignal","BACKGROUND_CONTEXT","nodeHost","loadHarnessStateAsync","getOrThrow","materializePluginEntries","resolvePluginEntriesAsync","stageMcpResources","resolveMcpAllowlistAsync","removePath","PO_MCP_PROJECTION_RESOLVER_SERVICE","defineRoute","DOMAIN_COMMAND","listDomainNamesAsync","BACKGROUND_CONTEXT","splitDomains","pickerTitle","domainToggleOptions","toggledDomains","toggleOptionDomain","normalizeDomainNames","PO_RESOURCE_CATALOG_ENTRY_TYPE","defineRoutedContribution","requirePoFs","defineRoutedContribution","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","composeRootHooks","apiRoute","commandDomains","resourceDomains","resourcePoAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/domains/route.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/poAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { listDomainNamesAsync, resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport type { PoHeadlessExecutionContext, PoHeadlessResource } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, getOrThrow, nodeHost, removePath, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\ntype IoContext = Parameters<FileSystem['readTextFile']>[1];\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(\n context: PoHeadlessExecutionContext,\n fs: FileSystem,\n io: IoContext,\n): Promise<PoHeadlessResource[]> {\n const resources: PoHeadlessResource[] = [];\n const home = context.environment.HOME ?? nodeHost.homeDirectory();\n for (const domain of await listDomainNamesAsync(fs, context.repoRoot, io, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = getOrThrow(await fs.createTempDir('po-domain-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, context.repoRoot, [domain], [], io, home),\n );\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: async () => getOrThrow(await fs.readTextFile(skill.path, BACKGROUND_CONTEXT)),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `Po domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await removePath(fs, temporaryDirectory, BACKGROUND_CONTEXT);\n }\n }\n return resources;\n}\n","import { resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport { loadHarnessStateAsync } from '@agimon-ai/po-config/harnessStore';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport {\n PO_MCP_PROJECTION_RESOLVER_SERVICE,\n type PoMcpProjectionResolverService,\n} from '@agimon-ai/po-core/mcpProjection';\nimport {\n BACKGROUND_CONTEXT,\n getOrThrow,\n nodeHost,\n removePath,\n requirePoFs,\n withAbortSignal,\n} from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { resolveMcpAllowlistAsync } from '../../../../services/mcpFilter';\nimport { materializePluginEntries } from '../../../../services/pluginMaterializer';\nimport { stageMcpResources } from '../../../../services/resourceCollector';\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent, context: root, signal }: PoServerPluginContext) => {\n const services: Array<(cordis: Context) => void> = [];\n if (!agent) return { value: { resources: [] } satisfies DomainServerScope, services };\n const fs = requirePoFs(root);\n const io = withAbortSignal(signal, BACKGROUND_CONTEXT);\n const execution = agent.context;\n const home = execution.environment.HOME ?? nodeHost.homeDirectory();\n const resolver: PoMcpProjectionResolverService = {\n async resolve(domains) {\n const { state } = await loadHarnessStateAsync(fs, { ...execution.environment }, io);\n const directory = getOrThrow(await fs.createTempDir('po-domain-mcp-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, execution.repoRoot, [...domains], [...state.pluginDirectories], io, home),\n );\n const staged = await stageMcpResources(execution.repoRoot, plugins, {\n enabled: true,\n temporaryDirectory: directory,\n mcpAllowlist: await resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io),\n });\n return {\n projection: staged.mcpProjection,\n cleanup: () => removePath(fs, directory, BACKGROUND_CONTEXT),\n };\n } catch (error) {\n await removePath(fs, directory, BACKGROUND_CONTEXT);\n throw error;\n }\n },\n };\n services.push((cordis) => {\n cordis.plugin((provider) => {\n provider.provide(PO_MCP_PROJECTION_RESOLVER_SERVICE, resolver);\n });\n });\n return {\n value: { resources: await domainServerResources(agent.context, fs, io) } satisfies DomainServerScope,\n services,\n };\n});\n","import { defineRoute } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoute(({ agent }: PoServerPluginContext) => ({\n basePath: 'domains',\n start: () => ({\n fetch(request: Request) {\n if (new URL(request.url).pathname !== '/current') return Response.json({ error: 'Not found' }, { status: 404 });\n if (request.method !== 'GET')\n return Response.json({ error: 'Method not allowed' }, { status: 405, headers: { Allow: 'GET' } });\n if (!agent) return Response.json({ error: 'Session agent unavailable' }, { status: 404 });\n const selection = agent.context.selection;\n return Response.json({ domains: selection.domains });\n },\n close() {},\n }),\n}));\n","import { listDomainNamesAsync } from '@agimon-ai/po-config/domains';\nimport { type PoHeadlessCommand, type PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\nimport { PO_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/po-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Full-set web replies share the string transport with legacy single-toggle labels. */\nfunction domainSelectionReply(answer: string): string[] | null {\n if (!answer.trimStart().startsWith('{')) return null;\n const reply: unknown = JSON.parse(answer);\n if (\n typeof reply !== 'object' ||\n reply === null ||\n !('kind' in reply) ||\n reply.kind !== DOMAIN_SELECTION_KIND ||\n !('version' in reply) ||\n reply.version !== DOMAIN_SELECTION_VERSION ||\n !('domains' in reply) ||\n !Array.isArray(reply.domains) ||\n !reply.domains.every((name: unknown): name is string => typeof name === 'string')\n ) {\n throw new Error('Invalid domains selection reply');\n }\n return reply.domains;\n}\n\nexport function createDomainServerCommand(host: PoHeadlessHostService, fs: FileSystem): PoHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active Po domains.',\n async execute(args, execution) {\n const available = await listDomainNamesAsync(fs, execution.repoRoot, BACKGROUND_CONTEXT);\n let requested = splitDomains(args);\n let fullSet = false;\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 const domains = domainSelectionReply(selected);\n fullSet = domains !== null;\n requested = domains ?? 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 (fullSet) {\n const wanted = new Set(requested);\n const current = new Set(execution.selection.domains);\n requested = [\n ...execution.selection.domains.filter((name) => wanted.has(name)),\n ...available.filter((name) => wanted.has(name) && !current.has(name)),\n ];\n }\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(PO_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent, context }: PoServerPluginContext) =>\n agent ? createDomainServerCommand(agent, requirePoFs(context)) : undefined,\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'po-author-domain',\n description:\n 'Configure Po plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .po/domains.yaml or ~/.po/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/po-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/domains/route.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourcePoAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/poAuthorDomain.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 serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-domain',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get commands(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourcePoAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","names":["nodeHost","listDomainNamesAsync","getOrThrow","materializePluginEntries","resolvePluginEntriesAsync","collectResources","BACKGROUND_CONTEXT","removePath","defineRoot","requirePoFs","withAbortSignal","BACKGROUND_CONTEXT","nodeHost","loadHarnessStateAsync","getOrThrow","materializePluginEntries","resolvePluginEntriesAsync","stageMcpResources","resolveMcpAllowlistAsync","poHomeDirectory","PO_USER_MCP_CONFIG_FILE","removePath","PO_MCP_PROJECTION_RESOLVER_SERVICE","defineRoute","DOMAIN_COMMAND","listDomainNamesAsync","BACKGROUND_CONTEXT","splitDomains","pickerTitle","domainToggleOptions","toggledDomains","toggleOptionDomain","normalizeDomainNames","PO_RESOURCE_CATALOG_ENTRY_TYPE","defineRoutedContribution","requirePoFs","defineRoutedContribution","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","composeRootHooks","apiRoute","commandDomains","resourceDomains","resourcePoAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/domains/route.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/poAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { listDomainNamesAsync, resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport type { PoHeadlessExecutionContext, PoHeadlessResource } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, getOrThrow, nodeHost, removePath, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\ntype IoContext = Parameters<FileSystem['readTextFile']>[1];\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(\n context: PoHeadlessExecutionContext,\n fs: FileSystem,\n io: IoContext,\n): Promise<PoHeadlessResource[]> {\n const resources: PoHeadlessResource[] = [];\n const home = context.environment.HOME ?? nodeHost.homeDirectory();\n for (const domain of await listDomainNamesAsync(fs, context.repoRoot, io, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = getOrThrow(await fs.createTempDir('po-domain-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, context.repoRoot, [domain], [], io, home),\n );\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: async () => getOrThrow(await fs.readTextFile(skill.path, BACKGROUND_CONTEXT)),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `Po domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await removePath(fs, temporaryDirectory, BACKGROUND_CONTEXT);\n }\n }\n return resources;\n}\n","import { resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport { loadHarnessStateAsync } from '@agimon-ai/po-config/harnessStore';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport {\n PO_MCP_PROJECTION_RESOLVER_SERVICE,\n PO_USER_MCP_CONFIG_FILE,\n type PoMcpProjectionResolverService,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport {\n BACKGROUND_CONTEXT,\n getOrThrow,\n nodeHost,\n removePath,\n requirePoFs,\n withAbortSignal,\n} from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { resolveMcpAllowlistAsync } from '../../../../services/mcpFilter';\nimport { materializePluginEntries } from '../../../../services/pluginMaterializer';\nimport { stageMcpResources } from '../../../../services/resourceCollector';\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent, context: root, signal }: PoServerPluginContext) => {\n const services: Array<(cordis: Context) => void> = [];\n if (!agent) return { value: { resources: [] } satisfies DomainServerScope, services };\n const fs = requirePoFs(root);\n const io = withAbortSignal(signal, BACKGROUND_CONTEXT);\n const execution = agent.context;\n const home = execution.environment.HOME ?? nodeHost.homeDirectory();\n const resolver: PoMcpProjectionResolverService = {\n async resolve(domains) {\n const { state } = await loadHarnessStateAsync(fs, { ...execution.environment }, io);\n const directory = getOrThrow(await fs.createTempDir('po-domain-mcp-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, execution.repoRoot, [...domains], [...state.pluginDirectories], io, home),\n );\n const staged = await stageMcpResources(execution.repoRoot, plugins, {\n enabled: true,\n temporaryDirectory: directory,\n mcpAllowlist: await resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io),\n userMcpConfigPath: `${poHomeDirectory(home, execution.environment)}/${PO_USER_MCP_CONFIG_FILE}`,\n });\n return {\n projection: staged.mcpProjection,\n cleanup: () => removePath(fs, directory, BACKGROUND_CONTEXT),\n };\n } catch (error) {\n await removePath(fs, directory, BACKGROUND_CONTEXT);\n throw error;\n }\n },\n };\n services.push((cordis) => {\n cordis.plugin((provider) => {\n provider.provide(PO_MCP_PROJECTION_RESOLVER_SERVICE, resolver);\n });\n });\n return {\n value: { resources: await domainServerResources(agent.context, fs, io) } satisfies DomainServerScope,\n services,\n };\n});\n","import { defineRoute } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoute(({ agent }: PoServerPluginContext) => ({\n basePath: 'domains',\n start: () => ({\n fetch(request: Request) {\n if (new URL(request.url).pathname !== '/current') return Response.json({ error: 'Not found' }, { status: 404 });\n if (request.method !== 'GET')\n return Response.json({ error: 'Method not allowed' }, { status: 405, headers: { Allow: 'GET' } });\n if (!agent) return Response.json({ error: 'Session agent unavailable' }, { status: 404 });\n const selection = agent.context.selection;\n return Response.json({ domains: selection.domains });\n },\n close() {},\n }),\n}));\n","import { listDomainNamesAsync } from '@agimon-ai/po-config/domains';\nimport { type PoHeadlessCommand, type PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\nimport { PO_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/po-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Full-set web replies share the string transport with legacy single-toggle labels. */\nfunction domainSelectionReply(answer: string): string[] | null {\n if (!answer.trimStart().startsWith('{')) return null;\n const reply: unknown = JSON.parse(answer);\n if (\n typeof reply !== 'object' ||\n reply === null ||\n !('kind' in reply) ||\n reply.kind !== DOMAIN_SELECTION_KIND ||\n !('version' in reply) ||\n reply.version !== DOMAIN_SELECTION_VERSION ||\n !('domains' in reply) ||\n !Array.isArray(reply.domains) ||\n !reply.domains.every((name: unknown): name is string => typeof name === 'string')\n ) {\n throw new Error('Invalid domains selection reply');\n }\n return reply.domains;\n}\n\nexport function createDomainServerCommand(host: PoHeadlessHostService, fs: FileSystem): PoHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active Po domains.',\n async execute(args, execution) {\n const available = await listDomainNamesAsync(fs, execution.repoRoot, BACKGROUND_CONTEXT);\n let requested = splitDomains(args);\n let fullSet = false;\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 const domains = domainSelectionReply(selected);\n fullSet = domains !== null;\n requested = domains ?? 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 (fullSet) {\n const wanted = new Set(requested);\n const current = new Set(execution.selection.domains);\n requested = [\n ...execution.selection.domains.filter((name) => wanted.has(name)),\n ...available.filter((name) => wanted.has(name) && !current.has(name)),\n ];\n }\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(PO_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent, context }: PoServerPluginContext) =>\n agent ? createDomainServerCommand(agent, requirePoFs(context)) : undefined,\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'po-author-domain',\n description:\n 'Configure Po plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .po/domains.yaml or ~/.po/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/po-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/domains/route.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourcePoAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/poAuthorDomain.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 serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-domain',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get commands(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourcePoAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { s as resolveMcpAllowlistAsync } from "../mcpFilter-CKUbKmxz.mjs";
2
2
  import { t as materializePluginEntries } from "../pluginMaterializer-D9-oDF-b.mjs";
3
- import { o as stageMcpResources, t as collectResources } from "../resourceCollector-CLxre4tE.mjs";
3
+ import { o as stageMcpResources, t as collectResources } from "../resourceCollector-DjZ0FvjL.mjs";
4
4
  import { d as splitDomains, l as normalizeDomainNames, m as toggledDomains, p as toggleOptionDomain, s as domainToggleOptions, t as DOMAIN_COMMAND, u as pickerTitle } from "../domainText-D0iurn8D.mjs";
5
5
  import { listDomainNamesAsync, resolvePluginEntriesAsync } from "@agimon-ai/po-config/domains";
6
6
  import { loadHarnessStateAsync } from "@agimon-ai/po-config/harnessStore";
7
- import { PO_MCP_PROJECTION_RESOLVER_SERVICE } from "@agimon-ai/po-core/mcpProjection";
7
+ import { PO_MCP_PROJECTION_RESOLVER_SERVICE, PO_USER_MCP_CONFIG_FILE } from "@agimon-ai/po-core/mcpProjection";
8
+ import { poHomeDirectory } from "@agimon-ai/po-core/piSettings";
8
9
  import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/serverPlugin";
9
10
  import { composeRootHooks, composeRootInjects, defineResource, defineRoot, defineRoute, defineRoutedContribution } from "@agimon-ai/po-core/extensionFile";
10
11
  import { BACKGROUND_CONTEXT, getOrThrow, nodeHost, removePath, requirePoFs, withAbortSignal } from "@agimon-ai/po-core/platform";
@@ -71,7 +72,8 @@ var root_server_default = defineRoot(async ({ agent, context: root, signal }) =>
71
72
  projection: (await stageMcpResources(execution.repoRoot, plugins, {
72
73
  enabled: true,
73
74
  temporaryDirectory: directory,
74
- mcpAllowlist: await resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io)
75
+ mcpAllowlist: await resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io),
76
+ userMcpConfigPath: `${poHomeDirectory(home, execution.environment)}/${PO_USER_MCP_CONFIG_FILE}`
75
77
  })).mcpProjection,
76
78
  cleanup: () => removePath(fs, directory, BACKGROUND_CONTEXT)
77
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["rootSession","apiRoute","commandDomains","resourceDomains","resourcePoAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/domains/route.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/poAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { listDomainNamesAsync, resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport type { PoHeadlessExecutionContext, PoHeadlessResource } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, getOrThrow, nodeHost, removePath, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\ntype IoContext = Parameters<FileSystem['readTextFile']>[1];\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(\n context: PoHeadlessExecutionContext,\n fs: FileSystem,\n io: IoContext,\n): Promise<PoHeadlessResource[]> {\n const resources: PoHeadlessResource[] = [];\n const home = context.environment.HOME ?? nodeHost.homeDirectory();\n for (const domain of await listDomainNamesAsync(fs, context.repoRoot, io, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = getOrThrow(await fs.createTempDir('po-domain-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, context.repoRoot, [domain], [], io, home),\n );\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: async () => getOrThrow(await fs.readTextFile(skill.path, BACKGROUND_CONTEXT)),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `Po domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await removePath(fs, temporaryDirectory, BACKGROUND_CONTEXT);\n }\n }\n return resources;\n}\n","import { resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport { loadHarnessStateAsync } from '@agimon-ai/po-config/harnessStore';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport {\n PO_MCP_PROJECTION_RESOLVER_SERVICE,\n type PoMcpProjectionResolverService,\n} from '@agimon-ai/po-core/mcpProjection';\nimport {\n BACKGROUND_CONTEXT,\n getOrThrow,\n nodeHost,\n removePath,\n requirePoFs,\n withAbortSignal,\n} from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { resolveMcpAllowlistAsync } from '../../../../services/mcpFilter';\nimport { materializePluginEntries } from '../../../../services/pluginMaterializer';\nimport { stageMcpResources } from '../../../../services/resourceCollector';\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent, context: root, signal }: PoServerPluginContext) => {\n const services: Array<(cordis: Context) => void> = [];\n if (!agent) return { value: { resources: [] } satisfies DomainServerScope, services };\n const fs = requirePoFs(root);\n const io = withAbortSignal(signal, BACKGROUND_CONTEXT);\n const execution = agent.context;\n const home = execution.environment.HOME ?? nodeHost.homeDirectory();\n const resolver: PoMcpProjectionResolverService = {\n async resolve(domains) {\n const { state } = await loadHarnessStateAsync(fs, { ...execution.environment }, io);\n const directory = getOrThrow(await fs.createTempDir('po-domain-mcp-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, execution.repoRoot, [...domains], [...state.pluginDirectories], io, home),\n );\n const staged = await stageMcpResources(execution.repoRoot, plugins, {\n enabled: true,\n temporaryDirectory: directory,\n mcpAllowlist: await resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io),\n });\n return {\n projection: staged.mcpProjection,\n cleanup: () => removePath(fs, directory, BACKGROUND_CONTEXT),\n };\n } catch (error) {\n await removePath(fs, directory, BACKGROUND_CONTEXT);\n throw error;\n }\n },\n };\n services.push((cordis) => {\n cordis.plugin((provider) => {\n provider.provide(PO_MCP_PROJECTION_RESOLVER_SERVICE, resolver);\n });\n });\n return {\n value: { resources: await domainServerResources(agent.context, fs, io) } satisfies DomainServerScope,\n services,\n };\n});\n","import { defineRoute } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoute(({ agent }: PoServerPluginContext) => ({\n basePath: 'domains',\n start: () => ({\n fetch(request: Request) {\n if (new URL(request.url).pathname !== '/current') return Response.json({ error: 'Not found' }, { status: 404 });\n if (request.method !== 'GET')\n return Response.json({ error: 'Method not allowed' }, { status: 405, headers: { Allow: 'GET' } });\n if (!agent) return Response.json({ error: 'Session agent unavailable' }, { status: 404 });\n const selection = agent.context.selection;\n return Response.json({ domains: selection.domains });\n },\n close() {},\n }),\n}));\n","import { listDomainNamesAsync } from '@agimon-ai/po-config/domains';\nimport { type PoHeadlessCommand, type PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\nimport { PO_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/po-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Full-set web replies share the string transport with legacy single-toggle labels. */\nfunction domainSelectionReply(answer: string): string[] | null {\n if (!answer.trimStart().startsWith('{')) return null;\n const reply: unknown = JSON.parse(answer);\n if (\n typeof reply !== 'object' ||\n reply === null ||\n !('kind' in reply) ||\n reply.kind !== DOMAIN_SELECTION_KIND ||\n !('version' in reply) ||\n reply.version !== DOMAIN_SELECTION_VERSION ||\n !('domains' in reply) ||\n !Array.isArray(reply.domains) ||\n !reply.domains.every((name: unknown): name is string => typeof name === 'string')\n ) {\n throw new Error('Invalid domains selection reply');\n }\n return reply.domains;\n}\n\nexport function createDomainServerCommand(host: PoHeadlessHostService, fs: FileSystem): PoHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active Po domains.',\n async execute(args, execution) {\n const available = await listDomainNamesAsync(fs, execution.repoRoot, BACKGROUND_CONTEXT);\n let requested = splitDomains(args);\n let fullSet = false;\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 const domains = domainSelectionReply(selected);\n fullSet = domains !== null;\n requested = domains ?? 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 (fullSet) {\n const wanted = new Set(requested);\n const current = new Set(execution.selection.domains);\n requested = [\n ...execution.selection.domains.filter((name) => wanted.has(name)),\n ...available.filter((name) => wanted.has(name) && !current.has(name)),\n ];\n }\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(PO_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent, context }: PoServerPluginContext) =>\n agent ? createDomainServerCommand(agent, requirePoFs(context)) : undefined,\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'po-author-domain',\n description:\n 'Configure Po plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .po/domains.yaml or ~/.po/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/po-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/domains/route.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourcePoAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/poAuthorDomain.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 serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-domain',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get commands(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourcePoAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":["rootSession","apiRoute","commandDomains","resourceDomains","resourcePoAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/domains/route.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/poAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { listDomainNamesAsync, resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport type { PoHeadlessExecutionContext, PoHeadlessResource } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, getOrThrow, nodeHost, removePath, type FileSystem } from '@agimon-ai/po-core/platform';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\ntype IoContext = Parameters<FileSystem['readTextFile']>[1];\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(\n context: PoHeadlessExecutionContext,\n fs: FileSystem,\n io: IoContext,\n): Promise<PoHeadlessResource[]> {\n const resources: PoHeadlessResource[] = [];\n const home = context.environment.HOME ?? nodeHost.homeDirectory();\n for (const domain of await listDomainNamesAsync(fs, context.repoRoot, io, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = getOrThrow(await fs.createTempDir('po-domain-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, context.repoRoot, [domain], [], io, home),\n );\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: async () => getOrThrow(await fs.readTextFile(skill.path, BACKGROUND_CONTEXT)),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `Po domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await removePath(fs, temporaryDirectory, BACKGROUND_CONTEXT);\n }\n }\n return resources;\n}\n","import { resolvePluginEntriesAsync } from '@agimon-ai/po-config/domains';\nimport { loadHarnessStateAsync } from '@agimon-ai/po-config/harnessStore';\nimport { defineRoot } from '@agimon-ai/po-core/extensionFile';\nimport {\n PO_MCP_PROJECTION_RESOLVER_SERVICE,\n PO_USER_MCP_CONFIG_FILE,\n type PoMcpProjectionResolverService,\n} from '@agimon-ai/po-core/mcpProjection';\nimport { poHomeDirectory } from '@agimon-ai/po-core/piSettings';\nimport {\n BACKGROUND_CONTEXT,\n getOrThrow,\n nodeHost,\n removePath,\n requirePoFs,\n withAbortSignal,\n} from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { resolveMcpAllowlistAsync } from '../../../../services/mcpFilter';\nimport { materializePluginEntries } from '../../../../services/pluginMaterializer';\nimport { stageMcpResources } from '../../../../services/resourceCollector';\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent, context: root, signal }: PoServerPluginContext) => {\n const services: Array<(cordis: Context) => void> = [];\n if (!agent) return { value: { resources: [] } satisfies DomainServerScope, services };\n const fs = requirePoFs(root);\n const io = withAbortSignal(signal, BACKGROUND_CONTEXT);\n const execution = agent.context;\n const home = execution.environment.HOME ?? nodeHost.homeDirectory();\n const resolver: PoMcpProjectionResolverService = {\n async resolve(domains) {\n const { state } = await loadHarnessStateAsync(fs, { ...execution.environment }, io);\n const directory = getOrThrow(await fs.createTempDir('po-domain-mcp-', io));\n try {\n const plugins = await materializePluginEntries(\n await resolvePluginEntriesAsync(fs, execution.repoRoot, [...domains], [...state.pluginDirectories], io, home),\n );\n const staged = await stageMcpResources(execution.repoRoot, plugins, {\n enabled: true,\n temporaryDirectory: directory,\n mcpAllowlist: await resolveMcpAllowlistAsync(fs, execution.repoRoot, [...domains], io),\n userMcpConfigPath: `${poHomeDirectory(home, execution.environment)}/${PO_USER_MCP_CONFIG_FILE}`,\n });\n return {\n projection: staged.mcpProjection,\n cleanup: () => removePath(fs, directory, BACKGROUND_CONTEXT),\n };\n } catch (error) {\n await removePath(fs, directory, BACKGROUND_CONTEXT);\n throw error;\n }\n },\n };\n services.push((cordis) => {\n cordis.plugin((provider) => {\n provider.provide(PO_MCP_PROJECTION_RESOLVER_SERVICE, resolver);\n });\n });\n return {\n value: { resources: await domainServerResources(agent.context, fs, io) } satisfies DomainServerScope,\n services,\n };\n});\n","import { defineRoute } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineRoute(({ agent }: PoServerPluginContext) => ({\n basePath: 'domains',\n start: () => ({\n fetch(request: Request) {\n if (new URL(request.url).pathname !== '/current') return Response.json({ error: 'Not found' }, { status: 404 });\n if (request.method !== 'GET')\n return Response.json({ error: 'Method not allowed' }, { status: 405, headers: { Allow: 'GET' } });\n if (!agent) return Response.json({ error: 'Session agent unavailable' }, { status: 404 });\n const selection = agent.context.selection;\n return Response.json({ domains: selection.domains });\n },\n close() {},\n }),\n}));\n","import { listDomainNamesAsync } from '@agimon-ai/po-config/domains';\nimport { type PoHeadlessCommand, type PoHeadlessHostService } from '@agimon-ai/po-core/headless';\nimport { BACKGROUND_CONTEXT, type FileSystem } from '@agimon-ai/po-core/platform';\nimport { PO_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/po-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nconst DOMAIN_SELECTION_KIND = 'po-domains-selection';\nconst DOMAIN_SELECTION_VERSION = 1;\n\n/** Full-set web replies share the string transport with legacy single-toggle labels. */\nfunction domainSelectionReply(answer: string): string[] | null {\n if (!answer.trimStart().startsWith('{')) return null;\n const reply: unknown = JSON.parse(answer);\n if (\n typeof reply !== 'object' ||\n reply === null ||\n !('kind' in reply) ||\n reply.kind !== DOMAIN_SELECTION_KIND ||\n !('version' in reply) ||\n reply.version !== DOMAIN_SELECTION_VERSION ||\n !('domains' in reply) ||\n !Array.isArray(reply.domains) ||\n !reply.domains.every((name: unknown): name is string => typeof name === 'string')\n ) {\n throw new Error('Invalid domains selection reply');\n }\n return reply.domains;\n}\n\nexport function createDomainServerCommand(host: PoHeadlessHostService, fs: FileSystem): PoHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active Po domains.',\n async execute(args, execution) {\n const available = await listDomainNamesAsync(fs, execution.repoRoot, BACKGROUND_CONTEXT);\n let requested = splitDomains(args);\n let fullSet = false;\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 const domains = domainSelectionReply(selected);\n fullSet = domains !== null;\n requested = domains ?? 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 (fullSet) {\n const wanted = new Set(requested);\n const current = new Set(execution.selection.domains);\n requested = [\n ...execution.selection.domains.filter((name) => wanted.has(name)),\n ...available.filter((name) => wanted.has(name) && !current.has(name)),\n ];\n }\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(PO_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport { requirePoFs } from '@agimon-ai/po-core/platform';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent, context }: PoServerPluginContext) =>\n agent ? createDomainServerCommand(agent, requirePoFs(context)) : undefined,\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/po-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<PoServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineResource({\n name: 'po-author-domain',\n description:\n 'Configure Po plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .po/domains.yaml or ~/.po/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/po-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/domains/route.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourcePoAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/poAuthorDomain.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 serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-domain',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): PoServerSessionPlugin['api'] { return [at(apiRoute, contextSession)]; },\n get commands(): PoServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): PoServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourcePoAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
package/dist/mcp.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { r as JsonObject } from "./resources-COT3OnLs.mjs";
1
+ import { r as JsonObject } from "./resources-BCUqYBIH.mjs";
2
2
  import { DomainMcpAllowlist } from "@agimon-ai/po-config/domains";
3
3
  import { AgentPluginMcpConfigSource, NormalizeAgentPluginMcpOptions, NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource } from "@agimon-ai/po-config/agentPluginMcp";
4
4
  import { PoMcpSessionAllowlist } from "@agimon-ai/po-core/mcpSession";
@@ -5,6 +5,8 @@ let node_fs = require("node:fs");
5
5
  node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
6
6
  let node_path = require("node:path");
7
7
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
8
+ let _agimon_ai_po_config_config = require("@agimon-ai/po-config/config");
9
+ let _agimon_ai_po_core_mcpProjection = require("@agimon-ai/po-core/mcpProjection");
8
10
  let yaml = require("yaml");
9
11
  let _agimon_ai_po_core_piSettings = require("@agimon-ai/po-core/piSettings");
10
12
  let node_crypto = require("node:crypto");
@@ -12,8 +14,6 @@ node_crypto = require_rolldown_runtime.__toESM(node_crypto, 1);
12
14
  let node_os = require("node:os");
13
15
  node_os = require_rolldown_runtime.__toESM(node_os, 1);
14
16
  let _agimon_ai_po_config_agentPluginMcp = require("@agimon-ai/po-config/agentPluginMcp");
15
- let _agimon_ai_po_config_config = require("@agimon-ai/po-config/config");
16
- let _agimon_ai_po_core_mcpProjection = require("@agimon-ai/po-core/mcpProjection");
17
17
  //#region src/services/skillCacheLocation/syncLabel.ts
18
18
  const LABEL_MAX_LENGTH = 48;
19
19
  /** Keeps a repository or worktree name usable as one path segment. */
@@ -157,7 +157,6 @@ const DISPATCHER_TOOLS = [
157
157
  ];
158
158
  const SKILL_MANIFEST_VERSION = 4;
159
159
  const SKILL_MANIFEST_HASH_LENGTH = 16;
160
- const AGENT_PLUGIN_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
161
160
  const PLUGIN_DATA_DIRECTORY = "plugin-data";
162
161
  function isJsonObject(value) {
163
162
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -173,67 +172,6 @@ function canonicalJson(value) {
173
172
  function projectionFingerprint(input) {
174
173
  return (0, node_crypto.createHash)("sha256").update(canonicalJson(input)).digest("hex");
175
174
  }
176
- function stablePluginIdentity(entry) {
177
- const source = entry.source;
178
- const identity = source?.type === "git" ? [
179
- "git",
180
- source.url,
181
- source.path ?? ""
182
- ] : source?.type === "npm" ? [
183
- "npm",
184
- source.registry ?? "",
185
- source.package
186
- ] : ["local", node_fs.default.realpathSync(entry.directory)];
187
- return (0, node_crypto.createHash)("sha256").update(JSON.stringify(identity)).digest("hex");
188
- }
189
- function rootAgentPluginSchema(entry) {
190
- const manifestPath = node_path.default.join(entry.directory, "plugin.json");
191
- if (entry.manifest?.path === manifestPath && entry.manifest.agentPluginSchema === AGENT_PLUGIN_SCHEMA) return AGENT_PLUGIN_SCHEMA;
192
- try {
193
- const stat = node_fs.default.lstatSync(manifestPath);
194
- if (stat.isSymbolicLink() || !stat.isFile()) return void 0;
195
- const parsed = JSON.parse(node_fs.default.readFileSync(manifestPath, "utf8"));
196
- return isJsonObject(parsed) && parsed.$schema === AGENT_PLUGIN_SCHEMA ? AGENT_PLUGIN_SCHEMA : void 0;
197
- } catch {
198
- return;
199
- }
200
- }
201
- async function pluginMcpSource(entry, pluginDataRoot) {
202
- if (entry.mcp === false) return void 0;
203
- const pluginRoot = node_fs.default.realpathSync(entry.directory);
204
- const agentPlugin = rootAgentPluginSchema(entry) === AGENT_PLUGIN_SCHEMA;
205
- const configPath = node_path.default.join(pluginRoot, agentPlugin ? "mcp.json" : ".mcp.json");
206
- let stat;
207
- try {
208
- stat = await node_fs.default.promises.lstat(configPath);
209
- } catch (error) {
210
- if (error.code === "ENOENT") return void 0;
211
- throw error;
212
- }
213
- if (!stat.isFile() || stat.isSymbolicLink()) return void 0;
214
- const content = await node_fs.default.promises.readFile(configPath);
215
- const contentDigest = (0, node_crypto.createHash)("sha256").update(content).digest("hex");
216
- const pluginId = stablePluginIdentity(entry);
217
- const sourceId = `plugin:${pluginId}`;
218
- if (!agentPlugin) return {
219
- sourceId,
220
- owner: "plugin",
221
- format: "native",
222
- configPath,
223
- contentDigest
224
- };
225
- return {
226
- sourceId,
227
- owner: "plugin",
228
- format: "agent-plugin-v1",
229
- configPath,
230
- contentDigest,
231
- pluginId,
232
- pluginRoot,
233
- pluginDataDirectory: node_path.default.join(pluginDataRoot, pluginId),
234
- mcpSchemaUrl: _agimon_ai_po_core_mcpProjection.AGENT_PLUGIN_MCP_SCHEMA_URL
235
- };
236
- }
237
175
  function skillManifestPath(repoRoot, skillRoot, discovery, cacheDirectory) {
238
176
  const key = (0, node_crypto.createHash)("sha256").update(`${node_path.default.resolve(skillRoot)}\0${discovery}`).digest("hex").slice(0, SKILL_MANIFEST_HASH_LENGTH);
239
177
  return node_path.default.join(cacheDirectory ?? resolveSkillCacheDirectory(repoRoot), `${key}.json`);
@@ -598,6 +536,7 @@ async function mergeProjectedMcpConfigs(sources, stagingDirectory) {
598
536
  const merged = { mcpServers: {} };
599
537
  const servers = merged.mcpServers;
600
538
  const origins = /* @__PURE__ */ new Map();
539
+ const userOwned = /* @__PURE__ */ new Set();
601
540
  for (const source of sources) {
602
541
  let config;
603
542
  if (source.format === "agent-plugin-v1") config = (0, _agimon_ai_po_config_agentPluginMcp.normalizeAgentPluginMcpSource)(source, {
@@ -617,9 +556,11 @@ async function mergeProjectedMcpConfigs(sources, stagingDirectory) {
617
556
  const incoming = config.mcpServers ?? {};
618
557
  for (const [name, definition] of Object.entries(incoming)) {
619
558
  const previous = servers[name];
620
- if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) throw new Error(`Conflicting MCP server "${name}": ${origins.get(name)} and ${source.configPath}`);
559
+ if (previous && !userOwned.has(name) && JSON.stringify(previous) !== JSON.stringify(definition)) throw new Error(`Conflicting MCP server "${name}": ${origins.get(name)} and ${source.configPath}`);
621
560
  servers[name] = definition;
622
561
  origins.set(name, source.configPath);
562
+ if (source.owner === "user") userOwned.add(name);
563
+ else userOwned.delete(name);
623
564
  }
624
565
  }
625
566
  return merged;
@@ -645,6 +586,16 @@ async function stageMcpResources(repoRoot, plugins, options) {
645
586
  recursive: true
646
587
  });
647
588
  await node_fs.default.promises.chmod(options.temporaryDirectory, 448);
589
+ if (options.enabled && options.userMcpConfigPath && await pathExists(options.userMcpConfigPath)) {
590
+ const content = await node_fs.default.promises.readFile(options.userMcpConfigPath);
591
+ mcpSources.push({
592
+ sourceId: "user:mcp.json",
593
+ owner: "user",
594
+ format: "native",
595
+ configPath: options.userMcpConfigPath,
596
+ contentDigest: (0, node_crypto.createHash)("sha256").update(content).digest("hex")
597
+ });
598
+ }
648
599
  if (options.enabled && await pathExists(repositoryMcpPath)) {
649
600
  const content = await node_fs.default.promises.readFile(repositoryMcpPath);
650
601
  mcpSources.push({
@@ -656,7 +607,7 @@ async function stageMcpResources(repoRoot, plugins, options) {
656
607
  });
657
608
  }
658
609
  if (options.enabled) for (const entry of pluginEntries) {
659
- const source = await pluginMcpSource(entry, pluginDataRoot);
610
+ const source = await (0, _agimon_ai_po_config_agentPluginMcp.pluginMcpSource)(entry, pluginDataRoot);
660
611
  if (!source) continue;
661
612
  mcpSources.push(source);
662
613
  pluginMcpSources.push(source);
@@ -756,7 +707,8 @@ async function collectResources(repoRoot, plugins, options) {
756
707
  enabled: options.mcp,
757
708
  temporaryDirectory,
758
709
  ...options.mcpAllowlist ? { mcpAllowlist: options.mcpAllowlist } : {},
759
- ...options.pluginDataRoot ? { pluginDataRoot: options.pluginDataRoot } : {}
710
+ ...options.pluginDataRoot ? { pluginDataRoot: options.pluginDataRoot } : {},
711
+ ...options.userMcpConfigPath ? { userMcpConfigPath: options.userMcpConfigPath } : {}
760
712
  });
761
713
  return {
762
714
  temporaryDirectory,
@@ -838,4 +790,4 @@ Object.defineProperty(exports, "stageMcpResources", {
838
790
  }
839
791
  });
840
792
 
841
- //# sourceMappingURL=resourceCollector-YOEwhNIR.cjs.map
793
+ //# sourceMappingURL=resourceCollector-DRvsbqfZ.cjs.map