@agimon-ai/doompi-domain 0.0.1-alpha.67 → 0.0.1-alpha.69

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.
@@ -3,14 +3,17 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_rolldown_runtime = require("../rolldown-runtime-C0BPl7ul.cjs");
6
+ const require_mcpFilter = require("../mcpFilter-CsTk699I.cjs");
6
7
  const require_pluginMaterializer = require("../pluginMaterializer-D4xOC_Oc.cjs");
7
8
  const require_resourceCollector = require("../resourceCollector-Bj_pmQ4Q.cjs");
8
9
  const require_domainText = require("../domainText-DOsRzOiP.cjs");
9
10
  let node_path = require("node:path");
10
11
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
11
12
  let _agimon_ai_doompi_config_domains = require("@agimon-ai/doompi-config/domains");
13
+ let _agimon_ai_doompi_config_harnessStore = require("@agimon-ai/doompi-config/harnessStore");
12
14
  let node_os = require("node:os");
13
15
  node_os = require_rolldown_runtime.__toESM(node_os, 1);
16
+ let _agimon_ai_doompi_core_mcpProjection = require("@agimon-ai/doompi-core/mcpProjection");
14
17
  let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
15
18
  let _agimon_ai_doompi_core_skills = require("@agimon-ai/doompi-core/skills");
16
19
  let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
@@ -61,7 +64,46 @@ async function domainServerResources(context) {
61
64
  }
62
65
  //#endregion
63
66
  //#region src/extensions/workspaces/sessions/(backend)/root.server.ts
64
- var root_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(async ({ agent }) => ({ value: { resources: agent ? await domainServerResources(agent.context) : [] } }));
67
+ var root_server_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(async ({ agent }) => {
68
+ const services = [];
69
+ if (agent) {
70
+ const execution = agent.context;
71
+ const home = execution.environment.HOME ?? node_os.default.homedir();
72
+ const resolver = { async resolve(domains) {
73
+ const { state } = (0, _agimon_ai_doompi_config_harnessStore.loadHarnessState)({ ...execution.environment });
74
+ const directory = await (0, node_fs_promises.mkdtemp)(node_path.default.join(node_os.default.tmpdir(), "doom-domain-mcp-"));
75
+ try {
76
+ const plugins = await require_pluginMaterializer.materializePluginEntries((0, _agimon_ai_doompi_config_domains.resolvePluginEntries)(execution.repoRoot, [...domains], [...state.pluginDirectories], home));
77
+ return {
78
+ projection: (await require_resourceCollector.stageMcpResources(execution.repoRoot, plugins, {
79
+ enabled: true,
80
+ temporaryDirectory: directory,
81
+ mcpAllowlist: require_mcpFilter.resolveMcpAllowlist(execution.repoRoot, [...domains])
82
+ })).mcpProjection,
83
+ cleanup: () => (0, node_fs_promises.rm)(directory, {
84
+ recursive: true,
85
+ force: true
86
+ })
87
+ };
88
+ } catch (error) {
89
+ await (0, node_fs_promises.rm)(directory, {
90
+ recursive: true,
91
+ force: true
92
+ });
93
+ throw error;
94
+ }
95
+ } };
96
+ services.push((cordis) => {
97
+ cordis.plugin((provider) => {
98
+ provider.provide(_agimon_ai_doompi_core_mcpProjection.DOOM_MCP_PROJECTION_RESOLVER_SERVICE, resolver);
99
+ });
100
+ });
101
+ }
102
+ return {
103
+ value: { resources: agent ? await domainServerResources(agent.context) : [] },
104
+ services
105
+ };
106
+ });
65
107
  //#endregion
66
108
  //#region src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts
