@agimon-ai/doompi-config 0.0.1-alpha.45 → 0.0.1-alpha.48
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/adapters/domains.cjs +1 -1
- package/dist/adapters/domains.cjs.map +1 -1
- package/dist/adapters/domains.d.cts.map +1 -1
- package/dist/adapters/domains.d.mts.map +1 -1
- package/dist/adapters/domains.mjs +1 -1
- package/dist/adapters/domains.mjs.map +1 -1
- package/dist/adapters/harnessState.cjs +1 -1
- package/dist/adapters/harnessState.cjs.map +1 -1
- package/dist/adapters/harnessState.d.cts.map +1 -1
- package/dist/adapters/harnessState.d.mts.map +1 -1
- package/dist/adapters/harnessState.mjs +1 -1
- package/dist/adapters/harnessState.mjs.map +1 -1
- package/dist/adapters/piConfig.cjs +1 -1
- package/dist/adapters/piConfig.cjs.map +1 -1
- package/dist/adapters/piConfig.d.cts.map +1 -1
- package/dist/adapters/piConfig.d.mts.map +1 -1
- package/dist/adapters/piConfig.mjs +1 -1
- package/dist/adapters/piConfig.mjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/types/config.d.cts +21 -1
- package/dist/types/config.d.cts.map +1 -1
- package/dist/types/config.d.mts +21 -1
- package/dist/types/config.d.mts.map +1 -1
- package/dist/types/domains.d.cts +2 -0
- package/dist/types/domains.d.cts.map +1 -1
- package/dist/types/domains.d.mts +2 -0
- package/dist/types/domains.d.mts.map +1 -1
- package/dist/types.d.cts +2 -2
- package/dist/types.d.mts +2 -2
- package/package.json +3 -3
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./config.cjs"),n=require("../services/domains.cjs"),r=require("./layeredConfig.cjs"),i=require("./pluginCatalog.cjs");let a=require("node:fs");a=e.__toESM(a,1);let o=require("node:path");o=e.__toESM(o,1);let s=require("node:os");s=e.__toESM(s,1);const c=`Plugin directory does not exist`,l=`.doom/domains.yaml`;function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e,t){if(!u(e))throw Error(`${t} must be an object`);return e}function f(e,t,n){let r=Object.keys(e).filter(e=>!t.includes(e));if(r.length>0)throw Error(`${n} contains unsupported field "${r[0]}"`)}function p(e,t){if(typeof e!=`string`||!e.trim())throw Error(`${t} must be a non-empty string`);return e.trim()}function m(e,t){if(e!==void 0)return p(e,t)}function h(e,t){if(!Array.isArray(e))throw Error(`${t} must be an array of non-empty strings`);return[...new Set(e.map((e,n)=>p(e,`${t}[${n}]`)))]}function g(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`${t} must be a boolean`);return e}}function _(e){return h(e,`defaultDomains in ${l}`)}function v(e,t){if(typeof e==`string`)return p(e,t);let n=d(e,t);f(n,[`name`,`skills`,`agents`,`hooks`,`mcp`],t);let r=n.skills===void 0?void 0:h(n.skills,`${t}.skills`),i=n.agents===void 0?void 0:h(n.agents,`${t}.agents`),a=g(n.hooks,`${t}.hooks`),o=g(n.mcp,`${t}.mcp`);return{name:p(n.name,`${t}.name`),...r?{skills:r}:{},...i?{agents:i}:{},...a===void 0?{}:{hooks:a},...o===void 0?{}:{mcp:o}}}function y(e,t){let n=d(e,t);return f(n,[`servers`,`proxy`],t),{...n.servers===void 0?{}:{servers:h(n.servers,`${t}.servers`)},...n.proxy===void 0?{}:{proxy:h(n.proxy,`${t}.proxy`)}}}function b(e,t){let n=d(e,t);f(n,[`description`,`plugins`,`mcp`,`sharedSkills`],t);let r=m(n.description,`${t}.description`);if(n.plugins!==void 0&&!Array.isArray(n.plugins))throw Error(`${t}.plugins must be an array`);let i=g(n.sharedSkills,`${t}.sharedSkills`);return{...r?{description:r}:{},...Array.isArray(n.plugins)?{plugins:n.plugins.map((e,n)=>v(e,`${t}.plugins[${n}]`))}:{},...n.mcp===void 0?{}:{mcp:y(n.mcp,`${t}.mcp`)},...i===void 0?{}:{sharedSkills:i}}}function x(e,t){if(e===void 0)return{};let n=d(e,t);return Object.fromEntries(Object.entries(n).map(([e,n])=>[e,h(n,`${t}.${e}`)]))}function S(e,t=s.default.homedir()){let a=r.readDoomConfigSources(`domains.yaml`,e,t),o={},c={},u;for(let e of a){let t=d(e.document,e.filePath);if(f(t,[`plugins`,`domains`,`aliases`,`defaultDomains`],e.filePath),Object.assign(o,x(t.aliases,`aliases in ${e.filePath}`)),t.domains!==void 0){let n=d(t.domains,`domains in ${e.filePath}`);for(let[t,r]of Object.entries(n))c[t]={...b(r,`domains.${t} in ${e.filePath}`),baseDirectory:e.baseDirectory}}Object.hasOwn(t,`defaultDomains`)&&(u=_(t.defaultDomains))}let p=i.loadPluginCatalog(a.map(e=>({filePath:e.filePath,baseDirectory:e.baseDirectory,value:d(e.document,e.filePath).plugins})),e,t);if(u){for(let e of n.expandDomainNames({plugins:p,domains:c,aliases:o},u))if(!Object.hasOwn(c,e))throw Error(`Unknown default domain "${e}" in ${l}`)}return{plugins:p,domains:c,aliases:o,...u?{defaultDomains:u}:{}}}function C(e,t){let n=S(e,t);return[...new Set([...Object.keys(n.domains),...Object.keys(n.aliases)])].sort()}function w(e,t,r){let i=S(e,r),a=n.expandDomainNames(i,t);return a.length===0||a.some(e=>i.domains[e]?.sharedSkills!==!1)}function T(e,r,l,u=s.default.homedir()){let d=S(e,u),f=[],p=new Set,m=t.globalDoomConfigDirectory(u);for(let e of n.expandDomainNames(d,r)){let t=d.domains[e];if(!t)throw Error(`Unknown domain: ${e}`);for(let n of t.plugins??[]){let t=typeof n!=`string`,r=t?n.name:n,o=d.plugins.entries[r];if(!o)throw Error(`Unknown plugin "${r}" referenced by domain "${e}"`);let s=i.pluginDirectoryForSource(o.source,m);if(o.source.type===`local`&&(!a.default.existsSync(s)||!a.default.statSync(s).isDirectory()))throw Error(`${c}: ${s}`);p.has(s)||(p.add(s),f.push({name:r,directory:s,source:o.source,...o.manifest?{manifest:o.manifest}:{},...o.manifest?.agentPluginSchema===`https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`?{skillDiscovery:`direct-children`}:{},...t&&n.skills?{skills:n.skills}:{},...t&&n.agents?{agents:n.agents}:{},...t&&n.hooks!==void 0?{hooks:n.hooks}:{},...t&&n.mcp!==void 0?{mcp:n.mcp}:{}}))}}for(let e of l){let t=o.default.resolve(e);if(!a.default.existsSync(t)||!a.default.statSync(t).isDirectory())throw Error(`${c}: ${t}`);p.has(t)||(p.add(t),f.push({name:o.default.basename(t),directory:t,source:{type:`local`,path:t}}))}return f}function E(e,t,n,r){return T(e,t,n,r).map(e=>e.directory)}const D=`DOOMPI_DOMAINS`,O=`default`,k=`marketing`;function A(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function j(e,t,n){let r=t[D];return r===void 0?n===void 0?A(e===k?k:O):[...n]:A(r)}exports.DEFAULT_DOMAIN=O,exports.DOOMPI_DOMAINS_ENV=D,exports.DOOM_DIR=r.DOOM_DIR,exports.defaultDomainsForMajorMode=j,exports.listDomainNames=C,exports.loadDomains=S,exports.resolvePluginDirectories=E,exports.resolvePluginEntries=T,exports.resolveSharedSkills=w;
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("./config.cjs"),n=require("../services/domains.cjs"),r=require("./layeredConfig.cjs"),i=require("./pluginCatalog.cjs");let a=require("node:fs");a=e.__toESM(a,1);let o=require("node:path");o=e.__toESM(o,1);let s=require("node:os");s=e.__toESM(s,1);const c=`Plugin directory does not exist`,l=`.doom/domains.yaml`;function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e,t){if(!u(e))throw Error(`${t} must be an object`);return e}function f(e,t,n){let r=Object.keys(e).filter(e=>!t.includes(e));if(r.length>0)throw Error(`${n} contains unsupported field "${r[0]}"`)}function p(e,t){if(typeof e!=`string`||!e.trim())throw Error(`${t} must be a non-empty string`);return e.trim()}function m(e,t){if(e!==void 0)return p(e,t)}function h(e,t){if(!Array.isArray(e))throw Error(`${t} must be an array of non-empty strings`);return[...new Set(e.map((e,n)=>p(e,`${t}[${n}]`)))]}function g(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`${t} must be a boolean`);return e}}function _(e){return h(e,`defaultDomains in ${l}`)}function v(e,t){if(typeof e==`string`)return p(e,t);let n=d(e,t);f(n,[`name`,`skills`,`agents`,`hooks`,`mcp`],t);let r=n.skills===void 0?void 0:h(n.skills,`${t}.skills`),i=n.agents===void 0?void 0:h(n.agents,`${t}.agents`),a=g(n.hooks,`${t}.hooks`),o=g(n.mcp,`${t}.mcp`);return{name:p(n.name,`${t}.name`),...r?{skills:r}:{},...i?{agents:i}:{},...a===void 0?{}:{hooks:a},...o===void 0?{}:{mcp:o}}}function y(e,t){let n=d(e,t);return f(n,[`servers`,`proxy`],t),{...n.servers===void 0?{}:{servers:h(n.servers,`${t}.servers`)},...n.proxy===void 0?{}:{proxy:h(n.proxy,`${t}.proxy`)}}}function b(e,t){let n=d(e,t);f(n,[`description`,`plugins`,`mcp`,`sharedSkills`],t);let r=m(n.description,`${t}.description`);if(n.plugins!==void 0&&!Array.isArray(n.plugins))throw Error(`${t}.plugins must be an array`);let i=g(n.sharedSkills,`${t}.sharedSkills`);return{...r?{description:r}:{},...Array.isArray(n.plugins)?{plugins:n.plugins.map((e,n)=>v(e,`${t}.plugins[${n}]`))}:{},...n.mcp===void 0?{}:{mcp:y(n.mcp,`${t}.mcp`)},...i===void 0?{}:{sharedSkills:i}}}function x(e,t){if(e===void 0)return{};let n=d(e,t);return Object.fromEntries(Object.entries(n).map(([e,n])=>[e,h(n,`${t}.${e}`)]))}function S(e,t=s.default.homedir()){let a=r.readDoomConfigSources(`domains.yaml`,e,t),o={},c={},u;for(let e of a){let t=d(e.document,e.filePath);if(f(t,[`plugins`,`domains`,`aliases`,`defaultDomains`],e.filePath),Object.assign(o,x(t.aliases,`aliases in ${e.filePath}`)),t.domains!==void 0){let n=d(t.domains,`domains in ${e.filePath}`);for(let[t,r]of Object.entries(n))c[t]={...b(r,`domains.${t} in ${e.filePath}`),baseDirectory:e.baseDirectory}}Object.hasOwn(t,`defaultDomains`)&&(u=_(t.defaultDomains))}let p=i.loadPluginCatalog(a.map(e=>({filePath:e.filePath,baseDirectory:e.baseDirectory,value:d(e.document,e.filePath).plugins})),e,t);if(u){for(let e of n.expandDomainNames({plugins:p,domains:c,aliases:o},u))if(!Object.hasOwn(c,e))throw Error(`Unknown default domain "${e}" in ${l}`)}return{plugins:p,domains:c,aliases:o,...u?{defaultDomains:u}:{}}}function C(e,t){let n=S(e,t);return[...new Set([...Object.keys(n.domains),...Object.keys(n.aliases)])].sort()}function w(e,t,r){let i=S(e,r),a=n.expandDomainNames(i,t);return a.length===0||a.some(e=>i.domains[e]?.sharedSkills!==!1)}function T(e,r,l,u=s.default.homedir()){let d=S(e,u),f=[],p=new Set,m=t.globalDoomConfigDirectory(u);for(let e of n.expandDomainNames(d,r)){let t=d.domains[e];if(!t)throw Error(`Unknown domain: ${e}`);for(let n of t.plugins??[]){let t=typeof n!=`string`,r=t?n.name:n,o=d.plugins.entries[r];if(!o)throw Error(`Unknown plugin "${r}" referenced by domain "${e}"`);let s=i.pluginDirectoryForSource(o.source,m);if(o.source.type===`local`&&(!a.default.existsSync(s)||!a.default.statSync(s).isDirectory()))throw Error(`${c}: ${s}`);p.has(s)||(p.add(s),f.push({name:r,directory:s,domain:e,source:o.source,...o.manifest?{manifest:o.manifest}:{},...o.manifest?.agentPluginSchema===`https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`?{skillDiscovery:`direct-children`}:{},...t&&n.skills?{skills:n.skills}:{},...t&&n.agents?{agents:n.agents}:{},...t&&n.hooks!==void 0?{hooks:n.hooks}:{},...t&&n.mcp!==void 0?{mcp:n.mcp}:{}}))}}for(let e of l){let t=o.default.resolve(e);if(!a.default.existsSync(t)||!a.default.statSync(t).isDirectory())throw Error(`${c}: ${t}`);p.has(t)||(p.add(t),f.push({name:o.default.basename(t),directory:t,source:{type:`local`,path:t}}))}return f}function E(e,t,n,r){return T(e,t,n,r).map(e=>e.directory)}const D=`DOOMPI_DOMAINS`,O=`default`,k=`marketing`;function A(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function j(e,t,n){let r=t[D];return r===void 0?n===void 0?A(e===k?k:O):[...n]:A(r)}exports.DEFAULT_DOMAIN=O,exports.DOOMPI_DOMAINS_ENV=D,exports.DOOM_DIR=r.DOOM_DIR,exports.defaultDomainsForMajorMode=j,exports.listDomainNames=C,exports.loadDomains=S,exports.resolvePluginDirectories=E,exports.resolvePluginEntries=T,exports.resolveSharedSkills=w;
|
|
2
2
|
//# sourceMappingURL=domains.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.cjs","names":["os","readDoomConfigSources","loadPluginCatalog","expandDomainNames","globalDoomConfigDirectory","pluginDirectoryForSource","fs","path"],"sources":["../../src/adapters/domains.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { expandDomainNames } from '../services/domains.ts';\nimport type {\n DomainDefinition,\n DomainManifest,\n DomainMcpAllowlist,\n DomainPlugin,\n PluginEntry,\n ResolvedDomain,\n} from '../types/domains.ts';\nimport { globalDoomConfigDirectory } from './config.ts';\nimport { readDoomConfigSources } from './layeredConfig.ts';\nimport { loadPluginCatalog, pluginDirectoryForSource } from './pluginCatalog.ts';\n\nexport { DOOM_DIR } from './layeredConfig.ts';\n\nconst DOMAINS_FILE = 'domains.yaml';\nconst UNKNOWN_DOMAIN_ERROR = 'Unknown domain';\nconst UNKNOWN_PLUGIN_ERROR = 'Unknown plugin';\nconst MISSING_PLUGIN_DIRECTORY_ERROR = 'Plugin directory does not exist';\nconst DEFAULT_DOMAINS_PATH = '.doom/domains.yaml';\nconst SUPPORTED_AGENT_PLUGIN_SCHEMA = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(`${label} must be an object`);\n return value;\n}\n\nfunction assertOnlyKeys(record: Record<string, unknown>, allowed: readonly string[], label: string): void {\n const unexpected = Object.keys(record).filter((key) => !allowed.includes(key));\n if (unexpected.length > 0) throw new Error(`${label} contains unsupported field \"${unexpected[0]}\"`);\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} must be a non-empty string`);\n return value.trim();\n}\n\nfunction optionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n return requireString(value, label);\n}\n\nfunction parseStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array of non-empty strings`);\n return [...new Set(value.map((entry, index) => requireString(entry, `${label}[${index}]`)))];\n}\n\nfunction parseOptionalBoolean(value: unknown, label: string): boolean | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'boolean') throw new Error(`${label} must be a boolean`);\n return value;\n}\n\nfunction parseDefaultDomains(value: unknown): string[] {\n return parseStringArray(value, `defaultDomains in ${DEFAULT_DOMAINS_PATH}`);\n}\n\nfunction parseDomainPlugin(value: unknown, label: string): DomainPlugin {\n if (typeof value === 'string') return requireString(value, label);\n const plugin = requireRecord(value, label);\n assertOnlyKeys(plugin, ['name', 'skills', 'agents', 'hooks', 'mcp'], label);\n const skills = plugin.skills === undefined ? undefined : parseStringArray(plugin.skills, `${label}.skills`);\n const agents = plugin.agents === undefined ? undefined : parseStringArray(plugin.agents, `${label}.agents`);\n const hooks = parseOptionalBoolean(plugin.hooks, `${label}.hooks`);\n const mcp = parseOptionalBoolean(plugin.mcp, `${label}.mcp`);\n return {\n name: requireString(plugin.name, `${label}.name`),\n ...(skills ? { skills } : {}),\n ...(agents ? { agents } : {}),\n ...(hooks === undefined ? {} : { hooks }),\n ...(mcp === undefined ? {} : { mcp }),\n };\n}\n\nfunction parseMcpAllowlist(value: unknown, label: string): DomainMcpAllowlist {\n const mcp = requireRecord(value, label);\n assertOnlyKeys(mcp, ['servers', 'proxy'], label);\n return {\n ...(mcp.servers === undefined ? {} : { servers: parseStringArray(mcp.servers, `${label}.servers`) }),\n ...(mcp.proxy === undefined ? {} : { proxy: parseStringArray(mcp.proxy, `${label}.proxy`) }),\n };\n}\n\nfunction parseDomain(value: unknown, label: string): DomainDefinition {\n const domain = requireRecord(value, label);\n assertOnlyKeys(domain, ['description', 'plugins', 'mcp', 'sharedSkills'], label);\n const description = optionalString(domain.description, `${label}.description`);\n if (domain.plugins !== undefined && !Array.isArray(domain.plugins)) {\n throw new Error(`${label}.plugins must be an array`);\n }\n const sharedSkills = parseOptionalBoolean(domain.sharedSkills, `${label}.sharedSkills`);\n return {\n ...(description ? { description } : {}),\n ...(Array.isArray(domain.plugins)\n ? { plugins: domain.plugins.map((plugin, index) => parseDomainPlugin(plugin, `${label}.plugins[${index}]`)) }\n : {}),\n ...(domain.mcp === undefined ? {} : { mcp: parseMcpAllowlist(domain.mcp, `${label}.mcp`) }),\n ...(sharedSkills === undefined ? {} : { sharedSkills }),\n };\n}\n\nfunction parseAliases(value: unknown, label: string): Record<string, string[]> {\n if (value === undefined) return {};\n const aliases = requireRecord(value, label);\n return Object.fromEntries(\n Object.entries(aliases).map(([name, domains]) => [name, parseStringArray(domains, `${label}.${name}`)]),\n );\n}\n\n/**\n * Reads domains and plugin catalogs from global and repository configs.\n *\n * Named domains and explicit plugin entries are replaced by later repository\n * definitions. Configured roots accumulate, with exact marketplace manifests\n * deduplicated in discovery order. Explicit entries override discovered IDs.\n */\nexport function loadDomains(repoRoot: string, homeDirectory: string = os.homedir()): DomainManifest {\n const sources = readDoomConfigSources<unknown>(DOMAINS_FILE, repoRoot, homeDirectory);\n const aliases: Record<string, string[]> = {};\n const domains: Record<string, ResolvedDomain> = {};\n let defaultDomains: string[] | undefined;\n\n for (const source of sources) {\n const document = requireRecord(source.document, source.filePath);\n assertOnlyKeys(document, ['plugins', 'domains', 'aliases', 'defaultDomains'], source.filePath);\n Object.assign(aliases, parseAliases(document.aliases, `aliases in ${source.filePath}`));\n if (document.domains !== undefined) {\n const sourceDomains = requireRecord(document.domains, `domains in ${source.filePath}`);\n for (const [name, definition] of Object.entries(sourceDomains)) {\n domains[name] = {\n ...parseDomain(definition, `domains.${name} in ${source.filePath}`),\n baseDirectory: source.baseDirectory,\n };\n }\n }\n if (Object.hasOwn(document, 'defaultDomains')) defaultDomains = parseDefaultDomains(document.defaultDomains);\n }\n\n const plugins = loadPluginCatalog(\n sources.map((source) => ({\n filePath: source.filePath,\n baseDirectory: source.baseDirectory,\n value: requireRecord(source.document, source.filePath).plugins,\n })),\n repoRoot,\n homeDirectory,\n );\n\n if (defaultDomains) {\n for (const name of expandDomainNames({ plugins, domains, aliases }, defaultDomains)) {\n if (!Object.hasOwn(domains, name)) {\n throw new Error(`Unknown default domain \"${name}\" in ${DEFAULT_DOMAINS_PATH}`);\n }\n }\n }\n return { plugins, domains, aliases, ...(defaultDomains ? { defaultDomains } : {}) };\n}\n\nexport function listDomainNames(repoRoot: string, homeDirectory?: string): string[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n return [...new Set([...Object.keys(manifest.domains), ...Object.keys(manifest.aliases)])].sort();\n}\n\n/**\n * Whether to include .claude/skills as shared fallbacks.\n *\n * Shared skills are included unless every selected domain opts out, so mixing a\n * trimmed domain with an untrimmed one cannot strip the untrimmed one's skills.\n */\nexport function resolveSharedSkills(repoRoot: string, domainNames: string[], homeDirectory?: string): boolean {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return true;\n return expanded.some((name) => manifest.domains[name]?.sharedSkills !== false);\n}\n\n/** Resolves named domain plugins while preserving each subset filter. */\nexport function resolvePluginEntries(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory: string = os.homedir(),\n): PluginEntry[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const entries: PluginEntry[] = [];\n const seen = new Set<string>();\n const homeDoomDirectory = globalDoomConfigDirectory(homeDirectory);\n\n for (const domainName of expandDomainNames(manifest, domainNames)) {\n const domain = manifest.domains[domainName];\n if (!domain) throw new Error(`${UNKNOWN_DOMAIN_ERROR}: ${domainName}`);\n for (const selection of domain.plugins ?? []) {\n const isSubset = typeof selection !== 'string';\n const pluginName = isSubset ? selection.name : selection;\n const plugin = manifest.plugins.entries[pluginName];\n if (!plugin) throw new Error(`${UNKNOWN_PLUGIN_ERROR} \"${pluginName}\" referenced by domain \"${domainName}\"`);\n const directory = pluginDirectoryForSource(plugin.source, homeDoomDirectory);\n if (plugin.source.type === 'local' && (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory())) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: pluginName,\n directory,\n source: plugin.source,\n ...(plugin.manifest ? { manifest: plugin.manifest } : {}),\n ...(plugin.manifest?.agentPluginSchema === SUPPORTED_AGENT_PLUGIN_SCHEMA\n ? { skillDiscovery: 'direct-children' as const }\n : {}),\n ...(isSubset && selection.skills ? { skills: selection.skills } : {}),\n ...(isSubset && selection.agents ? { agents: selection.agents } : {}),\n ...(isSubset && selection.hooks !== undefined ? { hooks: selection.hooks } : {}),\n ...(isSubset && selection.mcp !== undefined ? { mcp: selection.mcp } : {}),\n });\n }\n }\n\n for (const configuredDirectory of explicitDirectories) {\n const directory = path.resolve(configuredDirectory);\n if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: path.basename(directory),\n directory,\n source: { type: 'local', path: directory },\n });\n }\n return entries;\n}\n\nexport function resolvePluginDirectories(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory?: string,\n): string[] {\n return resolvePluginEntries(repoRoot, domainNames, explicitDirectories, homeDirectory).map(\n (entry) => entry.directory,\n );\n}\n\nexport const DOOMPI_DOMAINS_ENV = 'DOOMPI_DOMAINS';\nexport const DEFAULT_DOMAIN = 'default';\nconst MARKETING_MAJOR_MODE = 'marketing';\n\nfunction parseDomainList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\n/**\n * Domains selected when the caller names none.\n *\n * Configuration keeps this axis independent of the major mode. The\n * major-mode-derived choice is retained only as the compatibility fallback for\n * domains files that declare no defaultDomains.\n */\nexport function defaultDomainsForMajorMode(\n majorMode: string,\n environment: NodeJS.ProcessEnv,\n defaultDomains?: readonly string[],\n): string[] {\n const inherited = environment[DOOMPI_DOMAINS_ENV];\n // An explicitly empty variable means no domains, so this tests for the key\n // rather than for a truthy value.\n if (inherited !== undefined) return parseDomainList(inherited);\n if (defaultDomains !== undefined) return [...defaultDomains];\n return parseDomainList(majorMode === MARKETING_MAJOR_MODE ? MARKETING_MAJOR_MODE : DEFAULT_DOMAIN);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"domains.cjs","names":["os","readDoomConfigSources","loadPluginCatalog","expandDomainNames","globalDoomConfigDirectory","pluginDirectoryForSource","fs","path"],"sources":["../../src/adapters/domains.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { expandDomainNames } from '../services/domains.ts';\nimport type {\n DomainDefinition,\n DomainManifest,\n DomainMcpAllowlist,\n DomainPlugin,\n PluginEntry,\n ResolvedDomain,\n} from '../types/domains.ts';\nimport { globalDoomConfigDirectory } from './config.ts';\nimport { readDoomConfigSources } from './layeredConfig.ts';\nimport { loadPluginCatalog, pluginDirectoryForSource } from './pluginCatalog.ts';\n\nexport { DOOM_DIR } from './layeredConfig.ts';\n\nconst DOMAINS_FILE = 'domains.yaml';\nconst UNKNOWN_DOMAIN_ERROR = 'Unknown domain';\nconst UNKNOWN_PLUGIN_ERROR = 'Unknown plugin';\nconst MISSING_PLUGIN_DIRECTORY_ERROR = 'Plugin directory does not exist';\nconst DEFAULT_DOMAINS_PATH = '.doom/domains.yaml';\nconst SUPPORTED_AGENT_PLUGIN_SCHEMA = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(`${label} must be an object`);\n return value;\n}\n\nfunction assertOnlyKeys(record: Record<string, unknown>, allowed: readonly string[], label: string): void {\n const unexpected = Object.keys(record).filter((key) => !allowed.includes(key));\n if (unexpected.length > 0) throw new Error(`${label} contains unsupported field \"${unexpected[0]}\"`);\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} must be a non-empty string`);\n return value.trim();\n}\n\nfunction optionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n return requireString(value, label);\n}\n\nfunction parseStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array of non-empty strings`);\n return [...new Set(value.map((entry, index) => requireString(entry, `${label}[${index}]`)))];\n}\n\nfunction parseOptionalBoolean(value: unknown, label: string): boolean | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'boolean') throw new Error(`${label} must be a boolean`);\n return value;\n}\n\nfunction parseDefaultDomains(value: unknown): string[] {\n return parseStringArray(value, `defaultDomains in ${DEFAULT_DOMAINS_PATH}`);\n}\n\nfunction parseDomainPlugin(value: unknown, label: string): DomainPlugin {\n if (typeof value === 'string') return requireString(value, label);\n const plugin = requireRecord(value, label);\n assertOnlyKeys(plugin, ['name', 'skills', 'agents', 'hooks', 'mcp'], label);\n const skills = plugin.skills === undefined ? undefined : parseStringArray(plugin.skills, `${label}.skills`);\n const agents = plugin.agents === undefined ? undefined : parseStringArray(plugin.agents, `${label}.agents`);\n const hooks = parseOptionalBoolean(plugin.hooks, `${label}.hooks`);\n const mcp = parseOptionalBoolean(plugin.mcp, `${label}.mcp`);\n return {\n name: requireString(plugin.name, `${label}.name`),\n ...(skills ? { skills } : {}),\n ...(agents ? { agents } : {}),\n ...(hooks === undefined ? {} : { hooks }),\n ...(mcp === undefined ? {} : { mcp }),\n };\n}\n\nfunction parseMcpAllowlist(value: unknown, label: string): DomainMcpAllowlist {\n const mcp = requireRecord(value, label);\n assertOnlyKeys(mcp, ['servers', 'proxy'], label);\n return {\n ...(mcp.servers === undefined ? {} : { servers: parseStringArray(mcp.servers, `${label}.servers`) }),\n ...(mcp.proxy === undefined ? {} : { proxy: parseStringArray(mcp.proxy, `${label}.proxy`) }),\n };\n}\n\nfunction parseDomain(value: unknown, label: string): DomainDefinition {\n const domain = requireRecord(value, label);\n assertOnlyKeys(domain, ['description', 'plugins', 'mcp', 'sharedSkills'], label);\n const description = optionalString(domain.description, `${label}.description`);\n if (domain.plugins !== undefined && !Array.isArray(domain.plugins)) {\n throw new Error(`${label}.plugins must be an array`);\n }\n const sharedSkills = parseOptionalBoolean(domain.sharedSkills, `${label}.sharedSkills`);\n return {\n ...(description ? { description } : {}),\n ...(Array.isArray(domain.plugins)\n ? { plugins: domain.plugins.map((plugin, index) => parseDomainPlugin(plugin, `${label}.plugins[${index}]`)) }\n : {}),\n ...(domain.mcp === undefined ? {} : { mcp: parseMcpAllowlist(domain.mcp, `${label}.mcp`) }),\n ...(sharedSkills === undefined ? {} : { sharedSkills }),\n };\n}\n\nfunction parseAliases(value: unknown, label: string): Record<string, string[]> {\n if (value === undefined) return {};\n const aliases = requireRecord(value, label);\n return Object.fromEntries(\n Object.entries(aliases).map(([name, domains]) => [name, parseStringArray(domains, `${label}.${name}`)]),\n );\n}\n\n/**\n * Reads domains and plugin catalogs from global and repository configs.\n *\n * Named domains and explicit plugin entries are replaced by later repository\n * definitions. Configured roots accumulate, with exact marketplace manifests\n * deduplicated in discovery order. Explicit entries override discovered IDs.\n */\nexport function loadDomains(repoRoot: string, homeDirectory: string = os.homedir()): DomainManifest {\n const sources = readDoomConfigSources<unknown>(DOMAINS_FILE, repoRoot, homeDirectory);\n const aliases: Record<string, string[]> = {};\n const domains: Record<string, ResolvedDomain> = {};\n let defaultDomains: string[] | undefined;\n\n for (const source of sources) {\n const document = requireRecord(source.document, source.filePath);\n assertOnlyKeys(document, ['plugins', 'domains', 'aliases', 'defaultDomains'], source.filePath);\n Object.assign(aliases, parseAliases(document.aliases, `aliases in ${source.filePath}`));\n if (document.domains !== undefined) {\n const sourceDomains = requireRecord(document.domains, `domains in ${source.filePath}`);\n for (const [name, definition] of Object.entries(sourceDomains)) {\n domains[name] = {\n ...parseDomain(definition, `domains.${name} in ${source.filePath}`),\n baseDirectory: source.baseDirectory,\n };\n }\n }\n if (Object.hasOwn(document, 'defaultDomains')) defaultDomains = parseDefaultDomains(document.defaultDomains);\n }\n\n const plugins = loadPluginCatalog(\n sources.map((source) => ({\n filePath: source.filePath,\n baseDirectory: source.baseDirectory,\n value: requireRecord(source.document, source.filePath).plugins,\n })),\n repoRoot,\n homeDirectory,\n );\n\n if (defaultDomains) {\n for (const name of expandDomainNames({ plugins, domains, aliases }, defaultDomains)) {\n if (!Object.hasOwn(domains, name)) {\n throw new Error(`Unknown default domain \"${name}\" in ${DEFAULT_DOMAINS_PATH}`);\n }\n }\n }\n return { plugins, domains, aliases, ...(defaultDomains ? { defaultDomains } : {}) };\n}\n\nexport function listDomainNames(repoRoot: string, homeDirectory?: string): string[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n return [...new Set([...Object.keys(manifest.domains), ...Object.keys(manifest.aliases)])].sort();\n}\n\n/**\n * Whether to include .claude/skills as shared fallbacks.\n *\n * Shared skills are included unless every selected domain opts out, so mixing a\n * trimmed domain with an untrimmed one cannot strip the untrimmed one's skills.\n */\nexport function resolveSharedSkills(repoRoot: string, domainNames: string[], homeDirectory?: string): boolean {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return true;\n return expanded.some((name) => manifest.domains[name]?.sharedSkills !== false);\n}\n\n/** Resolves named domain plugins while preserving each subset filter. */\nexport function resolvePluginEntries(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory: string = os.homedir(),\n): PluginEntry[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const entries: PluginEntry[] = [];\n const seen = new Set<string>();\n const homeDoomDirectory = globalDoomConfigDirectory(homeDirectory);\n\n for (const domainName of expandDomainNames(manifest, domainNames)) {\n const domain = manifest.domains[domainName];\n if (!domain) throw new Error(`${UNKNOWN_DOMAIN_ERROR}: ${domainName}`);\n for (const selection of domain.plugins ?? []) {\n const isSubset = typeof selection !== 'string';\n const pluginName = isSubset ? selection.name : selection;\n const plugin = manifest.plugins.entries[pluginName];\n if (!plugin) throw new Error(`${UNKNOWN_PLUGIN_ERROR} \"${pluginName}\" referenced by domain \"${domainName}\"`);\n const directory = pluginDirectoryForSource(plugin.source, homeDoomDirectory);\n if (plugin.source.type === 'local' && (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory())) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: pluginName,\n directory,\n // The domain is only in scope here. `resolvePluginDirectories` keeps\n // just the path, so anything downstream that wants to say which domain\n // brought a plugin has to be told now or not at all.\n domain: domainName,\n source: plugin.source,\n ...(plugin.manifest ? { manifest: plugin.manifest } : {}),\n ...(plugin.manifest?.agentPluginSchema === SUPPORTED_AGENT_PLUGIN_SCHEMA\n ? { skillDiscovery: 'direct-children' as const }\n : {}),\n ...(isSubset && selection.skills ? { skills: selection.skills } : {}),\n ...(isSubset && selection.agents ? { agents: selection.agents } : {}),\n ...(isSubset && selection.hooks !== undefined ? { hooks: selection.hooks } : {}),\n ...(isSubset && selection.mcp !== undefined ? { mcp: selection.mcp } : {}),\n });\n }\n }\n\n for (const configuredDirectory of explicitDirectories) {\n const directory = path.resolve(configuredDirectory);\n if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: path.basename(directory),\n directory,\n source: { type: 'local', path: directory },\n });\n }\n return entries;\n}\n\nexport function resolvePluginDirectories(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory?: string,\n): string[] {\n return resolvePluginEntries(repoRoot, domainNames, explicitDirectories, homeDirectory).map(\n (entry) => entry.directory,\n );\n}\n\nexport const DOOMPI_DOMAINS_ENV = 'DOOMPI_DOMAINS';\nexport const DEFAULT_DOMAIN = 'default';\nconst MARKETING_MAJOR_MODE = 'marketing';\n\nfunction parseDomainList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\n/**\n * Domains selected when the caller names none.\n *\n * Configuration keeps this axis independent of the major mode. The\n * major-mode-derived choice is retained only as the compatibility fallback for\n * domains files that declare no defaultDomains.\n */\nexport function defaultDomainsForMajorMode(\n majorMode: string,\n environment: NodeJS.ProcessEnv,\n defaultDomains?: readonly string[],\n): string[] {\n const inherited = environment[DOOMPI_DOMAINS_ENV];\n // An explicitly empty variable means no domains, so this tests for the key\n // rather than for a truthy value.\n if (inherited !== undefined) return parseDomainList(inherited);\n if (defaultDomains !== undefined) return [...defaultDomains];\n return parseDomainList(majorMode === MARKETING_MAJOR_MODE ? MARKETING_MAJOR_MODE : DEFAULT_DOMAIN);\n}\n"],"mappings":"sTAkBA,MAGM,EAAiC,kCACjC,EAAuB,qBAG7B,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAS,EAAc,EAAgB,EAAwC,CAC7E,GAAI,CAAC,EAAS,CAAK,EAAG,MAAU,MAAM,GAAG,EAAM,mBAAmB,EAClE,OAAO,CACT,CAEA,SAAS,EAAe,EAAiC,EAA4B,EAAqB,CACxG,IAAM,EAAa,OAAO,KAAK,CAAM,CAAC,CAAC,OAAQ,GAAQ,CAAC,EAAQ,SAAS,CAAG,CAAC,EAC7E,GAAI,EAAW,OAAS,EAAG,MAAU,MAAM,GAAG,EAAM,+BAA+B,EAAW,GAAG,EAAE,CACrG,CAEA,SAAS,EAAc,EAAgB,EAAuB,CAC5D,GAAI,OAAO,GAAU,UAAY,CAAC,EAAM,KAAK,EAAG,MAAU,MAAM,GAAG,EAAM,4BAA4B,EACrG,OAAO,EAAM,KAAK,CACpB,CAEA,SAAS,EAAe,EAAgB,EAAmC,CACrE,OAAU,IAAA,GACd,OAAO,EAAc,EAAO,CAAK,CACnC,CAEA,SAAS,EAAiB,EAAgB,EAAyB,CACjE,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,MAAU,MAAM,GAAG,EAAM,uCAAuC,EAC3F,MAAO,CAAC,GAAG,IAAI,IAAI,EAAM,KAAK,EAAO,IAAU,EAAc,EAAO,GAAG,EAAM,GAAG,EAAM,EAAE,CAAC,CAAC,CAAC,CAC7F,CAEA,SAAS,EAAqB,EAAgB,EAAoC,CAC5E,OAAU,IAAA,GACd,IAAI,OAAO,GAAU,UAAW,MAAU,MAAM,GAAG,EAAM,mBAAmB,EAC5E,OAAO,CADqE,CAE9E,CAEA,SAAS,EAAoB,EAA0B,CACrD,OAAO,EAAiB,EAAO,qBAAqB,GAAsB,CAC5E,CAEA,SAAS,EAAkB,EAAgB,EAA6B,CACtE,GAAI,OAAO,GAAU,SAAU,OAAO,EAAc,EAAO,CAAK,EAChE,IAAM,EAAS,EAAc,EAAO,CAAK,EACzC,EAAe,EAAQ,CAAC,OAAQ,SAAU,SAAU,QAAS,KAAK,EAAG,CAAK,EAC1E,IAAM,EAAS,EAAO,SAAW,IAAA,GAAY,IAAA,GAAY,EAAiB,EAAO,OAAQ,GAAG,EAAM,QAAQ,EACpG,EAAS,EAAO,SAAW,IAAA,GAAY,IAAA,GAAY,EAAiB,EAAO,OAAQ,GAAG,EAAM,QAAQ,EACpG,EAAQ,EAAqB,EAAO,MAAO,GAAG,EAAM,OAAO,EAC3D,EAAM,EAAqB,EAAO,IAAK,GAAG,EAAM,KAAK,EAC3D,MAAO,CACL,KAAM,EAAc,EAAO,KAAM,GAAG,EAAM,MAAM,EAChD,GAAI,EAAS,CAAE,QAAO,EAAI,CAAC,EAC3B,GAAI,EAAS,CAAE,QAAO,EAAI,CAAC,EAC3B,GAAI,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,OAAM,EACvC,GAAI,IAAQ,IAAA,GAAY,CAAC,EAAI,CAAE,KAAI,CACrC,CACF,CAEA,SAAS,EAAkB,EAAgB,EAAmC,CAC5E,IAAM,EAAM,EAAc,EAAO,CAAK,EAEtC,OADA,EAAe,EAAK,CAAC,UAAW,OAAO,EAAG,CAAK,EACxC,CACL,GAAI,EAAI,UAAY,IAAA,GAAY,CAAC,EAAI,CAAE,QAAS,EAAiB,EAAI,QAAS,GAAG,EAAM,SAAS,CAAE,EAClG,GAAI,EAAI,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAiB,EAAI,MAAO,GAAG,EAAM,OAAO,CAAE,CAC5F,CACF,CAEA,SAAS,EAAY,EAAgB,EAAiC,CACpE,IAAM,EAAS,EAAc,EAAO,CAAK,EACzC,EAAe,EAAQ,CAAC,cAAe,UAAW,MAAO,cAAc,EAAG,CAAK,EAC/E,IAAM,EAAc,EAAe,EAAO,YAAa,GAAG,EAAM,aAAa,EAC7E,GAAI,EAAO,UAAY,IAAA,IAAa,CAAC,MAAM,QAAQ,EAAO,OAAO,EAC/D,MAAU,MAAM,GAAG,EAAM,0BAA0B,EAErD,IAAM,EAAe,EAAqB,EAAO,aAAc,GAAG,EAAM,cAAc,EACtF,MAAO,CACL,GAAI,EAAc,CAAE,aAAY,EAAI,CAAC,EACrC,GAAI,MAAM,QAAQ,EAAO,OAAO,EAC5B,CAAE,QAAS,EAAO,QAAQ,KAAK,EAAQ,IAAU,EAAkB,EAAQ,GAAG,EAAM,WAAW,EAAM,EAAE,CAAC,CAAE,EAC1G,CAAC,EACL,GAAI,EAAO,MAAQ,IAAA,GAAY,CAAC,EAAI,CAAE,IAAK,EAAkB,EAAO,IAAK,GAAG,EAAM,KAAK,CAAE,EACzF,GAAI,IAAiB,IAAA,GAAY,CAAC,EAAI,CAAE,cAAa,CACvD,CACF,CAEA,SAAS,EAAa,EAAgB,EAAyC,CAC7E,GAAI,IAAU,IAAA,GAAW,MAAO,CAAC,EACjC,IAAM,EAAU,EAAc,EAAO,CAAK,EAC1C,OAAO,OAAO,YACZ,OAAO,QAAQ,CAAO,CAAC,CAAC,KAAK,CAAC,EAAM,KAAa,CAAC,EAAM,EAAiB,EAAS,GAAG,EAAM,GAAG,GAAM,CAAC,CAAC,CACxG,CACF,CASA,SAAgB,EAAY,EAAkB,EAAwBA,EAAAA,QAAG,QAAQ,EAAmB,CAClG,IAAM,EAAUC,EAAAA,sBAA+B,eAAc,EAAU,CAAa,EAC9E,EAAoC,CAAC,EACrC,EAA0C,CAAC,EAC7C,EAEJ,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,EAAW,EAAc,EAAO,SAAU,EAAO,QAAQ,EAG/D,GAFA,EAAe,EAAU,CAAC,UAAW,UAAW,UAAW,gBAAgB,EAAG,EAAO,QAAQ,EAC7F,OAAO,OAAO,EAAS,EAAa,EAAS,QAAS,cAAc,EAAO,UAAU,CAAC,EAClF,EAAS,UAAY,IAAA,GAAW,CAClC,IAAM,EAAgB,EAAc,EAAS,QAAS,cAAc,EAAO,UAAU,EACrF,IAAK,GAAM,CAAC,EAAM,KAAe,OAAO,QAAQ,CAAa,EAC3D,EAAQ,GAAQ,CACd,GAAG,EAAY,EAAY,WAAW,EAAK,MAAM,EAAO,UAAU,EAClE,cAAe,EAAO,aACxB,CAEJ,CACI,OAAO,OAAO,EAAU,gBAAgB,IAAG,EAAiB,EAAoB,EAAS,cAAc,EAC7G,CAEA,IAAM,EAAUC,EAAAA,kBACd,EAAQ,IAAK,IAAY,CACvB,SAAU,EAAO,SACjB,cAAe,EAAO,cACtB,MAAO,EAAc,EAAO,SAAU,EAAO,QAAQ,CAAC,CAAC,OACzD,EAAE,EACF,EACA,CACF,EAEA,GAAI,EACG,KAAA,IAAM,KAAQC,EAAAA,kBAAkB,CAAE,UAAS,UAAS,SAAQ,EAAG,CAAc,EAChF,GAAI,CAAC,OAAO,OAAO,EAAS,CAAI,EAC9B,MAAU,MAAM,2BAA2B,EAAK,OAAO,GAAsB,CAAA,CAInF,MAAO,CAAE,UAAS,UAAS,UAAS,GAAI,EAAiB,CAAE,gBAAe,EAAI,CAAC,CAAG,CACpF,CAEA,SAAgB,EAAgB,EAAkB,EAAkC,CAClF,IAAM,EAAW,EAAY,EAAU,CAAa,EACpD,MAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,EAAS,OAAO,EAAG,GAAG,OAAO,KAAK,EAAS,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CACjG,CAQA,SAAgB,EAAoB,EAAkB,EAAuB,EAAiC,CAC5G,IAAM,EAAW,EAAY,EAAU,CAAa,EAC9C,EAAWA,EAAAA,kBAAkB,EAAU,CAAW,EAExD,OADI,EAAS,SAAW,GACjB,EAAS,KAAM,GAAS,EAAS,QAAQ,EAAK,EAAE,eAAiB,EAAK,CAC/E,CAGA,SAAgB,EACd,EACA,EACA,EACA,EAAwBH,EAAAA,QAAG,QAAQ,EACpB,CACf,IAAM,EAAW,EAAY,EAAU,CAAa,EAC9C,EAAyB,CAAC,EAC1B,EAAO,IAAI,IACX,EAAoBI,EAAAA,0BAA0B,CAAa,EAEjE,IAAK,IAAM,KAAcD,EAAAA,kBAAkB,EAAU,CAAW,EAAG,CACjE,IAAM,EAAS,EAAS,QAAQ,GAChC,GAAI,CAAC,EAAQ,MAAU,MAAM,mBAA4B,GAAY,EACrE,IAAK,IAAM,KAAa,EAAO,SAAW,CAAC,EAAG,CAC5C,IAAM,EAAW,OAAO,GAAc,SAChC,EAAa,EAAW,EAAU,KAAO,EACzC,EAAS,EAAS,QAAQ,QAAQ,GACxC,GAAI,CAAC,EAAQ,MAAU,MAAM,mBAA4B,EAAW,0BAA0B,EAAW,EAAE,EAC3G,IAAM,EAAYE,EAAAA,yBAAyB,EAAO,OAAQ,CAAiB,EAC3E,GAAI,EAAO,OAAO,OAAS,UAAY,CAACC,EAAAA,QAAG,WAAW,CAAS,GAAK,CAACA,EAAAA,QAAG,SAAS,CAAS,CAAC,CAAC,YAAY,GACtG,MAAU,MAAM,GAAG,EAA+B,IAAI,GAAW,EAE/D,EAAK,IAAI,CAAS,IACtB,EAAK,IAAI,CAAS,EAClB,EAAQ,KAAK,CACX,KAAM,EACN,YAIA,OAAQ,EACR,OAAQ,EAAO,OACf,GAAI,EAAO,SAAW,CAAE,SAAU,EAAO,QAAS,EAAI,CAAC,EACvD,GAAI,EAAO,UAAU,oBAAsB,6DACvC,CAAE,eAAgB,iBAA2B,EAC7C,CAAC,EACL,GAAI,GAAY,EAAU,OAAS,CAAE,OAAQ,EAAU,MAAO,EAAI,CAAC,EACnE,GAAI,GAAY,EAAU,OAAS,CAAE,OAAQ,EAAU,MAAO,EAAI,CAAC,EACnE,GAAI,GAAY,EAAU,QAAU,IAAA,GAAY,CAAE,MAAO,EAAU,KAAM,EAAI,CAAC,EAC9E,GAAI,GAAY,EAAU,MAAQ,IAAA,GAAY,CAAE,IAAK,EAAU,GAAI,EAAI,CAAC,CAC1E,CAAC,EACH,CACF,CAEA,IAAK,IAAM,KAAuB,EAAqB,CACrD,IAAM,EAAYC,EAAAA,QAAK,QAAQ,CAAmB,EAClD,GAAI,CAACD,EAAAA,QAAG,WAAW,CAAS,GAAK,CAACA,EAAAA,QAAG,SAAS,CAAS,CAAC,CAAC,YAAY,EACnE,MAAU,MAAM,GAAG,EAA+B,IAAI,GAAW,EAE/D,EAAK,IAAI,CAAS,IACtB,EAAK,IAAI,CAAS,EAClB,EAAQ,KAAK,CACX,KAAMC,EAAAA,QAAK,SAAS,CAAS,EAC7B,YACA,OAAQ,CAAE,KAAM,QAAS,KAAM,CAAU,CAC3C,CAAC,EACH,CACA,OAAO,CACT,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACU,CACV,OAAO,EAAqB,EAAU,EAAa,EAAqB,CAAa,CAAC,CAAC,IACpF,GAAU,EAAM,SACnB,CACF,CAEA,MAAa,EAAqB,iBACrB,EAAiB,UACxB,EAAuB,YAE7B,SAAS,EAAgB,EAAyB,CAChD,OAAO,EACJ,MAAM,GAAG,CAAC,CACV,IAAK,GAAU,EAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,CACnB,CASA,SAAgB,EACd,EACA,EACA,EACU,CACV,IAAM,EAAY,EAAY,GAK9B,OAFI,IAAc,IAAA,GACd,IAAmB,IAAA,GAChB,EAAgB,IAAc,EAAuB,EAAuB,CAAc,EADxD,CAAC,GAAG,CAAc,EADvB,EAAgB,CAAS,CAG/D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/adapters/domains.ts"],"mappings":";;;;;;;;;;iBA2HgB,YAAY,kBAAkB,yBAAuC;iBA0CrE,gBAAgB,kBAAkB;;;;;;;iBAWlC,oBAAoB,kBAAkB,uBAAuB;;iBAQ7D,qBACd,kBACA,uBACA,+BACA,yBACC;
|
|
1
|
+
{"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/adapters/domains.ts"],"mappings":";;;;;;;;;;iBA2HgB,YAAY,kBAAkB,yBAAuC;iBA0CrE,gBAAgB,kBAAkB;;;;;;;iBAWlC,oBAAoB,kBAAkB,uBAAuB;;iBAQ7D,qBACd,kBACA,uBACA,+BACA,yBACC;iBAwDa,yBACd,kBACA,uBACA,+BACA;cAOW;cACA;;;;;;;;iBAiBG,2BACd,mBACA,aAAa,OAAO,YACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/adapters/domains.ts"],"mappings":";;;;;;;;;;iBA2HgB,YAAY,kBAAkB,yBAAuC;iBA0CrE,gBAAgB,kBAAkB;;;;;;;iBAWlC,oBAAoB,kBAAkB,uBAAuB;;iBAQ7D,qBACd,kBACA,uBACA,+BACA,yBACC;
|
|
1
|
+
{"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/adapters/domains.ts"],"mappings":";;;;;;;;;;iBA2HgB,YAAY,kBAAkB,yBAAuC;iBA0CrE,gBAAgB,kBAAkB;;;;;;;iBAWlC,oBAAoB,kBAAkB,uBAAuB;;iBAQ7D,qBACd,kBACA,uBACA,+BACA,yBACC;iBAwDa,yBACd,kBACA,uBACA,+BACA;cAOW;cACA;;;;;;;;iBAiBG,2BACd,mBACA,aAAa,OAAO,YACpB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{globalDoomConfigDirectory as e}from"./config.mjs";import{expandDomainNames as t}from"../services/domains.mjs";import{DOOM_DIR as n,readDoomConfigSources as r}from"./layeredConfig.mjs";import{loadPluginCatalog as i,pluginDirectoryForSource as a}from"./pluginCatalog.mjs";import o from"node:fs";import s from"node:path";import c from"node:os";const l=`Plugin directory does not exist`,u=`.doom/domains.yaml`;function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){if(!d(e))throw Error(`${t} must be an object`);return e}function p(e,t,n){let r=Object.keys(e).filter(e=>!t.includes(e));if(r.length>0)throw Error(`${n} contains unsupported field "${r[0]}"`)}function m(e,t){if(typeof e!=`string`||!e.trim())throw Error(`${t} must be a non-empty string`);return e.trim()}function h(e,t){if(e!==void 0)return m(e,t)}function g(e,t){if(!Array.isArray(e))throw Error(`${t} must be an array of non-empty strings`);return[...new Set(e.map((e,n)=>m(e,`${t}[${n}]`)))]}function _(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`${t} must be a boolean`);return e}}function v(e){return g(e,`defaultDomains in ${u}`)}function y(e,t){if(typeof e==`string`)return m(e,t);let n=f(e,t);p(n,[`name`,`skills`,`agents`,`hooks`,`mcp`],t);let r=n.skills===void 0?void 0:g(n.skills,`${t}.skills`),i=n.agents===void 0?void 0:g(n.agents,`${t}.agents`),a=_(n.hooks,`${t}.hooks`),o=_(n.mcp,`${t}.mcp`);return{name:m(n.name,`${t}.name`),...r?{skills:r}:{},...i?{agents:i}:{},...a===void 0?{}:{hooks:a},...o===void 0?{}:{mcp:o}}}function b(e,t){let n=f(e,t);return p(n,[`servers`,`proxy`],t),{...n.servers===void 0?{}:{servers:g(n.servers,`${t}.servers`)},...n.proxy===void 0?{}:{proxy:g(n.proxy,`${t}.proxy`)}}}function x(e,t){let n=f(e,t);p(n,[`description`,`plugins`,`mcp`,`sharedSkills`],t);let r=h(n.description,`${t}.description`);if(n.plugins!==void 0&&!Array.isArray(n.plugins))throw Error(`${t}.plugins must be an array`);let i=_(n.sharedSkills,`${t}.sharedSkills`);return{...r?{description:r}:{},...Array.isArray(n.plugins)?{plugins:n.plugins.map((e,n)=>y(e,`${t}.plugins[${n}]`))}:{},...n.mcp===void 0?{}:{mcp:b(n.mcp,`${t}.mcp`)},...i===void 0?{}:{sharedSkills:i}}}function S(e,t){if(e===void 0)return{};let n=f(e,t);return Object.fromEntries(Object.entries(n).map(([e,n])=>[e,g(n,`${t}.${e}`)]))}function C(e,n=c.homedir()){let a=r(`domains.yaml`,e,n),o={},s={},l;for(let e of a){let t=f(e.document,e.filePath);if(p(t,[`plugins`,`domains`,`aliases`,`defaultDomains`],e.filePath),Object.assign(o,S(t.aliases,`aliases in ${e.filePath}`)),t.domains!==void 0){let n=f(t.domains,`domains in ${e.filePath}`);for(let[t,r]of Object.entries(n))s[t]={...x(r,`domains.${t} in ${e.filePath}`),baseDirectory:e.baseDirectory}}Object.hasOwn(t,`defaultDomains`)&&(l=v(t.defaultDomains))}let d=i(a.map(e=>({filePath:e.filePath,baseDirectory:e.baseDirectory,value:f(e.document,e.filePath).plugins})),e,n);if(l){for(let e of t({plugins:d,domains:s,aliases:o},l))if(!Object.hasOwn(s,e))throw Error(`Unknown default domain "${e}" in ${u}`)}return{plugins:d,domains:s,aliases:o,...l?{defaultDomains:l}:{}}}function w(e,t){let n=C(e,t);return[...new Set([...Object.keys(n.domains),...Object.keys(n.aliases)])].sort()}function T(e,n,r){let i=C(e,r),a=t(i,n);return a.length===0||a.some(e=>i.domains[e]?.sharedSkills!==!1)}function E(n,r,i,u=c.homedir()){let d=C(n,u),f=[],p=new Set,m=e(u);for(let e of t(d,r)){let t=d.domains[e];if(!t)throw Error(`Unknown domain: ${e}`);for(let n of t.plugins??[]){let t=typeof n!=`string`,r=t?n.name:n,i=d.plugins.entries[r];if(!i)throw Error(`Unknown plugin "${r}" referenced by domain "${e}"`);let s=a(i.source,m);if(i.source.type===`local`&&(!o.existsSync(s)||!o.statSync(s).isDirectory()))throw Error(`${l}: ${s}`);p.has(s)||(p.add(s),f.push({name:r,directory:s,source:i.source,...i.manifest?{manifest:i.manifest}:{},...i.manifest?.agentPluginSchema===`https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`?{skillDiscovery:`direct-children`}:{},...t&&n.skills?{skills:n.skills}:{},...t&&n.agents?{agents:n.agents}:{},...t&&n.hooks!==void 0?{hooks:n.hooks}:{},...t&&n.mcp!==void 0?{mcp:n.mcp}:{}}))}}for(let e of i){let t=s.resolve(e);if(!o.existsSync(t)||!o.statSync(t).isDirectory())throw Error(`${l}: ${t}`);p.has(t)||(p.add(t),f.push({name:s.basename(t),directory:t,source:{type:`local`,path:t}}))}return f}function D(e,t,n,r){return E(e,t,n,r).map(e=>e.directory)}const O=`DOOMPI_DOMAINS`,k=`default`,A=`marketing`;function j(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function M(e,t,n){let r=t[O];return r===void 0?n===void 0?j(e===A?A:k):[...n]:j(r)}export{k as DEFAULT_DOMAIN,O as DOOMPI_DOMAINS_ENV,n as DOOM_DIR,M as defaultDomainsForMajorMode,w as listDomainNames,C as loadDomains,D as resolvePluginDirectories,E as resolvePluginEntries,T as resolveSharedSkills};
|
|
1
|
+
import{globalDoomConfigDirectory as e}from"./config.mjs";import{expandDomainNames as t}from"../services/domains.mjs";import{DOOM_DIR as n,readDoomConfigSources as r}from"./layeredConfig.mjs";import{loadPluginCatalog as i,pluginDirectoryForSource as a}from"./pluginCatalog.mjs";import o from"node:fs";import s from"node:path";import c from"node:os";const l=`Plugin directory does not exist`,u=`.doom/domains.yaml`;function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e,t){if(!d(e))throw Error(`${t} must be an object`);return e}function p(e,t,n){let r=Object.keys(e).filter(e=>!t.includes(e));if(r.length>0)throw Error(`${n} contains unsupported field "${r[0]}"`)}function m(e,t){if(typeof e!=`string`||!e.trim())throw Error(`${t} must be a non-empty string`);return e.trim()}function h(e,t){if(e!==void 0)return m(e,t)}function g(e,t){if(!Array.isArray(e))throw Error(`${t} must be an array of non-empty strings`);return[...new Set(e.map((e,n)=>m(e,`${t}[${n}]`)))]}function _(e,t){if(e!==void 0){if(typeof e!=`boolean`)throw Error(`${t} must be a boolean`);return e}}function v(e){return g(e,`defaultDomains in ${u}`)}function y(e,t){if(typeof e==`string`)return m(e,t);let n=f(e,t);p(n,[`name`,`skills`,`agents`,`hooks`,`mcp`],t);let r=n.skills===void 0?void 0:g(n.skills,`${t}.skills`),i=n.agents===void 0?void 0:g(n.agents,`${t}.agents`),a=_(n.hooks,`${t}.hooks`),o=_(n.mcp,`${t}.mcp`);return{name:m(n.name,`${t}.name`),...r?{skills:r}:{},...i?{agents:i}:{},...a===void 0?{}:{hooks:a},...o===void 0?{}:{mcp:o}}}function b(e,t){let n=f(e,t);return p(n,[`servers`,`proxy`],t),{...n.servers===void 0?{}:{servers:g(n.servers,`${t}.servers`)},...n.proxy===void 0?{}:{proxy:g(n.proxy,`${t}.proxy`)}}}function x(e,t){let n=f(e,t);p(n,[`description`,`plugins`,`mcp`,`sharedSkills`],t);let r=h(n.description,`${t}.description`);if(n.plugins!==void 0&&!Array.isArray(n.plugins))throw Error(`${t}.plugins must be an array`);let i=_(n.sharedSkills,`${t}.sharedSkills`);return{...r?{description:r}:{},...Array.isArray(n.plugins)?{plugins:n.plugins.map((e,n)=>y(e,`${t}.plugins[${n}]`))}:{},...n.mcp===void 0?{}:{mcp:b(n.mcp,`${t}.mcp`)},...i===void 0?{}:{sharedSkills:i}}}function S(e,t){if(e===void 0)return{};let n=f(e,t);return Object.fromEntries(Object.entries(n).map(([e,n])=>[e,g(n,`${t}.${e}`)]))}function C(e,n=c.homedir()){let a=r(`domains.yaml`,e,n),o={},s={},l;for(let e of a){let t=f(e.document,e.filePath);if(p(t,[`plugins`,`domains`,`aliases`,`defaultDomains`],e.filePath),Object.assign(o,S(t.aliases,`aliases in ${e.filePath}`)),t.domains!==void 0){let n=f(t.domains,`domains in ${e.filePath}`);for(let[t,r]of Object.entries(n))s[t]={...x(r,`domains.${t} in ${e.filePath}`),baseDirectory:e.baseDirectory}}Object.hasOwn(t,`defaultDomains`)&&(l=v(t.defaultDomains))}let d=i(a.map(e=>({filePath:e.filePath,baseDirectory:e.baseDirectory,value:f(e.document,e.filePath).plugins})),e,n);if(l){for(let e of t({plugins:d,domains:s,aliases:o},l))if(!Object.hasOwn(s,e))throw Error(`Unknown default domain "${e}" in ${u}`)}return{plugins:d,domains:s,aliases:o,...l?{defaultDomains:l}:{}}}function w(e,t){let n=C(e,t);return[...new Set([...Object.keys(n.domains),...Object.keys(n.aliases)])].sort()}function T(e,n,r){let i=C(e,r),a=t(i,n);return a.length===0||a.some(e=>i.domains[e]?.sharedSkills!==!1)}function E(n,r,i,u=c.homedir()){let d=C(n,u),f=[],p=new Set,m=e(u);for(let e of t(d,r)){let t=d.domains[e];if(!t)throw Error(`Unknown domain: ${e}`);for(let n of t.plugins??[]){let t=typeof n!=`string`,r=t?n.name:n,i=d.plugins.entries[r];if(!i)throw Error(`Unknown plugin "${r}" referenced by domain "${e}"`);let s=a(i.source,m);if(i.source.type===`local`&&(!o.existsSync(s)||!o.statSync(s).isDirectory()))throw Error(`${l}: ${s}`);p.has(s)||(p.add(s),f.push({name:r,directory:s,domain:e,source:i.source,...i.manifest?{manifest:i.manifest}:{},...i.manifest?.agentPluginSchema===`https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`?{skillDiscovery:`direct-children`}:{},...t&&n.skills?{skills:n.skills}:{},...t&&n.agents?{agents:n.agents}:{},...t&&n.hooks!==void 0?{hooks:n.hooks}:{},...t&&n.mcp!==void 0?{mcp:n.mcp}:{}}))}}for(let e of i){let t=s.resolve(e);if(!o.existsSync(t)||!o.statSync(t).isDirectory())throw Error(`${l}: ${t}`);p.has(t)||(p.add(t),f.push({name:s.basename(t),directory:t,source:{type:`local`,path:t}}))}return f}function D(e,t,n,r){return E(e,t,n,r).map(e=>e.directory)}const O=`DOOMPI_DOMAINS`,k=`default`,A=`marketing`;function j(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function M(e,t,n){let r=t[O];return r===void 0?n===void 0?j(e===A?A:k):[...n]:j(r)}export{k as DEFAULT_DOMAIN,O as DOOMPI_DOMAINS_ENV,n as DOOM_DIR,M as defaultDomainsForMajorMode,w as listDomainNames,C as loadDomains,D as resolvePluginDirectories,E as resolvePluginEntries,T as resolveSharedSkills};
|
|
2
2
|
//# sourceMappingURL=domains.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.mjs","names":[],"sources":["../../src/adapters/domains.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { expandDomainNames } from '../services/domains.ts';\nimport type {\n DomainDefinition,\n DomainManifest,\n DomainMcpAllowlist,\n DomainPlugin,\n PluginEntry,\n ResolvedDomain,\n} from '../types/domains.ts';\nimport { globalDoomConfigDirectory } from './config.ts';\nimport { readDoomConfigSources } from './layeredConfig.ts';\nimport { loadPluginCatalog, pluginDirectoryForSource } from './pluginCatalog.ts';\n\nexport { DOOM_DIR } from './layeredConfig.ts';\n\nconst DOMAINS_FILE = 'domains.yaml';\nconst UNKNOWN_DOMAIN_ERROR = 'Unknown domain';\nconst UNKNOWN_PLUGIN_ERROR = 'Unknown plugin';\nconst MISSING_PLUGIN_DIRECTORY_ERROR = 'Plugin directory does not exist';\nconst DEFAULT_DOMAINS_PATH = '.doom/domains.yaml';\nconst SUPPORTED_AGENT_PLUGIN_SCHEMA = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(`${label} must be an object`);\n return value;\n}\n\nfunction assertOnlyKeys(record: Record<string, unknown>, allowed: readonly string[], label: string): void {\n const unexpected = Object.keys(record).filter((key) => !allowed.includes(key));\n if (unexpected.length > 0) throw new Error(`${label} contains unsupported field \"${unexpected[0]}\"`);\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} must be a non-empty string`);\n return value.trim();\n}\n\nfunction optionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n return requireString(value, label);\n}\n\nfunction parseStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array of non-empty strings`);\n return [...new Set(value.map((entry, index) => requireString(entry, `${label}[${index}]`)))];\n}\n\nfunction parseOptionalBoolean(value: unknown, label: string): boolean | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'boolean') throw new Error(`${label} must be a boolean`);\n return value;\n}\n\nfunction parseDefaultDomains(value: unknown): string[] {\n return parseStringArray(value, `defaultDomains in ${DEFAULT_DOMAINS_PATH}`);\n}\n\nfunction parseDomainPlugin(value: unknown, label: string): DomainPlugin {\n if (typeof value === 'string') return requireString(value, label);\n const plugin = requireRecord(value, label);\n assertOnlyKeys(plugin, ['name', 'skills', 'agents', 'hooks', 'mcp'], label);\n const skills = plugin.skills === undefined ? undefined : parseStringArray(plugin.skills, `${label}.skills`);\n const agents = plugin.agents === undefined ? undefined : parseStringArray(plugin.agents, `${label}.agents`);\n const hooks = parseOptionalBoolean(plugin.hooks, `${label}.hooks`);\n const mcp = parseOptionalBoolean(plugin.mcp, `${label}.mcp`);\n return {\n name: requireString(plugin.name, `${label}.name`),\n ...(skills ? { skills } : {}),\n ...(agents ? { agents } : {}),\n ...(hooks === undefined ? {} : { hooks }),\n ...(mcp === undefined ? {} : { mcp }),\n };\n}\n\nfunction parseMcpAllowlist(value: unknown, label: string): DomainMcpAllowlist {\n const mcp = requireRecord(value, label);\n assertOnlyKeys(mcp, ['servers', 'proxy'], label);\n return {\n ...(mcp.servers === undefined ? {} : { servers: parseStringArray(mcp.servers, `${label}.servers`) }),\n ...(mcp.proxy === undefined ? {} : { proxy: parseStringArray(mcp.proxy, `${label}.proxy`) }),\n };\n}\n\nfunction parseDomain(value: unknown, label: string): DomainDefinition {\n const domain = requireRecord(value, label);\n assertOnlyKeys(domain, ['description', 'plugins', 'mcp', 'sharedSkills'], label);\n const description = optionalString(domain.description, `${label}.description`);\n if (domain.plugins !== undefined && !Array.isArray(domain.plugins)) {\n throw new Error(`${label}.plugins must be an array`);\n }\n const sharedSkills = parseOptionalBoolean(domain.sharedSkills, `${label}.sharedSkills`);\n return {\n ...(description ? { description } : {}),\n ...(Array.isArray(domain.plugins)\n ? { plugins: domain.plugins.map((plugin, index) => parseDomainPlugin(plugin, `${label}.plugins[${index}]`)) }\n : {}),\n ...(domain.mcp === undefined ? {} : { mcp: parseMcpAllowlist(domain.mcp, `${label}.mcp`) }),\n ...(sharedSkills === undefined ? {} : { sharedSkills }),\n };\n}\n\nfunction parseAliases(value: unknown, label: string): Record<string, string[]> {\n if (value === undefined) return {};\n const aliases = requireRecord(value, label);\n return Object.fromEntries(\n Object.entries(aliases).map(([name, domains]) => [name, parseStringArray(domains, `${label}.${name}`)]),\n );\n}\n\n/**\n * Reads domains and plugin catalogs from global and repository configs.\n *\n * Named domains and explicit plugin entries are replaced by later repository\n * definitions. Configured roots accumulate, with exact marketplace manifests\n * deduplicated in discovery order. Explicit entries override discovered IDs.\n */\nexport function loadDomains(repoRoot: string, homeDirectory: string = os.homedir()): DomainManifest {\n const sources = readDoomConfigSources<unknown>(DOMAINS_FILE, repoRoot, homeDirectory);\n const aliases: Record<string, string[]> = {};\n const domains: Record<string, ResolvedDomain> = {};\n let defaultDomains: string[] | undefined;\n\n for (const source of sources) {\n const document = requireRecord(source.document, source.filePath);\n assertOnlyKeys(document, ['plugins', 'domains', 'aliases', 'defaultDomains'], source.filePath);\n Object.assign(aliases, parseAliases(document.aliases, `aliases in ${source.filePath}`));\n if (document.domains !== undefined) {\n const sourceDomains = requireRecord(document.domains, `domains in ${source.filePath}`);\n for (const [name, definition] of Object.entries(sourceDomains)) {\n domains[name] = {\n ...parseDomain(definition, `domains.${name} in ${source.filePath}`),\n baseDirectory: source.baseDirectory,\n };\n }\n }\n if (Object.hasOwn(document, 'defaultDomains')) defaultDomains = parseDefaultDomains(document.defaultDomains);\n }\n\n const plugins = loadPluginCatalog(\n sources.map((source) => ({\n filePath: source.filePath,\n baseDirectory: source.baseDirectory,\n value: requireRecord(source.document, source.filePath).plugins,\n })),\n repoRoot,\n homeDirectory,\n );\n\n if (defaultDomains) {\n for (const name of expandDomainNames({ plugins, domains, aliases }, defaultDomains)) {\n if (!Object.hasOwn(domains, name)) {\n throw new Error(`Unknown default domain \"${name}\" in ${DEFAULT_DOMAINS_PATH}`);\n }\n }\n }\n return { plugins, domains, aliases, ...(defaultDomains ? { defaultDomains } : {}) };\n}\n\nexport function listDomainNames(repoRoot: string, homeDirectory?: string): string[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n return [...new Set([...Object.keys(manifest.domains), ...Object.keys(manifest.aliases)])].sort();\n}\n\n/**\n * Whether to include .claude/skills as shared fallbacks.\n *\n * Shared skills are included unless every selected domain opts out, so mixing a\n * trimmed domain with an untrimmed one cannot strip the untrimmed one's skills.\n */\nexport function resolveSharedSkills(repoRoot: string, domainNames: string[], homeDirectory?: string): boolean {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return true;\n return expanded.some((name) => manifest.domains[name]?.sharedSkills !== false);\n}\n\n/** Resolves named domain plugins while preserving each subset filter. */\nexport function resolvePluginEntries(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory: string = os.homedir(),\n): PluginEntry[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const entries: PluginEntry[] = [];\n const seen = new Set<string>();\n const homeDoomDirectory = globalDoomConfigDirectory(homeDirectory);\n\n for (const domainName of expandDomainNames(manifest, domainNames)) {\n const domain = manifest.domains[domainName];\n if (!domain) throw new Error(`${UNKNOWN_DOMAIN_ERROR}: ${domainName}`);\n for (const selection of domain.plugins ?? []) {\n const isSubset = typeof selection !== 'string';\n const pluginName = isSubset ? selection.name : selection;\n const plugin = manifest.plugins.entries[pluginName];\n if (!plugin) throw new Error(`${UNKNOWN_PLUGIN_ERROR} \"${pluginName}\" referenced by domain \"${domainName}\"`);\n const directory = pluginDirectoryForSource(plugin.source, homeDoomDirectory);\n if (plugin.source.type === 'local' && (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory())) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: pluginName,\n directory,\n source: plugin.source,\n ...(plugin.manifest ? { manifest: plugin.manifest } : {}),\n ...(plugin.manifest?.agentPluginSchema === SUPPORTED_AGENT_PLUGIN_SCHEMA\n ? { skillDiscovery: 'direct-children' as const }\n : {}),\n ...(isSubset && selection.skills ? { skills: selection.skills } : {}),\n ...(isSubset && selection.agents ? { agents: selection.agents } : {}),\n ...(isSubset && selection.hooks !== undefined ? { hooks: selection.hooks } : {}),\n ...(isSubset && selection.mcp !== undefined ? { mcp: selection.mcp } : {}),\n });\n }\n }\n\n for (const configuredDirectory of explicitDirectories) {\n const directory = path.resolve(configuredDirectory);\n if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: path.basename(directory),\n directory,\n source: { type: 'local', path: directory },\n });\n }\n return entries;\n}\n\nexport function resolvePluginDirectories(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory?: string,\n): string[] {\n return resolvePluginEntries(repoRoot, domainNames, explicitDirectories, homeDirectory).map(\n (entry) => entry.directory,\n );\n}\n\nexport const DOOMPI_DOMAINS_ENV = 'DOOMPI_DOMAINS';\nexport const DEFAULT_DOMAIN = 'default';\nconst MARKETING_MAJOR_MODE = 'marketing';\n\nfunction parseDomainList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\n/**\n * Domains selected when the caller names none.\n *\n * Configuration keeps this axis independent of the major mode. The\n * major-mode-derived choice is retained only as the compatibility fallback for\n * domains files that declare no defaultDomains.\n */\nexport function defaultDomainsForMajorMode(\n majorMode: string,\n environment: NodeJS.ProcessEnv,\n defaultDomains?: readonly string[],\n): string[] {\n const inherited = environment[DOOMPI_DOMAINS_ENV];\n // An explicitly empty variable means no domains, so this tests for the key\n // rather than for a truthy value.\n if (inherited !== undefined) return parseDomainList(inherited);\n if (defaultDomains !== undefined) return [...defaultDomains];\n return parseDomainList(majorMode === MARKETING_MAJOR_MODE ? MARKETING_MAJOR_MODE : DEFAULT_DOMAIN);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"domains.mjs","names":[],"sources":["../../src/adapters/domains.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { expandDomainNames } from '../services/domains.ts';\nimport type {\n DomainDefinition,\n DomainManifest,\n DomainMcpAllowlist,\n DomainPlugin,\n PluginEntry,\n ResolvedDomain,\n} from '../types/domains.ts';\nimport { globalDoomConfigDirectory } from './config.ts';\nimport { readDoomConfigSources } from './layeredConfig.ts';\nimport { loadPluginCatalog, pluginDirectoryForSource } from './pluginCatalog.ts';\n\nexport { DOOM_DIR } from './layeredConfig.ts';\n\nconst DOMAINS_FILE = 'domains.yaml';\nconst UNKNOWN_DOMAIN_ERROR = 'Unknown domain';\nconst UNKNOWN_PLUGIN_ERROR = 'Unknown plugin';\nconst MISSING_PLUGIN_DIRECTORY_ERROR = 'Plugin directory does not exist';\nconst DEFAULT_DOMAINS_PATH = '.doom/domains.yaml';\nconst SUPPORTED_AGENT_PLUGIN_SCHEMA = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requireRecord(value: unknown, label: string): Record<string, unknown> {\n if (!isRecord(value)) throw new Error(`${label} must be an object`);\n return value;\n}\n\nfunction assertOnlyKeys(record: Record<string, unknown>, allowed: readonly string[], label: string): void {\n const unexpected = Object.keys(record).filter((key) => !allowed.includes(key));\n if (unexpected.length > 0) throw new Error(`${label} contains unsupported field \"${unexpected[0]}\"`);\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== 'string' || !value.trim()) throw new Error(`${label} must be a non-empty string`);\n return value.trim();\n}\n\nfunction optionalString(value: unknown, label: string): string | undefined {\n if (value === undefined) return undefined;\n return requireString(value, label);\n}\n\nfunction parseStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value)) throw new Error(`${label} must be an array of non-empty strings`);\n return [...new Set(value.map((entry, index) => requireString(entry, `${label}[${index}]`)))];\n}\n\nfunction parseOptionalBoolean(value: unknown, label: string): boolean | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'boolean') throw new Error(`${label} must be a boolean`);\n return value;\n}\n\nfunction parseDefaultDomains(value: unknown): string[] {\n return parseStringArray(value, `defaultDomains in ${DEFAULT_DOMAINS_PATH}`);\n}\n\nfunction parseDomainPlugin(value: unknown, label: string): DomainPlugin {\n if (typeof value === 'string') return requireString(value, label);\n const plugin = requireRecord(value, label);\n assertOnlyKeys(plugin, ['name', 'skills', 'agents', 'hooks', 'mcp'], label);\n const skills = plugin.skills === undefined ? undefined : parseStringArray(plugin.skills, `${label}.skills`);\n const agents = plugin.agents === undefined ? undefined : parseStringArray(plugin.agents, `${label}.agents`);\n const hooks = parseOptionalBoolean(plugin.hooks, `${label}.hooks`);\n const mcp = parseOptionalBoolean(plugin.mcp, `${label}.mcp`);\n return {\n name: requireString(plugin.name, `${label}.name`),\n ...(skills ? { skills } : {}),\n ...(agents ? { agents } : {}),\n ...(hooks === undefined ? {} : { hooks }),\n ...(mcp === undefined ? {} : { mcp }),\n };\n}\n\nfunction parseMcpAllowlist(value: unknown, label: string): DomainMcpAllowlist {\n const mcp = requireRecord(value, label);\n assertOnlyKeys(mcp, ['servers', 'proxy'], label);\n return {\n ...(mcp.servers === undefined ? {} : { servers: parseStringArray(mcp.servers, `${label}.servers`) }),\n ...(mcp.proxy === undefined ? {} : { proxy: parseStringArray(mcp.proxy, `${label}.proxy`) }),\n };\n}\n\nfunction parseDomain(value: unknown, label: string): DomainDefinition {\n const domain = requireRecord(value, label);\n assertOnlyKeys(domain, ['description', 'plugins', 'mcp', 'sharedSkills'], label);\n const description = optionalString(domain.description, `${label}.description`);\n if (domain.plugins !== undefined && !Array.isArray(domain.plugins)) {\n throw new Error(`${label}.plugins must be an array`);\n }\n const sharedSkills = parseOptionalBoolean(domain.sharedSkills, `${label}.sharedSkills`);\n return {\n ...(description ? { description } : {}),\n ...(Array.isArray(domain.plugins)\n ? { plugins: domain.plugins.map((plugin, index) => parseDomainPlugin(plugin, `${label}.plugins[${index}]`)) }\n : {}),\n ...(domain.mcp === undefined ? {} : { mcp: parseMcpAllowlist(domain.mcp, `${label}.mcp`) }),\n ...(sharedSkills === undefined ? {} : { sharedSkills }),\n };\n}\n\nfunction parseAliases(value: unknown, label: string): Record<string, string[]> {\n if (value === undefined) return {};\n const aliases = requireRecord(value, label);\n return Object.fromEntries(\n Object.entries(aliases).map(([name, domains]) => [name, parseStringArray(domains, `${label}.${name}`)]),\n );\n}\n\n/**\n * Reads domains and plugin catalogs from global and repository configs.\n *\n * Named domains and explicit plugin entries are replaced by later repository\n * definitions. Configured roots accumulate, with exact marketplace manifests\n * deduplicated in discovery order. Explicit entries override discovered IDs.\n */\nexport function loadDomains(repoRoot: string, homeDirectory: string = os.homedir()): DomainManifest {\n const sources = readDoomConfigSources<unknown>(DOMAINS_FILE, repoRoot, homeDirectory);\n const aliases: Record<string, string[]> = {};\n const domains: Record<string, ResolvedDomain> = {};\n let defaultDomains: string[] | undefined;\n\n for (const source of sources) {\n const document = requireRecord(source.document, source.filePath);\n assertOnlyKeys(document, ['plugins', 'domains', 'aliases', 'defaultDomains'], source.filePath);\n Object.assign(aliases, parseAliases(document.aliases, `aliases in ${source.filePath}`));\n if (document.domains !== undefined) {\n const sourceDomains = requireRecord(document.domains, `domains in ${source.filePath}`);\n for (const [name, definition] of Object.entries(sourceDomains)) {\n domains[name] = {\n ...parseDomain(definition, `domains.${name} in ${source.filePath}`),\n baseDirectory: source.baseDirectory,\n };\n }\n }\n if (Object.hasOwn(document, 'defaultDomains')) defaultDomains = parseDefaultDomains(document.defaultDomains);\n }\n\n const plugins = loadPluginCatalog(\n sources.map((source) => ({\n filePath: source.filePath,\n baseDirectory: source.baseDirectory,\n value: requireRecord(source.document, source.filePath).plugins,\n })),\n repoRoot,\n homeDirectory,\n );\n\n if (defaultDomains) {\n for (const name of expandDomainNames({ plugins, domains, aliases }, defaultDomains)) {\n if (!Object.hasOwn(domains, name)) {\n throw new Error(`Unknown default domain \"${name}\" in ${DEFAULT_DOMAINS_PATH}`);\n }\n }\n }\n return { plugins, domains, aliases, ...(defaultDomains ? { defaultDomains } : {}) };\n}\n\nexport function listDomainNames(repoRoot: string, homeDirectory?: string): string[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n return [...new Set([...Object.keys(manifest.domains), ...Object.keys(manifest.aliases)])].sort();\n}\n\n/**\n * Whether to include .claude/skills as shared fallbacks.\n *\n * Shared skills are included unless every selected domain opts out, so mixing a\n * trimmed domain with an untrimmed one cannot strip the untrimmed one's skills.\n */\nexport function resolveSharedSkills(repoRoot: string, domainNames: string[], homeDirectory?: string): boolean {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return true;\n return expanded.some((name) => manifest.domains[name]?.sharedSkills !== false);\n}\n\n/** Resolves named domain plugins while preserving each subset filter. */\nexport function resolvePluginEntries(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory: string = os.homedir(),\n): PluginEntry[] {\n const manifest = loadDomains(repoRoot, homeDirectory);\n const entries: PluginEntry[] = [];\n const seen = new Set<string>();\n const homeDoomDirectory = globalDoomConfigDirectory(homeDirectory);\n\n for (const domainName of expandDomainNames(manifest, domainNames)) {\n const domain = manifest.domains[domainName];\n if (!domain) throw new Error(`${UNKNOWN_DOMAIN_ERROR}: ${domainName}`);\n for (const selection of domain.plugins ?? []) {\n const isSubset = typeof selection !== 'string';\n const pluginName = isSubset ? selection.name : selection;\n const plugin = manifest.plugins.entries[pluginName];\n if (!plugin) throw new Error(`${UNKNOWN_PLUGIN_ERROR} \"${pluginName}\" referenced by domain \"${domainName}\"`);\n const directory = pluginDirectoryForSource(plugin.source, homeDoomDirectory);\n if (plugin.source.type === 'local' && (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory())) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: pluginName,\n directory,\n // The domain is only in scope here. `resolvePluginDirectories` keeps\n // just the path, so anything downstream that wants to say which domain\n // brought a plugin has to be told now or not at all.\n domain: domainName,\n source: plugin.source,\n ...(plugin.manifest ? { manifest: plugin.manifest } : {}),\n ...(plugin.manifest?.agentPluginSchema === SUPPORTED_AGENT_PLUGIN_SCHEMA\n ? { skillDiscovery: 'direct-children' as const }\n : {}),\n ...(isSubset && selection.skills ? { skills: selection.skills } : {}),\n ...(isSubset && selection.agents ? { agents: selection.agents } : {}),\n ...(isSubset && selection.hooks !== undefined ? { hooks: selection.hooks } : {}),\n ...(isSubset && selection.mcp !== undefined ? { mcp: selection.mcp } : {}),\n });\n }\n }\n\n for (const configuredDirectory of explicitDirectories) {\n const directory = path.resolve(configuredDirectory);\n if (!fs.existsSync(directory) || !fs.statSync(directory).isDirectory()) {\n throw new Error(`${MISSING_PLUGIN_DIRECTORY_ERROR}: ${directory}`);\n }\n if (seen.has(directory)) continue;\n seen.add(directory);\n entries.push({\n name: path.basename(directory),\n directory,\n source: { type: 'local', path: directory },\n });\n }\n return entries;\n}\n\nexport function resolvePluginDirectories(\n repoRoot: string,\n domainNames: string[],\n explicitDirectories: string[],\n homeDirectory?: string,\n): string[] {\n return resolvePluginEntries(repoRoot, domainNames, explicitDirectories, homeDirectory).map(\n (entry) => entry.directory,\n );\n}\n\nexport const DOOMPI_DOMAINS_ENV = 'DOOMPI_DOMAINS';\nexport const DEFAULT_DOMAIN = 'default';\nconst MARKETING_MAJOR_MODE = 'marketing';\n\nfunction parseDomainList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n\n/**\n * Domains selected when the caller names none.\n *\n * Configuration keeps this axis independent of the major mode. The\n * major-mode-derived choice is retained only as the compatibility fallback for\n * domains files that declare no defaultDomains.\n */\nexport function defaultDomainsForMajorMode(\n majorMode: string,\n environment: NodeJS.ProcessEnv,\n defaultDomains?: readonly string[],\n): string[] {\n const inherited = environment[DOOMPI_DOMAINS_ENV];\n // An explicitly empty variable means no domains, so this tests for the key\n // rather than for a truthy value.\n if (inherited !== undefined) return parseDomainList(inherited);\n if (defaultDomains !== undefined) return [...defaultDomains];\n return parseDomainList(majorMode === MARKETING_MAJOR_MODE ? MARKETING_MAJOR_MODE : DEFAULT_DOMAIN);\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:path");t=e.__toESM(t,1);const n=new Set([`profileEnvironment`,`pluginHooks`,`mcpProjection`]),r={root:`DOOMPI_ROOT`,majorMode:`DOOMPI_MAJOR_MODE`,temporaryDirectory:`DOOMPI_TEMP_DIR`,domains:`DOOMPI_DOMAINS`,layers:`DOOMPI_LAYERS`,compositionFingerprint:`DOOMPI_COMPOSITION_FINGERPRINT`,profile:`DOOMPI_PROFILE`,profileEnvironment:`DOOMPI_PROFILE_ENV`,hookGroups:`DOOMPI_HOOK_GROUPS`,skillDirectories:`DOOMPI_SKILL_DIRS`,agentDirectories:`DOOMPI_AGENT_DIRS`,additionalDirectories:`DOOMPI_ADDITIONAL_DIRS`,childExtensions:`DOOMPI_CHILD_EXTENSIONS`,pluginDirectories:`DOOMPI_PLUGIN_DIRS`,pluginHooks:`DOOMPI_PLUGIN_HOOKS`,mcpConfigPath:`DOOMPI_MCP_CONFIG`,personaFile:`DOOMPI_PERSONA_FILE`,hooks:`DOOMPI_HOOKS_ENABLED`,agents:`DOOMPI_AGENTS_ENABLED`,mcp:`DOOMPI_MCP_ENABLED`,allowProtectedWrites:`DOOMPI_ALLOW_PROTECTED_WRITES`};function i(e){return e?.split(`,`).map(e=>e.trim()).filter(Boolean)??[]}function a(e){return e?.split(t.default.delimiter).map(e=>e.trim()).filter(Boolean)??[]}function o(e){return e!==`0`}function s(e,t,n){if(!e)return{};try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]==`string`))}catch(e){return n?.(t,e),{}}}function c(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch(e){return n?.(t,e),[]}}function l(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.pluginRoot==`string`&&typeof e.configPath==`string`):[]}catch(e){return n?.(t,e),[]}}function u(e=process.env,t){let n=r,u=e[n.hookGroups];return{root:e[n.root]||void 0,majorMode:e[n.majorMode]||`copilot`,temporaryDirectory:e[n.temporaryDirectory]||void 0,domains:i(e[n.domains]),layers:i(e[n.layers]),compositionFingerprint:e[n.compositionFingerprint]||void 0,profile:e[n.profile]||void 0,profileEnvironment:s(e[n.profileEnvironment],n.profileEnvironment,t),hookGroups:u===void 0?void 0:i(u),skillDirectories:a(e[n.skillDirectories]),agentDirectories:a(e[n.agentDirectories]),additionalDirectories:a(e[n.additionalDirectories]),childExtensions:c(e[n.childExtensions],n.childExtensions,t),pluginDirectories:a(e[n.pluginDirectories]),pluginHooks:l(e[n.pluginHooks],n.pluginHooks,t),mcpConfigPath:e[n.mcpConfigPath]||void 0,personaFile:e[n.personaFile]||void 0,hooks:o(e[n.hooks]),agents:o(e[n.agents]),mcp:o(e[n.mcp]),allowProtectedWrites:o(e[n.allowProtectedWrites])}}function d(e,n=process.env){let i=(e,t)=>{t===void 0?delete n[e]:n[e]=t},a=(e,t)=>i(e,t?`1`:`0`),o=r;return`root`in e&&i(o.root,e.root),`majorMode`in e&&i(o.majorMode,e.majorMode),`temporaryDirectory`in e&&i(o.temporaryDirectory,e.temporaryDirectory),`domains`in e&&i(o.domains,e.domains?.join(`,`)),`layers`in e&&i(o.layers,e.layers?.join(`,`)),`compositionFingerprint`in e&&i(o.compositionFingerprint,e.compositionFingerprint),`profile`in e&&i(o.profile,e.profile),`hookGroups`in e&&i(o.hookGroups,e.hookGroups?.join(`,`)),`skillDirectories`in e&&i(o.skillDirectories,e.skillDirectories?.join(t.default.delimiter)),`agentDirectories`in e&&i(o.agentDirectories,e.agentDirectories?.join(t.default.delimiter)),`additionalDirectories`in e&&i(o.additionalDirectories,e.additionalDirectories?.join(t.default.delimiter)),`childExtensions`in e&&i(o.childExtensions,JSON.stringify(e.childExtensions??[])),`pluginDirectories`in e&&i(o.pluginDirectories,e.pluginDirectories?.join(t.default.delimiter)),`mcpConfigPath`in e&&i(o.mcpConfigPath,e.mcpConfigPath),`personaFile`in e&&i(o.personaFile,e.personaFile),e.hooks!==void 0&&a(o.hooks,e.hooks),e.agents!==void 0&&a(o.agents,e.agents),e.mcp!==void 0&&a(o.mcp,e.mcp),e.allowProtectedWrites!==void 0&&a(o.allowProtectedWrites,e.allowProtectedWrites),n}exports.FILE_ONLY_STATE_FIELDS=n,exports.HARNESS_STATE_KEYS=r,exports.projectHarnessEnvironment=d,exports.readHarnessState=u;
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:path");t=e.__toESM(t,1);const n=new Set([`profileEnvironment`,`pluginHooks`,`mcpProjection`,`packageAttribution`]),r={root:`DOOMPI_ROOT`,majorMode:`DOOMPI_MAJOR_MODE`,temporaryDirectory:`DOOMPI_TEMP_DIR`,domains:`DOOMPI_DOMAINS`,layers:`DOOMPI_LAYERS`,compositionFingerprint:`DOOMPI_COMPOSITION_FINGERPRINT`,profile:`DOOMPI_PROFILE`,profileEnvironment:`DOOMPI_PROFILE_ENV`,hookGroups:`DOOMPI_HOOK_GROUPS`,skillDirectories:`DOOMPI_SKILL_DIRS`,agentDirectories:`DOOMPI_AGENT_DIRS`,additionalDirectories:`DOOMPI_ADDITIONAL_DIRS`,childExtensions:`DOOMPI_CHILD_EXTENSIONS`,pluginDirectories:`DOOMPI_PLUGIN_DIRS`,pluginHooks:`DOOMPI_PLUGIN_HOOKS`,mcpConfigPath:`DOOMPI_MCP_CONFIG`,personaFile:`DOOMPI_PERSONA_FILE`,hooks:`DOOMPI_HOOKS_ENABLED`,agents:`DOOMPI_AGENTS_ENABLED`,mcp:`DOOMPI_MCP_ENABLED`,allowProtectedWrites:`DOOMPI_ALLOW_PROTECTED_WRITES`};function i(e){return e?.split(`,`).map(e=>e.trim()).filter(Boolean)??[]}function a(e){return e?.split(t.default.delimiter).map(e=>e.trim()).filter(Boolean)??[]}function o(e){return e!==`0`}function s(e,t,n){if(!e)return{};try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]==`string`))}catch(e){return n?.(t,e),{}}}function c(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch(e){return n?.(t,e),[]}}function l(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.pluginRoot==`string`&&typeof e.configPath==`string`):[]}catch(e){return n?.(t,e),[]}}function u(e=process.env,t){let n=r,u=e[n.hookGroups];return{root:e[n.root]||void 0,majorMode:e[n.majorMode]||`copilot`,temporaryDirectory:e[n.temporaryDirectory]||void 0,domains:i(e[n.domains]),layers:i(e[n.layers]),compositionFingerprint:e[n.compositionFingerprint]||void 0,profile:e[n.profile]||void 0,profileEnvironment:s(e[n.profileEnvironment],n.profileEnvironment,t),hookGroups:u===void 0?void 0:i(u),skillDirectories:a(e[n.skillDirectories]),agentDirectories:a(e[n.agentDirectories]),additionalDirectories:a(e[n.additionalDirectories]),childExtensions:c(e[n.childExtensions],n.childExtensions,t),pluginDirectories:a(e[n.pluginDirectories]),pluginHooks:l(e[n.pluginHooks],n.pluginHooks,t),mcpConfigPath:e[n.mcpConfigPath]||void 0,personaFile:e[n.personaFile]||void 0,hooks:o(e[n.hooks]),agents:o(e[n.agents]),mcp:o(e[n.mcp]),allowProtectedWrites:o(e[n.allowProtectedWrites])}}function d(e,n=process.env){let i=(e,t)=>{t===void 0?delete n[e]:n[e]=t},a=(e,t)=>i(e,t?`1`:`0`),o=r;return`root`in e&&i(o.root,e.root),`majorMode`in e&&i(o.majorMode,e.majorMode),`temporaryDirectory`in e&&i(o.temporaryDirectory,e.temporaryDirectory),`domains`in e&&i(o.domains,e.domains?.join(`,`)),`layers`in e&&i(o.layers,e.layers?.join(`,`)),`compositionFingerprint`in e&&i(o.compositionFingerprint,e.compositionFingerprint),`profile`in e&&i(o.profile,e.profile),`hookGroups`in e&&i(o.hookGroups,e.hookGroups?.join(`,`)),`skillDirectories`in e&&i(o.skillDirectories,e.skillDirectories?.join(t.default.delimiter)),`agentDirectories`in e&&i(o.agentDirectories,e.agentDirectories?.join(t.default.delimiter)),`additionalDirectories`in e&&i(o.additionalDirectories,e.additionalDirectories?.join(t.default.delimiter)),`childExtensions`in e&&i(o.childExtensions,JSON.stringify(e.childExtensions??[])),`pluginDirectories`in e&&i(o.pluginDirectories,e.pluginDirectories?.join(t.default.delimiter)),`mcpConfigPath`in e&&i(o.mcpConfigPath,e.mcpConfigPath),`personaFile`in e&&i(o.personaFile,e.personaFile),e.hooks!==void 0&&a(o.hooks,e.hooks),e.agents!==void 0&&a(o.agents,e.agents),e.mcp!==void 0&&a(o.mcp,e.mcp),e.allowProtectedWrites!==void 0&&a(o.allowProtectedWrites,e.allowProtectedWrites),n}exports.FILE_ONLY_STATE_FIELDS=n,exports.HARNESS_STATE_KEYS=r,exports.projectHarnessEnvironment=d,exports.readHarnessState=u;
|
|
2
2
|
//# sourceMappingURL=harnessState.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnessState.cjs","names":["path"],"sources":["../../src/adapters/harnessState.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessState, PluginHookSource } from '../types/config.ts';\n\n/**\n * The codec between harness state and the environment.\n *\n * Decoding exists for processes that were started without a state file: a\n * nested run, a third-party spawn, or anything older than the store. Encoding\n * exists because bash hooks, the shell launchers, and packages that do not\n * depend on this one can only read an environment. Ownership, persistence and\n * mutation belong to harnessStore.ts; nothing here touches disk or holds state.\n */\n\nconst DEFAULT_MAJOR_MODE = 'copilot';\nconst DISABLED_FLAG = '0';\n\n/**\n * State that lives in the file only.\n *\n * These are JSON documents that every spawned process and every hook would\n * otherwise copy in its environment. The plugin hook list and profile defaults\n * are read from the store, while Config publishes the MCP projection through\n * the session-scoped Cordis registry.\n */\nexport const FILE_ONLY_STATE_FIELDS: ReadonlySet<keyof HarnessState> = new Set([\n 'profileEnvironment',\n 'pluginHooks',\n 'mcpProjection',\n]);\n\nexport type HarnessStateParseReporter = (key: string, error: unknown) => void;\n\nexport const HARNESS_STATE_KEYS = {\n root: 'DOOMPI_ROOT',\n majorMode: 'DOOMPI_MAJOR_MODE',\n temporaryDirectory: 'DOOMPI_TEMP_DIR',\n domains: 'DOOMPI_DOMAINS',\n layers: 'DOOMPI_LAYERS',\n compositionFingerprint: 'DOOMPI_COMPOSITION_FINGERPRINT',\n profile: 'DOOMPI_PROFILE',\n profileEnvironment: 'DOOMPI_PROFILE_ENV',\n hookGroups: 'DOOMPI_HOOK_GROUPS',\n skillDirectories: 'DOOMPI_SKILL_DIRS',\n agentDirectories: 'DOOMPI_AGENT_DIRS',\n additionalDirectories: 'DOOMPI_ADDITIONAL_DIRS',\n childExtensions: 'DOOMPI_CHILD_EXTENSIONS',\n pluginDirectories: 'DOOMPI_PLUGIN_DIRS',\n pluginHooks: 'DOOMPI_PLUGIN_HOOKS',\n mcpConfigPath: 'DOOMPI_MCP_CONFIG',\n personaFile: 'DOOMPI_PERSONA_FILE',\n hooks: 'DOOMPI_HOOKS_ENABLED',\n agents: 'DOOMPI_AGENTS_ENABLED',\n mcp: 'DOOMPI_MCP_ENABLED',\n allowProtectedWrites: 'DOOMPI_ALLOW_PROTECTED_WRITES',\n} as const;\n\nfunction splitCsv(value: string | undefined): string[] {\n return (\n value\n ?.split(',')\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction splitPaths(value: string | undefined): string[] {\n return (\n value\n ?.split(path.delimiter)\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction parseFlag(value: string | undefined): boolean {\n return value !== DISABLED_FLAG;\n}\n\nfunction parseStringRecord(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): Record<string, string> {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return {};\n return Object.fromEntries(\n Object.entries(parsed).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n } catch (error) {\n report?.(key, error);\n return {};\n }\n}\n\nfunction parseStringList(value: string | undefined, key: string, report?: HarnessStateParseReporter): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nfunction parsePluginHooks(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): PluginHookSource[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (item): item is PluginHookSource =>\n typeof item === 'object' &&\n item !== null &&\n typeof (item as PluginHookSource).pluginRoot === 'string' &&\n typeof (item as PluginHookSource).configPath === 'string',\n );\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessStateParseReporter,\n): HarnessState {\n const keys = HARNESS_STATE_KEYS;\n const hookGroups = environment[keys.hookGroups];\n return {\n root: environment[keys.root] || undefined,\n majorMode: environment[keys.majorMode] || DEFAULT_MAJOR_MODE,\n temporaryDirectory: environment[keys.temporaryDirectory] || undefined,\n domains: splitCsv(environment[keys.domains]),\n layers: splitCsv(environment[keys.layers]),\n compositionFingerprint: environment[keys.compositionFingerprint] || undefined,\n profile: environment[keys.profile] || undefined,\n profileEnvironment: parseStringRecord(environment[keys.profileEnvironment], keys.profileEnvironment, report),\n hookGroups: hookGroups === undefined ? undefined : splitCsv(hookGroups),\n skillDirectories: splitPaths(environment[keys.skillDirectories]),\n agentDirectories: splitPaths(environment[keys.agentDirectories]),\n additionalDirectories: splitPaths(environment[keys.additionalDirectories]),\n childExtensions: parseStringList(environment[keys.childExtensions], keys.childExtensions, report),\n pluginDirectories: splitPaths(environment[keys.pluginDirectories]),\n pluginHooks: parsePluginHooks(environment[keys.pluginHooks], keys.pluginHooks, report),\n mcpConfigPath: environment[keys.mcpConfigPath] || undefined,\n personaFile: environment[keys.personaFile] || undefined,\n hooks: parseFlag(environment[keys.hooks]),\n agents: parseFlag(environment[keys.agents]),\n mcp: parseFlag(environment[keys.mcp]),\n allowProtectedWrites: parseFlag(environment[keys.allowProtectedWrites]),\n };\n}\n\n/**\n * Publishes a state patch into an environment.\n *\n * Takes the environment rather than assuming `process.env`, because the\n * launcher builds a child environment and Doom Team builds a spawn snapshot;\n * neither should mutate its own process to describe another one.\n *\n * Fields in FILE_ONLY_FIELDS are skipped: the file carries them, and a reader\n * that needs them reads the store.\n */\nexport function projectHarnessEnvironment(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const assign = (key: string, value: string | undefined): void => {\n if (value === undefined) delete environment[key];\n else environment[key] = value;\n };\n const assignFlag = (key: string, value: boolean): void => assign(key, value ? '1' : DISABLED_FLAG);\n const keys = HARNESS_STATE_KEYS;\n\n if ('root' in patch) assign(keys.root, patch.root);\n if ('majorMode' in patch) assign(keys.majorMode, patch.majorMode);\n if ('temporaryDirectory' in patch) assign(keys.temporaryDirectory, patch.temporaryDirectory);\n if ('domains' in patch) assign(keys.domains, patch.domains?.join(','));\n if ('layers' in patch) assign(keys.layers, patch.layers?.join(','));\n if ('compositionFingerprint' in patch) assign(keys.compositionFingerprint, patch.compositionFingerprint);\n if ('profile' in patch) assign(keys.profile, patch.profile);\n if ('hookGroups' in patch) assign(keys.hookGroups, patch.hookGroups?.join(','));\n if ('skillDirectories' in patch) assign(keys.skillDirectories, patch.skillDirectories?.join(path.delimiter));\n if ('agentDirectories' in patch) assign(keys.agentDirectories, patch.agentDirectories?.join(path.delimiter));\n if ('additionalDirectories' in patch) {\n assign(keys.additionalDirectories, patch.additionalDirectories?.join(path.delimiter));\n }\n if ('childExtensions' in patch) assign(keys.childExtensions, JSON.stringify(patch.childExtensions ?? []));\n if ('pluginDirectories' in patch) assign(keys.pluginDirectories, patch.pluginDirectories?.join(path.delimiter));\n if ('mcpConfigPath' in patch) assign(keys.mcpConfigPath, patch.mcpConfigPath);\n if ('personaFile' in patch) assign(keys.personaFile, patch.personaFile);\n if (patch.hooks !== undefined) assignFlag(keys.hooks, patch.hooks);\n if (patch.agents !== undefined) assignFlag(keys.agents, patch.agents);\n if (patch.mcp !== undefined) assignFlag(keys.mcp, patch.mcp);\n if (patch.allowProtectedWrites !== undefined) assignFlag(keys.allowProtectedWrites, patch.allowProtectedWrites);\n return environment;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"harnessState.cjs","names":["path"],"sources":["../../src/adapters/harnessState.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessState, PluginHookSource } from '../types/config.ts';\n\n/**\n * The codec between harness state and the environment.\n *\n * Decoding exists for processes that were started without a state file: a\n * nested run, a third-party spawn, or anything older than the store. Encoding\n * exists because bash hooks, the shell launchers, and packages that do not\n * depend on this one can only read an environment. Ownership, persistence and\n * mutation belong to harnessStore.ts; nothing here touches disk or holds state.\n */\n\nconst DEFAULT_MAJOR_MODE = 'copilot';\nconst DISABLED_FLAG = '0';\n\n/**\n * State that lives in the file only.\n *\n * These are JSON documents that every spawned process and every hook would\n * otherwise copy in its environment. The plugin hook list and profile defaults\n * are read from the store, while Config publishes the MCP projection through\n * the session-scoped Cordis registry.\n */\nexport const FILE_ONLY_STATE_FIELDS: ReadonlySet<keyof HarnessState> = new Set([\n 'profileEnvironment',\n 'pluginHooks',\n 'mcpProjection',\n // One entry per composed package. Nothing that spawns a process needs it,\n // and putting a map that size in front of every exec would cost far more\n // than the one surface that reads it is worth.\n 'packageAttribution',\n]);\n\nexport type HarnessStateParseReporter = (key: string, error: unknown) => void;\n\nexport const HARNESS_STATE_KEYS = {\n root: 'DOOMPI_ROOT',\n majorMode: 'DOOMPI_MAJOR_MODE',\n temporaryDirectory: 'DOOMPI_TEMP_DIR',\n domains: 'DOOMPI_DOMAINS',\n layers: 'DOOMPI_LAYERS',\n compositionFingerprint: 'DOOMPI_COMPOSITION_FINGERPRINT',\n profile: 'DOOMPI_PROFILE',\n profileEnvironment: 'DOOMPI_PROFILE_ENV',\n hookGroups: 'DOOMPI_HOOK_GROUPS',\n skillDirectories: 'DOOMPI_SKILL_DIRS',\n agentDirectories: 'DOOMPI_AGENT_DIRS',\n additionalDirectories: 'DOOMPI_ADDITIONAL_DIRS',\n childExtensions: 'DOOMPI_CHILD_EXTENSIONS',\n pluginDirectories: 'DOOMPI_PLUGIN_DIRS',\n pluginHooks: 'DOOMPI_PLUGIN_HOOKS',\n mcpConfigPath: 'DOOMPI_MCP_CONFIG',\n personaFile: 'DOOMPI_PERSONA_FILE',\n hooks: 'DOOMPI_HOOKS_ENABLED',\n agents: 'DOOMPI_AGENTS_ENABLED',\n mcp: 'DOOMPI_MCP_ENABLED',\n allowProtectedWrites: 'DOOMPI_ALLOW_PROTECTED_WRITES',\n} as const;\n\nfunction splitCsv(value: string | undefined): string[] {\n return (\n value\n ?.split(',')\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction splitPaths(value: string | undefined): string[] {\n return (\n value\n ?.split(path.delimiter)\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction parseFlag(value: string | undefined): boolean {\n return value !== DISABLED_FLAG;\n}\n\nfunction parseStringRecord(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): Record<string, string> {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return {};\n return Object.fromEntries(\n Object.entries(parsed).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n } catch (error) {\n report?.(key, error);\n return {};\n }\n}\n\nfunction parseStringList(value: string | undefined, key: string, report?: HarnessStateParseReporter): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nfunction parsePluginHooks(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): PluginHookSource[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (item): item is PluginHookSource =>\n typeof item === 'object' &&\n item !== null &&\n typeof (item as PluginHookSource).pluginRoot === 'string' &&\n typeof (item as PluginHookSource).configPath === 'string',\n );\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessStateParseReporter,\n): HarnessState {\n const keys = HARNESS_STATE_KEYS;\n const hookGroups = environment[keys.hookGroups];\n return {\n root: environment[keys.root] || undefined,\n majorMode: environment[keys.majorMode] || DEFAULT_MAJOR_MODE,\n temporaryDirectory: environment[keys.temporaryDirectory] || undefined,\n domains: splitCsv(environment[keys.domains]),\n layers: splitCsv(environment[keys.layers]),\n compositionFingerprint: environment[keys.compositionFingerprint] || undefined,\n profile: environment[keys.profile] || undefined,\n profileEnvironment: parseStringRecord(environment[keys.profileEnvironment], keys.profileEnvironment, report),\n hookGroups: hookGroups === undefined ? undefined : splitCsv(hookGroups),\n skillDirectories: splitPaths(environment[keys.skillDirectories]),\n agentDirectories: splitPaths(environment[keys.agentDirectories]),\n additionalDirectories: splitPaths(environment[keys.additionalDirectories]),\n childExtensions: parseStringList(environment[keys.childExtensions], keys.childExtensions, report),\n pluginDirectories: splitPaths(environment[keys.pluginDirectories]),\n pluginHooks: parsePluginHooks(environment[keys.pluginHooks], keys.pluginHooks, report),\n mcpConfigPath: environment[keys.mcpConfigPath] || undefined,\n personaFile: environment[keys.personaFile] || undefined,\n hooks: parseFlag(environment[keys.hooks]),\n agents: parseFlag(environment[keys.agents]),\n mcp: parseFlag(environment[keys.mcp]),\n allowProtectedWrites: parseFlag(environment[keys.allowProtectedWrites]),\n };\n}\n\n/**\n * Publishes a state patch into an environment.\n *\n * Takes the environment rather than assuming `process.env`, because the\n * launcher builds a child environment and Doom Team builds a spawn snapshot;\n * neither should mutate its own process to describe another one.\n *\n * Fields in FILE_ONLY_FIELDS are skipped: the file carries them, and a reader\n * that needs them reads the store.\n */\nexport function projectHarnessEnvironment(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const assign = (key: string, value: string | undefined): void => {\n if (value === undefined) delete environment[key];\n else environment[key] = value;\n };\n const assignFlag = (key: string, value: boolean): void => assign(key, value ? '1' : DISABLED_FLAG);\n const keys = HARNESS_STATE_KEYS;\n\n if ('root' in patch) assign(keys.root, patch.root);\n if ('majorMode' in patch) assign(keys.majorMode, patch.majorMode);\n if ('temporaryDirectory' in patch) assign(keys.temporaryDirectory, patch.temporaryDirectory);\n if ('domains' in patch) assign(keys.domains, patch.domains?.join(','));\n if ('layers' in patch) assign(keys.layers, patch.layers?.join(','));\n if ('compositionFingerprint' in patch) assign(keys.compositionFingerprint, patch.compositionFingerprint);\n if ('profile' in patch) assign(keys.profile, patch.profile);\n if ('hookGroups' in patch) assign(keys.hookGroups, patch.hookGroups?.join(','));\n if ('skillDirectories' in patch) assign(keys.skillDirectories, patch.skillDirectories?.join(path.delimiter));\n if ('agentDirectories' in patch) assign(keys.agentDirectories, patch.agentDirectories?.join(path.delimiter));\n if ('additionalDirectories' in patch) {\n assign(keys.additionalDirectories, patch.additionalDirectories?.join(path.delimiter));\n }\n if ('childExtensions' in patch) assign(keys.childExtensions, JSON.stringify(patch.childExtensions ?? []));\n if ('pluginDirectories' in patch) assign(keys.pluginDirectories, patch.pluginDirectories?.join(path.delimiter));\n if ('mcpConfigPath' in patch) assign(keys.mcpConfigPath, patch.mcpConfigPath);\n if ('personaFile' in patch) assign(keys.personaFile, patch.personaFile);\n if (patch.hooks !== undefined) assignFlag(keys.hooks, patch.hooks);\n if (patch.agents !== undefined) assignFlag(keys.agents, patch.agents);\n if (patch.mcp !== undefined) assignFlag(keys.mcp, patch.mcp);\n if (patch.allowProtectedWrites !== undefined) assignFlag(keys.allowProtectedWrites, patch.allowProtectedWrites);\n return environment;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnessState.d.cts","names":[],"sources":["../../src/adapters/harnessState.ts"],"mappings":";;;;;;;;;;cAwBa,wBAAwB,kBAAkB;
|
|
1
|
+
{"version":3,"file":"harnessState.d.cts","names":[],"sources":["../../src/adapters/harnessState.ts"],"mappings":";;;;;;;;;;cAwBa,wBAAwB,kBAAkB;KAU3C,6BAA6B,aAAa;cAEzC;WACX;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;iBA4Ec,iBACd,cAAa,OAAO,YACpB,SAAS,4BACR;;;;;;;;;;;iBAsCa,0BACd,OAAO,QAAQ,eACf,cAAa,OAAO,aACnB,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnessState.d.mts","names":[],"sources":["../../src/adapters/harnessState.ts"],"mappings":";;;;;;;;;;cAwBa,wBAAwB,kBAAkB;
|
|
1
|
+
{"version":3,"file":"harnessState.d.mts","names":[],"sources":["../../src/adapters/harnessState.ts"],"mappings":";;;;;;;;;;cAwBa,wBAAwB,kBAAkB;KAU3C,6BAA6B,aAAa;cAEzC;WACX;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;iBA4Ec,iBACd,cAAa,OAAO,YACpB,SAAS,4BACR;;;;;;;;;;;iBAsCa,0BACd,OAAO,QAAQ,eACf,cAAa,OAAO,aACnB,OAAO"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:path";const t=new Set([`profileEnvironment`,`pluginHooks`,`mcpProjection`]),n={root:`DOOMPI_ROOT`,majorMode:`DOOMPI_MAJOR_MODE`,temporaryDirectory:`DOOMPI_TEMP_DIR`,domains:`DOOMPI_DOMAINS`,layers:`DOOMPI_LAYERS`,compositionFingerprint:`DOOMPI_COMPOSITION_FINGERPRINT`,profile:`DOOMPI_PROFILE`,profileEnvironment:`DOOMPI_PROFILE_ENV`,hookGroups:`DOOMPI_HOOK_GROUPS`,skillDirectories:`DOOMPI_SKILL_DIRS`,agentDirectories:`DOOMPI_AGENT_DIRS`,additionalDirectories:`DOOMPI_ADDITIONAL_DIRS`,childExtensions:`DOOMPI_CHILD_EXTENSIONS`,pluginDirectories:`DOOMPI_PLUGIN_DIRS`,pluginHooks:`DOOMPI_PLUGIN_HOOKS`,mcpConfigPath:`DOOMPI_MCP_CONFIG`,personaFile:`DOOMPI_PERSONA_FILE`,hooks:`DOOMPI_HOOKS_ENABLED`,agents:`DOOMPI_AGENTS_ENABLED`,mcp:`DOOMPI_MCP_ENABLED`,allowProtectedWrites:`DOOMPI_ALLOW_PROTECTED_WRITES`};function r(e){return e?.split(`,`).map(e=>e.trim()).filter(Boolean)??[]}function i(t){return t?.split(e.delimiter).map(e=>e.trim()).filter(Boolean)??[]}function a(e){return e!==`0`}function o(e,t,n){if(!e)return{};try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]==`string`))}catch(e){return n?.(t,e),{}}}function s(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch(e){return n?.(t,e),[]}}function c(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.pluginRoot==`string`&&typeof e.configPath==`string`):[]}catch(e){return n?.(t,e),[]}}function l(e=process.env,t){let l=n,u=e[l.hookGroups];return{root:e[l.root]||void 0,majorMode:e[l.majorMode]||`copilot`,temporaryDirectory:e[l.temporaryDirectory]||void 0,domains:r(e[l.domains]),layers:r(e[l.layers]),compositionFingerprint:e[l.compositionFingerprint]||void 0,profile:e[l.profile]||void 0,profileEnvironment:o(e[l.profileEnvironment],l.profileEnvironment,t),hookGroups:u===void 0?void 0:r(u),skillDirectories:i(e[l.skillDirectories]),agentDirectories:i(e[l.agentDirectories]),additionalDirectories:i(e[l.additionalDirectories]),childExtensions:s(e[l.childExtensions],l.childExtensions,t),pluginDirectories:i(e[l.pluginDirectories]),pluginHooks:c(e[l.pluginHooks],l.pluginHooks,t),mcpConfigPath:e[l.mcpConfigPath]||void 0,personaFile:e[l.personaFile]||void 0,hooks:a(e[l.hooks]),agents:a(e[l.agents]),mcp:a(e[l.mcp]),allowProtectedWrites:a(e[l.allowProtectedWrites])}}function u(t,r=process.env){let i=(e,t)=>{t===void 0?delete r[e]:r[e]=t},a=(e,t)=>i(e,t?`1`:`0`),o=n;return`root`in t&&i(o.root,t.root),`majorMode`in t&&i(o.majorMode,t.majorMode),`temporaryDirectory`in t&&i(o.temporaryDirectory,t.temporaryDirectory),`domains`in t&&i(o.domains,t.domains?.join(`,`)),`layers`in t&&i(o.layers,t.layers?.join(`,`)),`compositionFingerprint`in t&&i(o.compositionFingerprint,t.compositionFingerprint),`profile`in t&&i(o.profile,t.profile),`hookGroups`in t&&i(o.hookGroups,t.hookGroups?.join(`,`)),`skillDirectories`in t&&i(o.skillDirectories,t.skillDirectories?.join(e.delimiter)),`agentDirectories`in t&&i(o.agentDirectories,t.agentDirectories?.join(e.delimiter)),`additionalDirectories`in t&&i(o.additionalDirectories,t.additionalDirectories?.join(e.delimiter)),`childExtensions`in t&&i(o.childExtensions,JSON.stringify(t.childExtensions??[])),`pluginDirectories`in t&&i(o.pluginDirectories,t.pluginDirectories?.join(e.delimiter)),`mcpConfigPath`in t&&i(o.mcpConfigPath,t.mcpConfigPath),`personaFile`in t&&i(o.personaFile,t.personaFile),t.hooks!==void 0&&a(o.hooks,t.hooks),t.agents!==void 0&&a(o.agents,t.agents),t.mcp!==void 0&&a(o.mcp,t.mcp),t.allowProtectedWrites!==void 0&&a(o.allowProtectedWrites,t.allowProtectedWrites),r}export{t as FILE_ONLY_STATE_FIELDS,n as HARNESS_STATE_KEYS,u as projectHarnessEnvironment,l as readHarnessState};
|
|
1
|
+
import e from"node:path";const t=new Set([`profileEnvironment`,`pluginHooks`,`mcpProjection`,`packageAttribution`]),n={root:`DOOMPI_ROOT`,majorMode:`DOOMPI_MAJOR_MODE`,temporaryDirectory:`DOOMPI_TEMP_DIR`,domains:`DOOMPI_DOMAINS`,layers:`DOOMPI_LAYERS`,compositionFingerprint:`DOOMPI_COMPOSITION_FINGERPRINT`,profile:`DOOMPI_PROFILE`,profileEnvironment:`DOOMPI_PROFILE_ENV`,hookGroups:`DOOMPI_HOOK_GROUPS`,skillDirectories:`DOOMPI_SKILL_DIRS`,agentDirectories:`DOOMPI_AGENT_DIRS`,additionalDirectories:`DOOMPI_ADDITIONAL_DIRS`,childExtensions:`DOOMPI_CHILD_EXTENSIONS`,pluginDirectories:`DOOMPI_PLUGIN_DIRS`,pluginHooks:`DOOMPI_PLUGIN_HOOKS`,mcpConfigPath:`DOOMPI_MCP_CONFIG`,personaFile:`DOOMPI_PERSONA_FILE`,hooks:`DOOMPI_HOOKS_ENABLED`,agents:`DOOMPI_AGENTS_ENABLED`,mcp:`DOOMPI_MCP_ENABLED`,allowProtectedWrites:`DOOMPI_ALLOW_PROTECTED_WRITES`};function r(e){return e?.split(`,`).map(e=>e.trim()).filter(Boolean)??[]}function i(t){return t?.split(e.delimiter).map(e=>e.trim()).filter(Boolean)??[]}function a(e){return e!==`0`}function o(e,t,n){if(!e)return{};try{let t=JSON.parse(e);return typeof t!=`object`||!t||Array.isArray(t)?{}:Object.fromEntries(Object.entries(t).filter(e=>typeof e[1]==`string`))}catch(e){return n?.(t,e),{}}}function s(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch(e){return n?.(t,e),[]}}function c(e,t,n){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`object`&&!!e&&typeof e.pluginRoot==`string`&&typeof e.configPath==`string`):[]}catch(e){return n?.(t,e),[]}}function l(e=process.env,t){let l=n,u=e[l.hookGroups];return{root:e[l.root]||void 0,majorMode:e[l.majorMode]||`copilot`,temporaryDirectory:e[l.temporaryDirectory]||void 0,domains:r(e[l.domains]),layers:r(e[l.layers]),compositionFingerprint:e[l.compositionFingerprint]||void 0,profile:e[l.profile]||void 0,profileEnvironment:o(e[l.profileEnvironment],l.profileEnvironment,t),hookGroups:u===void 0?void 0:r(u),skillDirectories:i(e[l.skillDirectories]),agentDirectories:i(e[l.agentDirectories]),additionalDirectories:i(e[l.additionalDirectories]),childExtensions:s(e[l.childExtensions],l.childExtensions,t),pluginDirectories:i(e[l.pluginDirectories]),pluginHooks:c(e[l.pluginHooks],l.pluginHooks,t),mcpConfigPath:e[l.mcpConfigPath]||void 0,personaFile:e[l.personaFile]||void 0,hooks:a(e[l.hooks]),agents:a(e[l.agents]),mcp:a(e[l.mcp]),allowProtectedWrites:a(e[l.allowProtectedWrites])}}function u(t,r=process.env){let i=(e,t)=>{t===void 0?delete r[e]:r[e]=t},a=(e,t)=>i(e,t?`1`:`0`),o=n;return`root`in t&&i(o.root,t.root),`majorMode`in t&&i(o.majorMode,t.majorMode),`temporaryDirectory`in t&&i(o.temporaryDirectory,t.temporaryDirectory),`domains`in t&&i(o.domains,t.domains?.join(`,`)),`layers`in t&&i(o.layers,t.layers?.join(`,`)),`compositionFingerprint`in t&&i(o.compositionFingerprint,t.compositionFingerprint),`profile`in t&&i(o.profile,t.profile),`hookGroups`in t&&i(o.hookGroups,t.hookGroups?.join(`,`)),`skillDirectories`in t&&i(o.skillDirectories,t.skillDirectories?.join(e.delimiter)),`agentDirectories`in t&&i(o.agentDirectories,t.agentDirectories?.join(e.delimiter)),`additionalDirectories`in t&&i(o.additionalDirectories,t.additionalDirectories?.join(e.delimiter)),`childExtensions`in t&&i(o.childExtensions,JSON.stringify(t.childExtensions??[])),`pluginDirectories`in t&&i(o.pluginDirectories,t.pluginDirectories?.join(e.delimiter)),`mcpConfigPath`in t&&i(o.mcpConfigPath,t.mcpConfigPath),`personaFile`in t&&i(o.personaFile,t.personaFile),t.hooks!==void 0&&a(o.hooks,t.hooks),t.agents!==void 0&&a(o.agents,t.agents),t.mcp!==void 0&&a(o.mcp,t.mcp),t.allowProtectedWrites!==void 0&&a(o.allowProtectedWrites,t.allowProtectedWrites),r}export{t as FILE_ONLY_STATE_FIELDS,n as HARNESS_STATE_KEYS,u as projectHarnessEnvironment,l as readHarnessState};
|
|
2
2
|
//# sourceMappingURL=harnessState.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnessState.mjs","names":[],"sources":["../../src/adapters/harnessState.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessState, PluginHookSource } from '../types/config.ts';\n\n/**\n * The codec between harness state and the environment.\n *\n * Decoding exists for processes that were started without a state file: a\n * nested run, a third-party spawn, or anything older than the store. Encoding\n * exists because bash hooks, the shell launchers, and packages that do not\n * depend on this one can only read an environment. Ownership, persistence and\n * mutation belong to harnessStore.ts; nothing here touches disk or holds state.\n */\n\nconst DEFAULT_MAJOR_MODE = 'copilot';\nconst DISABLED_FLAG = '0';\n\n/**\n * State that lives in the file only.\n *\n * These are JSON documents that every spawned process and every hook would\n * otherwise copy in its environment. The plugin hook list and profile defaults\n * are read from the store, while Config publishes the MCP projection through\n * the session-scoped Cordis registry.\n */\nexport const FILE_ONLY_STATE_FIELDS: ReadonlySet<keyof HarnessState> = new Set([\n 'profileEnvironment',\n 'pluginHooks',\n 'mcpProjection',\n]);\n\nexport type HarnessStateParseReporter = (key: string, error: unknown) => void;\n\nexport const HARNESS_STATE_KEYS = {\n root: 'DOOMPI_ROOT',\n majorMode: 'DOOMPI_MAJOR_MODE',\n temporaryDirectory: 'DOOMPI_TEMP_DIR',\n domains: 'DOOMPI_DOMAINS',\n layers: 'DOOMPI_LAYERS',\n compositionFingerprint: 'DOOMPI_COMPOSITION_FINGERPRINT',\n profile: 'DOOMPI_PROFILE',\n profileEnvironment: 'DOOMPI_PROFILE_ENV',\n hookGroups: 'DOOMPI_HOOK_GROUPS',\n skillDirectories: 'DOOMPI_SKILL_DIRS',\n agentDirectories: 'DOOMPI_AGENT_DIRS',\n additionalDirectories: 'DOOMPI_ADDITIONAL_DIRS',\n childExtensions: 'DOOMPI_CHILD_EXTENSIONS',\n pluginDirectories: 'DOOMPI_PLUGIN_DIRS',\n pluginHooks: 'DOOMPI_PLUGIN_HOOKS',\n mcpConfigPath: 'DOOMPI_MCP_CONFIG',\n personaFile: 'DOOMPI_PERSONA_FILE',\n hooks: 'DOOMPI_HOOKS_ENABLED',\n agents: 'DOOMPI_AGENTS_ENABLED',\n mcp: 'DOOMPI_MCP_ENABLED',\n allowProtectedWrites: 'DOOMPI_ALLOW_PROTECTED_WRITES',\n} as const;\n\nfunction splitCsv(value: string | undefined): string[] {\n return (\n value\n ?.split(',')\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction splitPaths(value: string | undefined): string[] {\n return (\n value\n ?.split(path.delimiter)\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction parseFlag(value: string | undefined): boolean {\n return value !== DISABLED_FLAG;\n}\n\nfunction parseStringRecord(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): Record<string, string> {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return {};\n return Object.fromEntries(\n Object.entries(parsed).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n } catch (error) {\n report?.(key, error);\n return {};\n }\n}\n\nfunction parseStringList(value: string | undefined, key: string, report?: HarnessStateParseReporter): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nfunction parsePluginHooks(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): PluginHookSource[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (item): item is PluginHookSource =>\n typeof item === 'object' &&\n item !== null &&\n typeof (item as PluginHookSource).pluginRoot === 'string' &&\n typeof (item as PluginHookSource).configPath === 'string',\n );\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessStateParseReporter,\n): HarnessState {\n const keys = HARNESS_STATE_KEYS;\n const hookGroups = environment[keys.hookGroups];\n return {\n root: environment[keys.root] || undefined,\n majorMode: environment[keys.majorMode] || DEFAULT_MAJOR_MODE,\n temporaryDirectory: environment[keys.temporaryDirectory] || undefined,\n domains: splitCsv(environment[keys.domains]),\n layers: splitCsv(environment[keys.layers]),\n compositionFingerprint: environment[keys.compositionFingerprint] || undefined,\n profile: environment[keys.profile] || undefined,\n profileEnvironment: parseStringRecord(environment[keys.profileEnvironment], keys.profileEnvironment, report),\n hookGroups: hookGroups === undefined ? undefined : splitCsv(hookGroups),\n skillDirectories: splitPaths(environment[keys.skillDirectories]),\n agentDirectories: splitPaths(environment[keys.agentDirectories]),\n additionalDirectories: splitPaths(environment[keys.additionalDirectories]),\n childExtensions: parseStringList(environment[keys.childExtensions], keys.childExtensions, report),\n pluginDirectories: splitPaths(environment[keys.pluginDirectories]),\n pluginHooks: parsePluginHooks(environment[keys.pluginHooks], keys.pluginHooks, report),\n mcpConfigPath: environment[keys.mcpConfigPath] || undefined,\n personaFile: environment[keys.personaFile] || undefined,\n hooks: parseFlag(environment[keys.hooks]),\n agents: parseFlag(environment[keys.agents]),\n mcp: parseFlag(environment[keys.mcp]),\n allowProtectedWrites: parseFlag(environment[keys.allowProtectedWrites]),\n };\n}\n\n/**\n * Publishes a state patch into an environment.\n *\n * Takes the environment rather than assuming `process.env`, because the\n * launcher builds a child environment and Doom Team builds a spawn snapshot;\n * neither should mutate its own process to describe another one.\n *\n * Fields in FILE_ONLY_FIELDS are skipped: the file carries them, and a reader\n * that needs them reads the store.\n */\nexport function projectHarnessEnvironment(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const assign = (key: string, value: string | undefined): void => {\n if (value === undefined) delete environment[key];\n else environment[key] = value;\n };\n const assignFlag = (key: string, value: boolean): void => assign(key, value ? '1' : DISABLED_FLAG);\n const keys = HARNESS_STATE_KEYS;\n\n if ('root' in patch) assign(keys.root, patch.root);\n if ('majorMode' in patch) assign(keys.majorMode, patch.majorMode);\n if ('temporaryDirectory' in patch) assign(keys.temporaryDirectory, patch.temporaryDirectory);\n if ('domains' in patch) assign(keys.domains, patch.domains?.join(','));\n if ('layers' in patch) assign(keys.layers, patch.layers?.join(','));\n if ('compositionFingerprint' in patch) assign(keys.compositionFingerprint, patch.compositionFingerprint);\n if ('profile' in patch) assign(keys.profile, patch.profile);\n if ('hookGroups' in patch) assign(keys.hookGroups, patch.hookGroups?.join(','));\n if ('skillDirectories' in patch) assign(keys.skillDirectories, patch.skillDirectories?.join(path.delimiter));\n if ('agentDirectories' in patch) assign(keys.agentDirectories, patch.agentDirectories?.join(path.delimiter));\n if ('additionalDirectories' in patch) {\n assign(keys.additionalDirectories, patch.additionalDirectories?.join(path.delimiter));\n }\n if ('childExtensions' in patch) assign(keys.childExtensions, JSON.stringify(patch.childExtensions ?? []));\n if ('pluginDirectories' in patch) assign(keys.pluginDirectories, patch.pluginDirectories?.join(path.delimiter));\n if ('mcpConfigPath' in patch) assign(keys.mcpConfigPath, patch.mcpConfigPath);\n if ('personaFile' in patch) assign(keys.personaFile, patch.personaFile);\n if (patch.hooks !== undefined) assignFlag(keys.hooks, patch.hooks);\n if (patch.agents !== undefined) assignFlag(keys.agents, patch.agents);\n if (patch.mcp !== undefined) assignFlag(keys.mcp, patch.mcp);\n if (patch.allowProtectedWrites !== undefined) assignFlag(keys.allowProtectedWrites, patch.allowProtectedWrites);\n return environment;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"harnessState.mjs","names":[],"sources":["../../src/adapters/harnessState.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessState, PluginHookSource } from '../types/config.ts';\n\n/**\n * The codec between harness state and the environment.\n *\n * Decoding exists for processes that were started without a state file: a\n * nested run, a third-party spawn, or anything older than the store. Encoding\n * exists because bash hooks, the shell launchers, and packages that do not\n * depend on this one can only read an environment. Ownership, persistence and\n * mutation belong to harnessStore.ts; nothing here touches disk or holds state.\n */\n\nconst DEFAULT_MAJOR_MODE = 'copilot';\nconst DISABLED_FLAG = '0';\n\n/**\n * State that lives in the file only.\n *\n * These are JSON documents that every spawned process and every hook would\n * otherwise copy in its environment. The plugin hook list and profile defaults\n * are read from the store, while Config publishes the MCP projection through\n * the session-scoped Cordis registry.\n */\nexport const FILE_ONLY_STATE_FIELDS: ReadonlySet<keyof HarnessState> = new Set([\n 'profileEnvironment',\n 'pluginHooks',\n 'mcpProjection',\n // One entry per composed package. Nothing that spawns a process needs it,\n // and putting a map that size in front of every exec would cost far more\n // than the one surface that reads it is worth.\n 'packageAttribution',\n]);\n\nexport type HarnessStateParseReporter = (key: string, error: unknown) => void;\n\nexport const HARNESS_STATE_KEYS = {\n root: 'DOOMPI_ROOT',\n majorMode: 'DOOMPI_MAJOR_MODE',\n temporaryDirectory: 'DOOMPI_TEMP_DIR',\n domains: 'DOOMPI_DOMAINS',\n layers: 'DOOMPI_LAYERS',\n compositionFingerprint: 'DOOMPI_COMPOSITION_FINGERPRINT',\n profile: 'DOOMPI_PROFILE',\n profileEnvironment: 'DOOMPI_PROFILE_ENV',\n hookGroups: 'DOOMPI_HOOK_GROUPS',\n skillDirectories: 'DOOMPI_SKILL_DIRS',\n agentDirectories: 'DOOMPI_AGENT_DIRS',\n additionalDirectories: 'DOOMPI_ADDITIONAL_DIRS',\n childExtensions: 'DOOMPI_CHILD_EXTENSIONS',\n pluginDirectories: 'DOOMPI_PLUGIN_DIRS',\n pluginHooks: 'DOOMPI_PLUGIN_HOOKS',\n mcpConfigPath: 'DOOMPI_MCP_CONFIG',\n personaFile: 'DOOMPI_PERSONA_FILE',\n hooks: 'DOOMPI_HOOKS_ENABLED',\n agents: 'DOOMPI_AGENTS_ENABLED',\n mcp: 'DOOMPI_MCP_ENABLED',\n allowProtectedWrites: 'DOOMPI_ALLOW_PROTECTED_WRITES',\n} as const;\n\nfunction splitCsv(value: string | undefined): string[] {\n return (\n value\n ?.split(',')\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction splitPaths(value: string | undefined): string[] {\n return (\n value\n ?.split(path.delimiter)\n .map((item) => item.trim())\n .filter(Boolean) ?? []\n );\n}\n\nfunction parseFlag(value: string | undefined): boolean {\n return value !== DISABLED_FLAG;\n}\n\nfunction parseStringRecord(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): Record<string, string> {\n if (!value) return {};\n try {\n const parsed = JSON.parse(value) as unknown;\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) return {};\n return Object.fromEntries(\n Object.entries(parsed).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n } catch (error) {\n report?.(key, error);\n return {};\n }\n}\n\nfunction parseStringList(value: string | undefined, key: string, report?: HarnessStateParseReporter): string[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? parsed.filter((item): item is string => typeof item === 'string') : [];\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nfunction parsePluginHooks(\n value: string | undefined,\n key: string,\n report?: HarnessStateParseReporter,\n): PluginHookSource[] {\n if (!value) return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (item): item is PluginHookSource =>\n typeof item === 'object' &&\n item !== null &&\n typeof (item as PluginHookSource).pluginRoot === 'string' &&\n typeof (item as PluginHookSource).configPath === 'string',\n );\n } catch (error) {\n report?.(key, error);\n return [];\n }\n}\n\nexport function readHarnessState(\n environment: NodeJS.ProcessEnv = process.env,\n report?: HarnessStateParseReporter,\n): HarnessState {\n const keys = HARNESS_STATE_KEYS;\n const hookGroups = environment[keys.hookGroups];\n return {\n root: environment[keys.root] || undefined,\n majorMode: environment[keys.majorMode] || DEFAULT_MAJOR_MODE,\n temporaryDirectory: environment[keys.temporaryDirectory] || undefined,\n domains: splitCsv(environment[keys.domains]),\n layers: splitCsv(environment[keys.layers]),\n compositionFingerprint: environment[keys.compositionFingerprint] || undefined,\n profile: environment[keys.profile] || undefined,\n profileEnvironment: parseStringRecord(environment[keys.profileEnvironment], keys.profileEnvironment, report),\n hookGroups: hookGroups === undefined ? undefined : splitCsv(hookGroups),\n skillDirectories: splitPaths(environment[keys.skillDirectories]),\n agentDirectories: splitPaths(environment[keys.agentDirectories]),\n additionalDirectories: splitPaths(environment[keys.additionalDirectories]),\n childExtensions: parseStringList(environment[keys.childExtensions], keys.childExtensions, report),\n pluginDirectories: splitPaths(environment[keys.pluginDirectories]),\n pluginHooks: parsePluginHooks(environment[keys.pluginHooks], keys.pluginHooks, report),\n mcpConfigPath: environment[keys.mcpConfigPath] || undefined,\n personaFile: environment[keys.personaFile] || undefined,\n hooks: parseFlag(environment[keys.hooks]),\n agents: parseFlag(environment[keys.agents]),\n mcp: parseFlag(environment[keys.mcp]),\n allowProtectedWrites: parseFlag(environment[keys.allowProtectedWrites]),\n };\n}\n\n/**\n * Publishes a state patch into an environment.\n *\n * Takes the environment rather than assuming `process.env`, because the\n * launcher builds a child environment and Doom Team builds a spawn snapshot;\n * neither should mutate its own process to describe another one.\n *\n * Fields in FILE_ONLY_FIELDS are skipped: the file carries them, and a reader\n * that needs them reads the store.\n */\nexport function projectHarnessEnvironment(\n patch: Partial<HarnessState>,\n environment: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const assign = (key: string, value: string | undefined): void => {\n if (value === undefined) delete environment[key];\n else environment[key] = value;\n };\n const assignFlag = (key: string, value: boolean): void => assign(key, value ? '1' : DISABLED_FLAG);\n const keys = HARNESS_STATE_KEYS;\n\n if ('root' in patch) assign(keys.root, patch.root);\n if ('majorMode' in patch) assign(keys.majorMode, patch.majorMode);\n if ('temporaryDirectory' in patch) assign(keys.temporaryDirectory, patch.temporaryDirectory);\n if ('domains' in patch) assign(keys.domains, patch.domains?.join(','));\n if ('layers' in patch) assign(keys.layers, patch.layers?.join(','));\n if ('compositionFingerprint' in patch) assign(keys.compositionFingerprint, patch.compositionFingerprint);\n if ('profile' in patch) assign(keys.profile, patch.profile);\n if ('hookGroups' in patch) assign(keys.hookGroups, patch.hookGroups?.join(','));\n if ('skillDirectories' in patch) assign(keys.skillDirectories, patch.skillDirectories?.join(path.delimiter));\n if ('agentDirectories' in patch) assign(keys.agentDirectories, patch.agentDirectories?.join(path.delimiter));\n if ('additionalDirectories' in patch) {\n assign(keys.additionalDirectories, patch.additionalDirectories?.join(path.delimiter));\n }\n if ('childExtensions' in patch) assign(keys.childExtensions, JSON.stringify(patch.childExtensions ?? []));\n if ('pluginDirectories' in patch) assign(keys.pluginDirectories, patch.pluginDirectories?.join(path.delimiter));\n if ('mcpConfigPath' in patch) assign(keys.mcpConfigPath, patch.mcpConfigPath);\n if ('personaFile' in patch) assign(keys.personaFile, patch.personaFile);\n if (patch.hooks !== undefined) assignFlag(keys.hooks, patch.hooks);\n if (patch.agents !== undefined) assignFlag(keys.agents, patch.agents);\n if (patch.mcp !== undefined) assignFlag(keys.mcp, patch.mcp);\n if (patch.allowProtectedWrites !== undefined) assignFlag(keys.allowProtectedWrites, patch.allowProtectedWrites);\n return environment;\n}\n"],"mappings":"yBAaA,MAWa,EAA0D,IAAI,IAAI,CAC7E,qBACA,cACA,gBAIA,oBACF,CAAC,EAIY,EAAqB,CAChC,KAAM,cACN,UAAW,oBACX,mBAAoB,kBACpB,QAAS,iBACT,OAAQ,gBACR,uBAAwB,iCACxB,QAAS,iBACT,mBAAoB,qBACpB,WAAY,qBACZ,iBAAkB,oBAClB,iBAAkB,oBAClB,sBAAuB,yBACvB,gBAAiB,0BACjB,kBAAmB,qBACnB,YAAa,sBACb,cAAe,oBACf,YAAa,sBACb,MAAO,uBACP,OAAQ,wBACR,IAAK,qBACL,qBAAsB,+BACxB,EAEA,SAAS,EAAS,EAAqC,CACrD,OACE,GACI,MAAM,GAAG,CAAC,CACX,IAAK,GAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,GAAK,CAAC,CAE3B,CAEA,SAAS,EAAW,EAAqC,CACvD,OACE,GACI,MAAM,EAAK,SAAS,CAAC,CACtB,IAAK,GAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,GAAK,CAAC,CAE3B,CAEA,SAAS,EAAU,EAAoC,CACrD,OAAO,IAAU,GACnB,CAEA,SAAS,EACP,EACA,EACA,EACwB,CACxB,GAAI,CAAC,EAAO,MAAO,CAAC,EACpB,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAK,EAE/B,OADI,OAAO,GAAW,WAAY,GAAmB,MAAM,QAAQ,CAAM,EAAU,CAAC,EAC7E,OAAO,YACZ,OAAO,QAAQ,CAAM,CAAC,CAAC,OAAQ,GAAqC,OAAO,EAAM,IAAO,QAAQ,CAClG,CACF,OAAS,EAAO,CAEd,OADA,IAAS,EAAK,CAAK,EACZ,CAAC,CACV,CACF,CAEA,SAAS,EAAgB,EAA2B,EAAa,EAA8C,CAC7G,GAAI,CAAC,EAAO,MAAO,CAAC,EACpB,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAK,EAC/B,OAAO,MAAM,QAAQ,CAAM,EAAI,EAAO,OAAQ,GAAyB,OAAO,GAAS,QAAQ,EAAI,CAAC,CACtG,OAAS,EAAO,CAEd,OADA,IAAS,EAAK,CAAK,EACZ,CAAC,CACV,CACF,CAEA,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,CAAC,EAAO,MAAO,CAAC,EACpB,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,CAAK,EAE/B,OADK,MAAM,QAAQ,CAAM,EAClB,EAAO,OACX,GACC,OAAO,GAAS,YAChB,GACA,OAAQ,EAA0B,YAAe,UACjD,OAAQ,EAA0B,YAAe,QACrD,EAPmC,CAAC,CAQtC,OAAS,EAAO,CAEd,OADA,IAAS,EAAK,CAAK,EACZ,CAAC,CACV,CACF,CAEA,SAAgB,EACd,EAAiC,QAAQ,IACzC,EACc,CACd,IAAM,EAAO,EACP,EAAa,EAAY,EAAK,YACpC,MAAO,CACL,KAAM,EAAY,EAAK,OAAS,IAAA,GAChC,UAAW,EAAY,EAAK,YAAc,UAC1C,mBAAoB,EAAY,EAAK,qBAAuB,IAAA,GAC5D,QAAS,EAAS,EAAY,EAAK,QAAQ,EAC3C,OAAQ,EAAS,EAAY,EAAK,OAAO,EACzC,uBAAwB,EAAY,EAAK,yBAA2B,IAAA,GACpE,QAAS,EAAY,EAAK,UAAY,IAAA,GACtC,mBAAoB,EAAkB,EAAY,EAAK,oBAAqB,EAAK,mBAAoB,CAAM,EAC3G,WAAY,IAAe,IAAA,GAAY,IAAA,GAAY,EAAS,CAAU,EACtE,iBAAkB,EAAW,EAAY,EAAK,iBAAiB,EAC/D,iBAAkB,EAAW,EAAY,EAAK,iBAAiB,EAC/D,sBAAuB,EAAW,EAAY,EAAK,sBAAsB,EACzE,gBAAiB,EAAgB,EAAY,EAAK,iBAAkB,EAAK,gBAAiB,CAAM,EAChG,kBAAmB,EAAW,EAAY,EAAK,kBAAkB,EACjE,YAAa,EAAiB,EAAY,EAAK,aAAc,EAAK,YAAa,CAAM,EACrF,cAAe,EAAY,EAAK,gBAAkB,IAAA,GAClD,YAAa,EAAY,EAAK,cAAgB,IAAA,GAC9C,MAAO,EAAU,EAAY,EAAK,MAAM,EACxC,OAAQ,EAAU,EAAY,EAAK,OAAO,EAC1C,IAAK,EAAU,EAAY,EAAK,IAAI,EACpC,qBAAsB,EAAU,EAAY,EAAK,qBAAqB,CACxE,CACF,CAYA,SAAgB,EACd,EACA,EAAiC,QAAQ,IACtB,CACnB,IAAM,GAAU,EAAa,IAAoC,CAC3D,IAAU,IAAA,GAAW,OAAO,EAAY,GACvC,EAAY,GAAO,CAC1B,EACM,GAAc,EAAa,IAAyB,EAAO,EAAK,EAAQ,IAAM,GAAa,EAC3F,EAAO,EAuBb,MArBI,SAAU,GAAO,EAAO,EAAK,KAAM,EAAM,IAAI,EAC7C,cAAe,GAAO,EAAO,EAAK,UAAW,EAAM,SAAS,EAC5D,uBAAwB,GAAO,EAAO,EAAK,mBAAoB,EAAM,kBAAkB,EACvF,YAAa,GAAO,EAAO,EAAK,QAAS,EAAM,SAAS,KAAK,GAAG,CAAC,EACjE,WAAY,GAAO,EAAO,EAAK,OAAQ,EAAM,QAAQ,KAAK,GAAG,CAAC,EAC9D,2BAA4B,GAAO,EAAO,EAAK,uBAAwB,EAAM,sBAAsB,EACnG,YAAa,GAAO,EAAO,EAAK,QAAS,EAAM,OAAO,EACtD,eAAgB,GAAO,EAAO,EAAK,WAAY,EAAM,YAAY,KAAK,GAAG,CAAC,EAC1E,qBAAsB,GAAO,EAAO,EAAK,iBAAkB,EAAM,kBAAkB,KAAK,EAAK,SAAS,CAAC,EACvG,qBAAsB,GAAO,EAAO,EAAK,iBAAkB,EAAM,kBAAkB,KAAK,EAAK,SAAS,CAAC,EACvG,0BAA2B,GAC7B,EAAO,EAAK,sBAAuB,EAAM,uBAAuB,KAAK,EAAK,SAAS,CAAC,EAElF,oBAAqB,GAAO,EAAO,EAAK,gBAAiB,KAAK,UAAU,EAAM,iBAAmB,CAAC,CAAC,CAAC,EACpG,sBAAuB,GAAO,EAAO,EAAK,kBAAmB,EAAM,mBAAmB,KAAK,EAAK,SAAS,CAAC,EAC1G,kBAAmB,GAAO,EAAO,EAAK,cAAe,EAAM,aAAa,EACxE,gBAAiB,GAAO,EAAO,EAAK,YAAa,EAAM,WAAW,EAClE,EAAM,QAAU,IAAA,IAAW,EAAW,EAAK,MAAO,EAAM,KAAK,EAC7D,EAAM,SAAW,IAAA,IAAW,EAAW,EAAK,OAAQ,EAAM,MAAM,EAChE,EAAM,MAAQ,IAAA,IAAW,EAAW,EAAK,IAAK,EAAM,GAAG,EACvD,EAAM,uBAAyB,IAAA,IAAW,EAAW,EAAK,qBAAsB,EAAM,oBAAoB,EACvG,CACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);let n=require("node:path");n=e.__toESM(n,1);let r=require("node:os");r=e.__toESM(r,1);let
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs");let t=require("node:fs");t=e.__toESM(t,1);let n=require("node:path");n=e.__toESM(n,1);let r=require("node:os");r=e.__toESM(r,1);const i=`settings.json`;function a(e){let t=n.default.join(e,`.pi`,`agent`);if(e!==r.default.homedir())return t;let i=process.env.PI_CODING_AGENT_DIR?.trim();return i?i===`~`?e:i.startsWith(`~/`)?n.default.join(e,i.slice(2)):n.default.resolve(i):t}function o(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function s(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];n[e]=o(t)&&o(r)?s(t,r):r}return n}function c(e){if(!t.default.existsSync(e))return{};let n;try{n=JSON.parse(t.default.readFileSync(e,`utf8`))}catch(t){throw Error(`Could not parse Pi settings at ${e}`,{cause:t})}if(!o(n))throw Error(`Pi settings at ${e} must be a JSON object`);return n}async function l(e){let n;try{n=JSON.parse(await t.default.promises.readFile(e,`utf8`))}catch(t){if(t.code===`ENOENT`)return{};throw Error(`Could not parse Pi settings at ${e}`,{cause:t})}if(!o(n))throw Error(`Pi settings at ${e} must be a JSON object`);return n}function u(e){return e.reduce((e,t)=>s(e,c(t)),{})}async function d(e){return(await Promise.all(e.map(l))).reduce(s,{})}function f(e){return typeof e==`function`?e():e}function p(e,t=r.default.homedir(),o=a(t)){return{canonicalUser:n.default.join(o,i),canonicalProject:n.default.join(e,`.pi`,i),legacyUser:[n.default.join(t,`.pi`,i)],legacyProject:[n.default.join(e,`pi`,i)]}}function m(e){let t=p(e.repoRoot,e.homeDirectory),n=[...t.legacyUser,...e.userConfigPaths??[],t.canonicalUser],r=[...t.legacyProject,...e.projectConfigPaths??[],t.canonicalProject],i=e.defaults??{},a=u(n),o=f(e.isProjectTrusted)?u(r):{};return[i,a,e.overlay??{},o,e.environment??{},e.cli??{},e.programmatic??{}].reduce(s,{})}async function h(e){let t=p(e.repoRoot,e.homeDirectory),n=[...t.legacyUser,...e.userConfigPaths??[],t.canonicalUser],r=[...t.legacyProject,...e.projectConfigPaths??[],t.canonicalProject],[i,a]=await Promise.all([d(n),f(e.isProjectTrusted)?d(r):Promise.resolve({})]);return[e.defaults??{},i,e.overlay??{},a,e.environment??{},e.cli??{},e.programmatic??{}].reduce(s,{})}exports.loadPiConfig=m,exports.loadPiConfigAsync=h,exports.piConfigPaths=p;
|
|
2
2
|
//# sourceMappingURL=piConfig.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piConfig.cjs","names":["
|
|
1
|
+
{"version":3,"file":"piConfig.cjs","names":["path","os","fs"],"sources":["../../src/adapters/piConfig.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { PiConfig, PiConfigLoadOptions, PiConfigPaths } from '../schemas/config/schema.ts';\n\nconst SETTINGS_FILE_NAME = 'settings.json';\nconst CONFIG_DIR_NAME = '.pi';\nconst AGENT_DIR_NAME = 'agent';\nconst PI_CODING_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nconst LEGACY_CONFIG_DIR_NAME = 'pi';\n\nfunction defaultAgentDirectory(homeDirectory: string): string {\n const fallback = path.join(homeDirectory, CONFIG_DIR_NAME, AGENT_DIR_NAME);\n if (homeDirectory !== os.homedir()) return fallback;\n const configured = process.env[PI_CODING_AGENT_DIR_ENV]?.trim();\n if (!configured) return fallback;\n if (configured === '~') return homeDirectory;\n if (configured.startsWith('~/')) return path.join(homeDirectory, configured.slice(2));\n return path.resolve(configured);\n}\nfunction isObject(value: unknown): value is PiConfig {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction mergeConfig(base: PiConfig, override: PiConfig): PiConfig {\n const result: PiConfig = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] = isObject(current) && isObject(value) ? mergeConfig(current, value) : value;\n }\n return result;\n}\n\nfunction readConfig(filePath: string): PiConfig {\n if (!fs.existsSync(filePath)) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(filePath, 'utf8'));\n } catch (error) {\n throw new Error(`Could not parse Pi settings at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Pi settings at ${filePath} must be a JSON object`);\n return parsed;\n}\n\nasync function readConfigAsync(filePath: string): Promise<PiConfig> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.promises.readFile(filePath, 'utf8'));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {};\n throw new Error(`Could not parse Pi settings at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Pi settings at ${filePath} must be a JSON object`);\n return parsed;\n}\n\nfunction readConfigPaths(paths: readonly string[]): PiConfig {\n return paths.reduce<PiConfig>((config, filePath) => mergeConfig(config, readConfig(filePath)), {});\n}\n\nasync function readConfigPathsAsync(paths: readonly string[]): Promise<PiConfig> {\n const layers = await Promise.all(paths.map(readConfigAsync));\n return layers.reduce<PiConfig>(mergeConfig, {});\n}\n\nfunction projectIsTrusted(value: PiConfigLoadOptions['isProjectTrusted']): boolean {\n return typeof value === 'function' ? value() : value;\n}\n\nexport function piConfigPaths(\n repoRoot: string,\n homeDirectory = os.homedir(),\n agentDirectory = defaultAgentDirectory(homeDirectory),\n): PiConfigPaths {\n return {\n canonicalUser: path.join(agentDirectory, SETTINGS_FILE_NAME),\n canonicalProject: path.join(repoRoot, CONFIG_DIR_NAME, SETTINGS_FILE_NAME),\n legacyUser: [path.join(homeDirectory, CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n legacyProject: [path.join(repoRoot, LEGACY_CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n };\n}\n\nexport function loadPiConfig(options: PiConfigLoadOptions): PiConfig {\n const paths = piConfigPaths(options.repoRoot, options.homeDirectory);\n const userPaths = [...paths.legacyUser, ...(options.userConfigPaths ?? []), paths.canonicalUser];\n const projectPaths = [...paths.legacyProject, ...(options.projectConfigPaths ?? []), paths.canonicalProject];\n const defaults = options.defaults ?? {};\n const user = readConfigPaths(userPaths);\n const trustedProject = projectIsTrusted(options.isProjectTrusted) ? readConfigPaths(projectPaths) : {};\n return [\n defaults,\n user,\n options.overlay ?? {},\n trustedProject,\n options.environment ?? {},\n options.cli ?? {},\n options.programmatic ?? {},\n ].reduce(mergeConfig, {});\n}\n\nexport async function loadPiConfigAsync(options: PiConfigLoadOptions): Promise<PiConfig> {\n const paths = piConfigPaths(options.repoRoot, options.homeDirectory);\n const userPaths = [...paths.legacyUser, ...(options.userConfigPaths ?? []), paths.canonicalUser];\n const projectPaths = [...paths.legacyProject, ...(options.projectConfigPaths ?? []), paths.canonicalProject];\n const [user, trustedProject] = await Promise.all([\n readConfigPathsAsync(userPaths),\n projectIsTrusted(options.isProjectTrusted) ? readConfigPathsAsync(projectPaths) : Promise.resolve({}),\n ]);\n return [\n options.defaults ?? {},\n user,\n options.overlay ?? {},\n trustedProject,\n options.environment ?? {},\n options.cli ?? {},\n options.programmatic ?? {},\n ].reduce(mergeConfig, {});\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piConfig.d.cts","names":[],"sources":["../../src/adapters/piConfig.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"piConfig.d.cts","names":[],"sources":["../../src/adapters/piConfig.ts"],"mappings":";;iBAsEgB,cACd,kBACA,wBACA,0BACC;iBASa,aAAa,SAAS,sBAAsB;iBAkBtC,kBAAkB,SAAS,sBAAsB,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piConfig.d.mts","names":[],"sources":["../../src/adapters/piConfig.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"piConfig.d.mts","names":[],"sources":["../../src/adapters/piConfig.ts"],"mappings":";;iBAsEgB,cACd,kBACA,wBACA,0BACC;iBASa,aAAa,SAAS,sBAAsB;iBAkBtC,kBAAkB,SAAS,sBAAsB,QAAQ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e from"node:fs";import t from"node:path";import n from"node:os";
|
|
1
|
+
import e from"node:fs";import t from"node:path";import n from"node:os";const r=`settings.json`;function i(e){let r=t.join(e,`.pi`,`agent`);if(e!==n.homedir())return r;let i=process.env.PI_CODING_AGENT_DIR?.trim();return i?i===`~`?e:i.startsWith(`~/`)?t.join(e,i.slice(2)):t.resolve(i):r}function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(e,t){let n={...e};for(let[e,r]of Object.entries(t)){let t=n[e];n[e]=a(t)&&a(r)?o(t,r):r}return n}function s(t){if(!e.existsSync(t))return{};let n;try{n=JSON.parse(e.readFileSync(t,`utf8`))}catch(e){throw Error(`Could not parse Pi settings at ${t}`,{cause:e})}if(!a(n))throw Error(`Pi settings at ${t} must be a JSON object`);return n}async function c(t){let n;try{n=JSON.parse(await e.promises.readFile(t,`utf8`))}catch(e){if(e.code===`ENOENT`)return{};throw Error(`Could not parse Pi settings at ${t}`,{cause:e})}if(!a(n))throw Error(`Pi settings at ${t} must be a JSON object`);return n}function l(e){return e.reduce((e,t)=>o(e,s(t)),{})}async function u(e){return(await Promise.all(e.map(c))).reduce(o,{})}function d(e){return typeof e==`function`?e():e}function f(e,a=n.homedir(),o=i(a)){return{canonicalUser:t.join(o,r),canonicalProject:t.join(e,`.pi`,r),legacyUser:[t.join(a,`.pi`,r)],legacyProject:[t.join(e,`pi`,r)]}}function p(e){let t=f(e.repoRoot,e.homeDirectory),n=[...t.legacyUser,...e.userConfigPaths??[],t.canonicalUser],r=[...t.legacyProject,...e.projectConfigPaths??[],t.canonicalProject],i=e.defaults??{},a=l(n),s=d(e.isProjectTrusted)?l(r):{};return[i,a,e.overlay??{},s,e.environment??{},e.cli??{},e.programmatic??{}].reduce(o,{})}async function m(e){let t=f(e.repoRoot,e.homeDirectory),n=[...t.legacyUser,...e.userConfigPaths??[],t.canonicalUser],r=[...t.legacyProject,...e.projectConfigPaths??[],t.canonicalProject],[i,a]=await Promise.all([u(n),d(e.isProjectTrusted)?u(r):Promise.resolve({})]);return[e.defaults??{},i,e.overlay??{},a,e.environment??{},e.cli??{},e.programmatic??{}].reduce(o,{})}export{p as loadPiConfig,m as loadPiConfigAsync,f as piConfigPaths};
|
|
2
2
|
//# sourceMappingURL=piConfig.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piConfig.mjs","names":[],"sources":["../../src/adapters/piConfig.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport
|
|
1
|
+
{"version":3,"file":"piConfig.mjs","names":[],"sources":["../../src/adapters/piConfig.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { PiConfig, PiConfigLoadOptions, PiConfigPaths } from '../schemas/config/schema.ts';\n\nconst SETTINGS_FILE_NAME = 'settings.json';\nconst CONFIG_DIR_NAME = '.pi';\nconst AGENT_DIR_NAME = 'agent';\nconst PI_CODING_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nconst LEGACY_CONFIG_DIR_NAME = 'pi';\n\nfunction defaultAgentDirectory(homeDirectory: string): string {\n const fallback = path.join(homeDirectory, CONFIG_DIR_NAME, AGENT_DIR_NAME);\n if (homeDirectory !== os.homedir()) return fallback;\n const configured = process.env[PI_CODING_AGENT_DIR_ENV]?.trim();\n if (!configured) return fallback;\n if (configured === '~') return homeDirectory;\n if (configured.startsWith('~/')) return path.join(homeDirectory, configured.slice(2));\n return path.resolve(configured);\n}\nfunction isObject(value: unknown): value is PiConfig {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction mergeConfig(base: PiConfig, override: PiConfig): PiConfig {\n const result: PiConfig = { ...base };\n for (const [key, value] of Object.entries(override)) {\n const current = result[key];\n result[key] = isObject(current) && isObject(value) ? mergeConfig(current, value) : value;\n }\n return result;\n}\n\nfunction readConfig(filePath: string): PiConfig {\n if (!fs.existsSync(filePath)) return {};\n let parsed: unknown;\n try {\n parsed = JSON.parse(fs.readFileSync(filePath, 'utf8'));\n } catch (error) {\n throw new Error(`Could not parse Pi settings at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Pi settings at ${filePath} must be a JSON object`);\n return parsed;\n}\n\nasync function readConfigAsync(filePath: string): Promise<PiConfig> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await fs.promises.readFile(filePath, 'utf8'));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {};\n throw new Error(`Could not parse Pi settings at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Pi settings at ${filePath} must be a JSON object`);\n return parsed;\n}\n\nfunction readConfigPaths(paths: readonly string[]): PiConfig {\n return paths.reduce<PiConfig>((config, filePath) => mergeConfig(config, readConfig(filePath)), {});\n}\n\nasync function readConfigPathsAsync(paths: readonly string[]): Promise<PiConfig> {\n const layers = await Promise.all(paths.map(readConfigAsync));\n return layers.reduce<PiConfig>(mergeConfig, {});\n}\n\nfunction projectIsTrusted(value: PiConfigLoadOptions['isProjectTrusted']): boolean {\n return typeof value === 'function' ? value() : value;\n}\n\nexport function piConfigPaths(\n repoRoot: string,\n homeDirectory = os.homedir(),\n agentDirectory = defaultAgentDirectory(homeDirectory),\n): PiConfigPaths {\n return {\n canonicalUser: path.join(agentDirectory, SETTINGS_FILE_NAME),\n canonicalProject: path.join(repoRoot, CONFIG_DIR_NAME, SETTINGS_FILE_NAME),\n legacyUser: [path.join(homeDirectory, CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n legacyProject: [path.join(repoRoot, LEGACY_CONFIG_DIR_NAME, SETTINGS_FILE_NAME)],\n };\n}\n\nexport function loadPiConfig(options: PiConfigLoadOptions): PiConfig {\n const paths = piConfigPaths(options.repoRoot, options.homeDirectory);\n const userPaths = [...paths.legacyUser, ...(options.userConfigPaths ?? []), paths.canonicalUser];\n const projectPaths = [...paths.legacyProject, ...(options.projectConfigPaths ?? []), paths.canonicalProject];\n const defaults = options.defaults ?? {};\n const user = readConfigPaths(userPaths);\n const trustedProject = projectIsTrusted(options.isProjectTrusted) ? readConfigPaths(projectPaths) : {};\n return [\n defaults,\n user,\n options.overlay ?? {},\n trustedProject,\n options.environment ?? {},\n options.cli ?? {},\n options.programmatic ?? {},\n ].reduce(mergeConfig, {});\n}\n\nexport async function loadPiConfigAsync(options: PiConfigLoadOptions): Promise<PiConfig> {\n const paths = piConfigPaths(options.repoRoot, options.homeDirectory);\n const userPaths = [...paths.legacyUser, ...(options.userConfigPaths ?? []), paths.canonicalUser];\n const projectPaths = [...paths.legacyProject, ...(options.projectConfigPaths ?? []), paths.canonicalProject];\n const [user, trustedProject] = await Promise.all([\n readConfigPathsAsync(userPaths),\n projectIsTrusted(options.isProjectTrusted) ? readConfigPathsAsync(projectPaths) : Promise.resolve({}),\n ]);\n return [\n options.defaults ?? {},\n user,\n options.overlay ?? {},\n trustedProject,\n options.environment ?? {},\n options.cli ?? {},\n options.programmatic ?? {},\n ].reduce(mergeConfig, {});\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { writePrivateAtomicJson } from "./adapters/atomicJson.cjs";
|
|
2
|
-
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.cjs";
|
|
2
|
+
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PackageAttribution, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.cjs";
|
|
3
3
|
import { globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./adapters/config.cjs";
|
|
4
4
|
import { ConfigKeyScope, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, configLeafKeys, configRootKeys, configScopeOf, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, resolveVoiceConfig, valueAtKeyPath } from "./services/configPolicy.cjs";
|
|
5
5
|
import { ConfigAdapterRegistrationOptions, PiConfig, PiConfigLoadOptions, PiConfigPaths } from "./schemas/config/schema.cjs";
|
|
@@ -16,4 +16,4 @@ import { DOOM_CONFIG_TEMPLATES, GLOBAL_DOOM_SEED_FILES, GlobalDoomInitResult, RE
|
|
|
16
16
|
import { LayerDefinition, LayerPackage, LayerPackageConfig, LayerResolvers, MajorModeDefinition, MajorModesConfig, ResolvedLayerDefinition, ResolvedPackageConfiguration, isLocalPackageSpecifier, layerEntries, layerHookGroups, loadMajorModesConfig, resolveLayers, resolvePackageConfigurations } from "./adapters/majorModes.cjs";
|
|
17
17
|
import { DOOM_CONFIG_ENTRY_TYPE, DOOM_CONFIG_TRANSITION_ENTRY_TYPE, DoomConfigSelection, acknowledgeDoomConfigTransition, appendDoomConfigSelection, appendDoomConfigTransition, createDoomConfigContext, createDoomConfigContextAsync, freezeDoomConfigContext, provideDoomConfigContext, readDoomConfigContextGeneration, readDoomConfigPendingSelection, readDoomConfigSelection, replaceDoomConfigContext, requireDoomConfigContext, supersedeDoomConfigTransition } from "./adapters/pi/piContext.cjs";
|
|
18
18
|
import { AgentProfile, PERSONA_FILES, applyProfileEnvironment, buildPersonaPrompt, listProfileNames, loadProfiles, replaceProfileEnvironment, resolveProfile } from "./adapters/profiles.cjs";
|
|
19
|
-
export { type AgentProfile, type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigAdapterRegistrationOptions, type ConfigKeyScope, type ConfigValueOrigin, DOOM_CONFIG_ENTRY_TYPE, DOOM_CONFIG_SERVICE, DOOM_CONFIG_TEMPLATES, DOOM_CONFIG_TRANSITION_ENTRY_TYPE, DOOM_DIR, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, type DeepReadonly, type DomainDefinition, type DomainManifest, type DomainMcpAllowlist, type DomainPlugin, type DoomConfig, type DoomConfigContext, type DoomConfigEdit, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigScope, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, FILE_ONLY_STATE_FIELDS, GLOBAL_DOOM_SEED_FILES, type GitPluginSource, type GlobalDoomInitResult, HARNESS_STATE_KEYS, HARNESS_STATE_POINTER, type HarnessState, type HarnessStateFile, type HarnessStateParseReporter, type HarnessStateTransactionSnapshot, type IDoomConfigLoader, type IDoomConfigService, type LayerDefinition, type LayerPackage, type LayerPackageConfig, type LayerResolvers, type LoadedHarnessState, type LocalPluginSource, MARKETPLACE_MANIFEST_RELATIVE_PATHS, type MajorModeDefinition, type MajorModesConfig, type NpmPluginSource, PERSONA_FILES, type PiConfig, type PiConfigLoadOptions, type PiConfigPaths, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginCatalog, type PluginCatalogEntry, type PluginEntry, type PluginHookSource, type PluginManifestMetadata, type PluginSkillDiscovery, type PluginSource, type ProjectTrust, REPOSITORY_DOOM_CONFIG_TEMPLATES, type RepositoryDoomInitOptions, type RepositoryDoomInitResult, type ResolvedDomain, type ResolvedLayerDefinition, type ResolvedPackageConfiguration, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine, type WriteDoomConfigOptions, acknowledgeDoomConfigTransition, appendDoomConfigSelection, appendDoomConfigTransition, applyProfileEnvironment, buildPersonaPrompt, configLeafKeys, configRootKeys, configScopeOf, createDoomConfigContext, createDoomConfigContextAsync, createHarnessSession, disposeHarnessState, domainCompletionItems, domainCompletionPrefix, expandDomainNames, findPluginManifestPath, freezeDoomConfigContext, getHarnessState, globalDoomConfigDirectory, globalDoomConfigPath, harnessRoot, initializeGlobalDoomConfig, initializeRepositoryDoomConfig, isLocalPackageSpecifier, isRemotePluginSource, layerEntries, layerHookGroups, listDomainNames, listProfileNames, loadDomains, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadHarnessState, loadMajorModesConfig, loadPiConfig, loadPiConfigAsync, loadProfiles, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, piConfigPaths, pluginDirectoryForSource, projectHarnessEnvironment, provideDoomConfigContext, readDoomConfigContextGeneration, readDoomConfigPendingSelection, readDoomConfigSelection, readHarnessState, replaceDoomConfigContext, replaceProfileEnvironment, repositoryDoomConfigPath, requireDoomConfigContext, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, resolveLayers, resolvePackageConfigurations, resolvePlanningPlansDirectory, resolvePluginDirectories, resolvePluginEntries, resolveProfile, resolveSharedSkills, resolveVoiceConfig, restoreHarnessStateSnapshot, setDoomConfigValue, snapshotHarnessState, supersedeDoomConfigTransition, unsetDoomConfigValue, updateHarnessState, valueAtKeyPath, writeDoomConfigValues, writePrivateAtomicJson };
|
|
19
|
+
export { type AgentProfile, type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigAdapterRegistrationOptions, type ConfigKeyScope, type ConfigValueOrigin, DOOM_CONFIG_ENTRY_TYPE, DOOM_CONFIG_SERVICE, DOOM_CONFIG_TEMPLATES, DOOM_CONFIG_TRANSITION_ENTRY_TYPE, DOOM_DIR, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, type DeepReadonly, type DomainDefinition, type DomainManifest, type DomainMcpAllowlist, type DomainPlugin, type DoomConfig, type DoomConfigContext, type DoomConfigEdit, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigScope, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, FILE_ONLY_STATE_FIELDS, GLOBAL_DOOM_SEED_FILES, type GitPluginSource, type GlobalDoomInitResult, HARNESS_STATE_KEYS, HARNESS_STATE_POINTER, type HarnessState, type HarnessStateFile, type HarnessStateParseReporter, type HarnessStateTransactionSnapshot, type IDoomConfigLoader, type IDoomConfigService, type LayerDefinition, type LayerPackage, type LayerPackageConfig, type LayerResolvers, type LoadedHarnessState, type LocalPluginSource, MARKETPLACE_MANIFEST_RELATIVE_PATHS, type MajorModeDefinition, type MajorModesConfig, type NpmPluginSource, PERSONA_FILES, type PackageAttribution, type PiConfig, type PiConfigLoadOptions, type PiConfigPaths, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginCatalog, type PluginCatalogEntry, type PluginEntry, type PluginHookSource, type PluginManifestMetadata, type PluginSkillDiscovery, type PluginSource, type ProjectTrust, REPOSITORY_DOOM_CONFIG_TEMPLATES, type RepositoryDoomInitOptions, type RepositoryDoomInitResult, type ResolvedDomain, type ResolvedLayerDefinition, type ResolvedPackageConfiguration, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine, type WriteDoomConfigOptions, acknowledgeDoomConfigTransition, appendDoomConfigSelection, appendDoomConfigTransition, applyProfileEnvironment, buildPersonaPrompt, configLeafKeys, configRootKeys, configScopeOf, createDoomConfigContext, createDoomConfigContextAsync, createHarnessSession, disposeHarnessState, domainCompletionItems, domainCompletionPrefix, expandDomainNames, findPluginManifestPath, freezeDoomConfigContext, getHarnessState, globalDoomConfigDirectory, globalDoomConfigPath, harnessRoot, initializeGlobalDoomConfig, initializeRepositoryDoomConfig, isLocalPackageSpecifier, isRemotePluginSource, layerEntries, layerHookGroups, listDomainNames, listProfileNames, loadDomains, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadHarnessState, loadMajorModesConfig, loadPiConfig, loadPiConfigAsync, loadProfiles, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, piConfigPaths, pluginDirectoryForSource, projectHarnessEnvironment, provideDoomConfigContext, readDoomConfigContextGeneration, readDoomConfigPendingSelection, readDoomConfigSelection, readHarnessState, replaceDoomConfigContext, replaceProfileEnvironment, repositoryDoomConfigPath, requireDoomConfigContext, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, resolveLayers, resolvePackageConfigurations, resolvePlanningPlansDirectory, resolvePluginDirectories, resolvePluginEntries, resolveProfile, resolveSharedSkills, resolveVoiceConfig, restoreHarnessStateSnapshot, setDoomConfigValue, snapshotHarnessState, supersedeDoomConfigTransition, unsetDoomConfigValue, updateHarnessState, valueAtKeyPath, writeDoomConfigValues, writePrivateAtomicJson };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { writePrivateAtomicJson } from "./adapters/atomicJson.mjs";
|
|
2
|
-
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.mjs";
|
|
2
|
+
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PackageAttribution, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.mjs";
|
|
3
3
|
import { globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./adapters/config.mjs";
|
|
4
4
|
import { ConfigKeyScope, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, configLeafKeys, configRootKeys, configScopeOf, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, resolveVoiceConfig, valueAtKeyPath } from "./services/configPolicy.mjs";
|
|
5
5
|
import { ConfigAdapterRegistrationOptions, PiConfig, PiConfigLoadOptions, PiConfigPaths } from "./schemas/config/schema.mjs";
|
|
@@ -16,4 +16,4 @@ import { DOOM_CONFIG_TEMPLATES, GLOBAL_DOOM_SEED_FILES, GlobalDoomInitResult, RE
|
|
|
16
16
|
import { LayerDefinition, LayerPackage, LayerPackageConfig, LayerResolvers, MajorModeDefinition, MajorModesConfig, ResolvedLayerDefinition, ResolvedPackageConfiguration, isLocalPackageSpecifier, layerEntries, layerHookGroups, loadMajorModesConfig, resolveLayers, resolvePackageConfigurations } from "./adapters/majorModes.mjs";
|
|
17
17
|
import { DOOM_CONFIG_ENTRY_TYPE, DOOM_CONFIG_TRANSITION_ENTRY_TYPE, DoomConfigSelection, acknowledgeDoomConfigTransition, appendDoomConfigSelection, appendDoomConfigTransition, createDoomConfigContext, createDoomConfigContextAsync, freezeDoomConfigContext, provideDoomConfigContext, readDoomConfigContextGeneration, readDoomConfigPendingSelection, readDoomConfigSelection, replaceDoomConfigContext, requireDoomConfigContext, supersedeDoomConfigTransition } from "./adapters/pi/piContext.mjs";
|
|
18
18
|
import { AgentProfile, PERSONA_FILES, applyProfileEnvironment, buildPersonaPrompt, listProfileNames, loadProfiles, replaceProfileEnvironment, resolveProfile } from "./adapters/profiles.mjs";
|
|
19
|
-
export { type AgentProfile, type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigAdapterRegistrationOptions, type ConfigKeyScope, type ConfigValueOrigin, DOOM_CONFIG_ENTRY_TYPE, DOOM_CONFIG_SERVICE, DOOM_CONFIG_TEMPLATES, DOOM_CONFIG_TRANSITION_ENTRY_TYPE, DOOM_DIR, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, type DeepReadonly, type DomainDefinition, type DomainManifest, type DomainMcpAllowlist, type DomainPlugin, type DoomConfig, type DoomConfigContext, type DoomConfigEdit, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigScope, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, FILE_ONLY_STATE_FIELDS, GLOBAL_DOOM_SEED_FILES, type GitPluginSource, type GlobalDoomInitResult, HARNESS_STATE_KEYS, HARNESS_STATE_POINTER, type HarnessState, type HarnessStateFile, type HarnessStateParseReporter, type HarnessStateTransactionSnapshot, type IDoomConfigLoader, type IDoomConfigService, type LayerDefinition, type LayerPackage, type LayerPackageConfig, type LayerResolvers, type LoadedHarnessState, type LocalPluginSource, MARKETPLACE_MANIFEST_RELATIVE_PATHS, type MajorModeDefinition, type MajorModesConfig, type NpmPluginSource, PERSONA_FILES, type PiConfig, type PiConfigLoadOptions, type PiConfigPaths, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginCatalog, type PluginCatalogEntry, type PluginEntry, type PluginHookSource, type PluginManifestMetadata, type PluginSkillDiscovery, type PluginSource, type ProjectTrust, REPOSITORY_DOOM_CONFIG_TEMPLATES, type RepositoryDoomInitOptions, type RepositoryDoomInitResult, type ResolvedDomain, type ResolvedLayerDefinition, type ResolvedPackageConfiguration, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine, type WriteDoomConfigOptions, acknowledgeDoomConfigTransition, appendDoomConfigSelection, appendDoomConfigTransition, applyProfileEnvironment, buildPersonaPrompt, configLeafKeys, configRootKeys, configScopeOf, createDoomConfigContext, createDoomConfigContextAsync, createHarnessSession, disposeHarnessState, domainCompletionItems, domainCompletionPrefix, expandDomainNames, findPluginManifestPath, freezeDoomConfigContext, getHarnessState, globalDoomConfigDirectory, globalDoomConfigPath, harnessRoot, initializeGlobalDoomConfig, initializeRepositoryDoomConfig, isLocalPackageSpecifier, isRemotePluginSource, layerEntries, layerHookGroups, listDomainNames, listProfileNames, loadDomains, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadHarnessState, loadMajorModesConfig, loadPiConfig, loadPiConfigAsync, loadProfiles, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, piConfigPaths, pluginDirectoryForSource, projectHarnessEnvironment, provideDoomConfigContext, readDoomConfigContextGeneration, readDoomConfigPendingSelection, readDoomConfigSelection, readHarnessState, replaceDoomConfigContext, replaceProfileEnvironment, repositoryDoomConfigPath, requireDoomConfigContext, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, resolveLayers, resolvePackageConfigurations, resolvePlanningPlansDirectory, resolvePluginDirectories, resolvePluginEntries, resolveProfile, resolveSharedSkills, resolveVoiceConfig, restoreHarnessStateSnapshot, setDoomConfigValue, snapshotHarnessState, supersedeDoomConfigTransition, unsetDoomConfigValue, updateHarnessState, valueAtKeyPath, writeDoomConfigValues, writePrivateAtomicJson };
|
|
19
|
+
export { type AgentProfile, type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigAdapterRegistrationOptions, type ConfigKeyScope, type ConfigValueOrigin, DOOM_CONFIG_ENTRY_TYPE, DOOM_CONFIG_SERVICE, DOOM_CONFIG_TEMPLATES, DOOM_CONFIG_TRANSITION_ENTRY_TYPE, DOOM_DIR, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, type DeepReadonly, type DomainDefinition, type DomainManifest, type DomainMcpAllowlist, type DomainPlugin, type DoomConfig, type DoomConfigContext, type DoomConfigEdit, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigScope, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, FILE_ONLY_STATE_FIELDS, GLOBAL_DOOM_SEED_FILES, type GitPluginSource, type GlobalDoomInitResult, HARNESS_STATE_KEYS, HARNESS_STATE_POINTER, type HarnessState, type HarnessStateFile, type HarnessStateParseReporter, type HarnessStateTransactionSnapshot, type IDoomConfigLoader, type IDoomConfigService, type LayerDefinition, type LayerPackage, type LayerPackageConfig, type LayerResolvers, type LoadedHarnessState, type LocalPluginSource, MARKETPLACE_MANIFEST_RELATIVE_PATHS, type MajorModeDefinition, type MajorModesConfig, type NpmPluginSource, PERSONA_FILES, type PackageAttribution, type PiConfig, type PiConfigLoadOptions, type PiConfigPaths, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginCatalog, type PluginCatalogEntry, type PluginEntry, type PluginHookSource, type PluginManifestMetadata, type PluginSkillDiscovery, type PluginSource, type ProjectTrust, REPOSITORY_DOOM_CONFIG_TEMPLATES, type RepositoryDoomInitOptions, type RepositoryDoomInitResult, type ResolvedDomain, type ResolvedLayerDefinition, type ResolvedPackageConfiguration, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine, type WriteDoomConfigOptions, acknowledgeDoomConfigTransition, appendDoomConfigSelection, appendDoomConfigTransition, applyProfileEnvironment, buildPersonaPrompt, configLeafKeys, configRootKeys, configScopeOf, createDoomConfigContext, createDoomConfigContextAsync, createHarnessSession, disposeHarnessState, domainCompletionItems, domainCompletionPrefix, expandDomainNames, findPluginManifestPath, freezeDoomConfigContext, getHarnessState, globalDoomConfigDirectory, globalDoomConfigPath, harnessRoot, initializeGlobalDoomConfig, initializeRepositoryDoomConfig, isLocalPackageSpecifier, isRemotePluginSource, layerEntries, layerHookGroups, listDomainNames, listProfileNames, loadDomains, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadHarnessState, loadMajorModesConfig, loadPiConfig, loadPiConfigAsync, loadProfiles, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, piConfigPaths, pluginDirectoryForSource, projectHarnessEnvironment, provideDoomConfigContext, readDoomConfigContextGeneration, readDoomConfigPendingSelection, readDoomConfigSelection, readHarnessState, replaceDoomConfigContext, replaceProfileEnvironment, repositoryDoomConfigPath, requireDoomConfigContext, requireHarnessPaths, requireHarnessRoot, resetHarnessStore, resolveLayers, resolvePackageConfigurations, resolvePlanningPlansDirectory, resolvePluginDirectories, resolvePluginEntries, resolveProfile, resolveSharedSkills, resolveVoiceConfig, restoreHarnessStateSnapshot, setDoomConfigValue, snapshotHarnessState, supersedeDoomConfigTransition, unsetDoomConfigValue, updateHarnessState, valueAtKeyPath, writeDoomConfigValues, writePrivateAtomicJson };
|
package/dist/types/config.d.cts
CHANGED
|
@@ -147,6 +147,15 @@ interface PluginHookSource {
|
|
|
147
147
|
pluginRoot: string;
|
|
148
148
|
configPath: string;
|
|
149
149
|
}
|
|
150
|
+
/** What admitted a package into the composition. */
|
|
151
|
+
interface PackageAttribution {
|
|
152
|
+
/** `major` for a layer package, `domain` for a plugin a domain carries. */
|
|
153
|
+
kind: 'major' | 'domain';
|
|
154
|
+
/** The major mode name, or the domain name. */
|
|
155
|
+
mode: string;
|
|
156
|
+
/** The layer the package was listed under; absent for a domain plugin. */
|
|
157
|
+
layer?: string;
|
|
158
|
+
}
|
|
150
159
|
interface HarnessState {
|
|
151
160
|
root?: string;
|
|
152
161
|
/** The one named major mode this session runs under. */
|
|
@@ -155,6 +164,17 @@ interface HarnessState {
|
|
|
155
164
|
domains: string[];
|
|
156
165
|
/** The layer components the major mode resolved to. */
|
|
157
166
|
layers: string[];
|
|
167
|
+
/**
|
|
168
|
+
* Which mode, layer, or domain admitted each package, keyed by the package
|
|
169
|
+
* name exactly as its manifest spells it.
|
|
170
|
+
*
|
|
171
|
+
* The composition resolves this on its way to a flat list of entry paths and
|
|
172
|
+
* has no further use for it, so without somewhere to put it the causal link
|
|
173
|
+
* between a mode and the tools it brought is lost the moment the session
|
|
174
|
+
* starts. A surface that reports what the session is carrying has to be able
|
|
175
|
+
* to say what asked for it.
|
|
176
|
+
*/
|
|
177
|
+
packageAttribution?: Record<string, PackageAttribution>;
|
|
158
178
|
/** Canonical identity shared by launch, sync, children, and reload. */
|
|
159
179
|
compositionFingerprint?: string;
|
|
160
180
|
profile?: string;
|
|
@@ -230,5 +250,5 @@ interface DoomConfigLayers {
|
|
|
230
250
|
valueAt(keyPath: readonly string[]): unknown;
|
|
231
251
|
}
|
|
232
252
|
//#endregion
|
|
233
|
-
export { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService$1 as IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
|
|
253
|
+
export { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService$1 as IDoomConfigService, PackageAttribution, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
|
|
234
254
|
//# sourceMappingURL=config.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.cts","names":[],"sources":["../../src/types/config.ts"],"mappings":";;;KAKY;KACA;KACA;KACA;UAEK;EACf;EACA,WAAW;;UAEI;EACf,OAAO;EACP,YAAY;EACZ;;;;;;;;;UASe;EACf;EACA;EACA;;UAEe;EACf;EACA;EACA,WAAW;EACX,aAAa;;UAEE;EACf;;UAEe;EACf;EACA;;UAEe;EACf;EACA,OAAO;;UAEQ;EACf,QAAQ;EACR;EACA;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf,SAAS;EACT;EACA;IAAa;IAAiB;;EAC9B;IACE,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;;EAElB,cAAc;;UAEC;EACf,QAAQ;EACR;EACA;IAAY;IAAiB;;EAC7B,UAAU,YAAY;EACtB,cAAc;;;;;;;;;UASC;EACf;EACA;EACA;;;UAIe;WACN;WACA;WACA;WACA;;WAEA;;KAGC;KACA;UAEK;WACN;WACA;WACA,QAAQ;WACR,QAAQ;WACR,UAAU;WACV,OAAO;;;KAIN,6BAA6B;WAAwC;;UAEhE;EACf;IAAU,WAAW;IAAoB,cAAc;;EACvD,cAAc;EACd,SAAS;EACT,QAAQ;EACR,YAAY;;UAGG;EACf;EACA;;UAGe;EACf;;EAEA;EACA;EACA;;EAEA;;
|
|
1
|
+
{"version":3,"file":"config.d.cts","names":[],"sources":["../../src/types/config.ts"],"mappings":";;;KAKY;KACA;KACA;KACA;UAEK;EACf;EACA,WAAW;;UAEI;EACf,OAAO;EACP,YAAY;EACZ;;;;;;;;;UASe;EACf;EACA;EACA;;UAEe;EACf;EACA;EACA,WAAW;EACX,aAAa;;UAEE;EACf;;UAEe;EACf;EACA;;UAEe;EACf;EACA,OAAO;;UAEQ;EACf,QAAQ;EACR;EACA;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf,SAAS;EACT;EACA;IAAa;IAAiB;;EAC9B;IACE,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;;EAElB,cAAc;;UAEC;EACf,QAAQ;EACR;EACA;IAAY;IAAiB;;EAC7B,UAAU,YAAY;EACtB,cAAc;;;;;;;;;UASC;EACf;EACA;EACA;;;UAIe;WACN;WACA;WACA;WACA;;WAEA;;KAGC;KACA;UAEK;WACN;WACA;WACA,QAAQ;WACR,QAAQ;WACR,UAAU;WACV,OAAO;;;KAIN,6BAA6B;WAAwC;;UAEhE;EACf;IAAU,WAAW;IAAoB,cAAc;;EACvD,cAAc;EACd,SAAS;EACT,QAAQ;EACR,YAAY;;UAGG;EACf;EACA;;;UAIe;;EAEf;;EAEA;;EAEA;;UAGe;EACf;;EAEA;EACA;EACA;;EAEA;;;;;;;;;;;EAWA,qBAAqB,eAAe;;EAEpC;EACA;EACA,oBAAoB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;;EAEb,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA;;KAGU,aAAa,UAAU,oBAAmB,6BAClD,SACA,+BAA+B,oBACpB,aAAa,WACtB,oCACc,cAAc,SAAS,aAAa,OAAO,YACvD;KAEI,qBAAqB,aAAa;UAE7B;WACN,UAAU,aAAa;WACvB,SAAS;;WAET,mBAAmB,aAAa;;WAEhC;;;UAIM;EACf,KAAK,kBAAkB,yBAAyB;;;UAIjC,6BAA2B,mBAA0B,mBAAmB;;YAG7E;IACR,eAAe;;;;KAQP;;UAGK;EACf;EACA;;;;;;EAMA;;EAEA;;;;;;;;;;UAWe;;EAEf,YAAY;EACZ,gBAAgB;EAChB,WAAW;;EAEX,SAAS,6BAA6B;;EAEtC,QAAQ"}
|
package/dist/types/config.d.mts
CHANGED
|
@@ -147,6 +147,15 @@ interface PluginHookSource {
|
|
|
147
147
|
pluginRoot: string;
|
|
148
148
|
configPath: string;
|
|
149
149
|
}
|
|
150
|
+
/** What admitted a package into the composition. */
|
|
151
|
+
interface PackageAttribution {
|
|
152
|
+
/** `major` for a layer package, `domain` for a plugin a domain carries. */
|
|
153
|
+
kind: 'major' | 'domain';
|
|
154
|
+
/** The major mode name, or the domain name. */
|
|
155
|
+
mode: string;
|
|
156
|
+
/** The layer the package was listed under; absent for a domain plugin. */
|
|
157
|
+
layer?: string;
|
|
158
|
+
}
|
|
150
159
|
interface HarnessState {
|
|
151
160
|
root?: string;
|
|
152
161
|
/** The one named major mode this session runs under. */
|
|
@@ -155,6 +164,17 @@ interface HarnessState {
|
|
|
155
164
|
domains: string[];
|
|
156
165
|
/** The layer components the major mode resolved to. */
|
|
157
166
|
layers: string[];
|
|
167
|
+
/**
|
|
168
|
+
* Which mode, layer, or domain admitted each package, keyed by the package
|
|
169
|
+
* name exactly as its manifest spells it.
|
|
170
|
+
*
|
|
171
|
+
* The composition resolves this on its way to a flat list of entry paths and
|
|
172
|
+
* has no further use for it, so without somewhere to put it the causal link
|
|
173
|
+
* between a mode and the tools it brought is lost the moment the session
|
|
174
|
+
* starts. A surface that reports what the session is carrying has to be able
|
|
175
|
+
* to say what asked for it.
|
|
176
|
+
*/
|
|
177
|
+
packageAttribution?: Record<string, PackageAttribution>;
|
|
158
178
|
/** Canonical identity shared by launch, sync, children, and reload. */
|
|
159
179
|
compositionFingerprint?: string;
|
|
160
180
|
profile?: string;
|
|
@@ -230,5 +250,5 @@ interface DoomConfigLayers {
|
|
|
230
250
|
valueAt(keyPath: readonly string[]): unknown;
|
|
231
251
|
}
|
|
232
252
|
//#endregion
|
|
233
|
-
export { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService$1 as IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
|
|
253
|
+
export { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService$1 as IDoomConfigService, PackageAttribution, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
|
|
234
254
|
//# sourceMappingURL=config.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.mts","names":[],"sources":["../../src/types/config.ts"],"mappings":";;;KAKY;KACA;KACA;KACA;UAEK;EACf;EACA,WAAW;;UAEI;EACf,OAAO;EACP,YAAY;EACZ;;;;;;;;;UASe;EACf;EACA;EACA;;UAEe;EACf;EACA;EACA,WAAW;EACX,aAAa;;UAEE;EACf;;UAEe;EACf;EACA;;UAEe;EACf;EACA,OAAO;;UAEQ;EACf,QAAQ;EACR;EACA;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf,SAAS;EACT;EACA;IAAa;IAAiB;;EAC9B;IACE,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;;EAElB,cAAc;;UAEC;EACf,QAAQ;EACR;EACA;IAAY;IAAiB;;EAC7B,UAAU,YAAY;EACtB,cAAc;;;;;;;;;UASC;EACf;EACA;EACA;;;UAIe;WACN;WACA;WACA;WACA;;WAEA;;KAGC;KACA;UAEK;WACN;WACA;WACA,QAAQ;WACR,QAAQ;WACR,UAAU;WACV,OAAO;;;KAIN,6BAA6B;WAAwC;;UAEhE;EACf;IAAU,WAAW;IAAoB,cAAc;;EACvD,cAAc;EACd,SAAS;EACT,QAAQ;EACR,YAAY;;UAGG;EACf;EACA;;UAGe;EACf;;EAEA;EACA;EACA;;EAEA;;
|
|
1
|
+
{"version":3,"file":"config.d.mts","names":[],"sources":["../../src/types/config.ts"],"mappings":";;;KAKY;KACA;KACA;KACA;UAEK;EACf;EACA,WAAW;;UAEI;EACf,OAAO;EACP,YAAY;EACZ;;;;;;;;;UASe;EACf;EACA;EACA;;UAEe;EACf;EACA;EACA,WAAW;EACX,aAAa;;UAEE;EACf;;UAEe;EACf;EACA;;UAEe;EACf;EACA,OAAO;;UAEQ;EACf,QAAQ;EACR;EACA;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf,SAAS;EACT;EACA;IAAa;IAAiB;;EAC9B;IACE,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;;EAElB,cAAc;;UAEC;EACf,QAAQ;EACR;EACA;IAAY;IAAiB;;EAC7B,UAAU,YAAY;EACtB,cAAc;;;;;;;;;UASC;EACf;EACA;EACA;;;UAIe;WACN;WACA;WACA;WACA;;WAEA;;KAGC;KACA;UAEK;WACN;WACA;WACA,QAAQ;WACR,QAAQ;WACR,UAAU;WACV,OAAO;;;KAIN,6BAA6B;WAAwC;;UAEhE;EACf;IAAU,WAAW;IAAoB,cAAc;;EACvD,cAAc;EACd,SAAS;EACT,QAAQ;EACR,YAAY;;UAGG;EACf;EACA;;;UAIe;;EAEf;;EAEA;;EAEA;;UAGe;EACf;;EAEA;EACA;EACA;;EAEA;;;;;;;;;;;EAWA,qBAAqB,eAAe;;EAEpC;EACA;EACA,oBAAoB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;;EAEb,gBAAgB;EAChB;EACA;EACA;EACA;EACA;EACA;;KAGU,aAAa,UAAU,oBAAmB,6BAClD,SACA,+BAA+B,oBACpB,aAAa,WACtB,oCACc,cAAc,SAAS,aAAa,OAAO,YACvD;KAEI,qBAAqB,aAAa;UAE7B;WACN,UAAU,aAAa;WACvB,SAAS;;WAET,mBAAmB,aAAa;;WAEhC;;;UAIM;EACf,KAAK,kBAAkB,yBAAyB;;;UAIjC,6BAA2B,mBAA0B,mBAAmB;;YAG7E;IACR,eAAe;;;;KAQP;;UAGK;EACf;EACA;;;;;;EAMA;;EAEA;;;;;;;;;;UAWe;;EAEf,YAAY;EACZ,gBAAgB;EAChB,WAAW;;EAEX,SAAS,6BAA6B;;EAEtC,QAAQ"}
|
package/dist/types/domains.d.cts
CHANGED
|
@@ -76,6 +76,8 @@ interface PluginEntry {
|
|
|
76
76
|
/** Catalog identifier when the entry came from domains.yaml. */
|
|
77
77
|
name?: string;
|
|
78
78
|
directory: string;
|
|
79
|
+
/** The domain that admitted this plugin; absent for an explicit directory. */
|
|
80
|
+
domain?: string;
|
|
79
81
|
/** Omitted for legacy programmatic callers that already supply a directory. */
|
|
80
82
|
source?: PluginSource;
|
|
81
83
|
/** Manifest metadata retained so resource adapters can apply schema-gated plugin contracts. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/types/domains.ts"],"mappings":";UAAiB;EACf;;EAEA;;UAGe;EACf;EACA;;EAEA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;KAGU,eAAe,oBAAoB,kBAAkB;KACrD;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,QAAQ;EACR;EACA;EACA,WAAW;;UAGI;;EAEf;;EAEA;;EAEA,SAAS,eAAe;;EAExB;;;KAIU;EAEN;EAAc;EAAmB;EAAmB;EAAiB;;UAE1D;;EAEf;;EAEA;;UAGe;EACf;EACA,UAAU;EACV,MAAM;EACN;;UAGe,uBAAuB;EACtC;;UAGe;EACf,SAAS;EACT,SAAS,eAAe;EACxB,SAAS;EACT;;UAGe;;EAEf;EACA;;EAEA,SAAS;;EAET,WAAW;EACX,iBAAiB;EACjB;EACA;EACA;EACA"}
|
|
1
|
+
{"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/types/domains.ts"],"mappings":";UAAiB;EACf;;EAEA;;UAGe;EACf;EACA;;EAEA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;KAGU,eAAe,oBAAoB,kBAAkB;KACrD;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,QAAQ;EACR;EACA;EACA,WAAW;;UAGI;;EAEf;;EAEA;;EAEA,SAAS,eAAe;;EAExB;;;KAIU;EAEN;EAAc;EAAmB;EAAmB;EAAiB;;UAE1D;;EAEf;;EAEA;;UAGe;EACf;EACA,UAAU;EACV,MAAM;EACN;;UAGe,uBAAuB;EACtC;;UAGe;EACf,SAAS;EACT,SAAS,eAAe;EACxB,SAAS;EACT;;UAGe;;EAEf;EACA;;EAEA;;EAEA,SAAS;;EAET,WAAW;EACX,iBAAiB;EACjB;EACA;EACA;EACA"}
|
package/dist/types/domains.d.mts
CHANGED
|
@@ -76,6 +76,8 @@ interface PluginEntry {
|
|
|
76
76
|
/** Catalog identifier when the entry came from domains.yaml. */
|
|
77
77
|
name?: string;
|
|
78
78
|
directory: string;
|
|
79
|
+
/** The domain that admitted this plugin; absent for an explicit directory. */
|
|
80
|
+
domain?: string;
|
|
79
81
|
/** Omitted for legacy programmatic callers that already supply a directory. */
|
|
80
82
|
source?: PluginSource;
|
|
81
83
|
/** Manifest metadata retained so resource adapters can apply schema-gated plugin contracts. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/types/domains.ts"],"mappings":";UAAiB;EACf;;EAEA;;UAGe;EACf;EACA;;EAEA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;KAGU,eAAe,oBAAoB,kBAAkB;KACrD;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,QAAQ;EACR;EACA;EACA,WAAW;;UAGI;;EAEf;;EAEA;;EAEA,SAAS,eAAe;;EAExB;;;KAIU;EAEN;EAAc;EAAmB;EAAmB;EAAiB;;UAE1D;;EAEf;;EAEA;;UAGe;EACf;EACA,UAAU;EACV,MAAM;EACN;;UAGe,uBAAuB;EACtC;;UAGe;EACf,SAAS;EACT,SAAS,eAAe;EACxB,SAAS;EACT;;UAGe;;EAEf;EACA;;EAEA,SAAS;;EAET,WAAW;EACX,iBAAiB;EACjB;EACA;EACA;EACA"}
|
|
1
|
+
{"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/types/domains.ts"],"mappings":";UAAiB;EACf;;EAEA;;UAGe;EACf;EACA;;EAEA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;KAGU,eAAe,oBAAoB,kBAAkB;KACrD;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,QAAQ;EACR;EACA;EACA,WAAW;;UAGI;;EAEf;;EAEA;;EAEA,SAAS,eAAe;;EAExB;;;KAIU;EAEN;EAAc;EAAmB;EAAmB;EAAiB;;UAE1D;;EAEf;;EAEA;;UAGe;EACf;EACA,UAAU;EACV,MAAM;EACN;;UAGe,uBAAuB;EACtC;;UAGe;EACf,SAAS;EACT,SAAS,eAAe;EACxB,SAAS;EACT;;UAGe;;EAEf;EACA;;EAEA;;EAEA,SAAS;;EAET,WAAW;EACX,iBAAiB;EACjB;EACA;EACA;EACA"}
|
package/dist/types.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.cjs";
|
|
2
|
-
export { type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigValueOrigin, DOOM_CONFIG_SERVICE, type DeepReadonly, type DoomConfig, type DoomConfigContext, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, type HarnessState, type IDoomConfigLoader, type IDoomConfigService, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginHookSource, type ProjectTrust, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine };
|
|
1
|
+
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PackageAttribution, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.cjs";
|
|
2
|
+
export { type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigValueOrigin, DOOM_CONFIG_SERVICE, type DeepReadonly, type DoomConfig, type DoomConfigContext, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, type HarnessState, type IDoomConfigLoader, type IDoomConfigService, type PackageAttribution, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginHookSource, type ProjectTrust, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine };
|
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.mjs";
|
|
2
|
-
export { type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigValueOrigin, DOOM_CONFIG_SERVICE, type DeepReadonly, type DoomConfig, type DoomConfigContext, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, type HarnessState, type IDoomConfigLoader, type IDoomConfigService, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginHookSource, type ProjectTrust, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine };
|
|
1
|
+
import { AutocompactModeConfig, AutocompactThresholdConfig, ConfigValueOrigin, DOOM_CONFIG_SERVICE, DeepReadonly, DoomConfig, DoomConfigContext, DoomConfigLayer, DoomConfigLayers, DoomConfigPendingSelection, DoomConfigSelection, DoomConfigTransitionPhase, DoomConfigTransitionRecord, DoomConfigTransitionStrategy, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigLoader, IDoomConfigService, PackageAttribution, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine } from "./types/config.mjs";
|
|
2
|
+
export { type AutocompactModeConfig, type AutocompactThresholdConfig, type ConfigValueOrigin, DOOM_CONFIG_SERVICE, type DeepReadonly, type DoomConfig, type DoomConfigContext, type DoomConfigLayer, type DoomConfigLayers, type DoomConfigPendingSelection, type DoomConfigSelection, type DoomConfigTransitionPhase, type DoomConfigTransitionRecord, type DoomConfigTransitionStrategy, type DoomHarnessContext, type DoomSelectionConfig, type EditorConfig, type HarnessState, type IDoomConfigLoader, type IDoomConfigService, type PackageAttribution, type PlanningAgentConfig, type PlanningModeConfig, type PlanningThinkingLevel, type PluginHookSource, type ProjectTrust, type ResolvedVoiceAutoCaptureConfig, type ResolvedVoiceConfig, type VoiceAdapterConfig, type VoiceAutoCaptureConfig, type VoiceConfig, type VoiceEngine, type VoiceModelConfig, type VoiceTtsConfig, type VoiceTtsEngine };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-config",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.48",
|
|
4
4
|
"description": "Typed configuration loading, validation, and host adapters for composing DoomPi sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-configuration",
|
|
@@ -136,8 +136,8 @@
|
|
|
136
136
|
"dependencies": {
|
|
137
137
|
"@deepseek-ai/cordis": "4.0.1",
|
|
138
138
|
"yaml": "2.9.0",
|
|
139
|
-
"@agimon-ai/doompi-
|
|
140
|
-
"@agimon-ai/doompi-
|
|
139
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.48",
|
|
140
|
+
"@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.48"
|
|
141
141
|
},
|
|
142
142
|
"devDependencies": {
|
|
143
143
|
"@earendil-works/pi-coding-agent": "0.84.4",
|