@agimon-ai/doompi-config 0.0.1-alpha.7 → 0.0.1-alpha.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -15
- package/dist/agentPluginMcp.cjs +1 -0
- package/dist/agentPluginMcp.d.cts +2 -0
- package/dist/agentPluginMcp.d.mts +2 -0
- package/dist/agentPluginMcp.mjs +1 -0
- package/dist/api-contracts.cjs +1 -0
- package/dist/api-contracts.d.cts +2 -0
- package/dist/api-contracts.d.mts +2 -0
- package/dist/api-contracts.mjs +1 -0
- package/dist/atomicJson.cjs +1 -2
- package/dist/atomicJson.d.cts +2 -6
- package/dist/atomicJson.d.mts +2 -6
- package/dist/atomicJson.mjs +1 -2
- package/dist/config.cjs +1 -2
- package/dist/config.d.cts +4 -24
- package/dist/config.d.mts +4 -24
- package/dist/config.mjs +1 -2
- package/dist/configSchema.d.cts +2 -0
- package/dist/configSchema.d.mts +2 -0
- package/dist/configWriter.cjs +1 -2
- package/dist/configWriter.d.cts +2 -52
- package/dist/configWriter.d.mts +2 -52
- package/dist/configWriter.mjs +1 -2
- package/dist/constants/config.cjs +2 -0
- package/dist/constants/config.cjs.map +1 -0
- package/dist/constants/config.mjs +2 -0
- package/dist/constants/config.mjs.map +1 -0
- package/dist/constants/settings.cjs +2 -0
- package/dist/constants/settings.cjs.map +1 -0
- package/dist/constants/settings.mjs +2 -0
- package/dist/constants/settings.mjs.map +1 -0
- package/dist/controllers/settingsApi.cjs +2 -0
- package/dist/controllers/settingsApi.cjs.map +1 -0
- package/dist/controllers/settingsApi.mjs +2 -0
- package/dist/controllers/settingsApi.mjs.map +1 -0
- package/dist/domains.cjs +1 -2
- package/dist/domains.d.cts +6 -77
- package/dist/domains.d.mts +6 -77
- package/dist/domains.mjs +1 -2
- package/dist/extensions/pi.cjs +1 -1
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.cts +2 -5
- package/dist/extensions/pi.d.cts.map +1 -1
- package/dist/extensions/pi.d.mts +2 -5
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +1 -1
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +2 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.cts +5 -0
- package/dist/extensions/server.d.cts.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +2 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/harnessState.cjs +1 -2
- package/dist/harnessState.d.cts +2 -50
- package/dist/harnessState.d.mts +2 -50
- package/dist/harnessState.mjs +1 -2
- package/dist/harnessStore.cjs +1 -2
- package/dist/harnessStore.d.cts +3 -102
- package/dist/harnessStore.d.mts +3 -102
- package/dist/harnessStore.mjs +1 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +21 -16
- package/dist/index.d.mts +21 -16
- package/dist/index.mjs +1 -1
- package/dist/init.cjs +1 -76
- package/dist/init.d.cts +2 -33
- package/dist/init.d.mts +2 -33
- package/dist/init.mjs +1 -76
- package/dist/layeredConfig.cjs +1 -2
- package/dist/layeredConfig.d.cts +2 -49
- package/dist/layeredConfig.d.mts +2 -49
- package/dist/layeredConfig.mjs +1 -2
- package/dist/majorModes.cjs +1 -2
- package/dist/majorModes.d.cts +2 -75
- package/dist/majorModes.d.mts +2 -75
- package/dist/majorModes.mjs +1 -2
- package/dist/models/harnessCache.cjs +2 -0
- package/dist/models/harnessCache.cjs.map +1 -0
- package/dist/models/harnessCache.d.cts +10 -0
- package/dist/models/harnessCache.d.cts.map +1 -0
- package/dist/models/harnessCache.d.mts +10 -0
- package/dist/models/harnessCache.d.mts.map +1 -0
- package/dist/models/harnessCache.mjs +2 -0
- package/dist/models/harnessCache.mjs.map +1 -0
- package/dist/piConfig.cjs +1 -0
- package/dist/piConfig.d.cts +3 -0
- package/dist/piConfig.d.mts +3 -0
- package/dist/piConfig.mjs +1 -0
- package/dist/piContext.cjs +1 -2
- package/dist/piContext.d.cts +3 -19
- package/dist/piContext.d.mts +3 -19
- package/dist/piContext.mjs +1 -2
- package/dist/profiles.cjs +1 -4
- package/dist/profiles.d.cts +5 -35
- package/dist/profiles.d.mts +5 -35
- package/dist/profiles.mjs +1 -4
- package/dist/schemas/apiContracts.cjs +2 -0
- package/dist/schemas/apiContracts.cjs.map +1 -0
- package/dist/schemas/apiContracts.d.cts +53 -0
- package/dist/schemas/apiContracts.d.cts.map +1 -0
- package/dist/schemas/apiContracts.d.mts +53 -0
- package/dist/schemas/apiContracts.d.mts.map +1 -0
- package/dist/schemas/apiContracts.mjs +2 -0
- package/dist/schemas/apiContracts.mjs.map +1 -0
- package/dist/selectionSwitch.cjs +1 -0
- package/dist/selectionSwitch.d.cts +2 -0
- package/dist/selectionSwitch.d.mts +2 -0
- package/dist/selectionSwitch.mjs +1 -0
- package/dist/services/agentPluginMcp/index.cjs +2 -0
- package/dist/services/agentPluginMcp/index.cjs.map +1 -0
- package/dist/services/agentPluginMcp/index.d.cts +37 -0
- package/dist/services/agentPluginMcp/index.d.cts.map +1 -0
- package/dist/services/agentPluginMcp/index.d.mts +37 -0
- package/dist/services/agentPluginMcp/index.d.mts.map +1 -0
- package/dist/services/agentPluginMcp/index.mjs +2 -0
- package/dist/services/agentPluginMcp/index.mjs.map +1 -0
- package/dist/services/atomicJson/index.cjs +2 -0
- package/dist/services/atomicJson/index.cjs.map +1 -0
- package/dist/services/atomicJson/index.d.cts +5 -0
- package/dist/services/atomicJson/index.d.cts.map +1 -0
- package/dist/services/atomicJson/index.d.mts +5 -0
- package/dist/services/atomicJson/index.d.mts.map +1 -0
- package/dist/services/atomicJson/index.mjs +2 -0
- package/dist/services/atomicJson/index.mjs.map +1 -0
- package/dist/services/config/index.cjs +2 -0
- package/dist/services/config/index.cjs.map +1 -0
- package/dist/services/config/index.d.cts +34 -0
- package/dist/services/config/index.d.cts.map +1 -0
- package/dist/services/config/index.d.mts +34 -0
- package/dist/services/config/index.d.mts.map +1 -0
- package/dist/services/config/index.mjs +2 -0
- package/dist/services/config/index.mjs.map +1 -0
- package/dist/services/configPolicy/index.cjs +2 -0
- package/dist/services/configPolicy/index.cjs.map +1 -0
- package/dist/services/configPolicy/index.d.cts +81 -0
- package/dist/services/configPolicy/index.d.cts.map +1 -0
- package/dist/services/configPolicy/index.d.mts +81 -0
- package/dist/services/configPolicy/index.d.mts.map +1 -0
- package/dist/services/configPolicy/index.mjs +2 -0
- package/dist/services/configPolicy/index.mjs.map +1 -0
- package/dist/services/configResources/index.cjs +2 -0
- package/dist/services/configResources/index.cjs.map +1 -0
- package/dist/services/configResources/index.mjs +2 -0
- package/dist/services/configResources/index.mjs.map +1 -0
- package/dist/services/configRuntime/index.cjs +2 -0
- package/dist/services/configRuntime/index.cjs.map +1 -0
- package/dist/services/configRuntime/index.mjs +2 -0
- package/dist/services/configRuntime/index.mjs.map +1 -0
- package/dist/services/configWriter/index.cjs +2 -0
- package/dist/services/configWriter/index.cjs.map +1 -0
- package/dist/services/configWriter/index.d.cts +65 -0
- package/dist/services/configWriter/index.d.cts.map +1 -0
- package/dist/services/configWriter/index.d.mts +65 -0
- package/dist/services/configWriter/index.d.mts.map +1 -0
- package/dist/services/configWriter/index.mjs +2 -0
- package/dist/services/configWriter/index.mjs.map +1 -0
- package/dist/services/domains/completion.cjs +2 -0
- package/dist/services/domains/completion.cjs.map +1 -0
- package/dist/services/domains/completion.d.cts +11 -0
- package/dist/services/domains/completion.d.cts.map +1 -0
- package/dist/services/domains/completion.d.mts +11 -0
- package/dist/services/domains/completion.d.mts.map +1 -0
- package/dist/services/domains/completion.mjs +2 -0
- package/dist/services/domains/completion.mjs.map +1 -0
- package/dist/services/domains/index.cjs +2 -0
- package/dist/services/domains/index.cjs.map +1 -0
- package/dist/services/domains/index.d.cts +35 -0
- package/dist/services/domains/index.d.cts.map +1 -0
- package/dist/services/domains/index.d.mts +35 -0
- package/dist/services/domains/index.d.mts.map +1 -0
- package/dist/services/domains/index.mjs +2 -0
- package/dist/services/domains/index.mjs.map +1 -0
- package/dist/services/doomConfigService/index.cjs +2 -0
- package/dist/services/doomConfigService/index.cjs.map +1 -0
- package/dist/services/doomConfigService/index.mjs +2 -0
- package/dist/services/doomConfigService/index.mjs.map +1 -0
- package/dist/services/harnessState/index.cjs +2 -0
- package/dist/services/harnessState/index.cjs.map +1 -0
- package/dist/services/harnessState/index.d.cts +49 -0
- package/dist/services/harnessState/index.d.cts.map +1 -0
- package/dist/services/harnessState/index.d.mts +49 -0
- package/dist/services/harnessState/index.d.mts.map +1 -0
- package/dist/services/harnessState/index.mjs +2 -0
- package/dist/services/harnessState/index.mjs.map +1 -0
- package/dist/services/harnessStore/index.cjs +2 -0
- package/dist/services/harnessStore/index.cjs.map +1 -0
- package/dist/services/harnessStore/index.d.cts +106 -0
- package/dist/services/harnessStore/index.d.cts.map +1 -0
- package/dist/services/harnessStore/index.d.mts +106 -0
- package/dist/services/harnessStore/index.d.mts.map +1 -0
- package/dist/services/harnessStore/index.mjs +2 -0
- package/dist/services/harnessStore/index.mjs.map +1 -0
- package/dist/services/imageSettings/index.cjs +2 -0
- package/dist/services/imageSettings/index.cjs.map +1 -0
- package/dist/services/imageSettings/index.d.cts +22 -0
- package/dist/services/imageSettings/index.d.cts.map +1 -0
- package/dist/services/imageSettings/index.d.mts +22 -0
- package/dist/services/imageSettings/index.d.mts.map +1 -0
- package/dist/services/imageSettings/index.mjs +2 -0
- package/dist/services/imageSettings/index.mjs.map +1 -0
- package/dist/services/init/index.cjs +232 -0
- package/dist/services/init/index.cjs.map +1 -0
- package/dist/services/init/index.d.cts +38 -0
- package/dist/services/init/index.d.cts.map +1 -0
- package/dist/services/init/index.d.mts +38 -0
- package/dist/services/init/index.d.mts.map +1 -0
- package/dist/services/init/index.mjs +232 -0
- package/dist/services/init/index.mjs.map +1 -0
- package/dist/services/layeredConfig/index.cjs +2 -0
- package/dist/services/layeredConfig/index.cjs.map +1 -0
- package/dist/services/layeredConfig/index.d.cts +53 -0
- package/dist/services/layeredConfig/index.d.cts.map +1 -0
- package/dist/services/layeredConfig/index.d.mts +53 -0
- package/dist/services/layeredConfig/index.d.mts.map +1 -0
- package/dist/services/layeredConfig/index.mjs +2 -0
- package/dist/services/layeredConfig/index.mjs.map +1 -0
- package/dist/services/majorModes/index.cjs +2 -0
- package/dist/services/majorModes/index.cjs.map +1 -0
- package/dist/services/majorModes/index.d.cts +117 -0
- package/dist/services/majorModes/index.d.cts.map +1 -0
- package/dist/services/majorModes/index.d.mts +117 -0
- package/dist/services/majorModes/index.d.mts.map +1 -0
- package/dist/services/majorModes/index.mjs +2 -0
- package/dist/services/majorModes/index.mjs.map +1 -0
- package/dist/services/personaFrontMatter/index.cjs +5 -0
- package/dist/services/personaFrontMatter/index.cjs.map +1 -0
- package/dist/services/personaFrontMatter/index.d.cts +11 -0
- package/dist/services/personaFrontMatter/index.d.cts.map +1 -0
- package/dist/services/personaFrontMatter/index.d.mts +11 -0
- package/dist/services/personaFrontMatter/index.d.mts.map +1 -0
- package/dist/services/personaFrontMatter/index.mjs +5 -0
- package/dist/services/personaFrontMatter/index.mjs.map +1 -0
- package/dist/services/personaIcon/index.cjs +2 -0
- package/dist/services/personaIcon/index.cjs.map +1 -0
- package/dist/services/personaIcon/index.d.cts +9 -0
- package/dist/services/personaIcon/index.d.cts.map +1 -0
- package/dist/services/personaIcon/index.d.mts +9 -0
- package/dist/services/personaIcon/index.d.mts.map +1 -0
- package/dist/services/personaIcon/index.mjs +2 -0
- package/dist/services/personaIcon/index.mjs.map +1 -0
- package/dist/services/piConfig/index.cjs +2 -0
- package/dist/services/piConfig/index.cjs.map +1 -0
- package/dist/services/piConfig/index.d.cts +20 -0
- package/dist/services/piConfig/index.d.cts.map +1 -0
- package/dist/services/piConfig/index.d.mts +20 -0
- package/dist/services/piConfig/index.d.mts.map +1 -0
- package/dist/services/piConfig/index.mjs +2 -0
- package/dist/services/piConfig/index.mjs.map +1 -0
- package/dist/services/pluginCatalog/index.cjs +2 -0
- package/dist/services/pluginCatalog/index.cjs.map +1 -0
- package/dist/services/pluginCatalog/index.d.cts +11 -0
- package/dist/services/pluginCatalog/index.d.cts.map +1 -0
- package/dist/services/pluginCatalog/index.d.mts +11 -0
- package/dist/services/pluginCatalog/index.d.mts.map +1 -0
- package/dist/services/pluginCatalog/index.mjs +2 -0
- package/dist/services/pluginCatalog/index.mjs.map +1 -0
- package/dist/services/profiles/index.cjs +4 -0
- package/dist/services/profiles/index.cjs.map +1 -0
- package/dist/services/profiles/index.d.cts +55 -0
- package/dist/services/profiles/index.d.cts.map +1 -0
- package/dist/services/profiles/index.d.mts +55 -0
- package/dist/services/profiles/index.d.mts.map +1 -0
- package/dist/services/profiles/index.mjs +4 -0
- package/dist/services/profiles/index.mjs.map +1 -0
- package/dist/services/selectionSwitch/index.cjs +2 -0
- package/dist/services/selectionSwitch/index.cjs.map +1 -0
- package/dist/services/selectionSwitch/index.d.cts +30 -0
- package/dist/services/selectionSwitch/index.d.cts.map +1 -0
- package/dist/services/selectionSwitch/index.d.mts +30 -0
- package/dist/services/selectionSwitch/index.d.mts.map +1 -0
- package/dist/services/selectionSwitch/index.mjs +2 -0
- package/dist/services/selectionSwitch/index.mjs.map +1 -0
- package/dist/services/sessionConfig/index.cjs +2 -0
- package/dist/services/sessionConfig/index.cjs.map +1 -0
- package/dist/services/sessionConfig/index.d.cts +33 -0
- package/dist/services/sessionConfig/index.d.cts.map +1 -0
- package/dist/services/sessionConfig/index.d.mts +33 -0
- package/dist/services/sessionConfig/index.d.mts.map +1 -0
- package/dist/services/sessionConfig/index.mjs +2 -0
- package/dist/services/sessionConfig/index.mjs.map +1 -0
- package/dist/services/settings/index.cjs +2 -0
- package/dist/services/settings/index.cjs.map +1 -0
- package/dist/services/settings/index.mjs +2 -0
- package/dist/services/settings/index.mjs.map +1 -0
- package/dist/types/config.cjs +1 -0
- package/dist/types/config.d.cts +308 -0
- package/dist/types/config.d.cts.map +1 -0
- package/dist/types/config.d.mts +308 -0
- package/dist/types/config.d.mts.map +1 -0
- package/dist/types/config.mjs +1 -0
- package/dist/types/domains.d.cts +92 -0
- package/dist/types/domains.d.cts.map +1 -0
- package/dist/types/domains.d.mts +92 -0
- package/dist/types/domains.d.mts.map +1 -0
- package/dist/{config/schema.d.cts → types/piConfig.d.cts} +7 -8
- package/dist/types/piConfig.d.cts.map +1 -0
- package/dist/{config/schema.d.mts → types/piConfig.d.mts} +7 -8
- package/dist/types/piConfig.d.mts.map +1 -0
- package/dist/types/profiles.d.cts +26 -0
- package/dist/types/profiles.d.cts.map +1 -0
- package/dist/types/profiles.d.mts +26 -0
- package/dist/types/profiles.d.mts.map +1 -0
- package/dist/types.cjs +1 -2
- package/dist/types.d.cts +2 -132
- package/dist/types.d.mts +2 -132
- package/dist/types.mjs +1 -2
- package/llms.txt +12 -0
- package/package.json +81 -39
- package/src/prompts/doompi-author-config/SKILL.md +26 -0
- package/src/prompts/doompi-author-config/agents/openai.yaml +4 -0
- package/src/prompts/doompi-author-config/references/config-contract.md +200 -0
- package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.cjs +0 -1
- package/dist/_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/decorate.mjs +0 -1
- package/dist/atomicJson.cjs.map +0 -1
- package/dist/atomicJson.d.cts.map +0 -1
- package/dist/atomicJson.d.mts.map +0 -1
- package/dist/atomicJson.mjs.map +0 -1
- package/dist/config/piConfig.cjs +0 -2
- package/dist/config/piConfig.cjs.map +0 -1
- package/dist/config/piConfig.d.cts +0 -7
- package/dist/config/piConfig.d.cts.map +0 -1
- package/dist/config/piConfig.d.mts +0 -7
- package/dist/config/piConfig.d.mts.map +0 -1
- package/dist/config/piConfig.mjs +0 -2
- package/dist/config/piConfig.mjs.map +0 -1
- package/dist/config/schema.d.cts.map +0 -1
- package/dist/config/schema.d.mts.map +0 -1
- package/dist/config.cjs.map +0 -1
- package/dist/config.d.cts.map +0 -1
- package/dist/config.d.mts.map +0 -1
- package/dist/config.mjs.map +0 -1
- package/dist/configWriter.cjs.map +0 -1
- package/dist/configWriter.d.cts.map +0 -1
- package/dist/configWriter.d.mts.map +0 -1
- package/dist/configWriter.mjs.map +0 -1
- package/dist/container.cjs +0 -2
- package/dist/container.cjs.map +0 -1
- package/dist/container.d.cts +0 -12
- package/dist/container.d.cts.map +0 -1
- package/dist/container.d.mts +0 -12
- package/dist/container.d.mts.map +0 -1
- package/dist/container.mjs +0 -2
- package/dist/container.mjs.map +0 -1
- package/dist/domains.cjs.map +0 -1
- package/dist/domains.d.cts.map +0 -1
- package/dist/domains.d.mts.map +0 -1
- package/dist/domains.mjs.map +0 -1
- package/dist/extensions/doom.cjs +0 -2
- package/dist/extensions/doom.cjs.map +0 -1
- package/dist/extensions/doom.d.cts +0 -8
- package/dist/extensions/doom.d.cts.map +0 -1
- package/dist/extensions/doom.d.mts +0 -8
- package/dist/extensions/doom.d.mts.map +0 -1
- package/dist/extensions/doom.mjs +0 -2
- package/dist/extensions/doom.mjs.map +0 -1
- package/dist/harnessState.cjs.map +0 -1
- package/dist/harnessState.d.cts.map +0 -1
- package/dist/harnessState.d.mts.map +0 -1
- package/dist/harnessState.mjs.map +0 -1
- package/dist/harnessStore.cjs.map +0 -1
- package/dist/harnessStore.d.cts.map +0 -1
- package/dist/harnessStore.d.mts.map +0 -1
- package/dist/harnessStore.mjs.map +0 -1
- package/dist/init.cjs.map +0 -1
- package/dist/init.d.cts.map +0 -1
- package/dist/init.d.mts.map +0 -1
- package/dist/init.mjs.map +0 -1
- package/dist/layeredConfig.cjs.map +0 -1
- package/dist/layeredConfig.d.cts.map +0 -1
- package/dist/layeredConfig.d.mts.map +0 -1
- package/dist/layeredConfig.mjs.map +0 -1
- package/dist/majorModes.cjs.map +0 -1
- package/dist/majorModes.d.cts.map +0 -1
- package/dist/majorModes.d.mts.map +0 -1
- package/dist/majorModes.mjs.map +0 -1
- package/dist/pi.cjs +0 -1
- package/dist/pi.d.cts +0 -2
- package/dist/pi.d.mts +0 -2
- package/dist/pi.mjs +0 -1
- package/dist/piContext.cjs.map +0 -1
- package/dist/piContext.d.cts.map +0 -1
- package/dist/piContext.d.mts.map +0 -1
- package/dist/piContext.mjs.map +0 -1
- package/dist/profiles.cjs.map +0 -1
- package/dist/profiles.d.cts.map +0 -1
- package/dist/profiles.d.mts.map +0 -1
- package/dist/profiles.mjs.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.d.cts.map +0 -1
- package/dist/types.d.mts.map +0 -1
- package/dist/types.mjs.map +0 -1
- package/skills/doom-pi-config/SKILL.md +0 -26
- package/skills/doom-pi-config/agents/openai.yaml +0 -4
- package/skills/doom-pi-config/references/config-contract.md +0 -43
- /package/dist/{config/schema.cjs → configSchema.cjs} +0 -0
- /package/dist/{config/schema.mjs → configSchema.mjs} +0 -0
package/README.md
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
# @agimon-ai/doompi-config
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Typed runtime configuration and immutable session context for
|
|
4
|
+
[DoomPi](https://www.npmjs.com/package/@agimon-ai/doompi).
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
This package is fixed core in the DoomPi distribution. It loads `config.yaml`, validates supported
|
|
7
|
+
runtime settings, publishes the `doom/config` Cordis service, and maintains selection state shared
|
|
8
|
+
by the major-mode, domain, and profile transition flows.
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
> **Alpha:** configuration contracts may change between releases.
|
|
11
|
+
|
|
12
|
+
## Requirements
|
|
13
|
+
|
|
14
|
+
- Node.js 22.19.0 or newer
|
|
15
|
+
- Pi 0.85.0 as a peer dependency
|
|
11
16
|
|
|
12
17
|
## Install
|
|
13
18
|
|
|
@@ -15,21 +20,124 @@ installed on its own.
|
|
|
15
20
|
npm install @agimon-ai/doompi-config
|
|
16
21
|
```
|
|
17
22
|
|
|
18
|
-
|
|
23
|
+
Do not add this package to a DoomPi layer. The distribution activates it before selectable packages
|
|
24
|
+
so the rest of the parent session can consume one resolved configuration snapshot.
|
|
25
|
+
|
|
26
|
+
## Runtime configuration
|
|
27
|
+
|
|
28
|
+
DoomPi reads `~/.pi/.doom/config.yaml` first and `<repoRoot>/.doom/config.yaml` second. Merge policy
|
|
29
|
+
is field-specific because some settings are personal and others are repository policy:
|
|
30
|
+
|
|
31
|
+
| Setting | Effective source policy |
|
|
32
|
+
| ------------------- | -------------------------------------------------------------------- |
|
|
33
|
+
| `projectTrust` | Repository value, defaulting to `ask` |
|
|
34
|
+
| `editor` | Personal config only |
|
|
35
|
+
| `modes.planning` | Personal and repository fields merge, with repository values winning |
|
|
36
|
+
| `voice` | Personal and repository fields merge, with repository values winning |
|
|
37
|
+
| `voice.autoCapture` | Personal config only |
|
|
38
|
+
| `selection` | Per-axis merge, with repository values winning |
|
|
39
|
+
|
|
40
|
+
Supported root keys are `modes`, `projectTrust`, `editor`, `voice`, and `selection`. Unknown keys and
|
|
41
|
+
invalid values fail during loading.
|
|
42
|
+
|
|
43
|
+
```yaml
|
|
44
|
+
projectTrust: ask
|
|
45
|
+
modes:
|
|
46
|
+
planning:
|
|
47
|
+
main:
|
|
48
|
+
model: openai/gpt-5.4
|
|
49
|
+
thinking: high
|
|
50
|
+
plansDirectory: .doom/plans
|
|
51
|
+
voice:
|
|
52
|
+
engine: auto
|
|
53
|
+
language: en
|
|
54
|
+
selection:
|
|
55
|
+
majorMode: copilot
|
|
56
|
+
domains: [default]
|
|
57
|
+
profile: reviewer
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The `selection` mapping names defaults. Definitions for those axes live in `modes.yaml`,
|
|
61
|
+
`domains.yaml`, and `profiles.yaml` and are documented by their owning package Help skills.
|
|
62
|
+
|
|
63
|
+
See the shipped [configuration contract](./src/prompts/doompi-author-config/references/config-contract.md) for
|
|
64
|
+
the complete runtime schema and additional configuration details.
|
|
65
|
+
|
|
66
|
+
## Typed session context
|
|
67
|
+
|
|
68
|
+
`@agimon-ai/doompi-config/extensions/pi` joins the runner-scoped Cordis host and provides
|
|
69
|
+
`DOOM_CONFIG_SERVICE`. Consumers must access it under an owning service injection:
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { DOOM_CONFIG_SERVICE, type DoomConfigContext, requireDoomConfigContext } from '@agimon-ai/doompi-config';
|
|
73
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
74
|
+
|
|
75
|
+
export function consumeDoomConfig(context: Context, consume: (snapshot: DoomConfigContext) => void): void {
|
|
76
|
+
context.inject([DOOM_CONFIG_SERVICE], (configContext) => {
|
|
77
|
+
consume(requireDoomConfigContext(configContext));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The snapshot is deeply frozen. It contains validated `settings`, active `harness` state, an optional
|
|
83
|
+
`pendingSelection`, and `requiresRelaunch`. Do not mutate it or retain it across provider or session
|
|
84
|
+
replacement. The next session publishes a new snapshot.
|
|
19
85
|
|
|
20
|
-
|
|
21
|
-
`.doom/modes.yaml`: making it optional would only create broken configurations.
|
|
86
|
+
## Plugin structure and lifecycle
|
|
22
87
|
|
|
23
|
-
|
|
88
|
+
Pi and server entries live directly in `src/extensions`. HTTP request handling lives in `src/controllers`, package behavior in `src/services/{serviceName}`, and cached harness state in `src/models`. Public consumption modules remain flat under `src/exports`.
|
|
24
89
|
|
|
25
|
-
|
|
90
|
+
The Pi entry uses `definePiExtension` with a Config service contribution and a typed `session_start` event. The shared helper owns mounting and disposal. Config publishes its readiness coordinator synchronously, loads configuration asynchronously, and waits at the session-start barrier before later features run. Session replacement cancels the prior generation and removes its Config and MCP projection services. Help contributions follow their optional provider without restarting Config.
|
|
26
91
|
|
|
27
|
-
This is
|
|
28
|
-
starts here.
|
|
92
|
+
This session readiness barrier is separate from plugin `onStart`. Awaiting configuration during plugin mounting would block publication of the services that startup consumers need.
|
|
29
93
|
|
|
30
|
-
##
|
|
94
|
+
## Selection transitions
|
|
95
|
+
|
|
96
|
+
Major-mode, domain, and profile packages resolve their own requested changes, then use the shared
|
|
97
|
+
transition coordinator. Config owns the persisted selection and transition journal records used to
|
|
98
|
+
distinguish active state from pending intent.
|
|
99
|
+
|
|
100
|
+
Transitions are serialized and compared with the active composition fingerprint. A compatible
|
|
101
|
+
change can use Pi reload. A launcher-owned composition change records pending intent for process
|
|
102
|
+
relaunch. A fresh session acknowledges a pending transition only when its exact target selection and
|
|
103
|
+
composition are active.
|
|
104
|
+
|
|
105
|
+
Consumers must not edit `snapshot.harness`, bypass the coordinator, or cache launcher environment
|
|
106
|
+
state at module scope.
|
|
107
|
+
|
|
108
|
+
## Public API
|
|
109
|
+
|
|
110
|
+
The root and focused `/config` and `/piContext` exports provide runtime parsing, merge policy, and
|
|
111
|
+
session integration:
|
|
112
|
+
|
|
113
|
+
```ts
|
|
114
|
+
import { loadDoomConfig } from '@agimon-ai/doompi-config';
|
|
115
|
+
|
|
116
|
+
const settings = loadDoomConfig(process.cwd());
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Pi-specific JSON settings are exposed through `/pi-config`; their types are exposed through `/config-schema`. The removed `/config/piConfig` and `/config/schema` paths have no aliases.
|
|
120
|
+
|
|
121
|
+
The package also exposes lower-level loaders used by the fixed axis packages. User-facing guidance
|
|
122
|
+
for defining modes, domains, and profiles is intentionally owned by those packages instead of this
|
|
123
|
+
runtime Config authoring skill.
|
|
124
|
+
|
|
125
|
+
## Help
|
|
126
|
+
|
|
127
|
+
The package publishes `src/prompts/doompi-author-config`, links it from `llms.txt`, and registers
|
|
128
|
+
`doompi-author-config` with the `doom/help` Cordis service. The guidance is visible to the AI only
|
|
129
|
+
while the parent Help minor mode is active.
|
|
130
|
+
|
|
131
|
+
## Development
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
pnpm build
|
|
135
|
+
pnpm typecheck
|
|
136
|
+
pnpm test
|
|
137
|
+
pnpm lint
|
|
138
|
+
```
|
|
31
139
|
|
|
32
|
-
|
|
140
|
+
Maintained by [Agimon](https://agimon.ai/about).
|
|
33
141
|
|
|
34
142
|
## License
|
|
35
143
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/agentPluginMcp/index.cjs");exports.normalizeAgentPluginMcpSource=e.normalizeAgentPluginMcpSource;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { AgentPluginMcpConfigSource, NormalizeAgentPluginMcpOptions, NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource } from "./services/agentPluginMcp/index.cjs";
|
|
2
|
+
export { type AgentPluginMcpConfigSource, type NormalizeAgentPluginMcpOptions, type NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { AgentPluginMcpConfigSource, NormalizeAgentPluginMcpOptions, NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource } from "./services/agentPluginMcp/index.mjs";
|
|
2
|
+
export { type AgentPluginMcpConfigSource, type NormalizeAgentPluginMcpOptions, type NormalizedAgentPluginMcpSource, normalizeAgentPluginMcpSource };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{normalizeAgentPluginMcpSource as e}from"./services/agentPluginMcp/index.mjs";export{e as normalizeAgentPluginMcpSource};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("./schemas/apiContracts.cjs");exports.apiContracts=e.apiContracts,exports.default=e.apiContracts;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{apiContracts as e}from"./schemas/apiContracts.mjs";export{e as apiContracts,e as default};
|
package/dist/atomicJson.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./
|
|
2
|
-
//# sourceMappingURL=atomicJson.cjs.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/atomicJson/index.cjs");exports.writePrivateAtomicJson=e.writePrivateAtomicJson;
|
package/dist/atomicJson.d.cts
CHANGED
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare function writePrivateAtomicJson(filePath: string, value: unknown): void;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { writePrivateAtomicJson };
|
|
6
|
-
//# sourceMappingURL=atomicJson.d.cts.map
|
|
1
|
+
import { writePrivateAtomicJson } from "./services/atomicJson/index.cjs";
|
|
2
|
+
export { writePrivateAtomicJson };
|
package/dist/atomicJson.d.mts
CHANGED
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
declare function writePrivateAtomicJson(filePath: string, value: unknown): void;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { writePrivateAtomicJson };
|
|
6
|
-
//# sourceMappingURL=atomicJson.d.mts.map
|
|
1
|
+
import { writePrivateAtomicJson } from "./services/atomicJson/index.mjs";
|
|
2
|
+
export { writePrivateAtomicJson };
|
package/dist/atomicJson.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
//# sourceMappingURL=atomicJson.mjs.map
|
|
1
|
+
import{writePrivateAtomicJson as e}from"./services/atomicJson/index.mjs";export{e as writePrivateAtomicJson};
|
package/dist/config.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./
|
|
2
|
-
//# sourceMappingURL=config.cjs.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/configPolicy/index.cjs"),t=require("./services/config/index.cjs");exports.DOOM_PLANNING_THINKING_LEVELS=e.DOOM_PLANNING_THINKING_LEVELS,exports.DOOM_VOICE_ENGINES=e.DOOM_VOICE_ENGINES,exports.DOOM_VOICE_MODES=e.DOOM_VOICE_MODES,exports.DOOM_VOICE_TTS_ENGINES=e.DOOM_VOICE_TTS_ENGINES,exports.configLeafKeys=e.configLeafKeys,exports.configRootKeys=e.configRootKeys,exports.configScopeOf=e.configScopeOf,exports.globalDoomConfigDirectory=t.globalDoomConfigDirectory,exports.globalDoomConfigPath=t.globalDoomConfigPath,exports.loadDoomConfig=t.loadDoomConfig,exports.loadDoomConfigAsync=t.loadDoomConfigAsync,exports.loadDoomConfigLayers=t.loadDoomConfigLayers,exports.loadDoomConfigLenient=t.loadDoomConfigLenient,exports.mergeDoomConfigs=e.mergeDoomConfigs,exports.parseAutocompactModeConfig=e.parseAutocompactModeConfig,exports.parseDoomConfig=e.parseDoomConfig,exports.parsePlanningModeConfig=e.parsePlanningModeConfig,exports.repositoryDoomConfigPath=t.repositoryDoomConfigPath,exports.resolvePlanningPlansDirectory=t.resolvePlanningPlansDirectory,exports.resolveVoiceConfig=e.resolveVoiceConfig,exports.valueAtKeyPath=e.valueAtKeyPath;
|
package/dist/config.d.cts
CHANGED
|
@@ -1,24 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* Exported because the config UI has to offer exactly what the parser accepts,
|
|
7
|
-
* and a second hand-written list in the contributing package would drift. The
|
|
8
|
-
* validating Sets below are built from these for the same reason.
|
|
9
|
-
*/
|
|
10
|
-
declare const DOOM_PLANNING_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
11
|
-
declare const DOOM_VOICE_ENGINES: readonly ["auto", "whisper-cpp", "openai-whisper", "mlx-whisper"];
|
|
12
|
-
declare const DOOM_VOICE_TTS_ENGINES: readonly ["macos-say"];
|
|
13
|
-
declare function parsePlanningModeConfig(value: unknown, filePath: string, location?: string): PlanningModeConfig;
|
|
14
|
-
declare function parseDoomConfig(content: string, filePath: string): DoomConfig;
|
|
15
|
-
declare function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig;
|
|
16
|
-
declare function resolveVoiceConfig(config: VoiceConfig): ResolvedVoiceConfig;
|
|
17
|
-
declare function globalDoomConfigDirectory(homeDirectory?: string): string;
|
|
18
|
-
declare function globalDoomConfigPath(homeDirectory?: string): string;
|
|
19
|
-
declare function resolvePlanningPlansDirectory(configured: string | undefined, repoRoot: string, homeDirectory?: string): string;
|
|
20
|
-
declare function repositoryDoomConfigPath(repoRoot: string): string;
|
|
21
|
-
declare function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig;
|
|
22
|
-
//#endregion
|
|
23
|
-
export { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig };
|
|
24
|
-
//# sourceMappingURL=config.d.cts.map
|
|
1
|
+
import { ConfigDiagnostic, ConfigValueOrigin, DoomConfigLayer, DoomConfigLayers, LenientParseOptions, LenientParseResult } from "./types/config.cjs";
|
|
2
|
+
import { globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadDoomConfigLenient, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./services/config/index.cjs";
|
|
3
|
+
import { ConfigKeyScope, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_MODES, DOOM_VOICE_TTS_ENGINES, configLeafKeys, configRootKeys, configScopeOf, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, resolveVoiceConfig, valueAtKeyPath } from "./services/configPolicy/index.cjs";
|
|
4
|
+
export { type ConfigDiagnostic, type ConfigKeyScope, type ConfigValueOrigin, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_MODES, DOOM_VOICE_TTS_ENGINES, type DoomConfigLayer, type DoomConfigLayers, type LenientParseOptions, type LenientParseResult, configLeafKeys, configRootKeys, configScopeOf, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadDoomConfigLenient, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig, valueAtKeyPath };
|
package/dist/config.d.mts
CHANGED
|
@@ -1,24 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*
|
|
6
|
-
* Exported because the config UI has to offer exactly what the parser accepts,
|
|
7
|
-
* and a second hand-written list in the contributing package would drift. The
|
|
8
|
-
* validating Sets below are built from these for the same reason.
|
|
9
|
-
*/
|
|
10
|
-
declare const DOOM_PLANNING_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
11
|
-
declare const DOOM_VOICE_ENGINES: readonly ["auto", "whisper-cpp", "openai-whisper", "mlx-whisper"];
|
|
12
|
-
declare const DOOM_VOICE_TTS_ENGINES: readonly ["macos-say"];
|
|
13
|
-
declare function parsePlanningModeConfig(value: unknown, filePath: string, location?: string): PlanningModeConfig;
|
|
14
|
-
declare function parseDoomConfig(content: string, filePath: string): DoomConfig;
|
|
15
|
-
declare function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig;
|
|
16
|
-
declare function resolveVoiceConfig(config: VoiceConfig): ResolvedVoiceConfig;
|
|
17
|
-
declare function globalDoomConfigDirectory(homeDirectory?: string): string;
|
|
18
|
-
declare function globalDoomConfigPath(homeDirectory?: string): string;
|
|
19
|
-
declare function resolvePlanningPlansDirectory(configured: string | undefined, repoRoot: string, homeDirectory?: string): string;
|
|
20
|
-
declare function repositoryDoomConfigPath(repoRoot: string): string;
|
|
21
|
-
declare function loadDoomConfig(repoRoot: string, homeDirectory?: string): DoomConfig;
|
|
22
|
-
//#endregion
|
|
23
|
-
export { DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_TTS_ENGINES, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, mergeDoomConfigs, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig };
|
|
24
|
-
//# sourceMappingURL=config.d.mts.map
|
|
1
|
+
import { ConfigDiagnostic, ConfigValueOrigin, DoomConfigLayer, DoomConfigLayers, LenientParseOptions, LenientParseResult } from "./types/config.mjs";
|
|
2
|
+
import { globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadDoomConfigLenient, repositoryDoomConfigPath, resolvePlanningPlansDirectory } from "./services/config/index.mjs";
|
|
3
|
+
import { ConfigKeyScope, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_MODES, DOOM_VOICE_TTS_ENGINES, configLeafKeys, configRootKeys, configScopeOf, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, resolveVoiceConfig, valueAtKeyPath } from "./services/configPolicy/index.mjs";
|
|
4
|
+
export { type ConfigDiagnostic, type ConfigKeyScope, type ConfigValueOrigin, DOOM_PLANNING_THINKING_LEVELS, DOOM_VOICE_ENGINES, DOOM_VOICE_MODES, DOOM_VOICE_TTS_ENGINES, type DoomConfigLayer, type DoomConfigLayers, type LenientParseOptions, type LenientParseResult, configLeafKeys, configRootKeys, configScopeOf, globalDoomConfigDirectory, globalDoomConfigPath, loadDoomConfig, loadDoomConfigAsync, loadDoomConfigLayers, loadDoomConfigLenient, mergeDoomConfigs, parseAutocompactModeConfig, parseDoomConfig, parsePlanningModeConfig, repositoryDoomConfigPath, resolvePlanningPlansDirectory, resolveVoiceConfig, valueAtKeyPath };
|
package/dist/config.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
//# sourceMappingURL=config.mjs.map
|
|
1
|
+
import{DOOM_PLANNING_THINKING_LEVELS as e,DOOM_VOICE_ENGINES as t,DOOM_VOICE_MODES as n,DOOM_VOICE_TTS_ENGINES as r,configLeafKeys as i,configRootKeys as a,configScopeOf as o,mergeDoomConfigs as s,parseAutocompactModeConfig as c,parseDoomConfig as l,parsePlanningModeConfig as u,resolveVoiceConfig as d,valueAtKeyPath as f}from"./services/configPolicy/index.mjs";import{globalDoomConfigDirectory as p,globalDoomConfigPath as m,loadDoomConfig as h,loadDoomConfigAsync as g,loadDoomConfigLayers as _,loadDoomConfigLenient as v,repositoryDoomConfigPath as y,resolvePlanningPlansDirectory as b}from"./services/config/index.mjs";export{e as DOOM_PLANNING_THINKING_LEVELS,t as DOOM_VOICE_ENGINES,n as DOOM_VOICE_MODES,r as DOOM_VOICE_TTS_ENGINES,i as configLeafKeys,a as configRootKeys,o as configScopeOf,p as globalDoomConfigDirectory,m as globalDoomConfigPath,h as loadDoomConfig,g as loadDoomConfigAsync,_ as loadDoomConfigLayers,v as loadDoomConfigLenient,s as mergeDoomConfigs,c as parseAutocompactModeConfig,l as parseDoomConfig,u as parsePlanningModeConfig,y as repositoryDoomConfigPath,b as resolvePlanningPlansDirectory,d as resolveVoiceConfig,f as valueAtKeyPath};
|
package/dist/configWriter.cjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./
|
|
2
|
-
//# sourceMappingURL=configWriter.cjs.map
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./services/configWriter/index.cjs");exports.setDoomConfigValue=e.setDoomConfigValue,exports.unsetDoomConfigValue=e.unsetDoomConfigValue,exports.writeDoomConfigValues=e.writeDoomConfigValues;
|
package/dist/configWriter.d.cts
CHANGED
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Writes into the global Doom config file, one key path at a time.
|
|
4
|
-
*
|
|
5
|
-
* Extracted from doom-file-edit, which owned the only writer in the repo and had
|
|
6
|
-
* it hard-coded to `editor.command`. Several extensions now edit their own
|
|
7
|
-
* settings from the config panel, and every one of them needs the same four
|
|
8
|
-
* properties: keep the user's comments, never publish a file the parser would
|
|
9
|
-
* reject, never leave a half-written file behind, and apply a set of related
|
|
10
|
-
* edits together.
|
|
11
|
-
*
|
|
12
|
-
* That last one is not a convenience. `voice.adapters.<engine>.model` accepts a
|
|
13
|
-
* path or an id but not both, so switching between them is a set and an unset
|
|
14
|
-
* that must land in the same write, or the file is briefly invalid.
|
|
15
|
-
*
|
|
16
|
-
* Atomicity is the same rename trick as `atomicJson.ts` next door, and carries
|
|
17
|
-
* the same caveat: it prevents torn reads, not lost updates. Two sessions with
|
|
18
|
-
* the panel open still clobber each other, because the rename only publishes
|
|
19
|
-
* what the caller already computed.
|
|
20
|
-
*
|
|
21
|
-
* AVOID:
|
|
22
|
-
* - Treating this as a lock
|
|
23
|
-
* - Writing an empty string; the parser rejects blank values, so clearing a key
|
|
24
|
-
* means removing it
|
|
25
|
-
*/
|
|
26
|
-
interface DoomConfigEdit {
|
|
27
|
-
/** Key path into the document, e.g. `['voice', 'adapters', 'mlx-whisper', 'model', 'id']`. */
|
|
28
|
-
readonly keyPath: readonly string[];
|
|
29
|
-
/** The value to write. `undefined` removes the key. */
|
|
30
|
-
readonly value?: string;
|
|
31
|
-
}
|
|
32
|
-
interface WriteDoomConfigOptions {
|
|
33
|
-
/**
|
|
34
|
-
* Remove ancestors left holding nothing. Defaults to true, and is not
|
|
35
|
-
* cosmetic: an adapter left as `{}` fails validation, because the parser
|
|
36
|
-
* requires a model once the adapter exists at all.
|
|
37
|
-
*/
|
|
38
|
-
readonly prune?: boolean;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Applies every edit as one document mutation, or throws having written nothing.
|
|
42
|
-
*
|
|
43
|
-
* Validation runs against the serialized result rather than each edit, so a pair
|
|
44
|
-
* of edits only valid together is accepted, and a single edit that breaks an
|
|
45
|
-
* invariant elsewhere is still caught.
|
|
46
|
-
*/
|
|
47
|
-
declare function writeDoomConfigValues(filePath: string, edits: readonly DoomConfigEdit[], options?: WriteDoomConfigOptions): Promise<void>;
|
|
48
|
-
declare function setDoomConfigValue(filePath: string, keyPath: readonly string[], value: string): Promise<void>;
|
|
49
|
-
declare function unsetDoomConfigValue(filePath: string, keyPath: readonly string[]): Promise<void>;
|
|
50
|
-
//#endregion
|
|
51
|
-
export { DoomConfigEdit, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
|
|
52
|
-
//# sourceMappingURL=configWriter.d.cts.map
|
|
1
|
+
import { DoomConfigEdit, DoomConfigScope, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues } from "./services/configWriter/index.cjs";
|
|
2
|
+
export { type DoomConfigEdit, type DoomConfigScope, type WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
|
package/dist/configWriter.d.mts
CHANGED
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Writes into the global Doom config file, one key path at a time.
|
|
4
|
-
*
|
|
5
|
-
* Extracted from doom-file-edit, which owned the only writer in the repo and had
|
|
6
|
-
* it hard-coded to `editor.command`. Several extensions now edit their own
|
|
7
|
-
* settings from the config panel, and every one of them needs the same four
|
|
8
|
-
* properties: keep the user's comments, never publish a file the parser would
|
|
9
|
-
* reject, never leave a half-written file behind, and apply a set of related
|
|
10
|
-
* edits together.
|
|
11
|
-
*
|
|
12
|
-
* That last one is not a convenience. `voice.adapters.<engine>.model` accepts a
|
|
13
|
-
* path or an id but not both, so switching between them is a set and an unset
|
|
14
|
-
* that must land in the same write, or the file is briefly invalid.
|
|
15
|
-
*
|
|
16
|
-
* Atomicity is the same rename trick as `atomicJson.ts` next door, and carries
|
|
17
|
-
* the same caveat: it prevents torn reads, not lost updates. Two sessions with
|
|
18
|
-
* the panel open still clobber each other, because the rename only publishes
|
|
19
|
-
* what the caller already computed.
|
|
20
|
-
*
|
|
21
|
-
* AVOID:
|
|
22
|
-
* - Treating this as a lock
|
|
23
|
-
* - Writing an empty string; the parser rejects blank values, so clearing a key
|
|
24
|
-
* means removing it
|
|
25
|
-
*/
|
|
26
|
-
interface DoomConfigEdit {
|
|
27
|
-
/** Key path into the document, e.g. `['voice', 'adapters', 'mlx-whisper', 'model', 'id']`. */
|
|
28
|
-
readonly keyPath: readonly string[];
|
|
29
|
-
/** The value to write. `undefined` removes the key. */
|
|
30
|
-
readonly value?: string;
|
|
31
|
-
}
|
|
32
|
-
interface WriteDoomConfigOptions {
|
|
33
|
-
/**
|
|
34
|
-
* Remove ancestors left holding nothing. Defaults to true, and is not
|
|
35
|
-
* cosmetic: an adapter left as `{}` fails validation, because the parser
|
|
36
|
-
* requires a model once the adapter exists at all.
|
|
37
|
-
*/
|
|
38
|
-
readonly prune?: boolean;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Applies every edit as one document mutation, or throws having written nothing.
|
|
42
|
-
*
|
|
43
|
-
* Validation runs against the serialized result rather than each edit, so a pair
|
|
44
|
-
* of edits only valid together is accepted, and a single edit that breaks an
|
|
45
|
-
* invariant elsewhere is still caught.
|
|
46
|
-
*/
|
|
47
|
-
declare function writeDoomConfigValues(filePath: string, edits: readonly DoomConfigEdit[], options?: WriteDoomConfigOptions): Promise<void>;
|
|
48
|
-
declare function setDoomConfigValue(filePath: string, keyPath: readonly string[], value: string): Promise<void>;
|
|
49
|
-
declare function unsetDoomConfigValue(filePath: string, keyPath: readonly string[]): Promise<void>;
|
|
50
|
-
//#endregion
|
|
51
|
-
export { DoomConfigEdit, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
|
|
52
|
-
//# sourceMappingURL=configWriter.d.mts.map
|
|
1
|
+
import { DoomConfigEdit, DoomConfigScope, WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues } from "./services/configWriter/index.mjs";
|
|
2
|
+
export { type DoomConfigEdit, type DoomConfigScope, type WriteDoomConfigOptions, setDoomConfigValue, unsetDoomConfigValue, writeDoomConfigValues };
|
package/dist/configWriter.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=configWriter.mjs.map
|
|
1
|
+
import{setDoomConfigValue as e,unsetDoomConfigValue as t,writeDoomConfigValues as n}from"./services/configWriter/index.mjs";export{e as setDoomConfigValue,t as unsetDoomConfigValue,n as writeDoomConfigValues};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e={name:`doompi-author-config`,description:`Configure DoomPi runtime settings, source precedence, and typed session configuration. Use for config.yaml, the doom/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.`};exports.CONFIG_HELP_SKILL=e,exports.PACKAGE_SOURCE=`@agimon-ai/doompi-config`;
|
|
2
|
+
//# sourceMappingURL=config.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.cjs","names":[],"sources":["../../src/constants/config.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-config';\nexport const CONFIG_HELP_SKILL = {\n name: 'doompi-author-config',\n description:\n 'Configure DoomPi runtime settings, source precedence, and typed session configuration. Use for config.yaml, the doom/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n};\n"],"mappings":"AAAA,MACa,EAAoB,CAC/B,KAAM,uBACN,YACE,oRACJ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=`@agimon-ai/doompi-config`,t={name:`doompi-author-config`,description:`Configure DoomPi runtime settings, source precedence, and typed session configuration. Use for config.yaml, the doom/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.`};export{t as CONFIG_HELP_SKILL,e as PACKAGE_SOURCE};
|
|
2
|
+
//# sourceMappingURL=config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../../src/constants/config.ts"],"sourcesContent":["export const PACKAGE_SOURCE = '@agimon-ai/doompi-config';\nexport const CONFIG_HELP_SKILL = {\n name: 'doompi-author-config',\n description:\n 'Configure DoomPi runtime settings, source precedence, and typed session configuration. Use for config.yaml, the doom/config Cordis service, immutable context snapshots, or shared selection transition state. Do not use for defining modes.yaml, domains.yaml, or profiles.yaml.',\n};\n"],"mappings":"AAAA,MAAa,EAAiB,2BACjB,EAAoB,CAC/B,KAAM,uBACN,YACE,oRACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.cjs","names":[],"sources":["../../src/constants/settings.ts"],"sourcesContent":["export const KEY_SEPARATOR = '.';\n\nexport const SELECTION_KEYS = {\n majorMode: ['selection', 'majorMode'],\n domains: ['selection', 'domains'],\n profile: ['selection', 'profile'],\n} as const;\n"],"mappings":"AAEA,MAAa,EAAiB,CAC5B,UAAW,CAAC,YAAa,WAAW,EACpC,QAAS,CAAC,YAAa,SAAS,EAChC,QAAS,CAAC,YAAa,SAAS,CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.mjs","names":[],"sources":["../../src/constants/settings.ts"],"sourcesContent":["export const KEY_SEPARATOR = '.';\n\nexport const SELECTION_KEYS = {\n majorMode: ['selection', 'majorMode'],\n domains: ['selection', 'domains'],\n profile: ['selection', 'profile'],\n} as const;\n"],"mappings":"AAEA,MAAa,EAAiB,CAC5B,UAAW,CAAC,YAAa,WAAW,EACpC,QAAS,CAAC,YAAa,SAAS,EAChC,QAAS,CAAC,YAAa,SAAS,CAClC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../services/configPolicy/index.cjs"),t=require("../services/config/index.cjs"),n=require("../services/configWriter/index.cjs"),r=require("../services/imageSettings/index.cjs"),i=require("../services/piConfig/index.cjs"),a=require("../services/settings/index.cjs"),o={basePath:`settings`,start(o){if(o.scope===`session`)throw Error(`Configuration settings require a global or workspace mount.`);let{homeDirectory:s}=o,c=()=>o.scope===`workspace`&&o.workspaceId&&o.workspaceRoot?{id:o.workspaceId,name:o.workspaceRoot.split(`/`).at(-1)??o.workspaceId,path:o.workspaceRoot,active:o.repositories?.().find(e=>e.id===o.workspaceId)?.active??!1}:void 0,l=()=>({...i.loadPiImageSettings(s),minDimension:256,maxAllowedDimension:r.DEFAULT_IMAGE_MAX_DIMENSION}),u=Promise.resolve(),d=!1,f=async r=>{if(d)return Response.json({error:`Configuration mount is closed.`},{status:503});let u=new URL(r.url),f=c();if(u.pathname===`/`&&r.method===`GET`)return Response.json(a.configView(o,u.searchParams.getAll(`key`)));if(u.pathname===`/repositories`&&r.method===`GET`)return Response.json({repositories:o.repositories?.()??[]});if(u.pathname===`/repository`&&r.method===`GET`)return f?Response.json(a.repositorySettingsView(f,s)):Response.json({error:`Choose a workspace.`},{status:404});if(u.pathname===`/images`&&o.scope===`global`){if(r.method===`GET`)return Response.json(l());if(r.method===`PUT`){let e=await r.json();return!a.isRecord(e)||e.autoResize!==void 0&&typeof e.autoResize!=`boolean`||e.maxDimension!==void 0&&(typeof e.maxDimension!=`number`||!Number.isFinite(e.maxDimension))?Response.json({error:`Invalid image settings.`},{status:400}):(i.savePiImageSettings({...typeof e.autoResize==`boolean`?{autoResize:e.autoResize}:{},...typeof e.maxDimension==`number`?{maxDimension:e.maxDimension}:{}},s),o.configurationChanged?.(),Response.json(l()))}}if(u.pathname===`/repository/selection`&&r.method===`PUT`){let e=a.parseSelectionWrite(await r.json());if(!e)return Response.json({error:`A selection write needs typed changes and a file hash.`},{status:400});if(!f||e.repositoryId!==f.id)return Response.json({error:`Workspace not found in this mount.`},{status:404});let i=a.repositorySettingsView(f,s);if(i.hash!==e.expectedHash)return Response.json({error:`The repository config changed since it was read.`,hash:i.hash},{status:409});let c=a.validateSelectionChanges(i,e.changes);return c?Response.json({error:c},{status:422}):(await n.writeDoomConfigValues(t.repositoryDoomConfigPath(f.path),a.selectionEdits(e.changes),{scope:`repository`}),o.configurationChanged?.(),Response.json(a.repositorySettingsView(f,s)))}if(u.pathname===`/value`&&r.method===`PUT`){let t=a.parseWrite(await r.json());if(!t)return Response.json({error:`A save requires a scope, key, value and file hash.`},{status:400});let i=o.scope===`global`?`global`:`repository`;if(t.scope!==i||i===`repository`&&t.repoRoot!==f?.path)return Response.json({error:`The write targets a different mount.`},{status:403});if(t.edits.some(t=>{let n=e.configScopeOf(t.keyPath);return n!==`both`&&n!==i}))return Response.json({error:`This key cannot be set at this scope.`},{status:409});let c=a.configView(o,[]);if(c.hashes[i]!==t.expectedHash)return Response.json({error:`The config changed since it was read.`,hash:c.hashes[i]},{status:409});let l=a.pathFor(i,f?.path??``,s);return await n.writeDoomConfigValues(l,t.edits.map(({keyPath:e,value:t})=>({keyPath:e,...t===null?{}:{value:t}})),{scope:i}),o.configurationChanged?.(),Response.json(a.configView(o,t.edits.map(e=>e.keyPath.join(`.`))))}return Response.json({error:`Configuration route not found.`},{status:404})},p=async e=>{try{return await f(e)}catch(e){return Response.json({error:a.describe(e)},{status:e instanceof SyntaxError?400:422})}};return{fetch(e){if(e.method===`GET`||e.method===`HEAD`)return p(e);let t=u.then(()=>p(e));return u=t.catch(()=>void 0),t},close(){d=!0}}}};exports.settingsApi=o;
|
|
2
|
+
//# sourceMappingURL=settingsApi.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settingsApi.cjs","names":["loadPiImageSettings","DEFAULT_IMAGE_MAX_DIMENSION","configView","repositorySettingsView","isRecord","parseSelectionWrite","validateSelectionChanges","writeDoomConfigValues","repositoryDoomConfigPath","selectionEdits","parseWrite","configScopeOf","pathFor","describe"],"sources":["../../src/controllers/settingsApi.ts"],"sourcesContent":["import type { DoomApi } from '@agimon-ai/doompi-core/package-api';\n\nimport { KEY_SEPARATOR } from '../constants/settings';\nimport { repositoryDoomConfigPath } from '../services/config';\nimport { configScopeOf } from '../services/configPolicy';\nimport { writeDoomConfigValues } from '../services/configWriter';\nimport { DEFAULT_IMAGE_MAX_DIMENSION, MIN_IMAGE_MAX_DIMENSION } from '../services/imageSettings';\nimport { loadPiImageSettings, savePiImageSettings } from '../services/piConfig';\nimport {\n configView,\n describe,\n isRecord,\n parseSelectionWrite,\n parseWrite,\n pathFor,\n repositorySettingsView,\n selectionEdits,\n validateSelectionChanges,\n} from '../services/settings';\nimport type { SettingsRepository } from '../types/settings';\n\n/** Config handlers are bound to their mount. Request paths cannot choose a different repository. */\nexport const settingsApi: DoomApi = {\n basePath: 'settings',\n start(context) {\n if (context.scope === 'session') throw new Error('Configuration settings require a global or workspace mount.');\n const { homeDirectory } = context;\n const repository = (): SettingsRepository | undefined =>\n context.scope === 'workspace' && context.workspaceId && context.workspaceRoot\n ? {\n id: context.workspaceId,\n name: context.workspaceRoot.split('/').at(-1) ?? context.workspaceId,\n path: context.workspaceRoot,\n active: context.repositories?.().find((entry) => entry.id === context.workspaceId)?.active ?? false,\n }\n : undefined;\n const imageView = () => ({\n ...loadPiImageSettings(homeDirectory),\n minDimension: MIN_IMAGE_MAX_DIMENSION,\n maxAllowedDimension: DEFAULT_IMAGE_MAX_DIMENSION,\n });\n let writes: Promise<unknown> = Promise.resolve();\n let closed = false;\n const dispatch = async (request: Request): Promise<Response> => {\n if (closed) return Response.json({ error: 'Configuration mount is closed.' }, { status: 503 });\n const url = new URL(request.url);\n const currentRepository = repository();\n if (url.pathname === '/' && request.method === 'GET')\n return Response.json(configView(context, url.searchParams.getAll('key')));\n if (url.pathname === '/repositories' && request.method === 'GET')\n return Response.json({ repositories: context.repositories?.() ?? [] });\n if (url.pathname === '/repository' && request.method === 'GET') {\n return currentRepository\n ? Response.json(repositorySettingsView(currentRepository, homeDirectory))\n : Response.json({ error: 'Choose a workspace.' }, { status: 404 });\n }\n if (url.pathname === '/images' && context.scope === 'global') {\n if (request.method === 'GET') return Response.json(imageView());\n if (request.method === 'PUT') {\n const body: unknown = await request.json();\n if (\n !isRecord(body) ||\n (body.autoResize !== undefined && typeof body.autoResize !== 'boolean') ||\n (body.maxDimension !== undefined &&\n (typeof body.maxDimension !== 'number' || !Number.isFinite(body.maxDimension)))\n )\n return Response.json({ error: 'Invalid image settings.' }, { status: 400 });\n savePiImageSettings(\n {\n ...(typeof body.autoResize === 'boolean' ? { autoResize: body.autoResize } : {}),\n ...(typeof body.maxDimension === 'number' ? { maxDimension: body.maxDimension } : {}),\n },\n homeDirectory,\n );\n context.configurationChanged?.();\n return Response.json(imageView());\n }\n }\n if (url.pathname === '/repository/selection' && request.method === 'PUT') {\n const body = parseSelectionWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A selection write needs typed changes and a file hash.' }, { status: 400 });\n if (!currentRepository || body.repositoryId !== currentRepository.id)\n return Response.json({ error: 'Workspace not found in this mount.' }, { status: 404 });\n const before = repositorySettingsView(currentRepository, homeDirectory);\n if (before.hash !== body.expectedHash)\n return Response.json(\n { error: 'The repository config changed since it was read.', hash: before.hash },\n { status: 409 },\n );\n const invalid = validateSelectionChanges(before, body.changes);\n if (invalid) return Response.json({ error: invalid }, { status: 422 });\n await writeDoomConfigValues(repositoryDoomConfigPath(currentRepository.path), selectionEdits(body.changes), {\n scope: 'repository',\n });\n context.configurationChanged?.();\n return Response.json(repositorySettingsView(currentRepository, homeDirectory));\n }\n if (url.pathname === '/value' && request.method === 'PUT') {\n const body = parseWrite(await request.json());\n if (!body)\n return Response.json({ error: 'A save requires a scope, key, value and file hash.' }, { status: 400 });\n const scope = context.scope === 'global' ? 'global' : 'repository';\n if (body.scope !== scope || (scope === 'repository' && body.repoRoot !== currentRepository?.path))\n return Response.json({ error: 'The write targets a different mount.' }, { status: 403 });\n if (\n body.edits.some((edit) => {\n const allowed = configScopeOf(edit.keyPath);\n return allowed !== 'both' && allowed !== scope;\n })\n )\n return Response.json({ error: 'This key cannot be set at this scope.' }, { status: 409 });\n const before = configView(context, []);\n if (before.hashes[scope] !== body.expectedHash)\n return Response.json(\n { error: 'The config changed since it was read.', hash: before.hashes[scope] },\n { status: 409 },\n );\n const target = pathFor(scope, currentRepository?.path ?? '', homeDirectory);\n await writeDoomConfigValues(\n target,\n body.edits.map(({ keyPath, value }) => ({ keyPath, ...(value === null ? {} : { value }) })),\n { scope },\n );\n context.configurationChanged?.();\n return Response.json(\n configView(\n context,\n body.edits.map((edit) => edit.keyPath.join(KEY_SEPARATOR)),\n ),\n );\n }\n return Response.json({ error: 'Configuration route not found.' }, { status: 404 });\n };\n const guarded = async (request: Request): Promise<Response> => {\n try {\n return await dispatch(request);\n } catch (error) {\n return Response.json({ error: describe(error) }, { status: error instanceof SyntaxError ? 400 : 422 });\n }\n };\n return {\n fetch(request) {\n if (request.method === 'GET' || request.method === 'HEAD') return guarded(request);\n const result = writes.then(() => guarded(request));\n writes = result.catch(() => undefined);\n return result;\n },\n close() {\n closed = true;\n },\n };\n },\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{configScopeOf as e}from"../services/configPolicy/index.mjs";import{repositoryDoomConfigPath as t}from"../services/config/index.mjs";import{writeDoomConfigValues as n}from"../services/configWriter/index.mjs";import{DEFAULT_IMAGE_MAX_DIMENSION as r}from"../services/imageSettings/index.mjs";import{loadPiImageSettings as i,savePiImageSettings as a}from"../services/piConfig/index.mjs";import{configView as o,describe as s,isRecord as c,parseSelectionWrite as l,parseWrite as u,pathFor as d,repositorySettingsView as f,selectionEdits as p,validateSelectionChanges as m}from"../services/settings/index.mjs";const h={basePath:`settings`,start(h){if(h.scope===`session`)throw Error(`Configuration settings require a global or workspace mount.`);let{homeDirectory:g}=h,_=()=>h.scope===`workspace`&&h.workspaceId&&h.workspaceRoot?{id:h.workspaceId,name:h.workspaceRoot.split(`/`).at(-1)??h.workspaceId,path:h.workspaceRoot,active:h.repositories?.().find(e=>e.id===h.workspaceId)?.active??!1}:void 0,v=()=>({...i(g),minDimension:256,maxAllowedDimension:r}),y=Promise.resolve(),b=!1,x=async r=>{if(b)return Response.json({error:`Configuration mount is closed.`},{status:503});let i=new URL(r.url),s=_();if(i.pathname===`/`&&r.method===`GET`)return Response.json(o(h,i.searchParams.getAll(`key`)));if(i.pathname===`/repositories`&&r.method===`GET`)return Response.json({repositories:h.repositories?.()??[]});if(i.pathname===`/repository`&&r.method===`GET`)return s?Response.json(f(s,g)):Response.json({error:`Choose a workspace.`},{status:404});if(i.pathname===`/images`&&h.scope===`global`){if(r.method===`GET`)return Response.json(v());if(r.method===`PUT`){let e=await r.json();return!c(e)||e.autoResize!==void 0&&typeof e.autoResize!=`boolean`||e.maxDimension!==void 0&&(typeof e.maxDimension!=`number`||!Number.isFinite(e.maxDimension))?Response.json({error:`Invalid image settings.`},{status:400}):(a({...typeof e.autoResize==`boolean`?{autoResize:e.autoResize}:{},...typeof e.maxDimension==`number`?{maxDimension:e.maxDimension}:{}},g),h.configurationChanged?.(),Response.json(v()))}}if(i.pathname===`/repository/selection`&&r.method===`PUT`){let e=l(await r.json());if(!e)return Response.json({error:`A selection write needs typed changes and a file hash.`},{status:400});if(!s||e.repositoryId!==s.id)return Response.json({error:`Workspace not found in this mount.`},{status:404});let i=f(s,g);if(i.hash!==e.expectedHash)return Response.json({error:`The repository config changed since it was read.`,hash:i.hash},{status:409});let a=m(i,e.changes);return a?Response.json({error:a},{status:422}):(await n(t(s.path),p(e.changes),{scope:`repository`}),h.configurationChanged?.(),Response.json(f(s,g)))}if(i.pathname===`/value`&&r.method===`PUT`){let t=u(await r.json());if(!t)return Response.json({error:`A save requires a scope, key, value and file hash.`},{status:400});let i=h.scope===`global`?`global`:`repository`;if(t.scope!==i||i===`repository`&&t.repoRoot!==s?.path)return Response.json({error:`The write targets a different mount.`},{status:403});if(t.edits.some(t=>{let n=e(t.keyPath);return n!==`both`&&n!==i}))return Response.json({error:`This key cannot be set at this scope.`},{status:409});let a=o(h,[]);if(a.hashes[i]!==t.expectedHash)return Response.json({error:`The config changed since it was read.`,hash:a.hashes[i]},{status:409});let c=d(i,s?.path??``,g);return await n(c,t.edits.map(({keyPath:e,value:t})=>({keyPath:e,...t===null?{}:{value:t}})),{scope:i}),h.configurationChanged?.(),Response.json(o(h,t.edits.map(e=>e.keyPath.join(`.`))))}return Response.json({error:`Configuration route not found.`},{status:404})},S=async e=>{try{return await x(e)}catch(e){return Response.json({error:s(e)},{status:e instanceof SyntaxError?400:422})}};return{fetch(e){if(e.method===`GET`||e.method===`HEAD`)return S(e);let t=y.then(()=>S(e));return y=t.catch(()=>void 0),t},close(){b=!0}}}};export{h as settingsApi};
|
|
2
|
+
//# sourceMappingURL=settingsApi.mjs.map
|