67
109
  function createDomainServerCommand(host) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["os","listDomainNames","mkdtemp","path","materializePluginEntries","resolvePluginEntries","collectResources","readFile","rm","defineRoot","DOMAIN_COMMAND","listDomainNames","splitDomains","pickerTitle","domainToggleOptions","toggledDomains","toggleOptionDomain","normalizeDomainNames","DOOM_RESOURCE_CATALOG_ENTRY_TYPE","defineRoutedContribution","defineRoutedContribution","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","rootSession","composeRootHooks","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-'));\n try {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n temporaryDirectory,\n });\n for (const skill of collected.skillSources) {\n resources.push({\n name: skill.name,\n description: skill.description,\n path: skill.path,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => readFile(skill.path, 'utf8'),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `DoomPi domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n return resources;\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent }: DoomServerPluginContext) => ({\n value: {\n resources: agent ? await domainServerResources(agent.context) : [],\n } satisfies DomainServerScope,\n}));\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/doompi-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n // The web composer caches get_commands for `$` completion. Signal only after\n // the headless host has reconciled commands so the re-read sees this selection.\n const projection: ResourceCatalogProjection = { version: 1, revision: Date.now() };\n await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","names":["os","listDomainNames","mkdtemp","path","materializePluginEntries","resolvePluginEntries","collectResources","readFile","rm","defineRoot","os","loadHarnessState","mkdtemp","path","materializePluginEntries","resolvePluginEntries","stageMcpResources","resolveMcpAllowlist","rm","DOOM_MCP_PROJECTION_RESOLVER_SERVICE","DOMAIN_COMMAND","listDomainNames","splitDomains","pickerTitle","domainToggleOptions","toggledDomains","toggleOptionDomain","normalizeDomainNames","DOOM_RESOURCE_CATALOG_ENTRY_TYPE","defineRoutedContribution","defineRoutedContribution","defineResource","packageResourcePath","readPackageResource","defineServerPlugin","rootSession","composeRootHooks","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-'));\n try {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n temporaryDirectory,\n });\n for (const skill of collected.skillSources) {\n resources.push({\n name: skill.name,\n description: skill.description,\n path: skill.path,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => readFile(skill.path, 'utf8'),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `DoomPi domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n return resources;\n}\n","import { mkdtemp, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport { loadHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport {\n DOOM_MCP_PROJECTION_RESOLVER_SERVICE,\n type DoomMcpProjectionResolverService,\n} from '@agimon-ai/doompi-core/mcpProjection';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { resolveMcpAllowlist } 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 }: DoomServerPluginContext) => {\n const services: Array<(cordis: Context) => void> = [];\n if (agent) {\n const execution = agent.context;\n const home = execution.environment.HOME ?? os.homedir();\n const resolver: DoomMcpProjectionResolverService = {\n async resolve(domains) {\n const { state } = loadHarnessState({ ...execution.environment });\n const directory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-mcp-'));\n try {\n const plugins = await materializePluginEntries(\n resolvePluginEntries(execution.repoRoot, [...domains], [...state.pluginDirectories], home),\n );\n const staged = await stageMcpResources(execution.repoRoot, plugins, {\n enabled: true,\n temporaryDirectory: directory,\n mcpAllowlist: resolveMcpAllowlist(execution.repoRoot, [...domains]),\n });\n return {\n projection: staged.mcpProjection,\n cleanup: () => rm(directory, { recursive: true, force: true }),\n };\n } catch (error) {\n await rm(directory, { recursive: true, force: true });\n throw error;\n }\n },\n };\n services.push((cordis) => {\n cordis.plugin((provider) => {\n provider.provide(DOOM_MCP_PROJECTION_RESOLVER_SERVICE, resolver);\n });\n });\n }\n return {\n value: { resources: agent ? await domainServerResources(agent.context) : [] } satisfies DomainServerScope,\n services,\n };\n});\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/doompi-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n // The web composer caches get_commands for `$` completion. Signal only after\n // the headless host has reconciled commands so the re-read sees this selection.\n const projection: ResourceCatalogProjection = { version: 1, revision: Date.now() };\n await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
@@ -1,9 +1,12 @@
1
+ import { o as resolveMcpAllowlist } from "../mcpFilter-ChoM_vWa.mjs";
1
2
  import { t as materializePluginEntries } from "../pluginMaterializer-D9qFOmKW.mjs";
2
- import { r as collectResources } from "../resourceCollector-D4b4QO6b.mjs";
3
+ import { c as stageMcpResources, r as collectResources } from "../resourceCollector-D4b4QO6b.mjs";
3
4
  import { c as domainToggleOptions, d as pickerTitle, f as splitDomains, h as toggledDomains, m as toggleOptionDomain, t as DOMAIN_COMMAND, u as normalizeDomainNames } from "../domainText-edEmt_4b.mjs";
4
5
  import path from "node:path";
5
6
  import { listDomainNames, resolvePluginEntries } from "@agimon-ai/doompi-config/domains";
7
+ import { loadHarnessState } from "@agimon-ai/doompi-config/harnessStore";
6
8
  import os from "node:os";
9
+ import { DOOM_MCP_PROJECTION_RESOLVER_SERVICE } from "@agimon-ai/doompi-core/mcpProjection";
7
10
  import { composeRootHooks, defineResource, defineRoot, defineRoutedContribution } from "@agimon-ai/doompi-core/extensionFile";
8
11
  import { DOOM_RESOURCE_CATALOG_ENTRY_TYPE } from "@agimon-ai/doompi-core/skills";
9
12
  import { defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/doompi-core/serverFacet";
@@ -54,7 +57,46 @@ async function domainServerResources(context) {
54
57
  }
55
58
  //#endregion
56
59
  //#region src/extensions/workspaces/sessions/(backend)/root.server.ts
57
- var root_server_default = defineRoot(async ({ agent }) => ({ value: { resources: agent ? await domainServerResources(agent.context) : [] } }));
60
+ var root_server_default = defineRoot(async ({ agent }) => {
61
+ const services = [];
62
+ if (agent) {
63
+ const execution = agent.context;
64
+ const home = execution.environment.HOME ?? os.homedir();
65
+ const resolver = { async resolve(domains) {
66
+ const { state } = loadHarnessState({ ...execution.environment });
67
+ const directory = await mkdtemp(path.join(os.tmpdir(), "doom-domain-mcp-"));
68
+ try {
69
+ const plugins = await materializePluginEntries(resolvePluginEntries(execution.repoRoot, [...domains], [...state.pluginDirectories], home));
70
+ return {
71
+ projection: (await stageMcpResources(execution.repoRoot, plugins, {
72
+ enabled: true,
73
+ temporaryDirectory: directory,
74
+ mcpAllowlist: resolveMcpAllowlist(execution.repoRoot, [...domains])
75
+ })).mcpProjection,
76
+ cleanup: () => rm(directory, {
77
+ recursive: true,
78
+ force: true
79
+ })
80
+ };
81
+ } catch (error) {
82
+ await rm(directory, {
83
+ recursive: true,
84
+ force: true
85
+ });
86
+ throw error;
87
+ }
88
+ } };
89
+ services.push((cordis) => {
90
+ cordis.plugin((provider) => {
91
+ provider.provide(DOOM_MCP_PROJECTION_RESOLVER_SERVICE, resolver);
92
+ });
93
+ });
94
+ }
95
+ return {
96
+ value: { resources: agent ? await domainServerResources(agent.context) : [] },
97
+ services
98
+ };
99
+ });
58
100
  //#endregion
59
101
  //#region src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts
60
102
  function createDomainServerCommand(host) {
@@ -1 +1 @@
1
- {"version":3,"file":"server.mjs","names":["rootSession","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-'));\n try {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n temporaryDirectory,\n });\n for (const skill of collected.skillSources) {\n resources.push({\n name: skill.name,\n description: skill.description,\n path: skill.path,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => readFile(skill.path, 'utf8'),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `DoomPi domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n return resources;\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { domainServerResources } from './_lib/domainServerResources';\nimport type { DomainServerScope } from './_lib/serverScope';\n\nexport default defineRoot(async ({ agent }: DoomServerPluginContext) => ({\n value: {\n resources: agent ? await domainServerResources(agent.context) : [],\n } satisfies DomainServerScope,\n}));\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/doompi-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n // The web composer caches get_commands for `$` completion. Signal only after\n // the headless host has reconciled commands so the re-read sees this selection.\n const projection: ResourceCatalogProjection = { version: 1, revision: Date.now() };\n await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.mjs","names":["rootSession","commandDomains","resourceDomains","resourceDoompiAuthorDomain"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerResources.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/domainServerCommand.ts","../../src/extensions/workspaces/sessions/(backend)/command/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/domains.server.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server.ts","../../generated/server.ts"],"sourcesContent":["import { mkdtemp, readFile, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport type { DoomHeadlessExecutionContext, DoomHeadlessResource } from '@agimon-ai/doompi-core/headless';\n\nimport { materializePluginEntries } from '../../../../../services/pluginMaterializer';\nimport { collectResources } from '../../../../../services/resourceCollector';\n\n/** Retain valid domains behind selection conditions; a broken neighbor must not prevent startup. */\nexport async function domainServerResources(context: DoomHeadlessExecutionContext): Promise<DoomHeadlessResource[]> {\n const resources: DoomHeadlessResource[] = [];\n const home = context.environment.HOME ?? os.homedir();\n for (const domain of listDomainNames(context.repoRoot, home)) {\n // Own staging here so collection failures also release their temporary files.\n const temporaryDirectory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-'));\n try {\n const plugins = await materializePluginEntries(resolvePluginEntries(context.repoRoot, [domain], [], home));\n const collected = await collectResources(context.repoRoot, plugins, {\n agents: false,\n mcp: false,\n sharedSkills: false,\n temporaryDirectory,\n });\n for (const skill of collected.skillSources) {\n resources.push({\n name: skill.name,\n description: skill.description,\n path: skill.path,\n kind: 'skill',\n when: { domain, attribution: { kind: 'domain', mode: domain } },\n read: () => readFile(skill.path, 'utf8'),\n });\n }\n } catch (error) {\n await context.client.notify({\n title: `DoomPi domain ${domain} unavailable`,\n body: error instanceof Error ? error.message : String(error),\n level: 'warning',\n });\n } finally {\n await rm(temporaryDirectory, { recursive: true, force: true });\n }\n }\n return resources;\n}\n","import { mkdtemp, rm } from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport { loadHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport {\n DOOM_MCP_PROJECTION_RESOLVER_SERVICE,\n type DoomMcpProjectionResolverService,\n} from '@agimon-ai/doompi-core/mcpProjection';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { resolveMcpAllowlist } 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 }: DoomServerPluginContext) => {\n const services: Array<(cordis: Context) => void> = [];\n if (agent) {\n const execution = agent.context;\n const home = execution.environment.HOME ?? os.homedir();\n const resolver: DoomMcpProjectionResolverService = {\n async resolve(domains) {\n const { state } = loadHarnessState({ ...execution.environment });\n const directory = await mkdtemp(path.join(os.tmpdir(), 'doom-domain-mcp-'));\n try {\n const plugins = await materializePluginEntries(\n resolvePluginEntries(execution.repoRoot, [...domains], [...state.pluginDirectories], home),\n );\n const staged = await stageMcpResources(execution.repoRoot, plugins, {\n enabled: true,\n temporaryDirectory: directory,\n mcpAllowlist: resolveMcpAllowlist(execution.repoRoot, [...domains]),\n });\n return {\n projection: staged.mcpProjection,\n cleanup: () => rm(directory, { recursive: true, force: true }),\n };\n } catch (error) {\n await rm(directory, { recursive: true, force: true });\n throw error;\n }\n },\n };\n services.push((cordis) => {\n cordis.plugin((provider) => {\n provider.provide(DOOM_MCP_PROJECTION_RESOLVER_SERVICE, resolver);\n });\n });\n }\n return {\n value: { resources: agent ? await domainServerResources(agent.context) : [] } satisfies DomainServerScope,\n services,\n };\n});\n","import { listDomainNames } from '@agimon-ai/doompi-config/domains';\nimport { type DoomHeadlessCommand, type DoomHeadlessHostService } from '@agimon-ai/doompi-core/headless';\nimport { DOOM_RESOURCE_CATALOG_ENTRY_TYPE, type ResourceCatalogProjection } from '@agimon-ai/doompi-core/skills';\n\nimport {\n DOMAIN_COMMAND,\n domainToggleOptions,\n normalizeDomainNames,\n pickerTitle,\n splitDomains,\n toggledDomains,\n toggleOptionDomain,\n} from '../../../../../services/domainText';\n\nexport function createDomainServerCommand(host: DoomHeadlessHostService): DoomHeadlessCommand {\n return {\n name: DOMAIN_COMMAND,\n description: 'Show or change the active DoomPi domains.',\n async execute(args, execution) {\n const available = listDomainNames(execution.repoRoot);\n let requested = splitDomains(args);\n if (requested.length === 0) {\n const listing = {\n active: [...execution.selection.domains],\n effective: [...execution.selection.domains],\n available,\n };\n const selected = await execution.client.request({\n kind: 'select',\n title: pickerTitle(listing),\n options: domainToggleOptions(listing).map((label) => ({ label, value: label })),\n });\n if (typeof selected !== 'string' || !selected) return;\n requested = toggledDomains(listing.effective, toggleOptionDomain(selected));\n }\n requested = normalizeDomainNames(requested);\n const unknown = requested.filter((name) => !available.includes(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n if (\n requested.length === execution.selection.domains.length &&\n requested.every((name, index) => name === execution.selection.domains[index])\n ) {\n return;\n }\n await host.changeSelection({ axis: 'domains', domains: requested });\n // The web composer caches get_commands for `$` completion. Signal only after\n // the headless host has reconciled commands so the re-read sees this selection.\n const projection: ResourceCatalogProjection = { version: 1, revision: Date.now() };\n await execution.session.appendCustomEntry(DOOM_RESOURCE_CATALOG_ENTRY_TYPE, projection);\n },\n };\n}\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createDomainServerCommand } from '../_lib/domainServerCommand';\nexport default defineRoutedContribution(\n ({ agent }: DoomServerPluginContext) => (agent ? createDomainServerCommand(agent) : undefined),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { DoomServerPluginContext } from '@agimon-ai/doompi-core/serverFacet';\n\nimport type { DomainServerScope } from '../_lib/serverScope';\n\nexport default defineRoutedContribution(\n (context: WithRoot<DoomServerPluginContext, DomainServerScope>) => context.root.resources,\n { cardinality: 'many' },\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineResource({\n name: 'doompi-author-domain',\n description:\n 'Configure DoomPi plugin catalogs and domain resource selections in domains.yaml. Use when creating or editing .doom/domains.yaml or ~/.pi/.doom/domains.yaml, choosing local, Git, or npm plugins, filtering plugin resources, setting aliases or defaults, or verifying resolved domain composition.',\n when: { state: { 'minor-mode': 'help' }, attribution: { kind: 'minor' as const, mode: 'help' } },\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-domain/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport commandDomains from '../src/extensions/workspaces/sessions/(backend)/command/domains.server';\nimport resourceDomains from '../src/extensions/workspaces/sessions/(backend)/resource/domains.server';\nimport resourceDoompiAuthorDomain from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorDomain.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\ntype ManyFactory<T, C> = (context: C) => T | readonly T[];\nconst many = <T, C>(value: T | readonly T[] | ManyFactory<T, C>, context: C): readonly T[] => {\n const resolved = typeof value === 'function' ? (value as ManyFactory<T, C>)(context) : value;\n return Array.isArray(resolved) ? resolved : [resolved as T];\n};\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-domain',\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'domains' }, at(commandDomains, contextSession))]); },\n get resources(): DoomServerSessionPlugin['resources'] { return [...many(resourceDomains, contextSession), at(resourceDoompiAuthorDomain, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-domain",
3
- "version": "0.0.1-alpha.67",
3
+ "version": "0.0.1-alpha.69",
4
4
  "description": "Domain selection, resource staging, and MCP scoping for DoomPi sessions.",
5
5
  "keywords": [
6
6
  "ai",
@@ -90,19 +90,19 @@
90
90
  "access": "public"
91
91
  },
92
92
  "dependencies": {
93
- "@agimon-ai/doompi-config": "0.0.1-alpha.88",
94
- "@agimon-ai/doompi-core": "0.0.1-alpha.89",
95
- "@agimon-ai/doompi-minor-mode": "0.0.1-alpha.89",
93
+ "@agimon-ai/doompi-config": "0.0.1-alpha.90",
94
+ "@agimon-ai/doompi-core": "0.0.1-alpha.91",
95
+ "@agimon-ai/doompi-minor-mode": "0.0.1-alpha.91",
96
96
  "@agimon-ai/doompi-telemetry": "0.0.1-alpha.83",
97
- "@agimon-ai/doompi-ui": "0.0.1-alpha.89",
97
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.91",
98
98
  "@deepseek-ai/cordis": "4.0.2",
99
99
  "typebox": "1.3.34",
100
100
  "yaml": "2.9.1"
101
101
  },
102
102
  "devDependencies": {
103
103
  "@agimon-ai/doompi-build": "0.0.1-alpha.15",
104
- "@agimon-ai/doompi-core": "0.0.1-alpha.89",
105
- "@agimon-ai/doompi-voice": "0.0.1-alpha.90",
104
+ "@agimon-ai/doompi-core": "0.0.1-alpha.91",
105
+ "@agimon-ai/doompi-voice": "0.0.1-alpha.92",
106
106
  "@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.81",
107
107
  "@deepseek-ai/cordis": "4.0.2",
108
108
  "@earendil-works/pi-coding-agent": "0.87.1",
@@ -114,7 +114,7 @@
114
114
  "vitest": "5.0.1"
115
115
  },
116
116
  "peerDependencies": {
117
- "@agimon-ai/doompi-core": "0.0.1-alpha.89",
117
+ "@agimon-ai/doompi-core": "0.0.1-alpha.91",
118
118
  "@earendil-works/pi-coding-agent": "0.87.1",
119
119
  "@earendil-works/pi-tui": "0.87.1"
120
120
  },