@agimon-ai/doompi 0.0.1-alpha.2 → 0.0.1-alpha.21
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 +437 -452
- package/assets/doompi-tui.png +0 -0
- package/dist/adapters/bootstrapClaim.cjs +2 -0
- package/dist/adapters/bootstrapClaim.cjs.map +1 -0
- package/dist/adapters/bootstrapClaim.mjs +2 -0
- package/dist/adapters/bootstrapClaim.mjs.map +1 -0
- package/dist/adapters/bootstrapLocator.cjs +2 -0
- package/dist/adapters/bootstrapLocator.cjs.map +1 -0
- package/dist/adapters/bootstrapLocator.d.cts +6 -0
- package/dist/adapters/bootstrapLocator.d.cts.map +1 -0
- package/dist/adapters/bootstrapLocator.d.mts +6 -0
- package/dist/adapters/bootstrapLocator.d.mts.map +1 -0
- package/dist/adapters/bootstrapLocator.mjs +2 -0
- package/dist/adapters/bootstrapLocator.mjs.map +1 -0
- package/dist/adapters/compatibility/antigravity.cjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.cjs.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.cts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.cts.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.mts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.mts.map +1 -1
- package/dist/adapters/compatibility/antigravity.mjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.mjs.map +1 -1
- package/dist/adapters/compatibility/codex.cjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.cjs.map +1 -1
- package/dist/adapters/compatibility/codex.d.cts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.cts.map +1 -1
- package/dist/adapters/compatibility/codex.d.mts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.mts.map +1 -1
- package/dist/adapters/compatibility/codex.mjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.mjs.map +1 -1
- package/dist/adapters/compatibility/index.cjs +2 -0
- package/dist/adapters/compatibility/index.cjs.map +1 -0
- package/dist/adapters/compatibility/index.d.cts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.cts.map +1 -1
- package/dist/adapters/compatibility/index.d.mts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.mts.map +1 -1
- package/dist/adapters/compatibility/index.mjs +2 -0
- package/dist/adapters/compatibility/index.mjs.map +1 -0
- package/dist/adapters/compatibility/process.cjs +2 -0
- package/dist/{services → adapters}/compatibility/process.cjs.map +1 -1
- package/dist/adapters/compatibility/process.d.cts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.cts.map +1 -1
- package/dist/adapters/compatibility/process.d.mts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.mts.map +1 -1
- package/dist/adapters/compatibility/process.mjs +2 -0
- package/dist/{services → adapters}/compatibility/process.mjs.map +1 -1
- package/dist/adapters/compatibility/shared.cjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.cjs.map +1 -1
- package/dist/adapters/compatibility/shared.d.cts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.cts.map +1 -1
- package/dist/adapters/compatibility/shared.d.mts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.mts.map +1 -1
- package/dist/adapters/compatibility/shared.mjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.mjs.map +1 -1
- package/dist/adapters/compatibilityContext.cjs +2 -0
- package/dist/adapters/compatibilityContext.cjs.map +1 -0
- package/dist/adapters/compatibilityContext.d.cts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.cts.map +1 -1
- package/dist/adapters/compatibilityContext.d.mts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.mts.map +1 -1
- package/dist/adapters/compatibilityContext.mjs +2 -0
- package/dist/adapters/compatibilityContext.mjs.map +1 -0
- package/dist/adapters/composer.cjs +2 -0
- package/dist/adapters/composer.cjs.map +1 -0
- package/dist/adapters/composer.d.cts +113 -0
- package/dist/adapters/composer.d.cts.map +1 -0
- package/dist/adapters/composer.d.mts +113 -0
- package/dist/adapters/composer.d.mts.map +1 -0
- package/dist/adapters/composer.mjs +2 -0
- package/dist/adapters/composer.mjs.map +1 -0
- package/dist/adapters/compositionState.cjs +2 -0
- package/dist/adapters/compositionState.cjs.map +1 -0
- package/dist/adapters/compositionState.d.cts +12 -0
- package/dist/adapters/compositionState.d.cts.map +1 -0
- package/dist/adapters/compositionState.d.mts +12 -0
- package/dist/adapters/compositionState.d.mts.map +1 -0
- package/dist/adapters/compositionState.mjs +2 -0
- package/dist/adapters/compositionState.mjs.map +1 -0
- package/dist/adapters/config/harnessState.cjs +2 -0
- package/dist/adapters/config/harnessState.cjs.map +1 -0
- package/dist/adapters/config/harnessState.d.cts +26 -0
- package/dist/adapters/config/harnessState.d.cts.map +1 -0
- package/dist/adapters/config/harnessState.d.mts +26 -0
- package/dist/adapters/config/harnessState.d.mts.map +1 -0
- package/dist/adapters/config/harnessState.mjs +2 -0
- package/dist/adapters/config/harnessState.mjs.map +1 -0
- package/dist/adapters/deferredSkills.cjs +12 -0
- package/dist/adapters/deferredSkills.cjs.map +1 -0
- package/dist/adapters/deferredSkills.mjs +12 -0
- package/dist/adapters/deferredSkills.mjs.map +1 -0
- package/dist/adapters/doomPackage.cjs +2 -0
- package/dist/adapters/doomPackage.cjs.map +1 -0
- package/dist/adapters/doomPackage.mjs +2 -0
- package/dist/adapters/doomPackage.mjs.map +1 -0
- package/dist/adapters/dpiRunner.cjs +3 -0
- package/dist/adapters/dpiRunner.cjs.map +1 -0
- package/dist/adapters/dpiRunner.mjs +3 -0
- package/dist/adapters/dpiRunner.mjs.map +1 -0
- package/dist/adapters/dpiSettings.cjs +2 -0
- package/dist/adapters/dpiSettings.cjs.map +1 -0
- package/dist/adapters/dpiSettings.mjs +2 -0
- package/dist/adapters/dpiSettings.mjs.map +1 -0
- package/dist/adapters/extensionCompiler.cjs +3 -0
- package/dist/adapters/extensionCompiler.cjs.map +1 -0
- package/dist/adapters/extensionCompiler.mjs +3 -0
- package/dist/adapters/extensionCompiler.mjs.map +1 -0
- package/dist/adapters/harnessContext.cjs +2 -0
- package/dist/adapters/harnessContext.cjs.map +1 -0
- package/dist/adapters/harnessContext.d.cts +61 -0
- package/dist/{services → adapters}/harnessContext.d.cts.map +1 -1
- package/dist/adapters/harnessContext.d.mts +61 -0
- package/dist/{services → adapters}/harnessContext.d.mts.map +1 -1
- package/dist/adapters/harnessContext.mjs +2 -0
- package/dist/adapters/harnessContext.mjs.map +1 -0
- package/dist/adapters/helpSkills.cjs +2 -0
- package/dist/adapters/helpSkills.cjs.map +1 -0
- package/dist/adapters/helpSkills.mjs +2 -0
- package/dist/adapters/helpSkills.mjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.cjs +2 -0
- package/dist/adapters/layerPackageInstaller.cjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.mjs +2 -0
- package/dist/adapters/layerPackageInstaller.mjs.map +1 -0
- package/dist/adapters/matrixSwitcher.cjs +2 -0
- package/dist/adapters/matrixSwitcher.cjs.map +1 -0
- package/dist/adapters/matrixSwitcher.d.cts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.cts.map +1 -1
- package/dist/adapters/matrixSwitcher.d.mts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.mts.map +1 -1
- package/dist/adapters/matrixSwitcher.mjs +2 -0
- package/dist/adapters/matrixSwitcher.mjs.map +1 -0
- package/dist/adapters/mcpFilter.cjs +3 -0
- package/dist/adapters/mcpFilter.cjs.map +1 -0
- package/dist/adapters/mcpFilter.d.cts +40 -0
- package/dist/adapters/mcpFilter.d.cts.map +1 -0
- package/dist/adapters/mcpFilter.d.mts +40 -0
- package/dist/adapters/mcpFilter.d.mts.map +1 -0
- package/dist/adapters/mcpFilter.mjs +3 -0
- package/dist/adapters/mcpFilter.mjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.cjs +2 -0
- package/dist/adapters/modules/moduleResolution.cjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.cts +69 -0
- package/dist/adapters/modules/moduleResolution.d.cts.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.mts +69 -0
- package/dist/adapters/modules/moduleResolution.d.mts.map +1 -0
- package/dist/adapters/modules/moduleResolution.mjs +2 -0
- package/dist/adapters/modules/moduleResolution.mjs.map +1 -0
- package/dist/adapters/packageBootstrap.cjs +2 -0
- package/dist/adapters/packageBootstrap.cjs.map +1 -0
- package/dist/adapters/packageBootstrap.d.cts +8 -0
- package/dist/adapters/packageBootstrap.d.cts.map +1 -0
- package/dist/adapters/packageBootstrap.d.mts +8 -0
- package/dist/adapters/packageBootstrap.d.mts.map +1 -0
- package/dist/adapters/packageBootstrap.mjs +2 -0
- package/dist/adapters/packageBootstrap.mjs.map +1 -0
- package/dist/adapters/piExtensionAlias.cjs +2 -0
- package/dist/adapters/piExtensionAlias.cjs.map +1 -0
- package/dist/adapters/piExtensionAlias.mjs +2 -0
- package/dist/adapters/piExtensionAlias.mjs.map +1 -0
- package/dist/adapters/piSettings.cjs +2 -0
- package/dist/adapters/piSettings.cjs.map +1 -0
- package/dist/adapters/piSettings.d.cts +25 -0
- package/dist/adapters/piSettings.d.cts.map +1 -0
- package/dist/adapters/piSettings.d.mts +25 -0
- package/dist/adapters/piSettings.d.mts.map +1 -0
- package/dist/adapters/piSettings.mjs +2 -0
- package/dist/adapters/piSettings.mjs.map +1 -0
- package/dist/adapters/pluginMaterializer.cjs +2 -0
- package/dist/adapters/pluginMaterializer.cjs.map +1 -0
- package/dist/adapters/pluginMaterializer.mjs +2 -0
- package/dist/adapters/pluginMaterializer.mjs.map +1 -0
- package/dist/adapters/projectPiSettings.cjs +2 -0
- package/dist/adapters/projectPiSettings.cjs.map +1 -0
- package/dist/adapters/projectPiSettings.d.cts +29 -0
- package/dist/adapters/projectPiSettings.d.cts.map +1 -0
- package/dist/adapters/projectPiSettings.d.mts +29 -0
- package/dist/adapters/projectPiSettings.d.mts.map +1 -0
- package/dist/adapters/projectPiSettings.mjs +2 -0
- package/dist/adapters/projectPiSettings.mjs.map +1 -0
- package/dist/adapters/repository/repository.cjs +2 -0
- package/dist/adapters/repository/repository.cjs.map +1 -0
- package/dist/adapters/repository/repository.d.cts +21 -0
- package/dist/adapters/repository/repository.d.cts.map +1 -0
- package/dist/adapters/repository/repository.d.mts +21 -0
- package/dist/adapters/repository/repository.d.mts.map +1 -0
- package/dist/adapters/repository/repository.mjs +2 -0
- package/dist/adapters/repository/repository.mjs.map +1 -0
- package/dist/adapters/resourceCollector.cjs +3 -0
- package/dist/adapters/resourceCollector.cjs.map +1 -0
- package/dist/adapters/resourceCollector.d.cts +25 -0
- package/dist/adapters/resourceCollector.d.cts.map +1 -0
- package/dist/adapters/resourceCollector.d.mts +25 -0
- package/dist/adapters/resourceCollector.d.mts.map +1 -0
- package/dist/adapters/resourceCollector.mjs +3 -0
- package/dist/adapters/resourceCollector.mjs.map +1 -0
- package/dist/adapters/runtimeBundle.cjs +2 -0
- package/dist/adapters/runtimeBundle.cjs.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.cts +4 -2
- package/dist/adapters/runtimeBundle.d.cts.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.mts +4 -2
- package/dist/adapters/runtimeBundle.d.mts.map +1 -0
- package/dist/adapters/runtimeBundle.mjs +2 -0
- package/dist/adapters/runtimeBundle.mjs.map +1 -0
- package/dist/adapters/serialization/json.cjs +2 -0
- package/dist/adapters/serialization/json.cjs.map +1 -0
- package/dist/adapters/serialization/json.d.cts +23 -0
- package/dist/adapters/serialization/json.d.cts.map +1 -0
- package/dist/adapters/serialization/json.d.mts +23 -0
- package/dist/adapters/serialization/json.d.mts.map +1 -0
- package/dist/adapters/serialization/json.mjs +2 -0
- package/dist/adapters/serialization/json.mjs.map +1 -0
- package/dist/adapters/sharedBuildCache.cjs +2 -0
- package/dist/adapters/sharedBuildCache.cjs.map +1 -0
- package/dist/adapters/sharedBuildCache.mjs +2 -0
- package/dist/adapters/sharedBuildCache.mjs.map +1 -0
- package/dist/adapters/skillCatalog.cjs +2 -0
- package/dist/adapters/skillCatalog.cjs.map +1 -0
- package/dist/adapters/skillCatalog.d.cts +61 -0
- package/dist/adapters/skillCatalog.d.cts.map +1 -0
- package/dist/adapters/skillCatalog.d.mts +61 -0
- package/dist/adapters/skillCatalog.d.mts.map +1 -0
- package/dist/adapters/skillCatalog.mjs +2 -0
- package/dist/adapters/skillCatalog.mjs.map +1 -0
- package/dist/adapters/skillSources.cjs +2 -0
- package/dist/{services → adapters}/skillSources.cjs.map +1 -1
- package/dist/adapters/skillSources.d.cts +24 -0
- package/dist/{services → adapters}/skillSources.d.cts.map +1 -1
- package/dist/adapters/skillSources.d.mts +24 -0
- package/dist/{services → adapters}/skillSources.d.mts.map +1 -1
- package/dist/adapters/skillSources.mjs +2 -0
- package/dist/{services → adapters}/skillSources.mjs.map +1 -1
- package/dist/adapters/startupPrecompiler.cjs +2 -0
- package/dist/adapters/startupPrecompiler.cjs.map +1 -0
- package/dist/adapters/startupPrecompiler.d.cts +13 -0
- package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
- package/dist/adapters/startupPrecompiler.d.mts +13 -0
- package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
- package/dist/adapters/startupPrecompiler.mjs +2 -0
- package/dist/adapters/startupPrecompiler.mjs.map +1 -0
- package/dist/adapters/syncLocation.cjs +2 -0
- package/dist/adapters/syncLocation.cjs.map +1 -0
- package/dist/adapters/syncLocation.d.cts +19 -0
- package/dist/adapters/syncLocation.d.cts.map +1 -0
- package/dist/adapters/syncLocation.d.mts +19 -0
- package/dist/adapters/syncLocation.d.mts.map +1 -0
- package/dist/adapters/syncLocation.mjs +2 -0
- package/dist/adapters/syncLocation.mjs.map +1 -0
- package/dist/adapters/syncState.cjs +2 -0
- package/dist/adapters/syncState.cjs.map +1 -0
- package/dist/adapters/syncState.d.cts +153 -0
- package/dist/adapters/syncState.d.cts.map +1 -0
- package/dist/adapters/syncState.d.mts +153 -0
- package/dist/adapters/syncState.d.mts.map +1 -0
- package/dist/adapters/syncState.mjs +2 -0
- package/dist/adapters/syncState.mjs.map +1 -0
- package/dist/adapters/syncStateContract.cjs +2 -0
- package/dist/adapters/syncStateContract.cjs.map +1 -0
- package/dist/adapters/syncStateContract.d.cts +13 -0
- package/dist/adapters/syncStateContract.d.cts.map +1 -0
- package/dist/adapters/syncStateContract.d.mts +13 -0
- package/dist/adapters/syncStateContract.d.mts.map +1 -0
- package/dist/adapters/syncStateContract.mjs +2 -0
- package/dist/adapters/syncStateContract.mjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
- package/dist/bin/cli.cjs +1 -1
- package/dist/bin/cli.cjs.map +1 -1
- package/dist/bin/cli.mjs +1 -1
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/dpi.cjs +3 -0
- package/dist/bin/dpi.cjs.map +1 -0
- package/dist/bin/dpi.d.cts +1 -0
- package/dist/bin/dpi.d.mts +1 -0
- package/dist/bin/dpi.mjs +3 -0
- package/dist/bin/dpi.mjs.map +1 -0
- package/dist/cli/cliApp.cjs +1 -2
- package/dist/cli/cliApp.d.cts +2 -45
- package/dist/cli/cliApp.d.mts +2 -45
- package/dist/cli/cliApp.mjs +1 -2
- package/dist/cli/compatibilityOptions.cjs +1 -2
- package/dist/cli/compatibilityOptions.d.cts +2 -15
- package/dist/cli/compatibilityOptions.d.mts +2 -15
- package/dist/cli/compatibilityOptions.mjs +1 -2
- package/dist/cli/help.cjs +1 -63
- package/dist/cli/help.d.cts +2 -6
- package/dist/cli/help.d.mts +2 -6
- package/dist/cli/help.mjs +1 -63
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.d.cts +4 -4
- package/dist/cli/index.d.mts +4 -4
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/matrixOptions.cjs +1 -2
- package/dist/cli/matrixOptions.d.cts +2 -99
- package/dist/cli/matrixOptions.d.mts +2 -99
- package/dist/cli/matrixOptions.mjs +1 -2
- package/dist/cli/options.cjs +1 -2
- package/dist/cli/options.d.cts +2 -7
- package/dist/cli/options.d.mts +2 -7
- package/dist/cli/options.mjs +1 -2
- package/dist/commands/baseCommand.cjs.map +1 -1
- package/dist/commands/baseCommand.d.cts +3 -3
- package/dist/commands/baseCommand.d.mts +3 -3
- package/dist/commands/baseCommand.mjs.map +1 -1
- package/dist/commands/buildCommand.cjs +2 -2
- package/dist/commands/buildCommand.cjs.map +1 -1
- package/dist/commands/buildCommand.mjs +2 -2
- package/dist/commands/buildCommand.mjs.map +1 -1
- package/dist/commands/cli/cliApp.cjs +2 -0
- package/dist/commands/cli/cliApp.cjs.map +1 -0
- package/dist/commands/cli/cliApp.d.cts +45 -0
- package/dist/commands/cli/cliApp.d.cts.map +1 -0
- package/dist/commands/cli/cliApp.d.mts +45 -0
- package/dist/commands/cli/cliApp.d.mts.map +1 -0
- package/dist/commands/cli/cliApp.mjs +2 -0
- package/dist/commands/cli/cliApp.mjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.cjs +2 -0
- package/dist/commands/cli/compatibilityOptions.cjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.cts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.cts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.mts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.mts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.mjs +2 -0
- package/dist/commands/cli/compatibilityOptions.mjs.map +1 -0
- package/dist/commands/cli/help.cjs +68 -0
- package/dist/{cli → commands/cli}/help.cjs.map +1 -1
- package/dist/commands/cli/help.d.cts +6 -0
- package/dist/commands/cli/help.d.cts.map +1 -0
- package/dist/commands/cli/help.d.mts +6 -0
- package/dist/commands/cli/help.d.mts.map +1 -0
- package/dist/commands/cli/help.mjs +68 -0
- package/dist/{cli → commands/cli}/help.mjs.map +1 -1
- package/dist/commands/cli/index.cjs +1 -0
- package/dist/commands/cli/index.d.cts +4 -0
- package/dist/commands/cli/index.d.mts +4 -0
- package/dist/commands/cli/index.mjs +1 -0
- package/dist/commands/cli/matrixOptions.cjs +2 -0
- package/dist/commands/cli/matrixOptions.cjs.map +1 -0
- package/dist/commands/cli/matrixOptions.d.cts +99 -0
- package/dist/commands/cli/matrixOptions.d.cts.map +1 -0
- package/dist/commands/cli/matrixOptions.d.mts +99 -0
- package/dist/commands/cli/matrixOptions.d.mts.map +1 -0
- package/dist/commands/cli/matrixOptions.mjs +2 -0
- package/dist/commands/cli/matrixOptions.mjs.map +1 -0
- package/dist/commands/cli/options.cjs +2 -0
- package/dist/commands/cli/options.cjs.map +1 -0
- package/dist/commands/cli/options.d.cts +7 -0
- package/dist/commands/cli/options.d.cts.map +1 -0
- package/dist/commands/cli/options.d.mts +7 -0
- package/dist/commands/cli/options.d.mts.map +1 -0
- package/dist/commands/cli/options.mjs +2 -0
- package/dist/commands/cli/options.mjs.map +1 -0
- package/dist/commands/compatibilityCommand.cjs +1 -1
- package/dist/commands/compatibilityCommand.cjs.map +1 -1
- package/dist/commands/compatibilityCommand.d.cts +1 -1
- package/dist/commands/compatibilityCommand.d.cts.map +1 -1
- package/dist/commands/compatibilityCommand.d.mts +1 -1
- package/dist/commands/compatibilityCommand.d.mts.map +1 -1
- package/dist/commands/compatibilityCommand.mjs +1 -1
- package/dist/commands/compatibilityCommand.mjs.map +1 -1
- package/dist/commands/emitMcpCommand.cjs +1 -1
- package/dist/commands/emitMcpCommand.cjs.map +1 -1
- package/dist/commands/emitMcpCommand.d.cts +2 -2
- package/dist/commands/emitMcpCommand.d.mts +2 -2
- package/dist/commands/emitMcpCommand.mjs +1 -1
- package/dist/commands/emitMcpCommand.mjs.map +1 -1
- package/dist/commands/explainCommand.cjs +2 -2
- package/dist/commands/explainCommand.cjs.map +1 -1
- package/dist/commands/explainCommand.d.cts +2 -2
- package/dist/commands/explainCommand.d.mts +2 -2
- package/dist/commands/explainCommand.mjs +2 -2
- package/dist/commands/explainCommand.mjs.map +1 -1
- package/dist/commands/index.cjs +1 -1
- package/dist/commands/index.d.cts +2 -3
- package/dist/commands/index.d.mts +2 -3
- package/dist/commands/index.mjs +1 -1
- package/dist/commands/initCommand.cjs +1 -2
- package/dist/commands/initCommand.cjs.map +1 -1
- package/dist/commands/initCommand.d.cts +4 -3
- package/dist/commands/initCommand.d.cts.map +1 -1
- package/dist/commands/initCommand.d.mts +4 -3
- package/dist/commands/initCommand.d.mts.map +1 -1
- package/dist/commands/initCommand.mjs +1 -2
- package/dist/commands/initCommand.mjs.map +1 -1
- package/dist/commands/initPresenter.cjs +3 -0
- package/dist/commands/initPresenter.cjs.map +1 -0
- package/dist/commands/initPresenter.d.cts +8 -0
- package/dist/commands/initPresenter.d.cts.map +1 -0
- package/dist/commands/initPresenter.d.mts +8 -0
- package/dist/commands/initPresenter.d.mts.map +1 -0
- package/dist/commands/initPresenter.mjs +3 -0
- package/dist/commands/initPresenter.mjs.map +1 -0
- package/dist/commands/launchCommand.cjs +1 -1
- package/dist/commands/launchCommand.cjs.map +1 -1
- package/dist/commands/launchCommand.d.cts +6 -4
- package/dist/commands/launchCommand.d.cts.map +1 -1
- package/dist/commands/launchCommand.d.mts +6 -4
- package/dist/commands/launchCommand.d.mts.map +1 -1
- package/dist/commands/launchCommand.mjs +1 -1
- package/dist/commands/launchCommand.mjs.map +1 -1
- package/dist/commands/syncCommand.cjs +5 -5
- package/dist/commands/syncCommand.cjs.map +1 -1
- package/dist/commands/syncCommand.d.cts +19 -7
- package/dist/commands/syncCommand.d.cts.map +1 -1
- package/dist/commands/syncCommand.d.mts +19 -7
- package/dist/commands/syncCommand.d.mts.map +1 -1
- package/dist/commands/syncCommand.mjs +5 -5
- package/dist/commands/syncCommand.mjs.map +1 -1
- package/dist/commands/syncPipeline.cjs +2 -0
- package/dist/commands/syncPipeline.cjs.map +1 -0
- package/dist/commands/syncPipeline.mjs +2 -0
- package/dist/commands/syncPipeline.mjs.map +1 -0
- package/dist/config/harnessState.cjs +1 -2
- package/dist/config/harnessState.d.cts +2 -24
- package/dist/config/harnessState.d.mts +2 -24
- package/dist/config/harnessState.mjs +1 -2
- package/dist/config/index.cjs +1 -1
- package/dist/config/index.d.cts +4 -7
- package/dist/config/index.d.mts +4 -7
- package/dist/config/index.mjs +1 -1
- package/dist/config/projectTrust.cjs +1 -2
- package/dist/config/projectTrust.d.cts +2 -14
- package/dist/config/projectTrust.d.mts +2 -14
- package/dist/config/projectTrust.mjs +1 -2
- package/dist/entries/autoStop.cjs +1 -2
- package/dist/entries/autoStop.d.cts +2 -6
- package/dist/entries/autoStop.d.mts +2 -7
- package/dist/entries/autoStop.mjs +1 -2
- package/dist/entries/components/matrixPicker.cjs +1 -2
- package/dist/entries/components/matrixPicker.d.cts +2 -55
- package/dist/entries/components/matrixPicker.d.mts +2 -55
- package/dist/entries/components/matrixPicker.mjs +1 -2
- package/dist/entries/components/skillsOverlay.cjs +1 -4
- package/dist/entries/components/skillsOverlay.d.cts +2 -58
- package/dist/entries/components/skillsOverlay.d.mts +2 -58
- package/dist/entries/components/skillsOverlay.mjs +1 -4
- package/dist/entries/domains.cjs +1 -2
- package/dist/entries/domains.d.cts +2 -10
- package/dist/entries/domains.d.mts +2 -10
- package/dist/entries/domains.mjs +1 -2
- package/dist/entries/doom.cjs +1 -2
- package/dist/entries/doom.d.cts +2 -13
- package/dist/entries/doom.d.mts +2 -14
- package/dist/entries/doom.mjs +1 -2
- package/dist/entries/effort.cjs +1 -2
- package/dist/entries/effort.d.cts +2 -10
- package/dist/entries/effort.d.mts +2 -10
- package/dist/entries/effort.mjs +1 -2
- package/dist/entries/majorMode.cjs +1 -6
- package/dist/entries/majorMode.d.cts +2 -29
- package/dist/entries/majorMode.d.mts +2 -29
- package/dist/entries/majorMode.mjs +1 -6
- package/dist/entries/modeCatalog.cjs +1 -0
- package/dist/entries/modeCatalog.d.cts +2 -0
- package/dist/entries/modeCatalog.d.mts +2 -0
- package/dist/entries/modeCatalog.mjs +1 -0
- package/dist/entries/notifications.cjs +1 -2
- package/dist/entries/notifications.d.cts +2 -13
- package/dist/entries/notifications.d.mts +2 -13
- package/dist/entries/notifications.mjs +1 -2
- package/dist/entries/ollamaProvider.cjs +1 -2
- package/dist/entries/ollamaProvider.d.cts +2 -6
- package/dist/entries/ollamaProvider.d.mts +2 -7
- package/dist/entries/ollamaProvider.mjs +1 -2
- package/dist/entries/persona.cjs +1 -2
- package/dist/entries/persona.d.cts +2 -14
- package/dist/entries/persona.d.mts +2 -15
- package/dist/entries/persona.mjs +1 -2
- package/dist/entries/profile.cjs +1 -3
- package/dist/entries/profile.d.cts +2 -16
- package/dist/entries/profile.d.mts +2 -16
- package/dist/entries/profile.mjs +1 -3
- package/dist/entries/repositoryHooks.cjs +1 -9
- package/dist/entries/repositoryHooks.d.cts +2 -7
- package/dist/entries/repositoryHooks.d.mts +2 -8
- package/dist/entries/repositoryHooks.mjs +1 -9
- package/dist/entries/skills.cjs +1 -2
- package/dist/entries/skills.d.cts +2 -34
- package/dist/entries/skills.d.mts +2 -34
- package/dist/entries/skills.mjs +1 -2
- package/dist/entries/styleSystem.cjs +1 -4
- package/dist/entries/styleSystem.d.cts +2 -32
- package/dist/entries/styleSystem.d.mts +2 -32
- package/dist/entries/styleSystem.mjs +1 -4
- package/dist/extensions/entries/autoStop.cjs +2 -0
- package/dist/extensions/entries/autoStop.cjs.map +1 -0
- package/dist/extensions/entries/autoStop.d.cts +7 -0
- package/dist/extensions/entries/autoStop.d.cts.map +1 -0
- package/dist/extensions/entries/autoStop.d.mts +7 -0
- package/dist/extensions/entries/autoStop.d.mts.map +1 -0
- package/dist/extensions/entries/autoStop.mjs +2 -0
- package/dist/extensions/entries/autoStop.mjs.map +1 -0
- package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
- package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.cjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.cjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.mjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.mjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs.map +1 -0
- package/dist/extensions/entries/domains.cjs +2 -0
- package/dist/extensions/entries/domains.cjs.map +1 -0
- package/dist/extensions/entries/domains.d.cts +18 -0
- package/dist/extensions/entries/domains.d.cts.map +1 -0
- package/dist/extensions/entries/domains.d.mts +18 -0
- package/dist/extensions/entries/domains.d.mts.map +1 -0
- package/dist/extensions/entries/domains.mjs +2 -0
- package/dist/extensions/entries/domains.mjs.map +1 -0
- package/dist/extensions/entries/doom.cjs +2 -0
- package/dist/extensions/entries/doom.cjs.map +1 -0
- package/dist/extensions/entries/doom.d.cts +14 -0
- package/dist/extensions/entries/doom.d.cts.map +1 -0
- package/dist/extensions/entries/doom.d.mts +14 -0
- package/dist/extensions/entries/doom.d.mts.map +1 -0
- package/dist/extensions/entries/doom.mjs +2 -0
- package/dist/extensions/entries/doom.mjs.map +1 -0
- package/dist/extensions/entries/effort.cjs +2 -0
- package/dist/extensions/entries/effort.cjs.map +1 -0
- package/dist/extensions/entries/effort.d.cts +10 -0
- package/dist/extensions/entries/effort.d.cts.map +1 -0
- package/dist/extensions/entries/effort.d.mts +10 -0
- package/dist/extensions/entries/effort.d.mts.map +1 -0
- package/dist/extensions/entries/effort.mjs +2 -0
- package/dist/extensions/entries/effort.mjs.map +1 -0
- package/dist/extensions/entries/majorMode.cjs +6 -0
- package/dist/extensions/entries/majorMode.cjs.map +1 -0
- package/dist/extensions/entries/majorMode.d.cts +27 -0
- package/dist/extensions/entries/majorMode.d.cts.map +1 -0
- package/dist/extensions/entries/majorMode.d.mts +27 -0
- package/dist/extensions/entries/majorMode.d.mts.map +1 -0
- package/dist/extensions/entries/majorMode.mjs +6 -0
- package/dist/extensions/entries/majorMode.mjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.cjs +2 -0
- package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.cts +7 -0
- package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.mts +7 -0
- package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
- package/dist/extensions/entries/modeCatalog.mjs +2 -0
- package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
- package/dist/extensions/entries/notifications.cjs +2 -0
- package/dist/extensions/entries/notifications.cjs.map +1 -0
- package/dist/extensions/entries/notifications.d.cts +14 -0
- package/dist/extensions/entries/notifications.d.cts.map +1 -0
- package/dist/extensions/entries/notifications.d.mts +14 -0
- package/dist/extensions/entries/notifications.d.mts.map +1 -0
- package/dist/extensions/entries/notifications.mjs +2 -0
- package/dist/extensions/entries/notifications.mjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.cjs +2 -0
- package/dist/extensions/entries/ollamaProvider.cjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.cts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.cts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.mts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.mts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.mjs +2 -0
- package/dist/extensions/entries/ollamaProvider.mjs.map +1 -0
- package/dist/extensions/entries/persona.cjs +2 -0
- package/dist/extensions/entries/persona.cjs.map +1 -0
- package/dist/extensions/entries/persona.d.cts +15 -0
- package/dist/extensions/entries/persona.d.cts.map +1 -0
- package/dist/extensions/entries/persona.d.mts +15 -0
- package/dist/extensions/entries/persona.d.mts.map +1 -0
- package/dist/extensions/entries/persona.mjs +2 -0
- package/dist/extensions/entries/persona.mjs.map +1 -0
- package/dist/extensions/entries/profile.cjs +3 -0
- package/dist/extensions/entries/profile.cjs.map +1 -0
- package/dist/extensions/entries/profile.d.cts +18 -0
- package/dist/extensions/entries/profile.d.cts.map +1 -0
- package/dist/extensions/entries/profile.d.mts +18 -0
- package/dist/extensions/entries/profile.d.mts.map +1 -0
- package/dist/extensions/entries/profile.mjs +3 -0
- package/dist/extensions/entries/profile.mjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.cjs +9 -0
- package/dist/extensions/entries/repositoryHooks.cjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.cts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.cts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.mts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.mts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.mjs +9 -0
- package/dist/extensions/entries/repositoryHooks.mjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.cjs +27 -0
- package/dist/extensions/entries/shellTitleController.cjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.cts +11 -0
- package/dist/extensions/entries/shellTitleController.d.cts.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.mts +11 -0
- package/dist/extensions/entries/shellTitleController.d.mts.map +1 -0
- package/dist/extensions/entries/shellTitleController.mjs +27 -0
- package/dist/extensions/entries/shellTitleController.mjs.map +1 -0
- package/dist/extensions/entries/skills.cjs +4 -0
- package/dist/extensions/entries/skills.cjs.map +1 -0
- package/dist/extensions/entries/skills.d.cts +34 -0
- package/dist/extensions/entries/skills.d.cts.map +1 -0
- package/dist/extensions/entries/skills.d.mts +34 -0
- package/dist/extensions/entries/skills.d.mts.map +1 -0
- package/dist/extensions/entries/skills.mjs +4 -0
- package/dist/extensions/entries/skills.mjs.map +1 -0
- package/dist/extensions/entries/styleSystem.cjs +4 -0
- package/dist/extensions/entries/styleSystem.cjs.map +1 -0
- package/dist/extensions/entries/styleSystem.d.cts +32 -0
- package/dist/extensions/entries/styleSystem.d.cts.map +1 -0
- package/dist/extensions/entries/styleSystem.d.mts +32 -0
- package/dist/extensions/entries/styleSystem.d.mts.map +1 -0
- package/dist/extensions/entries/styleSystem.mjs +4 -0
- package/dist/{entries/styleSystem.cjs.map → extensions/entries/styleSystem.mjs.map} +1 -1
- package/dist/extensions/pi.cjs +1 -0
- package/dist/extensions/pi.d.cts +2 -0
- package/dist/extensions/pi.d.mts +2 -0
- package/dist/extensions/pi.mjs +1 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs.map +1 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +33 -29
- package/dist/index.d.mts +33 -29
- package/dist/index.mjs +1 -1
- package/dist/logSinkTelemetry.cjs +1 -2
- package/dist/logSinkTelemetry.d.cts +2 -51
- package/dist/logSinkTelemetry.d.mts +2 -51
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
- package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
- package/dist/schemas/domainVoiceTools.cjs +2 -0
- package/dist/schemas/domainVoiceTools.cjs.map +1 -0
- package/dist/schemas/domainVoiceTools.mjs +2 -0
- package/dist/schemas/domainVoiceTools.mjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.cjs +2 -0
- package/dist/schemas/majorModeVoiceTools.cjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.mjs +2 -0
- package/dist/schemas/majorModeVoiceTools.mjs.map +1 -0
- package/dist/services/compatibility/antigravity.cjs +1 -2
- package/dist/services/compatibility/antigravity.d.cts +2 -11
- package/dist/services/compatibility/antigravity.d.mts +2 -11
- package/dist/services/compatibility/antigravity.mjs +1 -2
- package/dist/services/compatibility/codex.cjs +1 -2
- package/dist/services/compatibility/codex.d.cts +2 -19
- package/dist/services/compatibility/codex.d.mts +2 -19
- package/dist/services/compatibility/codex.mjs +1 -2
- package/dist/services/compatibility/index.cjs +1 -2
- package/dist/services/compatibility/index.d.cts +6 -16
- package/dist/services/compatibility/index.d.mts +6 -16
- package/dist/services/compatibility/index.mjs +1 -2
- package/dist/services/compatibility/process.cjs +1 -2
- package/dist/services/compatibility/process.d.cts +2 -35
- package/dist/services/compatibility/process.d.mts +2 -35
- package/dist/services/compatibility/process.mjs +1 -2
- package/dist/services/compatibility/shared.cjs +1 -2
- package/dist/services/compatibility/shared.d.cts +2 -33
- package/dist/services/compatibility/shared.d.mts +2 -33
- package/dist/services/compatibility/shared.mjs +1 -2
- package/dist/services/compatibilityContext.cjs +1 -2
- package/dist/services/compatibilityContext.d.cts +2 -23
- package/dist/services/compatibilityContext.d.mts +2 -23
- package/dist/services/compatibilityContext.mjs +1 -2
- package/dist/services/composer.cjs +1 -2
- package/dist/services/composer.d.cts +4 -135
- package/dist/services/composer.d.mts +4 -135
- package/dist/services/composer.mjs +1 -2
- package/dist/services/config/index.cjs +1 -0
- package/dist/services/config/index.d.cts +7 -0
- package/dist/services/config/index.d.mts +7 -0
- package/dist/services/config/index.mjs +1 -0
- package/dist/services/config/projectTrust.cjs +2 -0
- package/dist/services/config/projectTrust.cjs.map +1 -0
- package/dist/services/config/projectTrust.d.cts +14 -0
- package/dist/services/config/projectTrust.d.cts.map +1 -0
- package/dist/services/config/projectTrust.d.mts +14 -0
- package/dist/services/config/projectTrust.d.mts.map +1 -0
- package/dist/services/config/projectTrust.mjs +2 -0
- package/dist/services/config/projectTrust.mjs.map +1 -0
- package/dist/services/extensionAssembler.cjs +1 -1
- package/dist/services/extensionAssembler.cjs.map +1 -1
- package/dist/services/extensionAssembler.d.cts +13 -6
- package/dist/services/extensionAssembler.d.cts.map +1 -1
- package/dist/services/extensionAssembler.d.mts +13 -6
- package/dist/services/extensionAssembler.d.mts.map +1 -1
- package/dist/services/extensionAssembler.mjs +1 -1
- package/dist/services/extensionAssembler.mjs.map +1 -1
- package/dist/services/harnessContext.cjs +1 -2
- package/dist/services/harnessContext.d.cts +2 -61
- package/dist/services/harnessContext.d.mts +2 -61
- package/dist/services/harnessContext.mjs +1 -2
- package/dist/services/index.cjs +1 -1
- package/dist/services/index.d.cts +18 -14
- package/dist/services/index.d.mts +18 -14
- package/dist/services/index.mjs +1 -1
- package/dist/services/matrixSwitcher.cjs +1 -2
- package/dist/services/matrixSwitcher.d.cts +2 -46
- package/dist/services/matrixSwitcher.d.mts +2 -46
- package/dist/services/matrixSwitcher.mjs +1 -2
- package/dist/services/mcpFilter.cjs +1 -3
- package/dist/services/mcpFilter.d.cts +2 -40
- package/dist/services/mcpFilter.d.mts +2 -40
- package/dist/services/mcpFilter.mjs +1 -3
- package/dist/services/modeCatalog.cjs +2 -0
- package/dist/services/modeCatalog.cjs.map +1 -0
- package/dist/services/modeCatalog.d.cts +18 -0
- package/dist/services/modeCatalog.d.cts.map +1 -0
- package/dist/services/modeCatalog.d.mts +18 -0
- package/dist/services/modeCatalog.d.mts.map +1 -0
- package/dist/services/modeCatalog.mjs +2 -0
- package/dist/services/modeCatalog.mjs.map +1 -0
- package/dist/services/piSettings.cjs +1 -2
- package/dist/services/piSettings.d.cts +2 -24
- package/dist/services/piSettings.d.mts +2 -24
- package/dist/services/piSettings.mjs +1 -2
- package/dist/services/resourceCollector.cjs +1 -3
- package/dist/services/resourceCollector.d.cts +2 -23
- package/dist/services/resourceCollector.d.mts +2 -23
- package/dist/services/resourceCollector.mjs +1 -3
- package/dist/services/skillCatalog.cjs +1 -2
- package/dist/services/skillCatalog.d.cts +2 -56
- package/dist/services/skillCatalog.d.mts +2 -56
- package/dist/services/skillCatalog.mjs +1 -2
- package/dist/services/skillSources.cjs +1 -2
- package/dist/services/skillSources.d.cts +2 -24
- package/dist/services/skillSources.d.mts +2 -24
- package/dist/services/skillSources.mjs +1 -2
- package/dist/services/syncState.cjs +1 -2
- package/dist/services/syncState.d.cts +3 -133
- package/dist/services/syncState.d.mts +3 -133
- package/dist/services/syncState.mjs +1 -2
- package/dist/services/tools/toolNames.cjs +2 -0
- package/dist/services/tools/toolNames.cjs.map +1 -0
- package/dist/services/tools/toolNames.d.cts +25 -0
- package/dist/services/tools/toolNames.d.cts.map +1 -0
- package/dist/services/tools/toolNames.d.mts +25 -0
- package/dist/services/tools/toolNames.d.mts.map +1 -0
- package/dist/services/tools/toolNames.mjs +2 -0
- package/dist/services/tools/toolNames.mjs.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.cts +1 -1
- package/dist/types/interfaces/compatibility.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.mts +1 -1
- package/dist/types/interfaces/compatibility.d.mts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.cts +6 -2
- package/dist/types/interfaces/harness.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.mts +6 -2
- package/dist/types/interfaces/harness.d.mts.map +1 -0
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.cts +5 -5
- package/dist/utils/index.d.mts +5 -5
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/json.cjs +1 -2
- package/dist/utils/json.d.cts +2 -23
- package/dist/utils/json.d.mts +2 -23
- package/dist/utils/json.mjs +1 -2
- package/dist/utils/moduleResolution.cjs +1 -2
- package/dist/utils/moduleResolution.d.cts +2 -56
- package/dist/utils/moduleResolution.d.mts +2 -56
- package/dist/utils/moduleResolution.mjs +1 -2
- package/dist/utils/repository.cjs +1 -2
- package/dist/utils/repository.d.cts +2 -21
- package/dist/utils/repository.d.mts +2 -21
- package/dist/utils/repository.mjs +1 -2
- package/dist/utils/toolNames.cjs +1 -2
- package/dist/utils/toolNames.d.cts +2 -25
- package/dist/utils/toolNames.d.mts +2 -25
- package/dist/utils/toolNames.mjs +1 -2
- package/package.json +59 -37
- package/dist/cli/cliApp.cjs.map +0 -1
- package/dist/cli/cliApp.d.cts.map +0 -1
- package/dist/cli/cliApp.d.mts.map +0 -1
- package/dist/cli/cliApp.mjs.map +0 -1
- package/dist/cli/compatibilityOptions.cjs.map +0 -1
- package/dist/cli/compatibilityOptions.d.cts.map +0 -1
- package/dist/cli/compatibilityOptions.d.mts.map +0 -1
- package/dist/cli/compatibilityOptions.mjs.map +0 -1
- package/dist/cli/help.d.cts.map +0 -1
- package/dist/cli/help.d.mts.map +0 -1
- package/dist/cli/matrixOptions.cjs.map +0 -1
- package/dist/cli/matrixOptions.d.cts.map +0 -1
- package/dist/cli/matrixOptions.d.mts.map +0 -1
- package/dist/cli/matrixOptions.mjs.map +0 -1
- package/dist/cli/options.cjs.map +0 -1
- package/dist/cli/options.d.cts.map +0 -1
- package/dist/cli/options.d.mts.map +0 -1
- package/dist/cli/options.mjs.map +0 -1
- package/dist/commands/buildCommand.d.cts +0 -23
- package/dist/commands/buildCommand.d.cts.map +0 -1
- package/dist/commands/buildCommand.d.mts +0 -23
- package/dist/commands/buildCommand.d.mts.map +0 -1
- package/dist/config/harnessState.cjs.map +0 -1
- package/dist/config/harnessState.d.cts.map +0 -1
- package/dist/config/harnessState.d.mts.map +0 -1
- package/dist/config/harnessState.mjs.map +0 -1
- package/dist/config/projectTrust.cjs.map +0 -1
- package/dist/config/projectTrust.d.cts.map +0 -1
- package/dist/config/projectTrust.d.mts.map +0 -1
- package/dist/config/projectTrust.mjs.map +0 -1
- package/dist/entries/addDirCompatibility.cjs +0 -2
- package/dist/entries/addDirCompatibility.cjs.map +0 -1
- package/dist/entries/addDirCompatibility.d.cts +0 -13
- package/dist/entries/addDirCompatibility.d.cts.map +0 -1
- package/dist/entries/addDirCompatibility.d.mts +0 -14
- package/dist/entries/addDirCompatibility.d.mts.map +0 -1
- package/dist/entries/addDirCompatibility.mjs +0 -2
- package/dist/entries/addDirCompatibility.mjs.map +0 -1
- package/dist/entries/autoStop.cjs.map +0 -1
- package/dist/entries/autoStop.d.cts.map +0 -1
- package/dist/entries/autoStop.d.mts.map +0 -1
- package/dist/entries/autoStop.mjs.map +0 -1
- package/dist/entries/components/matrixPicker.cjs.map +0 -1
- package/dist/entries/components/matrixPicker.d.cts.map +0 -1
- package/dist/entries/components/matrixPicker.d.mts.map +0 -1
- package/dist/entries/components/matrixPicker.mjs.map +0 -1
- package/dist/entries/components/skillsOverlay.cjs.map +0 -1
- package/dist/entries/components/skillsOverlay.d.cts.map +0 -1
- package/dist/entries/components/skillsOverlay.d.mts.map +0 -1
- package/dist/entries/components/skillsOverlay.mjs.map +0 -1
- package/dist/entries/domains.cjs.map +0 -1
- package/dist/entries/domains.d.cts.map +0 -1
- package/dist/entries/domains.d.mts.map +0 -1
- package/dist/entries/domains.mjs.map +0 -1
- package/dist/entries/doom.cjs.map +0 -1
- package/dist/entries/doom.d.cts.map +0 -1
- package/dist/entries/doom.d.mts.map +0 -1
- package/dist/entries/doom.mjs.map +0 -1
- package/dist/entries/effort.cjs.map +0 -1
- package/dist/entries/effort.d.cts.map +0 -1
- package/dist/entries/effort.d.mts.map +0 -1
- package/dist/entries/effort.mjs.map +0 -1
- package/dist/entries/majorMode.cjs.map +0 -1
- package/dist/entries/majorMode.d.cts.map +0 -1
- package/dist/entries/majorMode.d.mts.map +0 -1
- package/dist/entries/majorMode.mjs.map +0 -1
- package/dist/entries/notifications.cjs.map +0 -1
- package/dist/entries/notifications.d.cts.map +0 -1
- package/dist/entries/notifications.d.mts.map +0 -1
- package/dist/entries/notifications.mjs.map +0 -1
- package/dist/entries/ollamaProvider.cjs.map +0 -1
- package/dist/entries/ollamaProvider.d.cts.map +0 -1
- package/dist/entries/ollamaProvider.d.mts.map +0 -1
- package/dist/entries/ollamaProvider.mjs.map +0 -1
- package/dist/entries/persona.cjs.map +0 -1
- package/dist/entries/persona.d.cts.map +0 -1
- package/dist/entries/persona.d.mts.map +0 -1
- package/dist/entries/persona.mjs.map +0 -1
- package/dist/entries/profile.cjs.map +0 -1
- package/dist/entries/profile.d.cts.map +0 -1
- package/dist/entries/profile.d.mts.map +0 -1
- package/dist/entries/profile.mjs.map +0 -1
- package/dist/entries/repositoryHooks.cjs.map +0 -1
- package/dist/entries/repositoryHooks.d.cts.map +0 -1
- package/dist/entries/repositoryHooks.d.mts.map +0 -1
- package/dist/entries/repositoryHooks.mjs.map +0 -1
- package/dist/entries/skills.cjs.map +0 -1
- package/dist/entries/skills.d.cts.map +0 -1
- package/dist/entries/skills.d.mts.map +0 -1
- package/dist/entries/skills.mjs.map +0 -1
- package/dist/entries/styleSystem.d.cts.map +0 -1
- package/dist/entries/styleSystem.d.mts.map +0 -1
- package/dist/entries/styleSystem.mjs.map +0 -1
- package/dist/interfaces/compatibility.d.cts.map +0 -1
- package/dist/interfaces/compatibility.d.mts.map +0 -1
- package/dist/interfaces/harness.d.cts.map +0 -1
- package/dist/interfaces/harness.d.mts.map +0 -1
- package/dist/logSinkTelemetry.cjs.map +0 -1
- package/dist/logSinkTelemetry.d.cts.map +0 -1
- package/dist/logSinkTelemetry.d.mts.map +0 -1
- package/dist/logSinkTelemetry.mjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +0 -1
- package/dist/services/compatibility/index.cjs.map +0 -1
- package/dist/services/compatibility/index.mjs.map +0 -1
- package/dist/services/compatibilityContext.cjs.map +0 -1
- package/dist/services/compatibilityContext.mjs.map +0 -1
- package/dist/services/composer.cjs.map +0 -1
- package/dist/services/composer.d.cts.map +0 -1
- package/dist/services/composer.d.mts.map +0 -1
- package/dist/services/composer.mjs.map +0 -1
- package/dist/services/extensionCompiler.cjs +0 -3
- package/dist/services/extensionCompiler.cjs.map +0 -1
- package/dist/services/extensionCompiler.mjs +0 -3
- package/dist/services/extensionCompiler.mjs.map +0 -1
- package/dist/services/harnessContext.cjs.map +0 -1
- package/dist/services/harnessContext.mjs.map +0 -1
- package/dist/services/matrixSwitcher.cjs.map +0 -1
- package/dist/services/matrixSwitcher.mjs.map +0 -1
- package/dist/services/mcpFilter.cjs.map +0 -1
- package/dist/services/mcpFilter.d.cts.map +0 -1
- package/dist/services/mcpFilter.d.mts.map +0 -1
- package/dist/services/mcpFilter.mjs.map +0 -1
- package/dist/services/piSettings.cjs.map +0 -1
- package/dist/services/piSettings.d.cts.map +0 -1
- package/dist/services/piSettings.d.mts.map +0 -1
- package/dist/services/piSettings.mjs.map +0 -1
- package/dist/services/resourceCollector.cjs.map +0 -1
- package/dist/services/resourceCollector.d.cts.map +0 -1
- package/dist/services/resourceCollector.d.mts.map +0 -1
- package/dist/services/resourceCollector.mjs.map +0 -1
- package/dist/services/runtimeBundle.cjs +0 -2
- package/dist/services/runtimeBundle.cjs.map +0 -1
- package/dist/services/runtimeBundle.d.cts.map +0 -1
- package/dist/services/runtimeBundle.d.mts.map +0 -1
- package/dist/services/runtimeBundle.mjs +0 -2
- package/dist/services/runtimeBundle.mjs.map +0 -1
- package/dist/services/skillCatalog.cjs.map +0 -1
- package/dist/services/skillCatalog.d.cts.map +0 -1
- package/dist/services/skillCatalog.d.mts.map +0 -1
- package/dist/services/skillCatalog.mjs.map +0 -1
- package/dist/services/syncState.cjs.map +0 -1
- package/dist/services/syncState.d.cts.map +0 -1
- package/dist/services/syncState.d.mts.map +0 -1
- package/dist/services/syncState.mjs.map +0 -1
- package/dist/utils/json.cjs.map +0 -1
- package/dist/utils/json.d.cts.map +0 -1
- package/dist/utils/json.d.mts.map +0 -1
- package/dist/utils/json.mjs.map +0 -1
- package/dist/utils/moduleResolution.cjs.map +0 -1
- package/dist/utils/moduleResolution.d.cts.map +0 -1
- package/dist/utils/moduleResolution.d.mts.map +0 -1
- package/dist/utils/moduleResolution.mjs.map +0 -1
- package/dist/utils/repository.cjs.map +0 -1
- package/dist/utils/repository.d.cts.map +0 -1
- package/dist/utils/repository.d.mts.map +0 -1
- package/dist/utils/repository.mjs.map +0 -1
- package/dist/utils/toolNames.cjs.map +0 -1
- package/dist/utils/toolNames.d.cts.map +0 -1
- package/dist/utils/toolNames.d.mts.map +0 -1
- package/dist/utils/toolNames.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionCompiler.cjs","names":["fs","path","optionalPackageEntry","builtinModules"],"sources":["../../src/services/extensionCompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { builtinModules, createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport type { LogLevel, LogOrStringHandler, RolldownLog } from 'rolldown';\nimport { optionalPackageEntry } from '../utils/index.ts';\n\n/**\n * Compiles TypeScript extensions into plain ESM ahead of the session.\n *\n * Pi loads extensions through jiti, which transpiles TypeScript at import time.\n * That works, but it costs a transform per module on a cold cache and makes Node\n * complain about type stripping under node_modules on every launch. Resolution\n * already knows the full extension list, so each TypeScript entry is bundled to\n * a single `.mjs` here and Pi imports it natively.\n *\n * Mode artifacts bundle their JavaScript dependencies. Node built-ins, native\n * packages, and Pi's shared runtime stay external; those imports are rewritten\n * to absolute paths so an artifact under `.pi/doom/dist` never relies on that\n * directory having its own `node_modules` tree.\n */\n\nconst TYPESCRIPT_SUFFIXES = ['.ts', '.mts', '.cts'] as const;\nconst COMPILED_SUFFIX = '.mjs';\nconst CACHE_VERSION = 'v3';\nconst SET_CACHE_VERSION = 'v4';\nconst HASH_LENGTH = 16;\nconst SET_DIRECTORY = 'sets';\nconst MANIFEST_SUFFIX = '.json';\nconst VIRTUAL_SET_ENTRY = '\\0doompi-extension-set';\n\n/** Pi's former npm scope. The packages are the same, published under a new name. */\nconst PI_SCOPE_RENAMES: Readonly<Record<string, string>> = {\n '@mariozechner/pi-coding-agent': '@earendil-works/pi-coding-agent',\n '@mariozechner/pi-tui': '@earendil-works/pi-tui',\n '@mariozechner/pi-ai': '@earendil-works/pi-ai',\n '@sinclair/typebox': 'typebox',\n};\n\nexport function isTypeScriptEntry(entry: string): boolean {\n return TYPESCRIPT_SUFFIXES.some((suffix) => entry.endsWith(suffix));\n}\n\nfunction renameScope(specifier: string): string {\n for (const [before, after] of Object.entries(PI_SCOPE_RENAMES)) {\n if (specifier === before) return after;\n if (specifier.startsWith(`${before}/`)) return `${after}${specifier.slice(before.length)}`;\n }\n return specifier;\n}\n\n/**\n * Cache key for a compiled entry.\n *\n * The entry's own bytes are the only cheap signal that the extension changed; a\n * dependency edit is not visible without walking the graph, so an upgrade that\n * leaves the entry byte-identical is served from cache until the version below\n * is raised.\n */\nfunction cacheKey(entry: string): string {\n const source = fs.readFileSync(entry);\n return createHash('sha256').update(CACHE_VERSION).update(entry).update(source).digest('hex').slice(0, HASH_LENGTH);\n}\n\nfunction compiledName(entry: string, key: string): string {\n const base = path.basename(entry).replace(/\\.[cm]?ts$/, '');\n const parent = path.basename(path.dirname(entry));\n return `${parent}-${base}.${key}${COMPILED_SUFFIX}`;\n}\n\n/**\n * Packages that must resolve to the copy this harness runs, never to a second\n * one bundled into an extension. Pi owns the TUI and the session state, so a\n * duplicate renders into a different screen and mutates a different store.\n */\nconst HOSTED_PACKAGES = new Set(['@earendil-works/pi-coding-agent', '@earendil-works/pi-tui', '@earendil-works/pi-ai']);\n\n/**\n * Resolves packages Pi exposes to extensions as compatibility aliases.\n *\n * Extensions do not need to declare TypeBox themselves because Pi's loader\n * provides it as a virtual module. A dist bundle bypasses that loader, so it\n * resolves the same package against Pi's dependency tree and bundles it.\n */\nfunction piExtensionDependencyEntry(specifier: string): string | undefined {\n const piEntry = optionalPackageEntry('@earendil-works/pi-coding-agent');\n if (!piEntry) return undefined;\n try {\n return createRequire(piEntry).resolve(specifier);\n } catch {\n return undefined;\n }\n}\n\n/** Packages whose native binaries or runtime discovery cannot be rolled up. */\nconst NATIVE_PACKAGES = new Set([\n '@parcel/watcher',\n '@napi-rs/keyring',\n 'better-sqlite3',\n 'canvas',\n 'fsevents',\n 'isolated-vm',\n 'keytar',\n 'node-pty',\n 'onnxruntime-node',\n 'playwright',\n 'playwright-core',\n 'puppeteer',\n 'sharp',\n]);\nconst NODE_BUILTINS = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]));\n\ninterface InputFingerprint {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface ExtensionSetManifest {\n version: string;\n entries: string[];\n output: string;\n inputs: InputFingerprint[];\n}\n\nexport interface CompileExtensionSetOptions {\n /** Persistent artifact directory. Compiler manifests remain in cacheDirectory. */\n outputDirectory?: string;\n /** Human-readable artifact prefix, normally the major-mode name. */\n outputName?: string;\n}\n\nfunction safeOutputName(value: string): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^[-.]+|[-.]+$/g, '');\n return normalized || 'doom-set';\n}\n\nfunction packageRootOf(specifier: string): string | undefined {\n const slash = specifier.startsWith('@') ? specifier.indexOf('/', specifier.indexOf('/') + 1) : specifier.indexOf('/');\n return slash === -1 ? specifier : specifier.slice(0, slash);\n}\n\nfunction packageRootFromPath(target: string): string | undefined {\n const normalized = target.split(path.sep).join('/');\n const marker = '/node_modules/';\n const offset = normalized.lastIndexOf(marker);\n if (offset === -1) return undefined;\n const parts = normalized.slice(offset + marker.length).split('/');\n // pnpm's first segment is a store key; the second node_modules marker names\n // the package that owns the file.\n const nested = parts.lastIndexOf('node_modules');\n const packageParts = nested === -1 ? parts : parts.slice(nested + 1);\n return packageParts[0]?.startsWith('@') ? packageParts.slice(0, 2).join('/') : packageParts[0];\n}\n\nfunction externalResolver() {\n return {\n name: 'doom-external-absolute',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('node:')) return null;\n const renamed = renameScope(specifier);\n\n // Host packages are resolved from this module, the way the rest of the\n // harness resolves them, because an extension written against Pi's former\n // scope does not have the current one in its own dependency tree.\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) return { id: hosted, external: true };\n }\n\n // Rolldown's resolver rather than `createRequire`, which cannot see an\n // ESM-only package that publishes no `require` condition and would send\n // Pi's own core into the bundle.\n const resolved = await this.resolve(renamed, importer, options);\n if (!resolved) return null;\n // A dependency that is itself TypeScript cannot be handed to Node either,\n // so it is bundled rather than externalised.\n if (isTypeScriptEntry(resolved.id)) return null;\n return { id: resolved.id, external: true };\n },\n };\n}\n\nfunction fingerprint(target: string): InputFingerprint | undefined {\n try {\n const stat = fs.statSync(target);\n if (!stat.isFile()) return undefined;\n return { path: target, size: stat.size, mtimeMs: stat.mtimeMs };\n } catch {\n return undefined;\n }\n}\n\nfunction manifestIsFresh(manifest: ExtensionSetManifest, entries: string[]): boolean {\n if (\n manifest.version !== SET_CACHE_VERSION ||\n JSON.stringify(manifest.entries) !== JSON.stringify(entries) ||\n !fs.existsSync(manifest.output)\n ) {\n return false;\n }\n return manifest.inputs.every((previous) => {\n const current = fingerprint(previous.path);\n return current?.size === previous.size && current.mtimeMs === previous.mtimeMs;\n });\n}\n\nfunction readSetManifest(manifestPath: string): ExtensionSetManifest | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as ExtensionSetManifest;\n return parsed && Array.isArray(parsed.entries) && Array.isArray(parsed.inputs) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeAtomic(target: string, contents: string): void {\n const temporary = `${target}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, contents);\n try {\n fs.renameSync(temporary, target);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(target)) throw error;\n }\n}\n\n/** Stable lookup key for one exact Pi load order. */\nexport function extensionSetKey(entries: readonly string[]): string {\n return createHash('sha256')\n .update(SET_CACHE_VERSION)\n .update(JSON.stringify(entries.map((entry) => path.resolve(entry))))\n .digest('hex')\n .slice(0, HASH_LENGTH);\n}\n\nfunction extensionSetSource(entries: readonly string[]): string {\n const loaders = entries.map((entry) => `() => import(${JSON.stringify(pathToImportSpecifier(entry))})`);\n const names = entries.map((entry) => JSON.stringify(entry));\n return [\n `const loaders = [${loaders.join(',')}];`,\n `const names = [${names.join(',')}];`,\n 'function report(index, error) {',\n ' const detail = error instanceof Error ? error.message : String(error);',\n ' process.stderr.write(`[doompi] ${names[index]}: ${detail}\\\\n`);',\n '}',\n 'export default async function doompiExtensionSet(pi) {',\n ' const loaded = await Promise.all(loaders.map(async (load, index) => {',\n ' try {',\n ' return await load();',\n ' } catch (error) {',\n ' report(index, error);',\n ' return undefined;',\n ' }',\n ' }));',\n ' for (let index = 0; index < loaded.length; index += 1) {',\n ' const extension = loaded[index];',\n ' if (!extension) continue;',\n ' try {',\n \" if (typeof extension.default !== 'function') throw new Error('does not export an extension factory');\",\n ' await extension.default(pi);',\n ' } catch (error) {',\n ' report(index, error);',\n ' }',\n ' }',\n '}',\n ].join('\\n');\n}\n\nfunction pathToImportSpecifier(target: string): string {\n // Rolldown accepts absolute POSIX paths directly. Windows needs a file URL,\n // but replacing separators is enough for its platform-independent parser.\n return path.resolve(target).split(path.sep).join('/');\n}\n\nfunction setExternalResolver(inputs: Set<string>) {\n return {\n name: 'doom-set-external',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier === VIRTUAL_SET_ENTRY) return null;\n if (NODE_BUILTINS.has(specifier) || specifier.startsWith('node:')) {\n return { id: specifier, external: true };\n }\n\n if (path.isAbsolute(specifier)) {\n const root = packageRootFromPath(specifier);\n if (root && (HOSTED_PACKAGES.has(root) || NATIVE_PACKAGES.has(root))) {\n inputs.add(specifier);\n return { id: specifier, external: true };\n }\n return null;\n }\n if (specifier.startsWith('.')) return null;\n\n const renamed = renameScope(specifier);\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) {\n inputs.add(hosted);\n return { id: hosted, external: true };\n }\n }\n if (root === 'typebox') {\n const typebox = piExtensionDependencyEntry(renamed);\n if (typebox) {\n inputs.add(typebox);\n return { id: typebox, external: false };\n }\n }\n if (root && NATIVE_PACKAGES.has(root)) {\n const resolved = await this.resolve(renamed, importer, options);\n if (resolved) {\n inputs.add(resolved.id);\n return { id: resolved.id, external: true };\n }\n }\n return null;\n },\n };\n}\n\nfunction inputCollector(inputs: Set<string>) {\n return {\n name: 'doom-set-inputs',\n load(id: string): null {\n if (path.isAbsolute(id) && fs.existsSync(id)) inputs.add(id);\n return null;\n },\n };\n}\n\n/** An unresolved bare import would otherwise become a broken dist external. */\nfunction failUnresolvedImport(_level: LogLevel, log: RolldownLog, handler: LogOrStringHandler): void {\n if (log.code === 'UNRESOLVED_IMPORT') handler('error', log);\n}\n\ninterface SourceRange {\n start: number;\n end: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectImportMetaUrlRanges(value: unknown, ranges: SourceRange[]): void {\n if (Array.isArray(value)) {\n for (const item of value) collectImportMetaUrlRanges(item, ranges);\n return;\n }\n if (!isRecord(value)) return;\n\n const object = value.object;\n const property = value.property;\n if (\n value.type === 'MemberExpression' &&\n value.computed === false &&\n typeof value.start === 'number' &&\n typeof value.end === 'number' &&\n isRecord(object) &&\n object.type === 'MetaProperty' &&\n isRecord(object.meta) &&\n object.meta.name === 'import' &&\n isRecord(object.property) &&\n object.property.name === 'meta' &&\n isRecord(property) &&\n property.name === 'url'\n ) {\n ranges.push({ start: value.start, end: value.end });\n return;\n }\n\n for (const child of Object.values(value)) collectImportMetaUrlRanges(child, ranges);\n}\n\n/** Keeps package-owned resource lookup anchored to each original source file. */\nfunction preserveImportMetaUrl() {\n return {\n name: 'doom-original-import-meta-url',\n transform(\n this: {\n parse: (source: string, options?: { lang?: 'js' | 'jsx' | 'ts' | 'tsx' }) => unknown;\n },\n source: string,\n id: string,\n ): string | null {\n if (!path.isAbsolute(id) || !source.includes('import.meta.url')) return null;\n const extension = path.extname(id).toLowerCase();\n const lang = extension === '.tsx' ? 'tsx' : extension === '.jsx' ? 'jsx' : isTypeScriptEntry(id) ? 'ts' : 'js';\n const ranges: SourceRange[] = [];\n collectImportMetaUrlRanges(this.parse(source, { lang }), ranges);\n if (ranges.length === 0) return null;\n const replacement = JSON.stringify(pathToFileURL(id).href);\n let transformed = source;\n for (const range of ranges.sort((left, right) => right.start - left.start)) {\n transformed = `${transformed.slice(0, range.start)}${replacement}${transformed.slice(range.end)}`;\n }\n return transformed;\n },\n };\n}\n\n/**\n * Compiles an ordered extension set into one native ESM entry.\n *\n * The generated entry starts every module load together, then invokes factories\n * sequentially in activation order. Its manifest records every loaded module,\n * so a dependency edit invalidates the cache without running the compiler.\n */\nexport async function compileExtensionSet(\n entries: readonly string[],\n cacheDirectory: string,\n options: CompileExtensionSetOptions = {},\n): Promise<string> {\n if (entries.length === 0) throw new Error('Cannot compile an empty extension set');\n const normalized = entries.map((entry) => path.resolve(entry));\n const setDirectory = path.join(cacheDirectory, SET_DIRECTORY);\n fs.mkdirSync(setDirectory, { recursive: true });\n const key = extensionSetKey(normalized);\n const outputDirectory = path.resolve(options.outputDirectory ?? setDirectory);\n const outputName = safeOutputName(options.outputName ?? 'doom-set');\n fs.mkdirSync(outputDirectory, { recursive: true });\n // One graph can be emitted under several named mode artifacts. Keep their\n // cache records separate without changing extensionSetKey, which is the\n // runtime lookup key for an exact activation order.\n const outputKey = createHash('sha256').update(outputDirectory).update(outputName).digest('hex').slice(0, HASH_LENGTH);\n const manifestPath = path.join(setDirectory, `${key}.${outputKey}${MANIFEST_SUFFIX}`);\n const previous = readSetManifest(manifestPath);\n if (previous && manifestIsFresh(previous, normalized)) return previous.output;\n\n const inputs = new Set(normalized);\n const source = extensionSetSource(normalized);\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: VIRTUAL_SET_ENTRY,\n platform: 'node',\n plugins: [\n {\n name: 'doom-set-entry',\n resolveId(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? id : null;\n },\n load(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? source : null;\n },\n },\n setExternalResolver(inputs),\n preserveImportMetaUrl(),\n inputCollector(inputs),\n ],\n onLog: failUnresolvedImport,\n });\n let code: string;\n try {\n const generated = await build.generate({ format: 'esm', sourcemap: false, minify: true, codeSplitting: false });\n const chunk = generated.output.find((output) => output.type === 'chunk');\n if (!chunk || chunk.type !== 'chunk') throw new Error('Rolldown produced no extension bundle');\n code = chunk.code;\n } finally {\n await build.close();\n }\n\n const contentKey = createHash('sha256').update(SET_CACHE_VERSION).update(code).digest('hex').slice(0, HASH_LENGTH);\n const output = path.join(outputDirectory, `${outputName}.${contentKey}${COMPILED_SUFFIX}`);\n if (!fs.existsSync(output)) writeAtomic(output, code);\n const inputFingerprints = [...inputs]\n .map(fingerprint)\n .filter((value): value is InputFingerprint => value !== undefined)\n .sort((left, right) => left.path.localeCompare(right.path));\n writeAtomic(\n manifestPath,\n `${JSON.stringify({ version: SET_CACHE_VERSION, entries: normalized, output, inputs: inputFingerprints }, null, 2)}\\n`,\n );\n return output;\n}\n\n/**\n * Bundles `entry` into `cacheDirectory` and returns the compiled path.\n *\n * Non-TypeScript entries are returned untouched. A cache hit skips the build.\n */\nexport async function compileExtension(entry: string, cacheDirectory: string): Promise<string> {\n if (!isTypeScriptEntry(entry)) return entry;\n\n const output = path.join(cacheDirectory, compiledName(entry, cacheKey(entry)));\n if (fs.existsSync(output)) return output;\n\n // Rolldown loads a native module and a sizeable parser graph. Sync is the\n // only command that needs it, and a cache hit does not, so keep it off every\n // other CLI startup path.\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: entry,\n platform: 'node',\n plugins: [externalResolver(), preserveImportMetaUrl()],\n onLog: failUnresolvedImport,\n });\n try {\n // One file per extension. Several of them import lazily, and code splitting\n // would emit sibling chunks that a single output path cannot describe.\n await build.write({ file: output, format: 'esm', sourcemap: false, minify: true, codeSplitting: false });\n } finally {\n await build.close();\n }\n return output;\n}\n\n/**\n * Compiles every TypeScript entry in a resolution map, leaving the rest as-is.\n *\n * A failure is not fatal: the original path is kept so Pi falls back to loading\n * the TypeScript through jiti, which is what it did before this existed.\n */\nexport async function compileResolvedEntries(\n resolved: Record<string, string>,\n cacheDirectory: string,\n): Promise<Record<string, string>> {\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const compiled: Record<string, string> = {};\n for (const [key, target] of Object.entries(resolved)) {\n try {\n compiled[key] = await compileExtension(target, cacheDirectory);\n } catch {\n compiled[key] = target;\n }\n }\n return compiled;\n}\n"],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{optionalPackageEntry as e}from"../utils/moduleResolution.mjs";import"../utils/index.mjs";import{builtinModules as t,createRequire as n}from"node:module";import r from"node:path";import i from"node:fs";import{createHash as a}from"node:crypto";import{pathToFileURL as o}from"node:url";const s=[`.ts`,`.mts`,`.cts`],c=`.mjs`,l=`\0doompi-extension-set`,u={"@mariozechner/pi-coding-agent":`@earendil-works/pi-coding-agent`,"@mariozechner/pi-tui":`@earendil-works/pi-tui`,"@mariozechner/pi-ai":`@earendil-works/pi-ai`,"@sinclair/typebox":`typebox`};function d(e){return s.some(t=>e.endsWith(t))}function f(e){for(let[t,n]of Object.entries(u)){if(e===t)return n;if(e.startsWith(`${t}/`))return`${n}${e.slice(t.length)}`}return e}function p(e){let t=i.readFileSync(e);return a(`sha256`).update(`v3`).update(e).update(t).digest(`hex`).slice(0,16)}function m(e,t){let n=r.basename(e).replace(/\.[cm]?ts$/,``);return`${r.basename(r.dirname(e))}-${n}.${t}${c}`}const h=new Set([`@earendil-works/pi-coding-agent`,`@earendil-works/pi-tui`,`@earendil-works/pi-ai`]);function g(t){let r=e(`@earendil-works/pi-coding-agent`);if(r)try{return n(r).resolve(t)}catch{return}}const _=new Set([`@parcel/watcher`,`@napi-rs/keyring`,`better-sqlite3`,`canvas`,`fsevents`,`isolated-vm`,`keytar`,`node-pty`,`onnxruntime-node`,`playwright`,`playwright-core`,`puppeteer`,`sharp`]),v=new Set(t.flatMap(e=>[e,`node:${e}`]));function y(e){return e.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^[-.]+|[-.]+$/g,``)||`doom-set`}function b(e){let t=e.startsWith(`@`)?e.indexOf(`/`,e.indexOf(`/`)+1):e.indexOf(`/`);return t===-1?e:e.slice(0,t)}function x(e){let t=e.split(r.sep).join(`/`),n=t.lastIndexOf(`/node_modules/`);if(n===-1)return;let i=t.slice(n+14).split(`/`),a=i.lastIndexOf(`node_modules`),o=a===-1?i:i.slice(a+1);return o[0]?.startsWith(`@`)?o.slice(0,2).join(`/`):o[0]}function S(){return{name:`doom-external-absolute`,async resolveId(t,n,i){if(t.startsWith(`.`)||r.isAbsolute(t)||t.startsWith(`node:`))return null;let a=f(t),o=b(a);if(o&&h.has(o)){let t=e(a);if(t)return{id:t,external:!0}}let s=await this.resolve(a,n,i);return!s||d(s.id)?null:{id:s.id,external:!0}}}}function C(e){try{let t=i.statSync(e);return t.isFile()?{path:e,size:t.size,mtimeMs:t.mtimeMs}:void 0}catch{return}}function w(e,t){return e.version!==`v4`||JSON.stringify(e.entries)!==JSON.stringify(t)||!i.existsSync(e.output)?!1:e.inputs.every(e=>{let t=C(e.path);return t?.size===e.size&&t.mtimeMs===e.mtimeMs})}function T(e){try{let t=JSON.parse(i.readFileSync(e,`utf8`));return t&&Array.isArray(t.entries)&&Array.isArray(t.inputs)?t:void 0}catch{return}}function E(e,t){let n=`${e}.${process.pid}.${Date.now()}.tmp`;i.writeFileSync(n,t);try{i.renameSync(n,e)}catch(t){if(i.rmSync(n,{force:!0}),!i.existsSync(e))throw t}}function D(e){return a(`sha256`).update(`v4`).update(JSON.stringify(e.map(e=>r.resolve(e)))).digest(`hex`).slice(0,16)}function O(e){let t=e.map(e=>`() => import(${JSON.stringify(k(e))})`),n=e.map(e=>JSON.stringify(e));return[`const loaders = [${t.join(`,`)}];`,`const names = [${n.join(`,`)}];`,`function report(index, error) {`,` const detail = error instanceof Error ? error.message : String(error);`," process.stderr.write(`[doompi] ${names[index]}: ${detail}\\n`);",`}`,`export default async function doompiExtensionSet(pi) {`,` const loaded = await Promise.all(loaders.map(async (load, index) => {`,` try {`,` return await load();`,` } catch (error) {`,` report(index, error);`,` return undefined;`,` }`,` }));`,` for (let index = 0; index < loaded.length; index += 1) {`,` const extension = loaded[index];`,` if (!extension) continue;`,` try {`,` if (typeof extension.default !== 'function') throw new Error('does not export an extension factory');`,` await extension.default(pi);`,` } catch (error) {`,` report(index, error);`,` }`,` }`,`}`].join(`
|
|
2
|
-
`)}function k(e){return r.resolve(e).split(r.sep).join(`/`)}function A(t){return{name:`doom-set-external`,async resolveId(n,i,a){if(n===l)return null;if(v.has(n)||n.startsWith(`node:`))return{id:n,external:!0};if(r.isAbsolute(n)){let e=x(n);return e&&(h.has(e)||_.has(e))?(t.add(n),{id:n,external:!0}):null}if(n.startsWith(`.`))return null;let o=f(n),s=b(o);if(s&&h.has(s)){let n=e(o);if(n)return t.add(n),{id:n,external:!0}}if(s===`typebox`){let e=g(o);if(e)return t.add(e),{id:e,external:!1}}if(s&&_.has(s)){let e=await this.resolve(o,i,a);if(e)return t.add(e.id),{id:e.id,external:!0}}return null}}}function j(e){return{name:`doom-set-inputs`,load(t){return r.isAbsolute(t)&&i.existsSync(t)&&e.add(t),null}}}function M(e,t,n){t.code===`UNRESOLVED_IMPORT`&&n(`error`,t)}function N(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function P(e,t){if(Array.isArray(e)){for(let n of e)P(n,t);return}if(!N(e))return;let n=e.object,r=e.property;if(e.type===`MemberExpression`&&e.computed===!1&&typeof e.start==`number`&&typeof e.end==`number`&&N(n)&&n.type===`MetaProperty`&&N(n.meta)&&n.meta.name===`import`&&N(n.property)&&n.property.name===`meta`&&N(r)&&r.name===`url`){t.push({start:e.start,end:e.end});return}for(let n of Object.values(e))P(n,t)}function F(){return{name:`doom-original-import-meta-url`,transform(e,t){if(!r.isAbsolute(t)||!e.includes(`import.meta.url`))return null;let n=r.extname(t).toLowerCase(),i=n===`.tsx`?`tsx`:n===`.jsx`?`jsx`:d(t)?`ts`:`js`,a=[];if(P(this.parse(e,{lang:i}),a),a.length===0)return null;let s=JSON.stringify(o(t).href),c=e;for(let e of a.sort((e,t)=>t.start-e.start))c=`${c.slice(0,e.start)}${s}${c.slice(e.end)}`;return c}}}async function I(e,t,n={}){if(e.length===0)throw Error(`Cannot compile an empty extension set`);let o=e.map(e=>r.resolve(e)),s=r.join(t,`sets`);i.mkdirSync(s,{recursive:!0});let u=D(o),d=r.resolve(n.outputDirectory??s),f=y(n.outputName??`doom-set`);i.mkdirSync(d,{recursive:!0});let p=a(`sha256`).update(d).update(f).digest(`hex`).slice(0,16),m=r.join(s,`${u}.${p}.json`),h=T(m);if(h&&w(h,o))return h.output;let g=new Set(o),_=O(o),{rolldown:v}=await import(`rolldown`),b=await v({input:l,platform:`node`,plugins:[{name:`doom-set-entry`,resolveId(e){return e===l?e:null},load(e){return e===l?_:null}},A(g),F(),j(g)],onLog:M}),x;try{let e=(await b.generate({format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!1})).output.find(e=>e.type===`chunk`);if(!e||e.type!==`chunk`)throw Error(`Rolldown produced no extension bundle`);x=e.code}finally{await b.close()}let S=a(`sha256`).update(`v4`).update(x).digest(`hex`).slice(0,16),k=r.join(d,`${f}.${S}${c}`);i.existsSync(k)||E(k,x);let N=[...g].map(C).filter(e=>e!==void 0).sort((e,t)=>e.path.localeCompare(t.path));return E(m,`${JSON.stringify({version:`v4`,entries:o,output:k,inputs:N},null,2)}\n`),k}async function L(e,t){if(!d(e))return e;let n=r.join(t,m(e,p(e)));if(i.existsSync(n))return n;let{rolldown:a}=await import(`rolldown`),o=await a({input:e,platform:`node`,plugins:[S(),F()],onLog:M});try{await o.write({file:n,format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!1})}finally{await o.close()}return n}async function R(e,t){i.mkdirSync(t,{recursive:!0});let n={};for(let[r,i]of Object.entries(e))try{n[r]=await L(i,t)}catch{n[r]=i}return n}export{I as compileExtensionSet,R as compileResolvedEntries,D as extensionSetKey};
|
|
3
|
-
//# sourceMappingURL=extensionCompiler.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionCompiler.mjs","names":[],"sources":["../../src/services/extensionCompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { builtinModules, createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport type { LogLevel, LogOrStringHandler, RolldownLog } from 'rolldown';\nimport { optionalPackageEntry } from '../utils/index.ts';\n\n/**\n * Compiles TypeScript extensions into plain ESM ahead of the session.\n *\n * Pi loads extensions through jiti, which transpiles TypeScript at import time.\n * That works, but it costs a transform per module on a cold cache and makes Node\n * complain about type stripping under node_modules on every launch. Resolution\n * already knows the full extension list, so each TypeScript entry is bundled to\n * a single `.mjs` here and Pi imports it natively.\n *\n * Mode artifacts bundle their JavaScript dependencies. Node built-ins, native\n * packages, and Pi's shared runtime stay external; those imports are rewritten\n * to absolute paths so an artifact under `.pi/doom/dist` never relies on that\n * directory having its own `node_modules` tree.\n */\n\nconst TYPESCRIPT_SUFFIXES = ['.ts', '.mts', '.cts'] as const;\nconst COMPILED_SUFFIX = '.mjs';\nconst CACHE_VERSION = 'v3';\nconst SET_CACHE_VERSION = 'v4';\nconst HASH_LENGTH = 16;\nconst SET_DIRECTORY = 'sets';\nconst MANIFEST_SUFFIX = '.json';\nconst VIRTUAL_SET_ENTRY = '\\0doompi-extension-set';\n\n/** Pi's former npm scope. The packages are the same, published under a new name. */\nconst PI_SCOPE_RENAMES: Readonly<Record<string, string>> = {\n '@mariozechner/pi-coding-agent': '@earendil-works/pi-coding-agent',\n '@mariozechner/pi-tui': '@earendil-works/pi-tui',\n '@mariozechner/pi-ai': '@earendil-works/pi-ai',\n '@sinclair/typebox': 'typebox',\n};\n\nexport function isTypeScriptEntry(entry: string): boolean {\n return TYPESCRIPT_SUFFIXES.some((suffix) => entry.endsWith(suffix));\n}\n\nfunction renameScope(specifier: string): string {\n for (const [before, after] of Object.entries(PI_SCOPE_RENAMES)) {\n if (specifier === before) return after;\n if (specifier.startsWith(`${before}/`)) return `${after}${specifier.slice(before.length)}`;\n }\n return specifier;\n}\n\n/**\n * Cache key for a compiled entry.\n *\n * The entry's own bytes are the only cheap signal that the extension changed; a\n * dependency edit is not visible without walking the graph, so an upgrade that\n * leaves the entry byte-identical is served from cache until the version below\n * is raised.\n */\nfunction cacheKey(entry: string): string {\n const source = fs.readFileSync(entry);\n return createHash('sha256').update(CACHE_VERSION).update(entry).update(source).digest('hex').slice(0, HASH_LENGTH);\n}\n\nfunction compiledName(entry: string, key: string): string {\n const base = path.basename(entry).replace(/\\.[cm]?ts$/, '');\n const parent = path.basename(path.dirname(entry));\n return `${parent}-${base}.${key}${COMPILED_SUFFIX}`;\n}\n\n/**\n * Packages that must resolve to the copy this harness runs, never to a second\n * one bundled into an extension. Pi owns the TUI and the session state, so a\n * duplicate renders into a different screen and mutates a different store.\n */\nconst HOSTED_PACKAGES = new Set(['@earendil-works/pi-coding-agent', '@earendil-works/pi-tui', '@earendil-works/pi-ai']);\n\n/**\n * Resolves packages Pi exposes to extensions as compatibility aliases.\n *\n * Extensions do not need to declare TypeBox themselves because Pi's loader\n * provides it as a virtual module. A dist bundle bypasses that loader, so it\n * resolves the same package against Pi's dependency tree and bundles it.\n */\nfunction piExtensionDependencyEntry(specifier: string): string | undefined {\n const piEntry = optionalPackageEntry('@earendil-works/pi-coding-agent');\n if (!piEntry) return undefined;\n try {\n return createRequire(piEntry).resolve(specifier);\n } catch {\n return undefined;\n }\n}\n\n/** Packages whose native binaries or runtime discovery cannot be rolled up. */\nconst NATIVE_PACKAGES = new Set([\n '@parcel/watcher',\n '@napi-rs/keyring',\n 'better-sqlite3',\n 'canvas',\n 'fsevents',\n 'isolated-vm',\n 'keytar',\n 'node-pty',\n 'onnxruntime-node',\n 'playwright',\n 'playwright-core',\n 'puppeteer',\n 'sharp',\n]);\nconst NODE_BUILTINS = new Set(builtinModules.flatMap((name) => [name, `node:${name}`]));\n\ninterface InputFingerprint {\n path: string;\n size: number;\n mtimeMs: number;\n}\n\ninterface ExtensionSetManifest {\n version: string;\n entries: string[];\n output: string;\n inputs: InputFingerprint[];\n}\n\nexport interface CompileExtensionSetOptions {\n /** Persistent artifact directory. Compiler manifests remain in cacheDirectory. */\n outputDirectory?: string;\n /** Human-readable artifact prefix, normally the major-mode name. */\n outputName?: string;\n}\n\nfunction safeOutputName(value: string): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9._-]+/g, '-')\n .replace(/^[-.]+|[-.]+$/g, '');\n return normalized || 'doom-set';\n}\n\nfunction packageRootOf(specifier: string): string | undefined {\n const slash = specifier.startsWith('@') ? specifier.indexOf('/', specifier.indexOf('/') + 1) : specifier.indexOf('/');\n return slash === -1 ? specifier : specifier.slice(0, slash);\n}\n\nfunction packageRootFromPath(target: string): string | undefined {\n const normalized = target.split(path.sep).join('/');\n const marker = '/node_modules/';\n const offset = normalized.lastIndexOf(marker);\n if (offset === -1) return undefined;\n const parts = normalized.slice(offset + marker.length).split('/');\n // pnpm's first segment is a store key; the second node_modules marker names\n // the package that owns the file.\n const nested = parts.lastIndexOf('node_modules');\n const packageParts = nested === -1 ? parts : parts.slice(nested + 1);\n return packageParts[0]?.startsWith('@') ? packageParts.slice(0, 2).join('/') : packageParts[0];\n}\n\nfunction externalResolver() {\n return {\n name: 'doom-external-absolute',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('node:')) return null;\n const renamed = renameScope(specifier);\n\n // Host packages are resolved from this module, the way the rest of the\n // harness resolves them, because an extension written against Pi's former\n // scope does not have the current one in its own dependency tree.\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) return { id: hosted, external: true };\n }\n\n // Rolldown's resolver rather than `createRequire`, which cannot see an\n // ESM-only package that publishes no `require` condition and would send\n // Pi's own core into the bundle.\n const resolved = await this.resolve(renamed, importer, options);\n if (!resolved) return null;\n // A dependency that is itself TypeScript cannot be handed to Node either,\n // so it is bundled rather than externalised.\n if (isTypeScriptEntry(resolved.id)) return null;\n return { id: resolved.id, external: true };\n },\n };\n}\n\nfunction fingerprint(target: string): InputFingerprint | undefined {\n try {\n const stat = fs.statSync(target);\n if (!stat.isFile()) return undefined;\n return { path: target, size: stat.size, mtimeMs: stat.mtimeMs };\n } catch {\n return undefined;\n }\n}\n\nfunction manifestIsFresh(manifest: ExtensionSetManifest, entries: string[]): boolean {\n if (\n manifest.version !== SET_CACHE_VERSION ||\n JSON.stringify(manifest.entries) !== JSON.stringify(entries) ||\n !fs.existsSync(manifest.output)\n ) {\n return false;\n }\n return manifest.inputs.every((previous) => {\n const current = fingerprint(previous.path);\n return current?.size === previous.size && current.mtimeMs === previous.mtimeMs;\n });\n}\n\nfunction readSetManifest(manifestPath: string): ExtensionSetManifest | undefined {\n try {\n const parsed = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as ExtensionSetManifest;\n return parsed && Array.isArray(parsed.entries) && Array.isArray(parsed.inputs) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeAtomic(target: string, contents: string): void {\n const temporary = `${target}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, contents);\n try {\n fs.renameSync(temporary, target);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(target)) throw error;\n }\n}\n\n/** Stable lookup key for one exact Pi load order. */\nexport function extensionSetKey(entries: readonly string[]): string {\n return createHash('sha256')\n .update(SET_CACHE_VERSION)\n .update(JSON.stringify(entries.map((entry) => path.resolve(entry))))\n .digest('hex')\n .slice(0, HASH_LENGTH);\n}\n\nfunction extensionSetSource(entries: readonly string[]): string {\n const loaders = entries.map((entry) => `() => import(${JSON.stringify(pathToImportSpecifier(entry))})`);\n const names = entries.map((entry) => JSON.stringify(entry));\n return [\n `const loaders = [${loaders.join(',')}];`,\n `const names = [${names.join(',')}];`,\n 'function report(index, error) {',\n ' const detail = error instanceof Error ? error.message : String(error);',\n ' process.stderr.write(`[doompi] ${names[index]}: ${detail}\\\\n`);',\n '}',\n 'export default async function doompiExtensionSet(pi) {',\n ' const loaded = await Promise.all(loaders.map(async (load, index) => {',\n ' try {',\n ' return await load();',\n ' } catch (error) {',\n ' report(index, error);',\n ' return undefined;',\n ' }',\n ' }));',\n ' for (let index = 0; index < loaded.length; index += 1) {',\n ' const extension = loaded[index];',\n ' if (!extension) continue;',\n ' try {',\n \" if (typeof extension.default !== 'function') throw new Error('does not export an extension factory');\",\n ' await extension.default(pi);',\n ' } catch (error) {',\n ' report(index, error);',\n ' }',\n ' }',\n '}',\n ].join('\\n');\n}\n\nfunction pathToImportSpecifier(target: string): string {\n // Rolldown accepts absolute POSIX paths directly. Windows needs a file URL,\n // but replacing separators is enough for its platform-independent parser.\n return path.resolve(target).split(path.sep).join('/');\n}\n\nfunction setExternalResolver(inputs: Set<string>) {\n return {\n name: 'doom-set-external',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier === VIRTUAL_SET_ENTRY) return null;\n if (NODE_BUILTINS.has(specifier) || specifier.startsWith('node:')) {\n return { id: specifier, external: true };\n }\n\n if (path.isAbsolute(specifier)) {\n const root = packageRootFromPath(specifier);\n if (root && (HOSTED_PACKAGES.has(root) || NATIVE_PACKAGES.has(root))) {\n inputs.add(specifier);\n return { id: specifier, external: true };\n }\n return null;\n }\n if (specifier.startsWith('.')) return null;\n\n const renamed = renameScope(specifier);\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) {\n inputs.add(hosted);\n return { id: hosted, external: true };\n }\n }\n if (root === 'typebox') {\n const typebox = piExtensionDependencyEntry(renamed);\n if (typebox) {\n inputs.add(typebox);\n return { id: typebox, external: false };\n }\n }\n if (root && NATIVE_PACKAGES.has(root)) {\n const resolved = await this.resolve(renamed, importer, options);\n if (resolved) {\n inputs.add(resolved.id);\n return { id: resolved.id, external: true };\n }\n }\n return null;\n },\n };\n}\n\nfunction inputCollector(inputs: Set<string>) {\n return {\n name: 'doom-set-inputs',\n load(id: string): null {\n if (path.isAbsolute(id) && fs.existsSync(id)) inputs.add(id);\n return null;\n },\n };\n}\n\n/** An unresolved bare import would otherwise become a broken dist external. */\nfunction failUnresolvedImport(_level: LogLevel, log: RolldownLog, handler: LogOrStringHandler): void {\n if (log.code === 'UNRESOLVED_IMPORT') handler('error', log);\n}\n\ninterface SourceRange {\n start: number;\n end: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction collectImportMetaUrlRanges(value: unknown, ranges: SourceRange[]): void {\n if (Array.isArray(value)) {\n for (const item of value) collectImportMetaUrlRanges(item, ranges);\n return;\n }\n if (!isRecord(value)) return;\n\n const object = value.object;\n const property = value.property;\n if (\n value.type === 'MemberExpression' &&\n value.computed === false &&\n typeof value.start === 'number' &&\n typeof value.end === 'number' &&\n isRecord(object) &&\n object.type === 'MetaProperty' &&\n isRecord(object.meta) &&\n object.meta.name === 'import' &&\n isRecord(object.property) &&\n object.property.name === 'meta' &&\n isRecord(property) &&\n property.name === 'url'\n ) {\n ranges.push({ start: value.start, end: value.end });\n return;\n }\n\n for (const child of Object.values(value)) collectImportMetaUrlRanges(child, ranges);\n}\n\n/** Keeps package-owned resource lookup anchored to each original source file. */\nfunction preserveImportMetaUrl() {\n return {\n name: 'doom-original-import-meta-url',\n transform(\n this: {\n parse: (source: string, options?: { lang?: 'js' | 'jsx' | 'ts' | 'tsx' }) => unknown;\n },\n source: string,\n id: string,\n ): string | null {\n if (!path.isAbsolute(id) || !source.includes('import.meta.url')) return null;\n const extension = path.extname(id).toLowerCase();\n const lang = extension === '.tsx' ? 'tsx' : extension === '.jsx' ? 'jsx' : isTypeScriptEntry(id) ? 'ts' : 'js';\n const ranges: SourceRange[] = [];\n collectImportMetaUrlRanges(this.parse(source, { lang }), ranges);\n if (ranges.length === 0) return null;\n const replacement = JSON.stringify(pathToFileURL(id).href);\n let transformed = source;\n for (const range of ranges.sort((left, right) => right.start - left.start)) {\n transformed = `${transformed.slice(0, range.start)}${replacement}${transformed.slice(range.end)}`;\n }\n return transformed;\n },\n };\n}\n\n/**\n * Compiles an ordered extension set into one native ESM entry.\n *\n * The generated entry starts every module load together, then invokes factories\n * sequentially in activation order. Its manifest records every loaded module,\n * so a dependency edit invalidates the cache without running the compiler.\n */\nexport async function compileExtensionSet(\n entries: readonly string[],\n cacheDirectory: string,\n options: CompileExtensionSetOptions = {},\n): Promise<string> {\n if (entries.length === 0) throw new Error('Cannot compile an empty extension set');\n const normalized = entries.map((entry) => path.resolve(entry));\n const setDirectory = path.join(cacheDirectory, SET_DIRECTORY);\n fs.mkdirSync(setDirectory, { recursive: true });\n const key = extensionSetKey(normalized);\n const outputDirectory = path.resolve(options.outputDirectory ?? setDirectory);\n const outputName = safeOutputName(options.outputName ?? 'doom-set');\n fs.mkdirSync(outputDirectory, { recursive: true });\n // One graph can be emitted under several named mode artifacts. Keep their\n // cache records separate without changing extensionSetKey, which is the\n // runtime lookup key for an exact activation order.\n const outputKey = createHash('sha256').update(outputDirectory).update(outputName).digest('hex').slice(0, HASH_LENGTH);\n const manifestPath = path.join(setDirectory, `${key}.${outputKey}${MANIFEST_SUFFIX}`);\n const previous = readSetManifest(manifestPath);\n if (previous && manifestIsFresh(previous, normalized)) return previous.output;\n\n const inputs = new Set(normalized);\n const source = extensionSetSource(normalized);\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: VIRTUAL_SET_ENTRY,\n platform: 'node',\n plugins: [\n {\n name: 'doom-set-entry',\n resolveId(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? id : null;\n },\n load(id: string): string | null {\n return id === VIRTUAL_SET_ENTRY ? source : null;\n },\n },\n setExternalResolver(inputs),\n preserveImportMetaUrl(),\n inputCollector(inputs),\n ],\n onLog: failUnresolvedImport,\n });\n let code: string;\n try {\n const generated = await build.generate({ format: 'esm', sourcemap: false, minify: true, codeSplitting: false });\n const chunk = generated.output.find((output) => output.type === 'chunk');\n if (!chunk || chunk.type !== 'chunk') throw new Error('Rolldown produced no extension bundle');\n code = chunk.code;\n } finally {\n await build.close();\n }\n\n const contentKey = createHash('sha256').update(SET_CACHE_VERSION).update(code).digest('hex').slice(0, HASH_LENGTH);\n const output = path.join(outputDirectory, `${outputName}.${contentKey}${COMPILED_SUFFIX}`);\n if (!fs.existsSync(output)) writeAtomic(output, code);\n const inputFingerprints = [...inputs]\n .map(fingerprint)\n .filter((value): value is InputFingerprint => value !== undefined)\n .sort((left, right) => left.path.localeCompare(right.path));\n writeAtomic(\n manifestPath,\n `${JSON.stringify({ version: SET_CACHE_VERSION, entries: normalized, output, inputs: inputFingerprints }, null, 2)}\\n`,\n );\n return output;\n}\n\n/**\n * Bundles `entry` into `cacheDirectory` and returns the compiled path.\n *\n * Non-TypeScript entries are returned untouched. A cache hit skips the build.\n */\nexport async function compileExtension(entry: string, cacheDirectory: string): Promise<string> {\n if (!isTypeScriptEntry(entry)) return entry;\n\n const output = path.join(cacheDirectory, compiledName(entry, cacheKey(entry)));\n if (fs.existsSync(output)) return output;\n\n // Rolldown loads a native module and a sizeable parser graph. Sync is the\n // only command that needs it, and a cache hit does not, so keep it off every\n // other CLI startup path.\n const { rolldown } = await import('rolldown');\n const build = await rolldown({\n input: entry,\n platform: 'node',\n plugins: [externalResolver(), preserveImportMetaUrl()],\n onLog: failUnresolvedImport,\n });\n try {\n // One file per extension. Several of them import lazily, and code splitting\n // would emit sibling chunks that a single output path cannot describe.\n await build.write({ file: output, format: 'esm', sourcemap: false, minify: true, codeSplitting: false });\n } finally {\n await build.close();\n }\n return output;\n}\n\n/**\n * Compiles every TypeScript entry in a resolution map, leaving the rest as-is.\n *\n * A failure is not fatal: the original path is kept so Pi falls back to loading\n * the TypeScript through jiti, which is what it did before this existed.\n */\nexport async function compileResolvedEntries(\n resolved: Record<string, string>,\n cacheDirectory: string,\n): Promise<Record<string, string>> {\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const compiled: Record<string, string> = {};\n for (const [key, target] of Object.entries(resolved)) {\n try {\n compiled[key] = await compileExtension(target, cacheDirectory);\n } catch {\n compiled[key] = target;\n }\n }\n return compiled;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"harnessContext.cjs","names":["createHarnessTelemetry","filterHookDisabledLayers","fs","resolveMcpAllowlist","HARNESS_EVENT","optionalPackageEntry","CONTEXT_PACKAGES","collectResources","selectWorkflowExtensionForProcess","DEFAULT_THEME_NAME","ownEntry","PERSONA_ENTRY","path","packageEntry"],"sources":["../../src/services/harnessContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { sessionConfigEnvironment } from '@agimon-ai/doompi-mcp';\nimport {\n type AgentProfile,\n type DomainMcpAllowlist,\n type MajorModesConfig,\n type PluginEntry,\n DEFAULT_THEME_NAME,\n applyProfileEnvironment,\n buildPersonaPrompt,\n createHarnessSession,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n writeDefaultTheme,\n} from '../config/index.ts';\nimport type { HarnessOptions, HarnessResources } from '../interfaces/index.ts';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\nimport { collectResources, selectWorkflowExtensionForProcess } from './resourceCollector.ts';\n\nconst OLLAMA_PRESET = 'ollama';\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported because the synced Pi path has no launcher to do it: the doom-pi\n * extension applies the same rules in-process before anything reads them.\n * `piArgs` is only consulted to spot a selected cloud model.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n if (options.preset === OLLAMA_PRESET) {\n const selected = options.piArgs.find((argument) => argument.startsWith(`${OLLAMA_PRESET}/`));\n const cloud = selected?.endsWith(':cloud') ?? false;\n if (cloud && !environment.OLLAMA_API_KEY) {\n throw new Error('OLLAMA_API_KEY is required for Ollama cloud models');\n }\n environment.OLLAMA_API_KEY ||= OLLAMA_PRESET;\n environment.DOOMPI_OLLAMA_BASE_URL =\n environment.OLLAMA_BASE_URL ?? environment.ANTHROPIC_BASE_URL ?? 'http://localhost:11434/v1';\n }\n}\n\n/**\n * Describes this run's MCP configuration for the doom-mcp extension.\n *\n * The extension runs inside the Pi child process and reads the layers itself, so\n * mcp-proxy owns discovery and merging. What travels here is only what the child\n * cannot work out on its own: which plugins this run selected, and the domain\n * allowlist. The merged config doom-pi writes is for external frontends.\n */\nexport function mcpSessionEnvironment(\n options: Pick<HarnessOptions, 'repoRoot'>,\n resources: HarnessResources,\n allowlist: DomainMcpAllowlist | undefined,\n): Record<string, string> {\n return sessionConfigEnvironment({\n repoRoot: options.repoRoot,\n stagingDirectory: resources.temporaryDirectory,\n ...(resources.pluginMcpConfigPaths.length > 0 ? { pluginConfigPaths: resources.pluginMcpConfigPaths } : {}),\n ...(allowlist ? { allowlist } : {}),\n });\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`doom_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = filterHookDisabledLayers(\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: resolvePluginEntries(options.repoRoot, options.domains, options.pluginDirectories),\n mcpAllowlist: resolveMcpAllowlist(options.repoRoot, options.domains),\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? options.repoRoot;\n const workflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.workflow);\n const dispatcherWorkflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow);\n const resources = await telemetry\n .runInSpan(\n `doom_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by `doom-pi sync`, which stages into a directory that outlives\n // the process rather than a temporary one.\n temporaryDirectory: options.resourceDirectory,\n workflowExtension,\n dispatcherWorkflowExtension,\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const activeWorkflowExtension = selectWorkflowExtensionForProcess(\n workflowExtension,\n resources.dispatcherWorkflowExtensionPath,\n );\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...process.env };\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.DOOMPI_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n // Always loaded, even with no persona at launch: the extension no-ops\n // without a persona file, and /profile needs it present to load one later.\n // Pi freezes the --extension list at startup, so it cannot be added on demand.\n const personaEntry = ownEntry(PERSONA_ENTRY);\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // doom-mcp is a normal package entry rather than generated code: it reads the\n // repository and plugin layers itself, so there is nothing to codegen a path\n // into. `--no-mcp` still gates by leaving the entry out of the list.\n const mcpEntry = options.mcp ? packageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n if (mcpEntry) Object.assign(environment, mcpSessionEnvironment(options, resources, mcpAllowlist));\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n allowProtectedWrites: options.allowProtectedWrites,\n workflowExtension,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_PI_BINARY = path.join(options.repoRoot, 'pi.sh');\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n mcpEntry,\n personaEntry,\n workflowExtension: activeWorkflowExtension,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"harnessContext.mjs","names":[],"sources":["../../src/services/harnessContext.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { sessionConfigEnvironment } from '@agimon-ai/doompi-mcp';\nimport {\n type AgentProfile,\n type DomainMcpAllowlist,\n type MajorModesConfig,\n type PluginEntry,\n DEFAULT_THEME_NAME,\n applyProfileEnvironment,\n buildPersonaPrompt,\n createHarnessSession,\n layerHookGroups,\n loadMajorModesConfig,\n resolveLayers,\n resolvePluginEntries,\n resolveProfile,\n resolveSharedSkills,\n writeDefaultTheme,\n} from '../config/index.ts';\nimport type { HarnessOptions, HarnessResources } from '../interfaces/index.ts';\nimport { createHarnessTelemetry, HARNESS_EVENT, type HarnessTelemetry } from '../logSinkTelemetry.ts';\nimport { optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\nimport { collectResources, selectWorkflowExtensionForProcess } from './resourceCollector.ts';\n\nconst OLLAMA_PRESET = 'ollama';\nconst PRIVATE_FILE_MODE = 0o600;\nconst RESOLVE_CONFIG_PHASE = 'resolve_config';\nconst COLLECT_RESOURCES_PHASE = 'collect_resources';\nconst BUILD_CONTEXT_PHASE = 'build_context';\n\n/**\n * Everything a command needs, resolved once.\n *\n * All three commands need the same expensive preparation (domains resolved,\n * plugins collected into a temp directory, environment assembled), so it is\n * built here and handed to whichever command runs.\n */\nexport interface HarnessContext {\n options: HarnessOptions;\n environment: NodeJS.ProcessEnv;\n resources: HarnessResources;\n plugins: PluginEntry[];\n profile?: string;\n personaDirectory?: string;\n /** Root personaDirectory resolves against, when a profile supplied one. */\n personaRoot?: string;\n mcpAllowlist?: DomainMcpAllowlist;\n majorModesConfig: MajorModesConfig;\n selectedLayers: string[];\n hookGroups: string[];\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n defaultThemePath: string;\n cleanup(): Promise<void>;\n}\n\n/**\n * Applies the provider environment a preset needs.\n *\n * Exported because the synced Pi path has no launcher to do it: the doom-pi\n * extension applies the same rules in-process before anything reads them.\n * `piArgs` is only consulted to spot a selected cloud model.\n */\nexport function configurePreset(\n options: Pick<HarnessOptions, 'preset' | 'piArgs'>,\n environment: NodeJS.ProcessEnv,\n): void {\n if (options.preset === 'kimi') {\n if (!environment.KIMI_API_KEY && environment.KIMI_CODE_API_KEY) {\n environment.KIMI_API_KEY = environment.KIMI_CODE_API_KEY;\n }\n if (!environment.KIMI_API_KEY) {\n throw new Error('KIMI_API_KEY or KIMI_CODE_API_KEY is required for the kimi preset');\n }\n }\n if (options.preset === OLLAMA_PRESET) {\n const selected = options.piArgs.find((argument) => argument.startsWith(`${OLLAMA_PRESET}/`));\n const cloud = selected?.endsWith(':cloud') ?? false;\n if (cloud && !environment.OLLAMA_API_KEY) {\n throw new Error('OLLAMA_API_KEY is required for Ollama cloud models');\n }\n environment.OLLAMA_API_KEY ||= OLLAMA_PRESET;\n environment.DOOMPI_OLLAMA_BASE_URL =\n environment.OLLAMA_BASE_URL ?? environment.ANTHROPIC_BASE_URL ?? 'http://localhost:11434/v1';\n }\n}\n\n/**\n * Describes this run's MCP configuration for the doom-mcp extension.\n *\n * The extension runs inside the Pi child process and reads the layers itself, so\n * mcp-proxy owns discovery and merging. What travels here is only what the child\n * cannot work out on its own: which plugins this run selected, and the domain\n * allowlist. The merged config doom-pi writes is for external frontends.\n */\nexport function mcpSessionEnvironment(\n options: Pick<HarnessOptions, 'repoRoot'>,\n resources: HarnessResources,\n allowlist: DomainMcpAllowlist | undefined,\n): Record<string, string> {\n return sessionConfigEnvironment({\n repoRoot: options.repoRoot,\n stagingDirectory: resources.temporaryDirectory,\n ...(resources.pluginMcpConfigPaths.length > 0 ? { pluginConfigPaths: resources.pluginMcpConfigPaths } : {}),\n ...(allowlist ? { allowlist } : {}),\n });\n}\n\n/** Resolves the optional persona and environment profile selected for this run. */\nexport function resolveHarnessProfile(options: HarnessOptions): AgentProfile | undefined {\n return options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n}\n\n/**\n * Resolves the full matrix and stages every resource Pi will need.\n *\n * The caller owns the returned cleanup(): the temporary directory holding\n * skills, agents, and the generated MCP config has to outlive this function\n * and be removed once the selected command is done with it.\n */\nexport async function buildHarnessContext(\n options: HarnessOptions,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): Promise<HarnessContext> {\n // Everything up to collectResources reads configuration off disk, so a single\n // malformed modes.yaml or profiles.yaml surfaces here as a failed launch\n // with no other record.\n const configured = await telemetry\n .runInSpan(`doom_pi.${RESOLVE_CONFIG_PHASE}`, { 'harness.phase': RESOLVE_CONFIG_PHASE }, async () => {\n const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n const selectedLayers = filterHookDisabledLayers(\n resolveLayers(majorModesConfig, options.majorMode),\n options.hooks,\n );\n const profile = resolveHarnessProfile(options);\n if (!fs.existsSync(options.cwd) || !fs.statSync(options.cwd).isDirectory()) {\n throw new Error(`Working directory does not exist: ${options.cwd}`);\n }\n return {\n majorModesConfig,\n selectedLayers,\n hookGroups: layerHookGroups(majorModesConfig, selectedLayers),\n profile,\n plugins: resolvePluginEntries(options.repoRoot, options.domains, options.pluginDirectories),\n mcpAllowlist: resolveMcpAllowlist(options.repoRoot, options.domains),\n sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n };\n })\n .catch(async (error: unknown) => {\n await telemetry.recordError(HARNESS_EVENT.configLoadFailed, error, {\n 'harness.phase': RESOLVE_CONFIG_PHASE,\n 'harness.major_mode': options.majorMode,\n 'harness.domain_count': options.domains.length,\n });\n throw error;\n });\n\n const { majorModesConfig, selectedLayers, hookGroups, profile, plugins, mcpAllowlist } = configured;\n const personaDirectory = profile?.persona;\n // A global profile's persona lives beside the global config, not in the repo.\n const personaRoot = profile?.personaRoot ?? options.repoRoot;\n const workflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.workflow);\n const dispatcherWorkflowExtension = optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow);\n const resources = await telemetry\n .runInSpan(\n `doom_pi.${COLLECT_RESOURCES_PHASE}`,\n { 'harness.plugin.count': plugins.length, 'harness.agents': options.agents, 'harness.mcp': options.mcp },\n () =>\n collectResources(options.repoRoot, plugins, {\n agents: options.agents,\n mcp: options.mcp,\n // Set by `doom-pi sync`, which stages into a directory that outlives\n // the process rather than a temporary one.\n temporaryDirectory: options.resourceDirectory,\n workflowExtension,\n dispatcherWorkflowExtension,\n mcpAllowlist,\n sharedSkills: configured.sharedSkills,\n }),\n )\n .catch(async (error: unknown) => {\n // Conflicting skills, agents, or MCP servers all fail here, and the plugin\n // that caused it is only identifiable from the message.\n await telemetry.recordError(HARNESS_EVENT.resourceCollectionFailed, error, {\n 'harness.phase': COLLECT_RESOURCES_PHASE,\n 'harness.plugin.count': plugins.length,\n });\n throw error;\n });\n\n try {\n const activeWorkflowExtension = selectWorkflowExtensionForProcess(\n workflowExtension,\n resources.dispatcherWorkflowExtensionPath,\n );\n const defaultThemePath = await writeDefaultTheme(resources.temporaryDirectory);\n const environment = { ...process.env };\n const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n\n configurePreset(options, environment);\n environment.NX_DAEMON ??= 'false';\n environment.DOOMPI_THEME ||= DEFAULT_THEME_NAME;\n environment.CLAUDE_PROJECT_DIR = options.repoRoot;\n environment.CODEX_REPO_ROOT = options.repoRoot;\n environment.ORIGINAL_REPO_PATH ||= options.repoRoot;\n environment.MCP_UI_VIEWER = options.automation ? 'none' : (environment.MCP_UI_VIEWER ?? '');\n\n // Always loaded, even with no persona at launch: the extension no-ops\n // without a persona file, and /profile needs it present to load one later.\n // Pi freezes the --extension list at startup, so it cannot be added on demand.\n const personaEntry = ownEntry(PERSONA_ENTRY);\n const personaPrompt = personaDirectory ? buildPersonaPrompt(personaRoot, personaDirectory) : undefined;\n let personaFile: string | undefined;\n if (personaPrompt) {\n personaFile = path.join(resources.temporaryDirectory, 'persona.md');\n await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n }\n\n // doom-mcp is a normal package entry rather than generated code: it reads the\n // repository and plugin layers itself, so there is nothing to codegen a path\n // into. `--no-mcp` still gates by leaving the entry out of the list.\n const mcpEntry = options.mcp ? packageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n if (mcpEntry) Object.assign(environment, mcpSessionEnvironment(options, resources, mcpAllowlist));\n\n // One write, describing the child rather than this process. The state file\n // is the child's authority and the environment is what it projects for the\n // hooks and packages that can only read an environment.\n createHarnessSession(\n {\n root: options.repoRoot,\n majorMode: options.majorMode,\n temporaryDirectory: resources.temporaryDirectory,\n domains: options.domains,\n layers: selectedLayers,\n profile: profile?.name,\n profileEnvironment,\n personaFile,\n skillDirectories: resources.skillDirectories,\n agentDirectories: resources.agentDirectories,\n additionalDirectories: options.additionalDirectories,\n childExtensions: [],\n pluginDirectories: options.pluginDirectories,\n pluginHooks: resources.pluginHooks,\n hookGroups,\n hooks: options.hooks,\n agents: options.agents,\n mcp: options.mcp,\n mcpConfigPath: resources.mcpConfigPath,\n allowProtectedWrites: options.allowProtectedWrites,\n workflowExtension,\n },\n { directory: resources.temporaryDirectory, environment },\n );\n if (options.agents) {\n environment.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n environment.PI_SUBAGENT_PI_BINARY = path.join(options.repoRoot, 'pi.sh');\n }\n\n // Core hook groups load regardless; hookGroups selects the rest. The initial\n // state write includes an empty list deliberately: unset means every group.\n\n return {\n options,\n environment,\n resources,\n plugins,\n profile: profile?.name,\n personaDirectory,\n personaRoot,\n mcpAllowlist,\n majorModesConfig,\n selectedLayers,\n hookGroups,\n mcpEntry,\n personaEntry,\n workflowExtension: activeWorkflowExtension,\n defaultThemePath,\n cleanup: resources.cleanup.bind(resources),\n };\n } catch (error) {\n // Preparation failed after the temp directory existed, so nothing will be\n // handed back to clean it up.\n await telemetry.recordError(HARNESS_EVENT.contextBuildFailed, error, {\n 'harness.phase': BUILD_CONTEXT_PHASE,\n 'harness.major_mode': options.majorMode,\n ...(profile?.name ? { 'harness.profile': profile.name } : {}),\n });\n await resources.cleanup();\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"matrixSwitcher.cjs","names":["collectResources","resolveMcpAllowlist","updateHarnessState","path","filterHookDisabledLayers","fs"],"sources":["../../src/services/matrixSwitcher.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { DoomHarnessContext } from '@agimon-ai/doompi-config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport { type AgentProfile, buildPersonaPrompt, replaceProfileEnvironment } from '@agimon-ai/doompi-config/profiles';\nimport { requireHarnessPaths, type HarnessState, updateHarnessState } from '../config/harnessState.ts';\nimport { type MajorModesConfig, layerHookGroups, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { collectResources } from './resourceCollector.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\n\nconst PERSONA_FILE = 'persona.md';\n\n/**\n * Live matrix switching.\n *\n * Every axis writes through the harness state module and relies on Pi's reload\n * re-executing extension modules, which drops their module-level caches and\n * makes them re-read the environment. That is the same path /domains has always\n * used; major mode and profile persona changes now share it.\n *\n * What reload cannot do is change the SET of loaded extensions: Pi freezes the\n * CLI --extension list at construction (resource-loader.js:164) and re-resolves\n * that same array on every reload. Callers report those parts as needing a\n * relaunch instead of pretending they applied.\n */\n\n/** Domains: skills, plugin hooks, MCP config, and subagent directories. */\nexport async function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const pluginEntries = resolvePluginEntries(root, domainNames, [...state.pluginDirectories]);\n const resources = await collectResources(root, pluginEntries, {\n agents: state.agents,\n mcp: state.mcp,\n temporaryDirectory,\n workflowExtension: state.workflowExtension,\n sharedSkills: resolveSharedSkills(root, domainNames),\n mcpAllowlist: resolveMcpAllowlist(root, domainNames),\n });\n\n const updated = updateHarnessState({\n domains: domainNames,\n skillDirectories: resources.skillDirectories,\n pluginHooks: resources.pluginHooks,\n mcpConfigPath: resources.mcpConfigPath,\n });\n process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n return updated;\n}\n\n/** Applies one major mode and the hook groups its effective layers contribute. */\nexport function applyMajorMode(config: MajorModesConfig, majorMode: string, state: DoomHarnessContext): HarnessState {\n const selected = filterHookDisabledLayers(resolveLayers(config, majorMode), state.hooks);\n return updateHarnessState({ majorMode, layers: selected, hookGroups: layerHookGroups(config, selected) });\n}\n\n/** Layers that contribute extensions or packages, which reload cannot swap. */\nexport function extensionLayers(config: MajorModesConfig, names: string[]): string[] {\n return names\n .filter((name) => {\n const layer = config.layers[name];\n return Boolean(layer && ((layer.extensions?.length ?? 0) > 0 || (layer.packages?.length ?? 0) > 0));\n })\n .sort();\n}\n\n/** Whether a mode change alters the extension set, and so needs a relaunch. */\nexport function needsRelaunch(config: MajorModesConfig, before: string[], after: string[]): boolean {\n return extensionLayers(config, before).join(',') !== extensionLayers(config, after).join(',');\n}\n\n/**\n * Persona: rewrites the assembled prompt file that the persona extension reads.\n *\n * The extension re-reads the file on reload and appends its block to whatever\n * system prompt it is given, so the repository's own AGENTS.md keeps applying\n * underneath. Returns false when the directories hold no readable persona.\n */\nexport async function applyPersona(\n personaDirectory: string,\n state: DoomHarnessContext,\n personaRoot?: string,\n): Promise<boolean> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const prompt = buildPersonaPrompt(personaRoot ?? root, personaDirectory);\n if (!prompt) return false;\n\n const personaPath = path.join(temporaryDirectory, PERSONA_FILE);\n await fs.promises.writeFile(personaPath, `${prompt}\\n`, { mode: 0o600 });\n updateHarnessState({ personaFile: personaPath });\n return true;\n}\n\n/**\n * Profile: one persona plus the environment defaults it declares.\n *\n * Lives beside the other switchers rather than in the /profile command,\n * because the synced Pi path applies the same switch from its `--profile` flag\n * before any command exists to run it.\n */\nexport async function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string> {\n const appliedPersona = await applyPersona(profile.persona, state, profile.personaRoot);\n if (!appliedPersona) throw new Error(`Profile ${profile.name} has no readable persona files`);\n\n const profileEnvironment = replaceProfileEnvironment(process.env, state.profileEnvironment, profile.env);\n updateHarnessState({ profile: profile.name, profileEnvironment });\n\n const environmentKeys = Object.keys(profile.env).sort();\n const environmentSummary = environmentKeys.length > 0 ? `; env defaults ${environmentKeys.join(', ')}` : '';\n return `Loaded ${profile.name}: persona ${profile.persona}${environmentSummary}.`;\n}\n"],"mappings":"shBA4BA,eAAsB,EAAa,EAAuB,EAAkD,CAC1G,GAAM,CAAE,OAAM,uBAAA,EAAA,EAAA,qBAA2C,EAAM,CAGzD,EAAY,MAAMA,EAAAA,iBAAiB,GAAA,EAAA,EAAA,sBADE,EAAM,EAAa,CAAC,GAAG,EAAM,kBAAkB,CAC9B,CAAE,CAC5D,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,qBACA,kBAAmB,EAAM,kBACzB,cAAA,EAAA,EAAA,qBAAkC,EAAM,EAAY,CACpD,aAAcC,EAAAA,oBAAoB,EAAM,EAAY,CACrD,CAAC,CAEI,EAAUC,EAAAA,mBAAmB,CACjC,QAAS,EACT,iBAAkB,EAAU,iBAC5B,YAAa,EAAU,YACvB,cAAe,EAAU,cAC1B,CAAC,CAGF,MAFA,SAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAKC,EAAAA,QAAK,UAAU,CAC1F,QAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAKA,EAAAA,QAAK,UAAU,CACnF,EAIT,SAAgB,EAAe,EAA0B,EAAmB,EAAyC,CACnH,IAAM,EAAWC,EAAAA,0BAAAA,EAAAA,EAAAA,eAAuC,EAAQ,EAAU,CAAE,EAAM,MAAM,CACxF,OAAOF,EAAAA,mBAAmB,CAAE,YAAW,OAAQ,EAAU,YAAA,EAAA,EAAA,iBAA4B,EAAQ,EAAS,CAAE,CAAC,CAI3G,SAAgB,EAAgB,EAA0B,EAA2B,CACnF,OAAO,EACJ,OAAQ,GAAS,CAChB,IAAM,EAAQ,EAAO,OAAO,GAC5B,MAAO,GAAQ,KAAW,EAAM,YAAY,QAAU,GAAK,IAAM,EAAM,UAAU,QAAU,GAAK,KAChG,CACD,MAAM,CAIX,SAAgB,EAAc,EAA0B,EAAkB,EAA0B,CAClG,OAAO,EAAgB,EAAQ,EAAO,CAAC,KAAK,IAAI,GAAK,EAAgB,EAAQ,EAAM,CAAC,KAAK,IAAI,CAU/F,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,GAAM,CAAE,OAAM,uBAAA,EAAA,EAAA,qBAA2C,EAAM,CAEzD,GAAA,EAAA,EAAA,oBAA4B,GAAe,EAAM,EAAiB,CACxE,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAcC,EAAAA,QAAK,KAAK,EAAoB,aAAa,CAG/D,OAFA,MAAME,EAAAA,QAAG,SAAS,UAAU,EAAa,GAAG,EAAO,IAAK,CAAE,KAAM,IAAO,CAAC,CACxE,EAAA,mBAAmB,CAAE,YAAa,EAAa,CAAC,CACzC,GAUT,eAAsB,EAAa,EAAuB,EAA4C,CAEpG,GAAI,CAAC,MADwB,EAAa,EAAQ,QAAS,EAAO,EAAQ,YAAY,CACjE,MAAU,MAAM,WAAW,EAAQ,KAAK,gCAAgC,CAE7F,IAAM,GAAA,EAAA,EAAA,2BAA+C,QAAQ,IAAK,EAAM,mBAAoB,EAAQ,IAAI,CACxG,EAAA,mBAAmB,CAAE,QAAS,EAAQ,KAAM,qBAAoB,CAAC,CAEjE,IAAM,EAAkB,OAAO,KAAK,EAAQ,IAAI,CAAC,MAAM,CACjD,EAAqB,EAAgB,OAAS,EAAI,kBAAkB,EAAgB,KAAK,KAAK,GAAK,GACzG,MAAO,UAAU,EAAQ,KAAK,YAAY,EAAQ,UAAU,EAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"matrixSwitcher.mjs","names":[],"sources":["../../src/services/matrixSwitcher.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { DoomHarnessContext } from '@agimon-ai/doompi-config';\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport { type AgentProfile, buildPersonaPrompt, replaceProfileEnvironment } from '@agimon-ai/doompi-config/profiles';\nimport { requireHarnessPaths, type HarnessState, updateHarnessState } from '../config/harnessState.ts';\nimport { type MajorModesConfig, layerHookGroups, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { filterHookDisabledLayers } from './extensionAssembler.ts';\nimport { collectResources } from './resourceCollector.ts';\nimport { resolveMcpAllowlist } from './mcpFilter.ts';\n\nconst PERSONA_FILE = 'persona.md';\n\n/**\n * Live matrix switching.\n *\n * Every axis writes through the harness state module and relies on Pi's reload\n * re-executing extension modules, which drops their module-level caches and\n * makes them re-read the environment. That is the same path /domains has always\n * used; major mode and profile persona changes now share it.\n *\n * What reload cannot do is change the SET of loaded extensions: Pi freezes the\n * CLI --extension list at construction (resource-loader.js:164) and re-resolves\n * that same array on every reload. Callers report those parts as needing a\n * relaunch instead of pretending they applied.\n */\n\n/** Domains: skills, plugin hooks, MCP config, and subagent directories. */\nexport async function applyDomains(domainNames: string[], state: DoomHarnessContext): Promise<HarnessState> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const pluginEntries = resolvePluginEntries(root, domainNames, [...state.pluginDirectories]);\n const resources = await collectResources(root, pluginEntries, {\n agents: state.agents,\n mcp: state.mcp,\n temporaryDirectory,\n workflowExtension: state.workflowExtension,\n sharedSkills: resolveSharedSkills(root, domainNames),\n mcpAllowlist: resolveMcpAllowlist(root, domainNames),\n });\n\n const updated = updateHarnessState({\n domains: domainNames,\n skillDirectories: resources.skillDirectories,\n pluginHooks: resources.pluginHooks,\n mcpConfigPath: resources.mcpConfigPath,\n });\n process.env.PI_SUBAGENT_EXTRA_AGENT_DIRS = resources.agentDirectories.join(path.delimiter);\n process.env.PI_SUBAGENT_EXTRA_SKILL_DIRS = resources.skillDirectories.join(path.delimiter);\n return updated;\n}\n\n/** Applies one major mode and the hook groups its effective layers contribute. */\nexport function applyMajorMode(config: MajorModesConfig, majorMode: string, state: DoomHarnessContext): HarnessState {\n const selected = filterHookDisabledLayers(resolveLayers(config, majorMode), state.hooks);\n return updateHarnessState({ majorMode, layers: selected, hookGroups: layerHookGroups(config, selected) });\n}\n\n/** Layers that contribute extensions or packages, which reload cannot swap. */\nexport function extensionLayers(config: MajorModesConfig, names: string[]): string[] {\n return names\n .filter((name) => {\n const layer = config.layers[name];\n return Boolean(layer && ((layer.extensions?.length ?? 0) > 0 || (layer.packages?.length ?? 0) > 0));\n })\n .sort();\n}\n\n/** Whether a mode change alters the extension set, and so needs a relaunch. */\nexport function needsRelaunch(config: MajorModesConfig, before: string[], after: string[]): boolean {\n return extensionLayers(config, before).join(',') !== extensionLayers(config, after).join(',');\n}\n\n/**\n * Persona: rewrites the assembled prompt file that the persona extension reads.\n *\n * The extension re-reads the file on reload and appends its block to whatever\n * system prompt it is given, so the repository's own AGENTS.md keeps applying\n * underneath. Returns false when the directories hold no readable persona.\n */\nexport async function applyPersona(\n personaDirectory: string,\n state: DoomHarnessContext,\n personaRoot?: string,\n): Promise<boolean> {\n const { root, temporaryDirectory } = requireHarnessPaths(state);\n\n const prompt = buildPersonaPrompt(personaRoot ?? root, personaDirectory);\n if (!prompt) return false;\n\n const personaPath = path.join(temporaryDirectory, PERSONA_FILE);\n await fs.promises.writeFile(personaPath, `${prompt}\\n`, { mode: 0o600 });\n updateHarnessState({ personaFile: personaPath });\n return true;\n}\n\n/**\n * Profile: one persona plus the environment defaults it declares.\n *\n * Lives beside the other switchers rather than in the /profile command,\n * because the synced Pi path applies the same switch from its `--profile` flag\n * before any command exists to run it.\n */\nexport async function applyProfile(profile: AgentProfile, state: DoomHarnessContext): Promise<string> {\n const appliedPersona = await applyPersona(profile.persona, state, profile.personaRoot);\n if (!appliedPersona) throw new Error(`Profile ${profile.name} has no readable persona files`);\n\n const profileEnvironment = replaceProfileEnvironment(process.env, state.profileEnvironment, profile.env);\n updateHarnessState({ profile: profile.name, profileEnvironment });\n\n const environmentKeys = Object.keys(profile.env).sort();\n const environmentSummary = environmentKeys.length > 0 ? `; env defaults ${environmentKeys.join(', ')}` : '';\n return `Loaded ${profile.name}: persona ${profile.persona}${environmentSummary}.`;\n}\n"],"mappings":"8lBA4BA,eAAsB,EAAa,EAAuB,EAAkD,CAC1G,GAAM,CAAE,OAAM,sBAAuB,EAAoB,EAAM,CAGzD,EAAY,MAAM,EAAiB,EADnB,EAAqB,EAAM,EAAa,CAAC,GAAG,EAAM,kBAAkB,CAC9B,CAAE,CAC5D,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,qBACA,kBAAmB,EAAM,kBACzB,aAAc,EAAoB,EAAM,EAAY,CACpD,aAAc,EAAoB,EAAM,EAAY,CACrD,CAAC,CAEI,EAAU,EAAmB,CACjC,QAAS,EACT,iBAAkB,EAAU,iBAC5B,YAAa,EAAU,YACvB,cAAe,EAAU,cAC1B,CAAC,CAGF,MAFA,SAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAK,EAAK,UAAU,CAC1F,QAAQ,IAAI,6BAA+B,EAAU,iBAAiB,KAAK,EAAK,UAAU,CACnF,EAIT,SAAgB,EAAe,EAA0B,EAAmB,EAAyC,CACnH,IAAM,EAAW,EAAyB,EAAc,EAAQ,EAAU,CAAE,EAAM,MAAM,CACxF,OAAO,EAAmB,CAAE,YAAW,OAAQ,EAAU,WAAY,EAAgB,EAAQ,EAAS,CAAE,CAAC,CAI3G,SAAgB,EAAgB,EAA0B,EAA2B,CACnF,OAAO,EACJ,OAAQ,GAAS,CAChB,IAAM,EAAQ,EAAO,OAAO,GAC5B,MAAO,GAAQ,KAAW,EAAM,YAAY,QAAU,GAAK,IAAM,EAAM,UAAU,QAAU,GAAK,KAChG,CACD,MAAM,CAIX,SAAgB,EAAc,EAA0B,EAAkB,EAA0B,CAClG,OAAO,EAAgB,EAAQ,EAAO,CAAC,KAAK,IAAI,GAAK,EAAgB,EAAQ,EAAM,CAAC,KAAK,IAAI,CAU/F,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,GAAM,CAAE,OAAM,sBAAuB,EAAoB,EAAM,CAEzD,EAAS,EAAmB,GAAe,EAAM,EAAiB,CACxE,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAc,EAAK,KAAK,EAAoB,aAAa,CAG/D,OAFA,MAAM,EAAG,SAAS,UAAU,EAAa,GAAG,EAAO,IAAK,CAAE,KAAM,IAAO,CAAC,CACxE,EAAmB,CAAE,YAAa,EAAa,CAAC,CACzC,GAUT,eAAsB,EAAa,EAAuB,EAA4C,CAEpG,GAAI,CAAC,MADwB,EAAa,EAAQ,QAAS,EAAO,EAAQ,YAAY,CACjE,MAAU,MAAM,WAAW,EAAQ,KAAK,gCAAgC,CAE7F,IAAM,EAAqB,EAA0B,QAAQ,IAAK,EAAM,mBAAoB,EAAQ,IAAI,CACxG,EAAmB,CAAE,QAAS,EAAQ,KAAM,qBAAoB,CAAC,CAEjE,IAAM,EAAkB,OAAO,KAAK,EAAQ,IAAI,CAAC,MAAM,CACjD,EAAqB,EAAgB,OAAS,EAAI,kBAAkB,EAAgB,KAAK,KAAK,GAAK,GACzG,MAAO,UAAU,EAAQ,KAAK,YAAY,EAAQ,UAAU,EAAmB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpFilter.cjs","names":["fs","path"],"sources":["../../src/services/mcpFilter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { type DomainMcpAllowlist, expandDomainNames, loadDomains } from '@agimon-ai/doompi-config/domains';\n\n/** Server name in .mcp.json whose upstreams are declared in mcp-config.yaml. */\nexport const PROXY_SERVER_NAME = 'agiflow-proxy';\n\ntype JsonObject = Record<string, unknown>;\n\n/**\n * Unions the mcp allowlists of the selected domains.\n *\n * Returns undefined when any selected domain omits `mcp`, which means \"give me\n * everything\". Filtering only kicks in once every selected domain has opted in,\n * so a domain that has not been migrated yet cannot silently lose its tools.\n */\nexport function resolveMcpAllowlist(repoRoot: string, domainNames: string[]): DomainMcpAllowlist | undefined {\n const manifest = loadDomains(repoRoot);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return undefined;\n\n const servers = new Set<string>();\n const proxy = new Set<string>();\n for (const name of expanded) {\n const allowlist = manifest.domains[name]?.mcp;\n if (!allowlist) return undefined;\n for (const server of allowlist.servers ?? []) servers.add(server);\n for (const upstream of allowlist.proxy ?? []) proxy.add(upstream);\n }\n return { servers: [...servers], proxy: [...proxy] };\n}\n\n/** Drops servers that are not on the allowlist. An empty list means keep all. */\nexport function filterMcpServers(config: JsonObject, allowed?: string[]): JsonObject {\n if (!allowed || allowed.length === 0) return config;\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const kept: Record<string, unknown> = {};\n for (const [name, definition] of Object.entries(servers)) {\n if (allowed.includes(name)) kept[name] = definition;\n }\n return { ...config, mcpServers: kept };\n}\n\n/**\n * Rewrites the proxy's upstream list, keeping only allowed servers.\n *\n * Entries are removed rather than marked disabled so a filtered upstream cannot\n * be reached even if the proxy ignores the disabled flag. Comments in the\n * source file are not preserved; the result is a per-run temporary file.\n */\nexport function filterProxyConfig(yamlText: string, allowed?: string[]): string {\n if (!allowed || allowed.length === 0) return yamlText;\n const config = (parseYaml(yamlText) ?? {}) as JsonObject;\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const kept: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const [name, definition] of Object.entries(servers)) {\n if (allowed.includes(name)) kept[name] = definition;\n else dropped.push(name);\n }\n const header = [\n '# Generated by doompi for this run. Do not edit.',\n `# Upstreams kept: ${Object.keys(kept).join(', ') || '(none)'}`,\n `# Upstreams removed by the domain allowlist: ${dropped.join(', ') || '(none)'}`,\n '',\n ].join('\\n');\n return `${header}${stringifyYaml({ ...config, mcpServers: kept })}`;\n}\n\n/**\n * Copies a generated MCP config out of the run directory so another frontend\n * can use it, keeping the proxy's --config pointing at the copy.\n *\n * The run directory is deleted when the harness exits, so emitting for\n * claude.sh or codex.sh has to relocate both files together.\n */\nexport async function persistMcpConfig(\n sourceConfigPath: string,\n temporaryDirectory: string,\n targetDirectory: string,\n): Promise<string> {\n await fs.promises.mkdir(targetDirectory, { recursive: true });\n const config = JSON.parse(fs.readFileSync(sourceConfigPath, 'utf8')) as JsonObject;\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const generatedProxyConfig = path.join(temporaryDirectory, 'mcp-config.yaml');\n\n if (proxy && fs.existsSync(generatedProxyConfig)) {\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf('--config');\n if (configIndex !== -1) {\n const targetProxyConfig = path.join(targetDirectory, 'mcp-config.yaml');\n await fs.promises.copyFile(generatedProxyConfig, targetProxyConfig);\n args[configIndex + 1] = targetProxyConfig;\n servers[PROXY_SERVER_NAME] = { ...proxy, args };\n }\n }\n\n const targetPath = path.join(targetDirectory, 'mcp.json');\n await fs.promises.writeFile(targetPath, `${JSON.stringify({ ...config, mcpServers: servers }, null, 2)}\\n`, {\n mode: 0o600,\n });\n return targetPath;\n}\n\n/**\n * Applies the allowlist to a merged MCP config, writing a filtered proxy config\n * into the run directory and repointing the proxy at it when needed.\n */\nexport async function applyMcpAllowlist(\n config: JsonObject,\n allowlist: DomainMcpAllowlist | undefined,\n repoRoot: string,\n temporaryDirectory: string,\n): Promise<JsonObject> {\n if (!allowlist) return config;\n const filtered = filterMcpServers(config, allowlist.servers);\n const servers = (filtered.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n if (!proxy || !allowlist.proxy || allowlist.proxy.length === 0) return filtered;\n\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf('--config');\n if (configIndex === -1 || !args[configIndex + 1]) return filtered;\n\n const sourcePath = path.resolve(repoRoot, args[configIndex + 1]);\n if (!fs.existsSync(sourcePath)) return filtered;\n const targetPath = path.join(temporaryDirectory, 'mcp-config.yaml');\n await fs.promises.writeFile(targetPath, filterProxyConfig(fs.readFileSync(sourcePath, 'utf8'), allowlist.proxy), {\n mode: 0o600,\n });\n args[configIndex + 1] = targetPath;\n return { ...filtered, mcpServers: { ...servers, [PROXY_SERVER_NAME]: { ...proxy, args } } };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpFilter.d.cts","names":[],"sources":["../../src/services/mcpFilter.ts"],"mappings":";;;;cAMa,iBAAA;AAAA,KAER,UAAA,GAAa,MAAA;;;;;AAF+B;;;iBAWjC,mBAAA,CAAoB,QAAA,UAAkB,WAAA,aAAwB,kBAAA;;iBAiB9D,gBAAA,CAAiB,MAAA,EAAQ,UAAA,EAAY,OAAA,cAAqB,UAAA;;;;;;;;iBAiB1D,iBAAA,CAAkB,QAAA,UAAkB,OAAA;AAjBpD;;;;;;;AAAA,iBA2CsB,gBAAA,CACpB,gBAAA,UACA,kBAAA,UACA,eAAA,WACC,OAAA;;;AA9BH;;iBA2DsB,iBAAA,CACpB,MAAA,EAAQ,UAAA,EACR,SAAA,EAAW,kBAAA,cACX,QAAA,UACA,kBAAA,WACC,OAAA,CAAQ,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpFilter.d.mts","names":[],"sources":["../../src/services/mcpFilter.ts"],"mappings":";;;;cAMa,iBAAA;AAAA,KAER,UAAA,GAAa,MAAA;;;;;AAF+B;;;iBAWjC,mBAAA,CAAoB,QAAA,UAAkB,WAAA,aAAwB,kBAAA;;iBAiB9D,gBAAA,CAAiB,MAAA,EAAQ,UAAA,EAAY,OAAA,cAAqB,UAAA;;;;;;;;iBAiB1D,iBAAA,CAAkB,QAAA,UAAkB,OAAA;AAjBpD;;;;;;;AAAA,iBA2CsB,gBAAA,CACpB,gBAAA,UACA,kBAAA,UACA,eAAA,WACC,OAAA;;;AA9BH;;iBA2DsB,iBAAA,CACpB,MAAA,EAAQ,UAAA,EACR,SAAA,EAAW,kBAAA,cACX,QAAA,UACA,kBAAA,WACC,OAAA,CAAQ,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcpFilter.mjs","names":["parseYaml","stringifyYaml"],"sources":["../../src/services/mcpFilter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { type DomainMcpAllowlist, expandDomainNames, loadDomains } from '@agimon-ai/doompi-config/domains';\n\n/** Server name in .mcp.json whose upstreams are declared in mcp-config.yaml. */\nexport const PROXY_SERVER_NAME = 'agiflow-proxy';\n\ntype JsonObject = Record<string, unknown>;\n\n/**\n * Unions the mcp allowlists of the selected domains.\n *\n * Returns undefined when any selected domain omits `mcp`, which means \"give me\n * everything\". Filtering only kicks in once every selected domain has opted in,\n * so a domain that has not been migrated yet cannot silently lose its tools.\n */\nexport function resolveMcpAllowlist(repoRoot: string, domainNames: string[]): DomainMcpAllowlist | undefined {\n const manifest = loadDomains(repoRoot);\n const expanded = expandDomainNames(manifest, domainNames);\n if (expanded.length === 0) return undefined;\n\n const servers = new Set<string>();\n const proxy = new Set<string>();\n for (const name of expanded) {\n const allowlist = manifest.domains[name]?.mcp;\n if (!allowlist) return undefined;\n for (const server of allowlist.servers ?? []) servers.add(server);\n for (const upstream of allowlist.proxy ?? []) proxy.add(upstream);\n }\n return { servers: [...servers], proxy: [...proxy] };\n}\n\n/** Drops servers that are not on the allowlist. An empty list means keep all. */\nexport function filterMcpServers(config: JsonObject, allowed?: string[]): JsonObject {\n if (!allowed || allowed.length === 0) return config;\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const kept: Record<string, unknown> = {};\n for (const [name, definition] of Object.entries(servers)) {\n if (allowed.includes(name)) kept[name] = definition;\n }\n return { ...config, mcpServers: kept };\n}\n\n/**\n * Rewrites the proxy's upstream list, keeping only allowed servers.\n *\n * Entries are removed rather than marked disabled so a filtered upstream cannot\n * be reached even if the proxy ignores the disabled flag. Comments in the\n * source file are not preserved; the result is a per-run temporary file.\n */\nexport function filterProxyConfig(yamlText: string, allowed?: string[]): string {\n if (!allowed || allowed.length === 0) return yamlText;\n const config = (parseYaml(yamlText) ?? {}) as JsonObject;\n const servers = (config.mcpServers ?? {}) as Record<string, unknown>;\n const kept: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const [name, definition] of Object.entries(servers)) {\n if (allowed.includes(name)) kept[name] = definition;\n else dropped.push(name);\n }\n const header = [\n '# Generated by doompi for this run. Do not edit.',\n `# Upstreams kept: ${Object.keys(kept).join(', ') || '(none)'}`,\n `# Upstreams removed by the domain allowlist: ${dropped.join(', ') || '(none)'}`,\n '',\n ].join('\\n');\n return `${header}${stringifyYaml({ ...config, mcpServers: kept })}`;\n}\n\n/**\n * Copies a generated MCP config out of the run directory so another frontend\n * can use it, keeping the proxy's --config pointing at the copy.\n *\n * The run directory is deleted when the harness exits, so emitting for\n * claude.sh or codex.sh has to relocate both files together.\n */\nexport async function persistMcpConfig(\n sourceConfigPath: string,\n temporaryDirectory: string,\n targetDirectory: string,\n): Promise<string> {\n await fs.promises.mkdir(targetDirectory, { recursive: true });\n const config = JSON.parse(fs.readFileSync(sourceConfigPath, 'utf8')) as JsonObject;\n const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n const generatedProxyConfig = path.join(temporaryDirectory, 'mcp-config.yaml');\n\n if (proxy && fs.existsSync(generatedProxyConfig)) {\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf('--config');\n if (configIndex !== -1) {\n const targetProxyConfig = path.join(targetDirectory, 'mcp-config.yaml');\n await fs.promises.copyFile(generatedProxyConfig, targetProxyConfig);\n args[configIndex + 1] = targetProxyConfig;\n servers[PROXY_SERVER_NAME] = { ...proxy, args };\n }\n }\n\n const targetPath = path.join(targetDirectory, 'mcp.json');\n await fs.promises.writeFile(targetPath, `${JSON.stringify({ ...config, mcpServers: servers }, null, 2)}\\n`, {\n mode: 0o600,\n });\n return targetPath;\n}\n\n/**\n * Applies the allowlist to a merged MCP config, writing a filtered proxy config\n * into the run directory and repointing the proxy at it when needed.\n */\nexport async function applyMcpAllowlist(\n config: JsonObject,\n allowlist: DomainMcpAllowlist | undefined,\n repoRoot: string,\n temporaryDirectory: string,\n): Promise<JsonObject> {\n if (!allowlist) return config;\n const filtered = filterMcpServers(config, allowlist.servers);\n const servers = (filtered.mcpServers ?? {}) as Record<string, JsonObject>;\n const proxy = servers[PROXY_SERVER_NAME];\n if (!proxy || !allowlist.proxy || allowlist.proxy.length === 0) return filtered;\n\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf('--config');\n if (configIndex === -1 || !args[configIndex + 1]) return filtered;\n\n const sourcePath = path.resolve(repoRoot, args[configIndex + 1]);\n if (!fs.existsSync(sourcePath)) return filtered;\n const targetPath = path.join(temporaryDirectory, 'mcp-config.yaml');\n await fs.promises.writeFile(targetPath, filterProxyConfig(fs.readFileSync(sourcePath, 'utf8'), allowlist.proxy), {\n mode: 0o600,\n });\n args[configIndex + 1] = targetPath;\n return { ...filtered, mcpServers: { ...servers, [PROXY_SERVER_NAME]: { ...proxy, args } } };\n}\n"],"mappings":"kLAMA,MAAa,EAAoB,gBAWjC,SAAgB,EAAoB,EAAkB,EAAuD,CAC3G,IAAM,EAAW,EAAY,EAAS,CAChC,EAAW,EAAkB,EAAU,EAAY,CACzD,GAAI,EAAS,SAAW,EAAG,OAE3B,IAAM,EAAU,IAAI,IACd,EAAQ,IAAI,IAClB,IAAK,IAAM,KAAQ,EAAU,CAC3B,IAAM,EAAY,EAAS,QAAQ,IAAO,IAC1C,GAAI,CAAC,EAAW,OAChB,IAAK,IAAM,KAAU,EAAU,SAAW,EAAE,CAAE,EAAQ,IAAI,EAAO,CACjE,IAAK,IAAM,KAAY,EAAU,OAAS,EAAE,CAAE,EAAM,IAAI,EAAS,CAEnE,MAAO,CAAE,QAAS,CAAC,GAAG,EAAQ,CAAE,MAAO,CAAC,GAAG,EAAM,CAAE,CAIrD,SAAgB,EAAiB,EAAoB,EAAgC,CACnF,GAAI,CAAC,GAAW,EAAQ,SAAW,EAAG,OAAO,EAC7C,IAAM,EAAW,EAAO,YAAc,EAAE,CAClC,EAAgC,EAAE,CACxC,IAAK,GAAM,CAAC,EAAM,KAAe,OAAO,QAAQ,EAAQ,CAClD,EAAQ,SAAS,EAAK,GAAE,EAAK,GAAQ,GAE3C,MAAO,CAAE,GAAG,EAAQ,WAAY,EAAM,CAUxC,SAAgB,EAAkB,EAAkB,EAA4B,CAC9E,GAAI,CAAC,GAAW,EAAQ,SAAW,EAAG,OAAO,EAC7C,IAAM,EAAUA,EAAU,EAAS,EAAI,EAAE,CACnC,EAAW,EAAO,YAAc,EAAE,CAClC,EAAgC,EAAE,CAClC,EAAoB,EAAE,CAC5B,IAAK,GAAM,CAAC,EAAM,KAAe,OAAO,QAAQ,EAAQ,CAClD,EAAQ,SAAS,EAAK,CAAE,EAAK,GAAQ,EACpC,EAAQ,KAAK,EAAK,CAQzB,MAAO,GANQ,CACb,mDACA,qBAAqB,OAAO,KAAK,EAAK,CAAC,KAAK,KAAK,EAAI,WACrD,gDAAgD,EAAQ,KAAK,KAAK,EAAI,WACtE,GACD,CAAC,KAAK;EACS,GAAGC,EAAc,CAAE,GAAG,EAAQ,WAAY,EAAM,CAAC,GAUnE,eAAsB,EACpB,EACA,EACA,EACiB,CACjB,MAAM,EAAG,SAAS,MAAM,EAAiB,CAAE,UAAW,GAAM,CAAC,CAC7D,IAAM,EAAS,KAAK,MAAM,EAAG,aAAa,EAAkB,OAAO,CAAC,CAC9D,EAAW,EAAO,YAAc,EAAE,CAClC,EAAQ,EAAQ,GAChB,EAAuB,EAAK,KAAK,EAAoB,kBAAkB,CAE7E,GAAI,GAAS,EAAG,WAAW,EAAqB,CAAE,CAChD,IAAM,EAAO,CAAC,GAAK,EAAM,MAAQ,EAAE,CAAe,CAC5C,EAAc,EAAK,QAAQ,WAAW,CAC5C,GAAI,IAAgB,GAAI,CACtB,IAAM,EAAoB,EAAK,KAAK,EAAiB,kBAAkB,CACvE,MAAM,EAAG,SAAS,SAAS,EAAsB,EAAkB,CACnE,EAAK,EAAc,GAAK,EACxB,EAAQ,GAAqB,CAAE,GAAG,EAAO,OAAM,EAInD,IAAM,EAAa,EAAK,KAAK,EAAiB,WAAW,CAIzD,OAHA,MAAM,EAAG,SAAS,UAAU,EAAY,GAAG,KAAK,UAAU,CAAE,GAAG,EAAQ,WAAY,EAAS,CAAE,KAAM,EAAE,CAAC,IAAK,CAC1G,KAAM,IACP,CAAC,CACK,EAOT,eAAsB,EACpB,EACA,EACA,EACA,EACqB,CACrB,GAAI,CAAC,EAAW,OAAO,EACvB,IAAM,EAAW,EAAiB,EAAQ,EAAU,QAAQ,CACtD,EAAW,EAAS,YAAc,EAAE,CACpC,EAAQ,EAAQ,GACtB,GAAI,CAAC,GAAS,CAAC,EAAU,OAAS,EAAU,MAAM,SAAW,EAAG,OAAO,EAEvE,IAAM,EAAO,CAAC,GAAK,EAAM,MAAQ,EAAE,CAAe,CAC5C,EAAc,EAAK,QAAQ,WAAW,CAC5C,GAAI,IAAgB,IAAM,CAAC,EAAK,EAAc,GAAI,OAAO,EAEzD,IAAM,EAAa,EAAK,QAAQ,EAAU,EAAK,EAAc,GAAG,CAChE,GAAI,CAAC,EAAG,WAAW,EAAW,CAAE,OAAO,EACvC,IAAM,EAAa,EAAK,KAAK,EAAoB,kBAAkB,CAKnE,OAJA,MAAM,EAAG,SAAS,UAAU,EAAY,EAAkB,EAAG,aAAa,EAAY,OAAO,CAAE,EAAU,MAAM,CAAE,CAC/G,KAAM,IACP,CAAC,CACF,EAAK,EAAc,GAAK,EACjB,CAAE,GAAG,EAAU,WAAY,CAAE,GAAG,GAAU,GAAoB,CAAE,GAAG,EAAO,OAAM,CAAE,CAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piSettings.cjs","names":["path","settingsRelativePath","readJson","isRecord"],"sources":["../../src/services/piSettings.ts"],"sourcesContent":["import path from 'node:path';\nimport { isRecord, readJson, writeFileAtomic, type JsonObject } from '../utils/index.ts';\nimport { settingsRelativePath } from './syncState.ts';\n\n/**\n * The Pi project settings file, as `doom-pi sync` maintains it.\n *\n * Sync owns three keys and leaves the rest of the file alone, because\n * `.pi/settings.json` is committed and hand-edited: `quietStartup` and the\n * subagent overrides Doom Team reads live there too. The extension entry is\n * written relative to `.pi`, which Pi resolves and which is identical on every\n * machine, so the file stays reviewable in a diff.\n */\n\nconst PI_DIRECTORY = '.pi';\nconst SETTINGS_FILE = 'settings.json';\nconst EXTENSIONS_KEY = 'extensions';\nconst THEMES_KEY = 'themes';\nconst THEME_KEY = 'theme';\n/** Any entry pointing at the doom-pi runtime, whatever path a past sync used. */\nconst DOOM_ENTRY_PATTERNS = [\n /(^|\\/)entries\\/doom\\.(ts|mjs|js)$/,\n /(^|\\/)doom\\/cache\\/sets\\/doom-set\\.[a-f0-9]+\\.mjs$/,\n /(^|\\/)doom\\/dist\\/[^/]+\\.[a-f0-9]+\\.mjs$/,\n];\n\nexport interface PiSettingsUpdate {\n /** Absolute path to the doom-pi Pi extension. */\n extensionEntry: string;\n /** Absolute path to the generated theme file. */\n themePath: string;\n themeName: string;\n}\n\nexport function piSettingsPath(repoRoot: string): string {\n return path.join(repoRoot, PI_DIRECTORY, SETTINGS_FILE);\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n}\n\n/**\n * Produces the settings content for an update, without writing it.\n *\n * Split out so `--check` can compare against what a sync would write.\n */\nexport function mergePiSettings(current: JsonObject, repoRoot: string, update: PiSettingsUpdate): JsonObject {\n const entry = settingsRelativePath(repoRoot, update.extensionEntry);\n const theme = settingsRelativePath(repoRoot, update.themePath);\n // First in the list, so the harness environment is hydrated before any\n // extension a user added themselves runs.\n const extensions = [\n entry,\n ...stringList(current[EXTENSIONS_KEY]).filter(\n (value) => !DOOM_ENTRY_PATTERNS.some((pattern) => pattern.test(value)),\n ),\n ];\n const themes = [theme, ...stringList(current[THEMES_KEY]).filter((value) => value !== theme)];\n return {\n ...current,\n [EXTENSIONS_KEY]: extensions,\n [THEMES_KEY]: themes,\n // Only filled in when unset: a theme the user picked later is their choice,\n // and re-imposing the doom theme on every sync would silently undo it.\n [THEME_KEY]: typeof current[THEME_KEY] === 'string' ? current[THEME_KEY] : update.themeName,\n };\n}\n\nexport function readPiSettings(repoRoot: string): JsonObject {\n const settings = readJson(piSettingsPath(repoRoot));\n return isRecord(settings) ? settings : {};\n}\n\nexport function serializePiSettings(settings: JsonObject): string {\n return `${JSON.stringify(settings, null, 2)}\\n`;\n}\n\n/** Merges the doom-owned keys into the committed settings file. */\nexport function writePiSettings(repoRoot: string, update: PiSettingsUpdate): string {\n const settingsPath = piSettingsPath(repoRoot);\n writeFileAtomic(settingsPath, serializePiSettings(mergePiSettings(readPiSettings(repoRoot), repoRoot, update)));\n return settingsPath;\n}\n"],"mappings":"oQAcA,MAEM,EAAiB,aACjB,EAAa,SACb,EAAY,QAEZ,EAAsB,CAC1B,oCACA,qDACA,2CACD,CAUD,SAAgB,EAAe,EAA0B,CACvD,OAAOA,EAAAA,QAAK,KAAK,EAAU,MAAc,gBAAc,CAGzD,SAAS,EAAW,EAA0B,CAC5C,OAAO,MAAM,QAAQ,EAAM,CAAG,EAAM,OAAQ,GAA2B,OAAO,GAAU,SAAS,CAAG,EAAE,CAQxG,SAAgB,EAAgB,EAAqB,EAAkB,EAAsC,CAC3G,IAAM,EAAQC,EAAAA,qBAAqB,EAAU,EAAO,eAAe,CAC7D,EAAQA,EAAAA,qBAAqB,EAAU,EAAO,UAAU,CAGxD,EAAa,CACjB,EACA,GAAG,EAAW,EAAQ,GAAgB,CAAC,OACpC,GAAU,CAAC,EAAoB,KAAM,GAAY,EAAQ,KAAK,EAAM,CAAC,CACvE,CACF,CACK,EAAS,CAAC,EAAO,GAAG,EAAW,EAAQ,GAAY,CAAC,OAAQ,GAAU,IAAU,EAAM,CAAC,CAC7F,MAAO,CACL,GAAG,GACF,GAAiB,GACjB,GAAa,GAGb,GAAY,OAAO,EAAQ,IAAe,SAAW,EAAQ,GAAa,EAAO,UACnF,CAGH,SAAgB,EAAe,EAA8B,CAC3D,IAAM,EAAWC,EAAAA,SAAS,EAAe,EAAS,CAAC,CACnD,OAAOC,EAAAA,SAAS,EAAS,CAAG,EAAW,EAAE,CAG3C,SAAgB,EAAoB,EAA8B,CAChE,MAAO,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAI9C,SAAgB,EAAgB,EAAkB,EAAkC,CAClF,IAAM,EAAe,EAAe,EAAS,CAE7C,OADA,EAAA,gBAAgB,EAAc,EAAoB,EAAgB,EAAe,EAAS,CAAE,EAAU,EAAO,CAAC,CAAC,CACxG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piSettings.d.cts","names":[],"sources":["../../src/services/piSettings.ts"],"mappings":";;;UA0BiB,gBAAA;;EAEf,cAAA;EAF+B;EAI/B,SAAA;EACA,SAAA;AAAA;AAAA,iBAGc,cAAA,CAAe,QAAA;;;;AAA/B;;iBAagB,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,QAAA,UAAkB,MAAA,EAAQ,gBAAA,GAAmB,UAAA;AAAA,iBAsBlF,cAAA,CAAe,QAAA,WAAmB,UAAA;AAAA,iBAKlC,mBAAA,CAAoB,QAAA,EAAU,UAAA;AA3B9C;AAAA,iBAgCgB,eAAA,CAAgB,QAAA,UAAkB,MAAA,EAAQ,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piSettings.d.mts","names":[],"sources":["../../src/services/piSettings.ts"],"mappings":";;;UA0BiB,gBAAA;;EAEf,cAAA;EAF+B;EAI/B,SAAA;EACA,SAAA;AAAA;AAAA,iBAGc,cAAA,CAAe,QAAA;;;;AAA/B;;iBAagB,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,QAAA,UAAkB,MAAA,EAAQ,gBAAA,GAAmB,UAAA;AAAA,iBAsBlF,cAAA,CAAe,QAAA,WAAmB,UAAA;AAAA,iBAKlC,mBAAA,CAAoB,QAAA,EAAU,UAAA;AA3B9C;AAAA,iBAgCgB,eAAA,CAAgB,QAAA,UAAkB,MAAA,EAAQ,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"piSettings.mjs","names":[],"sources":["../../src/services/piSettings.ts"],"sourcesContent":["import path from 'node:path';\nimport { isRecord, readJson, writeFileAtomic, type JsonObject } from '../utils/index.ts';\nimport { settingsRelativePath } from './syncState.ts';\n\n/**\n * The Pi project settings file, as `doom-pi sync` maintains it.\n *\n * Sync owns three keys and leaves the rest of the file alone, because\n * `.pi/settings.json` is committed and hand-edited: `quietStartup` and the\n * subagent overrides Doom Team reads live there too. The extension entry is\n * written relative to `.pi`, which Pi resolves and which is identical on every\n * machine, so the file stays reviewable in a diff.\n */\n\nconst PI_DIRECTORY = '.pi';\nconst SETTINGS_FILE = 'settings.json';\nconst EXTENSIONS_KEY = 'extensions';\nconst THEMES_KEY = 'themes';\nconst THEME_KEY = 'theme';\n/** Any entry pointing at the doom-pi runtime, whatever path a past sync used. */\nconst DOOM_ENTRY_PATTERNS = [\n /(^|\\/)entries\\/doom\\.(ts|mjs|js)$/,\n /(^|\\/)doom\\/cache\\/sets\\/doom-set\\.[a-f0-9]+\\.mjs$/,\n /(^|\\/)doom\\/dist\\/[^/]+\\.[a-f0-9]+\\.mjs$/,\n];\n\nexport interface PiSettingsUpdate {\n /** Absolute path to the doom-pi Pi extension. */\n extensionEntry: string;\n /** Absolute path to the generated theme file. */\n themePath: string;\n themeName: string;\n}\n\nexport function piSettingsPath(repoRoot: string): string {\n return path.join(repoRoot, PI_DIRECTORY, SETTINGS_FILE);\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n}\n\n/**\n * Produces the settings content for an update, without writing it.\n *\n * Split out so `--check` can compare against what a sync would write.\n */\nexport function mergePiSettings(current: JsonObject, repoRoot: string, update: PiSettingsUpdate): JsonObject {\n const entry = settingsRelativePath(repoRoot, update.extensionEntry);\n const theme = settingsRelativePath(repoRoot, update.themePath);\n // First in the list, so the harness environment is hydrated before any\n // extension a user added themselves runs.\n const extensions = [\n entry,\n ...stringList(current[EXTENSIONS_KEY]).filter(\n (value) => !DOOM_ENTRY_PATTERNS.some((pattern) => pattern.test(value)),\n ),\n ];\n const themes = [theme, ...stringList(current[THEMES_KEY]).filter((value) => value !== theme)];\n return {\n ...current,\n [EXTENSIONS_KEY]: extensions,\n [THEMES_KEY]: themes,\n // Only filled in when unset: a theme the user picked later is their choice,\n // and re-imposing the doom theme on every sync would silently undo it.\n [THEME_KEY]: typeof current[THEME_KEY] === 'string' ? current[THEME_KEY] : update.themeName,\n };\n}\n\nexport function readPiSettings(repoRoot: string): JsonObject {\n const settings = readJson(piSettingsPath(repoRoot));\n return isRecord(settings) ? settings : {};\n}\n\nexport function serializePiSettings(settings: JsonObject): string {\n return `${JSON.stringify(settings, null, 2)}\\n`;\n}\n\n/** Merges the doom-owned keys into the committed settings file. */\nexport function writePiSettings(repoRoot: string, update: PiSettingsUpdate): string {\n const settingsPath = piSettingsPath(repoRoot);\n writeFileAtomic(settingsPath, serializePiSettings(mergePiSettings(readPiSettings(repoRoot), repoRoot, update)));\n return settingsPath;\n}\n"],"mappings":"2LAcA,MAEM,EAAiB,aACjB,EAAa,SACb,EAAY,QAEZ,EAAsB,CAC1B,oCACA,qDACA,2CACD,CAUD,SAAgB,EAAe,EAA0B,CACvD,OAAO,EAAK,KAAK,EAAU,MAAc,gBAAc,CAGzD,SAAS,EAAW,EAA0B,CAC5C,OAAO,MAAM,QAAQ,EAAM,CAAG,EAAM,OAAQ,GAA2B,OAAO,GAAU,SAAS,CAAG,EAAE,CAQxG,SAAgB,EAAgB,EAAqB,EAAkB,EAAsC,CAC3G,IAAM,EAAQ,EAAqB,EAAU,EAAO,eAAe,CAC7D,EAAQ,EAAqB,EAAU,EAAO,UAAU,CAGxD,EAAa,CACjB,EACA,GAAG,EAAW,EAAQ,GAAgB,CAAC,OACpC,GAAU,CAAC,EAAoB,KAAM,GAAY,EAAQ,KAAK,EAAM,CAAC,CACvE,CACF,CACK,EAAS,CAAC,EAAO,GAAG,EAAW,EAAQ,GAAY,CAAC,OAAQ,GAAU,IAAU,EAAM,CAAC,CAC7F,MAAO,CACL,GAAG,GACF,GAAiB,GACjB,GAAa,GAGb,GAAY,OAAO,EAAQ,IAAe,SAAW,EAAQ,GAAa,EAAO,UACnF,CAGH,SAAgB,EAAe,EAA8B,CAC3D,IAAM,EAAW,EAAS,EAAe,EAAS,CAAC,CACnD,OAAO,EAAS,EAAS,CAAG,EAAW,EAAE,CAG3C,SAAgB,EAAoB,EAA8B,CAChE,MAAO,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAI9C,SAAgB,EAAgB,EAAkB,EAAkC,CAClF,IAAM,EAAe,EAAe,EAAS,CAE7C,OADA,EAAgB,EAAc,EAAoB,EAAgB,EAAe,EAAS,CAAE,EAAU,EAAO,CAAC,CAAC,CACxG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resourceCollector.cjs","names":["path","toPiToolName","fs","os","applyMcpAllowlist"],"sources":["../../src/services/resourceCollector.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport { applyMcpAllowlist } from './mcpFilter.ts';\nimport type { PluginEntry } from '@agimon-ai/doompi-config/domains';\nimport type { HarnessResourceOptions, HarnessResources, PluginHookSource } from '../interfaces/index.ts';\nimport { type JsonObject, toPiToolName } from '../utils/index.ts';\n\nexport const DISPATCHER_AGENT_NAME = 'agiflow-dispatcher';\nconst DISPATCHER_TOOLS = ['read', 'grep', 'find', 'ls', 'bash', 'launch_workflow', 'list_workflows'];\nconst SKILL_MANIFEST_VERSION = 1;\nconst SKILL_MANIFEST_DIRECTORY = path.join('.pi', 'doom', 'cache', 'skills');\n\ninterface NamedResource {\n name: string;\n path: string;\n digest?: string;\n}\n\ninterface SkillManifestFile {\n path: string;\n name: string;\n digest: string;\n size: number;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifestDirectory {\n path: string;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifest {\n version: number;\n root: string;\n files: SkillManifestFile[];\n directories: SkillManifestDirectory[];\n}\n\nexport function selectWorkflowExtensionForProcess(\n workflowExtension: string | undefined,\n dispatcherWorkflowExtension: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const isDispatcherChild =\n environment.PI_SUBAGENT_CHILD_AGENT === DISPATCHER_AGENT_NAME && Boolean(environment.PI_SUBAGENT_PARENT_SESSION);\n return isDispatcherChild && dispatcherWorkflowExtension ? dispatcherWorkflowExtension : workflowExtension;\n}\n\nfunction splitFrontmatter(content: string): { attributes: JsonObject; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error('Resource is missing YAML frontmatter');\n return { attributes: parse(match[1]!) as JsonObject, body: match[2] ?? '' };\n}\n\nconst CLAUDE_MODEL_ALIASES: Record<string, string> = {\n sonnet: 'anthropic/claude-sonnet-4-6',\n opus: 'anthropic/claude-opus-4-6',\n haiku: 'anthropic/claude-haiku-4-5',\n};\n\nfunction assertSafeAgentName(name: string): string {\n const trimmed = name.trim();\n if (\n !trimmed ||\n trimmed !== name ||\n trimmed === '.' ||\n trimmed === '..' ||\n trimmed.includes('\\0') ||\n /[\\\\/]/.test(trimmed)\n ) {\n throw new Error(`Unsafe agent name: ${JSON.stringify(name)}`);\n }\n return trimmed;\n}\n\nfunction normalizeClaudeModel(value: unknown): unknown {\n if (typeof value === 'string') return CLAUDE_MODEL_ALIASES[value.toLowerCase()] ?? value;\n if (Array.isArray(value)) return value.map((entry) => normalizeClaudeModel(entry));\n return value;\n}\n\nexport function adaptAgentDefinition(content: string): { name: string; content: string } {\n const { attributes, body } = splitFrontmatter(content);\n const rawName = typeof attributes.name === 'string' ? attributes.name : undefined;\n if (!rawName) throw new Error('Agent definition requires a name');\n const name = assertSafeAgentName(rawName);\n const hasTools = Object.prototype.hasOwnProperty.call(attributes, 'tools');\n const rawTools = Array.isArray(attributes.tools)\n ? attributes.tools.map(String)\n : typeof attributes.tools === 'string'\n ? attributes.tools\n .split(',')\n .map((tool) => tool.trim())\n .filter(Boolean)\n : [];\n const mappedTools = [...new Set(rawTools.map(toPiToolName).filter((tool): tool is string => Boolean(tool)))];\n const converted: JsonObject = {\n ...attributes,\n inheritProjectContext: true,\n inheritSkills: true,\n systemPromptMode: attributes.systemPromptMode ?? 'replace',\n };\n if (hasTools) converted.tools = Array.isArray(attributes.tools) ? mappedTools : mappedTools.join(', ');\n else delete converted.tools;\n if (converted.model !== undefined) converted.model = normalizeClaudeModel(converted.model);\n if (converted.fallbackModels !== undefined) converted.fallbackModels = normalizeClaudeModel(converted.fallbackModels);\n if (converted.memory === 'project' || converted.memory === 'user')\n converted.memory = { scope: converted.memory, path: name };\n else if (\n converted.memory !== undefined &&\n (typeof converted.memory !== 'object' || converted.memory === null || Array.isArray(converted.memory))\n )\n throw new Error('Unsupported memory declaration');\n delete converted.permissionMode;\n return { name, content: `---\\n${stringify(converted).trim()}\\n---\\n\\n${body.trimStart()}` };\n}\n\nfunction skillManifestPath(repoRoot: string, skillRoot: string): string {\n const key = createHash('sha256').update(path.resolve(skillRoot)).digest('hex').slice(0, 16);\n return path.join(repoRoot, SKILL_MANIFEST_DIRECTORY, `${key}.json`);\n}\n\nfunction fileMatches(previous: SkillManifestFile): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return (\n stat.isFile() &&\n stat.size === previous.size &&\n stat.mtimeMs === previous.mtimeMs &&\n stat.ctimeMs === previous.ctimeMs\n );\n } catch {\n return false;\n }\n}\n\nfunction directoryMatches(previous: SkillManifestDirectory): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return stat.isDirectory() && stat.mtimeMs === previous.mtimeMs && stat.ctimeMs === previous.ctimeMs;\n } catch {\n return false;\n }\n}\n\nfunction readSkillManifest(manifestPath: string, root: string): SkillManifest | undefined {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as SkillManifest;\n if (\n manifest.version !== SKILL_MANIFEST_VERSION ||\n manifest.root !== path.resolve(root) ||\n !Array.isArray(manifest.files) ||\n !Array.isArray(manifest.directories) ||\n !manifest.files.every(fileMatches) ||\n !manifest.directories.every(directoryMatches)\n ) {\n return undefined;\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nfunction writeSkillManifest(manifestPath: string, manifest: SkillManifest): void {\n fs.mkdirSync(path.dirname(manifestPath), { recursive: true, mode: 0o700 });\n const temporary = `${manifestPath}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n try {\n fs.renameSync(temporary, manifestPath);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(manifestPath)) throw error;\n }\n}\n\nfunction scanSkillManifest(root: string): SkillManifest {\n const directories: SkillManifestDirectory[] = [];\n const files: SkillManifestFile[] = [];\n const walk = (directory: string): void => {\n if (!fs.existsSync(directory)) return;\n const directoryStat = fs.statSync(directory);\n directories.push({ path: directory, mtimeMs: directoryStat.mtimeMs, ctimeMs: directoryStat.ctimeMs });\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n walk(candidate);\n continue;\n }\n if (!entry.isFile() || entry.name !== 'SKILL.md') continue;\n const content = fs.readFileSync(candidate, 'utf8');\n const { attributes } = splitFrontmatter(content);\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${candidate}`);\n const stat = fs.statSync(candidate);\n files.push({\n path: candidate,\n name: attributes.name,\n digest: createHash('sha256').update(content).digest('hex'),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n });\n }\n };\n walk(path.resolve(root));\n files.sort((left, right) => left.path.localeCompare(right.path));\n directories.sort((left, right) => left.path.localeCompare(right.path));\n return { version: SKILL_MANIFEST_VERSION, root: path.resolve(root), files, directories };\n}\n\n/** Cached skill metadata and exact files, ready for Pi without a second tree walk. */\nexport function discoverSkills(repoRoot: string, root: string): NamedResource[] {\n if (!fs.existsSync(root)) return [];\n const manifestPath = skillManifestPath(repoRoot, root);\n const cached = readSkillManifest(manifestPath, root);\n const manifest = cached ?? scanSkillManifest(root);\n if (!cached) writeSkillManifest(manifestPath, manifest);\n return manifest.files.map(({ name, path: filePath, digest }) => ({ name, path: filePath, digest }));\n}\n\nfunction markdownFiles(directory: string): string[] {\n if (!fs.existsSync(directory)) return [];\n const results: string[] = [];\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) results.push(...markdownFiles(candidate));\n if (entry.isFile() && entry.name.endsWith('.md')) results.push(candidate);\n }\n return results;\n}\n\nfunction frontmatterName(filePath: string): string {\n const { attributes } = splitFrontmatter(fs.readFileSync(filePath, 'utf8'));\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${filePath}`);\n return attributes.name;\n}\n\nfunction assertUnique(resources: NamedResource[], kind: string): void {\n const seen = new Map<string, string>();\n const digestByName = new Map<string, string>();\n for (const resource of resources) {\n const previous = seen.get(resource.name);\n const digest = resource.digest ?? createHash('sha256').update(fs.readFileSync(resource.path)).digest('hex');\n if (previous && digestByName.get(resource.name) !== digest) {\n throw new Error(`Conflicting ${kind} \"${resource.name}\": ${previous} and ${resource.path}`);\n }\n seen.set(resource.name, resource.path);\n digestByName.set(resource.name, digest);\n }\n}\n\nfunction dispatcherAgentSource(dispatcherWorkflowExtension: string): string {\n const attributes: JsonObject = {\n name: DISPATCHER_AGENT_NAME,\n description: 'Selects and launches Agiflow workflows for one loop pass without implementing the work.',\n thinking: 'high',\n systemPromptMode: 'replace',\n inheritProjectContext: true,\n inheritSkills: true,\n tools: DISPATCHER_TOOLS.join(', '),\n extensions: [dispatcherWorkflowExtension],\n defaultContext: 'fresh',\n defaultProgress: false,\n };\n const body = [\n 'You are the Agiflow workflow dispatcher.',\n 'Reason about the supplied dispatch context and launch eligible workflows.',\n 'Launch workflows without monitoring them. After dispatching, report and exit.',\n 'Follow the task restrictions exactly. Do not implement jobs or edit repository files.',\n ].join('\\n');\n return `---\\n${stringify(attributes).trim()}\\n---\\n\\n${body}\\n`;\n}\n\nexport function mergeMcpConfigs(configPaths: string[]): JsonObject {\n const merged: JsonObject = { mcpServers: {} };\n const servers = merged.mcpServers as Record<string, unknown>;\n const sources = new Map<string, string>();\n for (const configPath of configPaths) {\n if (!fs.existsSync(configPath)) continue;\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n const incoming = (config.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, definition] of Object.entries(incoming)) {\n const previous = servers[name];\n if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) {\n throw new Error(`Conflicting MCP server \"${name}\": ${sources.get(name)} and ${configPath}`);\n }\n servers[name] = definition;\n sources.set(name, configPath);\n }\n }\n return merged;\n}\n\n/** Matches a resource name against a subset filter. Undefined keeps everything. */\nfunction keepsName(allowed: string[] | undefined, name: string): boolean {\n if (!allowed) return true;\n return allowed.some((pattern) =>\n pattern.includes('*')\n ? new RegExp(`^${pattern.split('*').map(escapeRegExp).join('.*')}$`).test(name)\n : pattern === name,\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport async function collectResources(\n repoRoot: string,\n plugins: Array<string | PluginEntry>,\n options: HarnessResourceOptions,\n): Promise<HarnessResources> {\n const pluginEntries: PluginEntry[] = plugins.map((plugin) =>\n typeof plugin === 'string' ? { directory: plugin } : plugin,\n );\n // A caller-supplied directory is owned by the caller: it is either a live\n // session's directory or the synced one, and removing it here would delete\n // resources that outlive this collection.\n const ownsDirectory = options.temporaryDirectory === undefined;\n const temporaryDirectory =\n options.temporaryDirectory ?? (await fs.promises.mkdtemp(path.join(os.tmpdir(), 'doom-pi-')));\n await fs.promises.mkdir(temporaryDirectory, { mode: 0o700, recursive: true });\n await fs.promises.chmod(temporaryDirectory, 0o700);\n const sharedSkills = path.join(repoRoot, '.claude', 'skills');\n // A domain can opt out of the always-on shared skills to keep its context small.\n const skillDirectories: string[] = [];\n const skillSources = options.sharedSkills === false ? [] : discoverSkills(repoRoot, sharedSkills);\n skillDirectories.push(...skillSources.map((skill) => skill.path));\n const agentSources: Array<{ name: string; path: string }> = [];\n const pluginHooks: PluginHookSource[] = [];\n const pluginMcpConfigPaths: string[] = [];\n const mcpPaths = [path.join(repoRoot, '.mcp.json')];\n\n for (const entry of pluginEntries) {\n const pluginDirectory = entry.directory;\n const skills = path.join(pluginDirectory, 'skills');\n if (fs.existsSync(skills)) {\n const found = discoverSkills(repoRoot, skills).filter((skill) => keepsName(entry.skills, skill.name));\n // Exact files let Pi skip another recursive traversal and make a plugin\n // subset unambiguous without staging copies of the skill bodies.\n skillDirectories.push(...found.map((skill) => skill.path));\n skillSources.push(...found);\n }\n const agents = path.join(pluginDirectory, 'agents');\n agentSources.push(\n ...markdownFiles(agents)\n .map((filePath) => ({ name: frontmatterName(filePath), path: filePath }))\n .filter((agent) => keepsName(entry.agents, agent.name)),\n );\n const hookConfig = path.join(pluginDirectory, 'hooks', 'hooks.json');\n if (entry.hooks !== false && fs.existsSync(hookConfig)) {\n pluginHooks.push({ pluginRoot: pluginDirectory, configPath: hookConfig });\n }\n const mcpConfig = path.join(pluginDirectory, '.mcp.json');\n if (entry.mcp !== false && fs.existsSync(mcpConfig)) {\n mcpPaths.push(mcpConfig);\n pluginMcpConfigPaths.push(mcpConfig);\n }\n }\n\n assertUnique(skillSources, 'skill');\n assertUnique(agentSources, 'agent');\n if (agentSources.some((source) => source.name === DISPATCHER_AGENT_NAME)) {\n throw new Error(`Conflicting agent \"${DISPATCHER_AGENT_NAME}\": reserved by the agent harness`);\n }\n\n const agentDirectories: string[] = [];\n let dispatcherWorkflowExtensionPath: string | undefined;\n const outputDirectory = path.join(temporaryDirectory, 'agents');\n await fs.promises.rm(outputDirectory, { recursive: true, force: true });\n if (options.agents && (agentSources.length > 0 || options.dispatcherWorkflowExtension)) {\n await fs.promises.mkdir(outputDirectory, { mode: 0o700 });\n for (const source of agentSources) {\n const adapted = adaptAgentDefinition(fs.readFileSync(source.path, 'utf8'));\n await fs.promises.writeFile(\n path.join(outputDirectory, `${assertSafeAgentName(adapted.name)}.md`),\n adapted.content,\n { mode: 0o600 },\n );\n }\n if (options.dispatcherWorkflowExtension) {\n dispatcherWorkflowExtensionPath = options.dispatcherWorkflowExtension;\n await fs.promises.writeFile(\n path.join(outputDirectory, `${DISPATCHER_AGENT_NAME}.md`),\n dispatcherAgentSource(options.dispatcherWorkflowExtension),\n { mode: 0o600 },\n );\n }\n agentDirectories.push(outputDirectory);\n }\n\n let mcpConfigPath: string | undefined;\n if (options.mcp) {\n mcpConfigPath = path.join(temporaryDirectory, 'mcp.json');\n // Domains without an mcp allowlist resolve to undefined here, which leaves\n // the merged config untouched.\n const merged = await applyMcpAllowlist(\n mergeMcpConfigs(mcpPaths),\n options.mcpAllowlist,\n repoRoot,\n temporaryDirectory,\n );\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(merged, null, 2)}\\n`, {\n mode: 0o600,\n });\n }\n\n return {\n temporaryDirectory,\n skillDirectories,\n skillCount: skillSources.length,\n agentCount: agentSources.length,\n agentDirectories,\n pluginHooks,\n dispatcherWorkflowExtensionPath,\n mcpConfigPath,\n pluginMcpConfigPaths,\n cleanup: () =>\n ownsDirectory ? fs.promises.rm(temporaryDirectory, { recursive: true, force: true }) : Promise.resolve(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resourceCollector.d.cts","names":[],"sources":["../../src/services/resourceCollector.ts"],"mappings":";;;;;cAUa,qBAAA;AAAA,UAKH,aAAA;EACR,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,iBAyBc,iCAAA,CACd,iBAAA,sBACA,2BAAA,sBACA,WAAA,GAAa,MAAA,CAAO,UAAA;AAAA,iBAwCN,oBAAA,CAAqB,OAAA;EAAoB,IAAA;EAAc,OAAA;AAAA;;iBAkIvD,cAAA,CAAe,QAAA,UAAkB,IAAA,WAAe,aAAA;AAAA,iBA8DhD,eAAA,CAAgB,WAAA,aAAwB,UAAA;AAAA,iBAkClC,gBAAA,CACpB,QAAA,UACA,OAAA,EAAS,KAAA,UAAe,WAAA,GACxB,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resourceCollector.d.mts","names":[],"sources":["../../src/services/resourceCollector.ts"],"mappings":";;;;;cAUa,qBAAA;AAAA,UAKH,aAAA;EACR,IAAA;EACA,IAAA;EACA,MAAA;AAAA;AAAA,iBAyBc,iCAAA,CACd,iBAAA,sBACA,2BAAA,sBACA,WAAA,GAAa,MAAA,CAAO,UAAA;AAAA,iBAwCN,oBAAA,CAAqB,OAAA;EAAoB,IAAA;EAAc,OAAA;AAAA;;iBAkIvD,cAAA,CAAe,QAAA,UAAkB,IAAA,WAAe,aAAA;AAAA,iBA8DhD,eAAA,CAAgB,WAAA,aAAwB,UAAA;AAAA,iBAkClC,gBAAA,CACpB,QAAA,UACA,OAAA,EAAS,KAAA,UAAe,WAAA,GACxB,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resourceCollector.mjs","names":[],"sources":["../../src/services/resourceCollector.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport { applyMcpAllowlist } from './mcpFilter.ts';\nimport type { PluginEntry } from '@agimon-ai/doompi-config/domains';\nimport type { HarnessResourceOptions, HarnessResources, PluginHookSource } from '../interfaces/index.ts';\nimport { type JsonObject, toPiToolName } from '../utils/index.ts';\n\nexport const DISPATCHER_AGENT_NAME = 'agiflow-dispatcher';\nconst DISPATCHER_TOOLS = ['read', 'grep', 'find', 'ls', 'bash', 'launch_workflow', 'list_workflows'];\nconst SKILL_MANIFEST_VERSION = 1;\nconst SKILL_MANIFEST_DIRECTORY = path.join('.pi', 'doom', 'cache', 'skills');\n\ninterface NamedResource {\n name: string;\n path: string;\n digest?: string;\n}\n\ninterface SkillManifestFile {\n path: string;\n name: string;\n digest: string;\n size: number;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifestDirectory {\n path: string;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifest {\n version: number;\n root: string;\n files: SkillManifestFile[];\n directories: SkillManifestDirectory[];\n}\n\nexport function selectWorkflowExtensionForProcess(\n workflowExtension: string | undefined,\n dispatcherWorkflowExtension: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const isDispatcherChild =\n environment.PI_SUBAGENT_CHILD_AGENT === DISPATCHER_AGENT_NAME && Boolean(environment.PI_SUBAGENT_PARENT_SESSION);\n return isDispatcherChild && dispatcherWorkflowExtension ? dispatcherWorkflowExtension : workflowExtension;\n}\n\nfunction splitFrontmatter(content: string): { attributes: JsonObject; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error('Resource is missing YAML frontmatter');\n return { attributes: parse(match[1]!) as JsonObject, body: match[2] ?? '' };\n}\n\nconst CLAUDE_MODEL_ALIASES: Record<string, string> = {\n sonnet: 'anthropic/claude-sonnet-4-6',\n opus: 'anthropic/claude-opus-4-6',\n haiku: 'anthropic/claude-haiku-4-5',\n};\n\nfunction assertSafeAgentName(name: string): string {\n const trimmed = name.trim();\n if (\n !trimmed ||\n trimmed !== name ||\n trimmed === '.' ||\n trimmed === '..' ||\n trimmed.includes('\\0') ||\n /[\\\\/]/.test(trimmed)\n ) {\n throw new Error(`Unsafe agent name: ${JSON.stringify(name)}`);\n }\n return trimmed;\n}\n\nfunction normalizeClaudeModel(value: unknown): unknown {\n if (typeof value === 'string') return CLAUDE_MODEL_ALIASES[value.toLowerCase()] ?? value;\n if (Array.isArray(value)) return value.map((entry) => normalizeClaudeModel(entry));\n return value;\n}\n\nexport function adaptAgentDefinition(content: string): { name: string; content: string } {\n const { attributes, body } = splitFrontmatter(content);\n const rawName = typeof attributes.name === 'string' ? attributes.name : undefined;\n if (!rawName) throw new Error('Agent definition requires a name');\n const name = assertSafeAgentName(rawName);\n const hasTools = Object.prototype.hasOwnProperty.call(attributes, 'tools');\n const rawTools = Array.isArray(attributes.tools)\n ? attributes.tools.map(String)\n : typeof attributes.tools === 'string'\n ? attributes.tools\n .split(',')\n .map((tool) => tool.trim())\n .filter(Boolean)\n : [];\n const mappedTools = [...new Set(rawTools.map(toPiToolName).filter((tool): tool is string => Boolean(tool)))];\n const converted: JsonObject = {\n ...attributes,\n inheritProjectContext: true,\n inheritSkills: true,\n systemPromptMode: attributes.systemPromptMode ?? 'replace',\n };\n if (hasTools) converted.tools = Array.isArray(attributes.tools) ? mappedTools : mappedTools.join(', ');\n else delete converted.tools;\n if (converted.model !== undefined) converted.model = normalizeClaudeModel(converted.model);\n if (converted.fallbackModels !== undefined) converted.fallbackModels = normalizeClaudeModel(converted.fallbackModels);\n if (converted.memory === 'project' || converted.memory === 'user')\n converted.memory = { scope: converted.memory, path: name };\n else if (\n converted.memory !== undefined &&\n (typeof converted.memory !== 'object' || converted.memory === null || Array.isArray(converted.memory))\n )\n throw new Error('Unsupported memory declaration');\n delete converted.permissionMode;\n return { name, content: `---\\n${stringify(converted).trim()}\\n---\\n\\n${body.trimStart()}` };\n}\n\nfunction skillManifestPath(repoRoot: string, skillRoot: string): string {\n const key = createHash('sha256').update(path.resolve(skillRoot)).digest('hex').slice(0, 16);\n return path.join(repoRoot, SKILL_MANIFEST_DIRECTORY, `${key}.json`);\n}\n\nfunction fileMatches(previous: SkillManifestFile): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return (\n stat.isFile() &&\n stat.size === previous.size &&\n stat.mtimeMs === previous.mtimeMs &&\n stat.ctimeMs === previous.ctimeMs\n );\n } catch {\n return false;\n }\n}\n\nfunction directoryMatches(previous: SkillManifestDirectory): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return stat.isDirectory() && stat.mtimeMs === previous.mtimeMs && stat.ctimeMs === previous.ctimeMs;\n } catch {\n return false;\n }\n}\n\nfunction readSkillManifest(manifestPath: string, root: string): SkillManifest | undefined {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as SkillManifest;\n if (\n manifest.version !== SKILL_MANIFEST_VERSION ||\n manifest.root !== path.resolve(root) ||\n !Array.isArray(manifest.files) ||\n !Array.isArray(manifest.directories) ||\n !manifest.files.every(fileMatches) ||\n !manifest.directories.every(directoryMatches)\n ) {\n return undefined;\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nfunction writeSkillManifest(manifestPath: string, manifest: SkillManifest): void {\n fs.mkdirSync(path.dirname(manifestPath), { recursive: true, mode: 0o700 });\n const temporary = `${manifestPath}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n try {\n fs.renameSync(temporary, manifestPath);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(manifestPath)) throw error;\n }\n}\n\nfunction scanSkillManifest(root: string): SkillManifest {\n const directories: SkillManifestDirectory[] = [];\n const files: SkillManifestFile[] = [];\n const walk = (directory: string): void => {\n if (!fs.existsSync(directory)) return;\n const directoryStat = fs.statSync(directory);\n directories.push({ path: directory, mtimeMs: directoryStat.mtimeMs, ctimeMs: directoryStat.ctimeMs });\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n walk(candidate);\n continue;\n }\n if (!entry.isFile() || entry.name !== 'SKILL.md') continue;\n const content = fs.readFileSync(candidate, 'utf8');\n const { attributes } = splitFrontmatter(content);\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${candidate}`);\n const stat = fs.statSync(candidate);\n files.push({\n path: candidate,\n name: attributes.name,\n digest: createHash('sha256').update(content).digest('hex'),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n });\n }\n };\n walk(path.resolve(root));\n files.sort((left, right) => left.path.localeCompare(right.path));\n directories.sort((left, right) => left.path.localeCompare(right.path));\n return { version: SKILL_MANIFEST_VERSION, root: path.resolve(root), files, directories };\n}\n\n/** Cached skill metadata and exact files, ready for Pi without a second tree walk. */\nexport function discoverSkills(repoRoot: string, root: string): NamedResource[] {\n if (!fs.existsSync(root)) return [];\n const manifestPath = skillManifestPath(repoRoot, root);\n const cached = readSkillManifest(manifestPath, root);\n const manifest = cached ?? scanSkillManifest(root);\n if (!cached) writeSkillManifest(manifestPath, manifest);\n return manifest.files.map(({ name, path: filePath, digest }) => ({ name, path: filePath, digest }));\n}\n\nfunction markdownFiles(directory: string): string[] {\n if (!fs.existsSync(directory)) return [];\n const results: string[] = [];\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) results.push(...markdownFiles(candidate));\n if (entry.isFile() && entry.name.endsWith('.md')) results.push(candidate);\n }\n return results;\n}\n\nfunction frontmatterName(filePath: string): string {\n const { attributes } = splitFrontmatter(fs.readFileSync(filePath, 'utf8'));\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${filePath}`);\n return attributes.name;\n}\n\nfunction assertUnique(resources: NamedResource[], kind: string): void {\n const seen = new Map<string, string>();\n const digestByName = new Map<string, string>();\n for (const resource of resources) {\n const previous = seen.get(resource.name);\n const digest = resource.digest ?? createHash('sha256').update(fs.readFileSync(resource.path)).digest('hex');\n if (previous && digestByName.get(resource.name) !== digest) {\n throw new Error(`Conflicting ${kind} \"${resource.name}\": ${previous} and ${resource.path}`);\n }\n seen.set(resource.name, resource.path);\n digestByName.set(resource.name, digest);\n }\n}\n\nfunction dispatcherAgentSource(dispatcherWorkflowExtension: string): string {\n const attributes: JsonObject = {\n name: DISPATCHER_AGENT_NAME,\n description: 'Selects and launches Agiflow workflows for one loop pass without implementing the work.',\n thinking: 'high',\n systemPromptMode: 'replace',\n inheritProjectContext: true,\n inheritSkills: true,\n tools: DISPATCHER_TOOLS.join(', '),\n extensions: [dispatcherWorkflowExtension],\n defaultContext: 'fresh',\n defaultProgress: false,\n };\n const body = [\n 'You are the Agiflow workflow dispatcher.',\n 'Reason about the supplied dispatch context and launch eligible workflows.',\n 'Launch workflows without monitoring them. After dispatching, report and exit.',\n 'Follow the task restrictions exactly. Do not implement jobs or edit repository files.',\n ].join('\\n');\n return `---\\n${stringify(attributes).trim()}\\n---\\n\\n${body}\\n`;\n}\n\nexport function mergeMcpConfigs(configPaths: string[]): JsonObject {\n const merged: JsonObject = { mcpServers: {} };\n const servers = merged.mcpServers as Record<string, unknown>;\n const sources = new Map<string, string>();\n for (const configPath of configPaths) {\n if (!fs.existsSync(configPath)) continue;\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n const incoming = (config.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, definition] of Object.entries(incoming)) {\n const previous = servers[name];\n if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) {\n throw new Error(`Conflicting MCP server \"${name}\": ${sources.get(name)} and ${configPath}`);\n }\n servers[name] = definition;\n sources.set(name, configPath);\n }\n }\n return merged;\n}\n\n/** Matches a resource name against a subset filter. Undefined keeps everything. */\nfunction keepsName(allowed: string[] | undefined, name: string): boolean {\n if (!allowed) return true;\n return allowed.some((pattern) =>\n pattern.includes('*')\n ? new RegExp(`^${pattern.split('*').map(escapeRegExp).join('.*')}$`).test(name)\n : pattern === name,\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport async function collectResources(\n repoRoot: string,\n plugins: Array<string | PluginEntry>,\n options: HarnessResourceOptions,\n): Promise<HarnessResources> {\n const pluginEntries: PluginEntry[] = plugins.map((plugin) =>\n typeof plugin === 'string' ? { directory: plugin } : plugin,\n );\n // A caller-supplied directory is owned by the caller: it is either a live\n // session's directory or the synced one, and removing it here would delete\n // resources that outlive this collection.\n const ownsDirectory = options.temporaryDirectory === undefined;\n const temporaryDirectory =\n options.temporaryDirectory ?? (await fs.promises.mkdtemp(path.join(os.tmpdir(), 'doom-pi-')));\n await fs.promises.mkdir(temporaryDirectory, { mode: 0o700, recursive: true });\n await fs.promises.chmod(temporaryDirectory, 0o700);\n const sharedSkills = path.join(repoRoot, '.claude', 'skills');\n // A domain can opt out of the always-on shared skills to keep its context small.\n const skillDirectories: string[] = [];\n const skillSources = options.sharedSkills === false ? [] : discoverSkills(repoRoot, sharedSkills);\n skillDirectories.push(...skillSources.map((skill) => skill.path));\n const agentSources: Array<{ name: string; path: string }> = [];\n const pluginHooks: PluginHookSource[] = [];\n const pluginMcpConfigPaths: string[] = [];\n const mcpPaths = [path.join(repoRoot, '.mcp.json')];\n\n for (const entry of pluginEntries) {\n const pluginDirectory = entry.directory;\n const skills = path.join(pluginDirectory, 'skills');\n if (fs.existsSync(skills)) {\n const found = discoverSkills(repoRoot, skills).filter((skill) => keepsName(entry.skills, skill.name));\n // Exact files let Pi skip another recursive traversal and make a plugin\n // subset unambiguous without staging copies of the skill bodies.\n skillDirectories.push(...found.map((skill) => skill.path));\n skillSources.push(...found);\n }\n const agents = path.join(pluginDirectory, 'agents');\n agentSources.push(\n ...markdownFiles(agents)\n .map((filePath) => ({ name: frontmatterName(filePath), path: filePath }))\n .filter((agent) => keepsName(entry.agents, agent.name)),\n );\n const hookConfig = path.join(pluginDirectory, 'hooks', 'hooks.json');\n if (entry.hooks !== false && fs.existsSync(hookConfig)) {\n pluginHooks.push({ pluginRoot: pluginDirectory, configPath: hookConfig });\n }\n const mcpConfig = path.join(pluginDirectory, '.mcp.json');\n if (entry.mcp !== false && fs.existsSync(mcpConfig)) {\n mcpPaths.push(mcpConfig);\n pluginMcpConfigPaths.push(mcpConfig);\n }\n }\n\n assertUnique(skillSources, 'skill');\n assertUnique(agentSources, 'agent');\n if (agentSources.some((source) => source.name === DISPATCHER_AGENT_NAME)) {\n throw new Error(`Conflicting agent \"${DISPATCHER_AGENT_NAME}\": reserved by the agent harness`);\n }\n\n const agentDirectories: string[] = [];\n let dispatcherWorkflowExtensionPath: string | undefined;\n const outputDirectory = path.join(temporaryDirectory, 'agents');\n await fs.promises.rm(outputDirectory, { recursive: true, force: true });\n if (options.agents && (agentSources.length > 0 || options.dispatcherWorkflowExtension)) {\n await fs.promises.mkdir(outputDirectory, { mode: 0o700 });\n for (const source of agentSources) {\n const adapted = adaptAgentDefinition(fs.readFileSync(source.path, 'utf8'));\n await fs.promises.writeFile(\n path.join(outputDirectory, `${assertSafeAgentName(adapted.name)}.md`),\n adapted.content,\n { mode: 0o600 },\n );\n }\n if (options.dispatcherWorkflowExtension) {\n dispatcherWorkflowExtensionPath = options.dispatcherWorkflowExtension;\n await fs.promises.writeFile(\n path.join(outputDirectory, `${DISPATCHER_AGENT_NAME}.md`),\n dispatcherAgentSource(options.dispatcherWorkflowExtension),\n { mode: 0o600 },\n );\n }\n agentDirectories.push(outputDirectory);\n }\n\n let mcpConfigPath: string | undefined;\n if (options.mcp) {\n mcpConfigPath = path.join(temporaryDirectory, 'mcp.json');\n // Domains without an mcp allowlist resolve to undefined here, which leaves\n // the merged config untouched.\n const merged = await applyMcpAllowlist(\n mergeMcpConfigs(mcpPaths),\n options.mcpAllowlist,\n repoRoot,\n temporaryDirectory,\n );\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(merged, null, 2)}\\n`, {\n mode: 0o600,\n });\n }\n\n return {\n temporaryDirectory,\n skillDirectories,\n skillCount: skillSources.length,\n agentCount: agentSources.length,\n agentDirectories,\n pluginHooks,\n dispatcherWorkflowExtensionPath,\n mcpConfigPath,\n pluginMcpConfigPaths,\n cleanup: () =>\n ownsDirectory ? fs.promises.rm(temporaryDirectory, { recursive: true, force: true }) : Promise.resolve(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../utils/json.cjs`);require(`../utils/index.cjs`);const n=require(`./extensionAssembler.cjs`),r=require(`./extensionCompiler.cjs`);let i=require(`node:path`);i=e.__toESM(i,1);const a=i.default.join(`.pi`,`doom`,`cache`),o=i.default.join(`.pi`,`doom`,`dist`);function s(e){let t={agents:e.options.agents,preset:e.options.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig};return{extensions:n.assembleExtensions({...t,autoStop:e.options.autoStop,mute:e.options.mute,workflowExtension:e.workflowExtension}),childExtensions:n.assembleChildExtensions({...t,agents:!1,autoStop:!1,mute:!0})}}function c(e){return{majorMode:e.majorMode,domains:[...e.domains],profile:e.profile,preset:e.preset,mute:e.mute,autoStop:e.autoStop,agents:e.agents,mcp:e.mcp}}function l(e){return[e.majorMode,e.mute?`mute`:void 0,e.autoStop?`auto-stop`:void 0].filter(e=>!!e).join(`.`)}function u(e){return e.replace(/\.mjs$/,`.manifest.json`)}async function d(e){let n=e.extensionPaths.map(e=>i.default.resolve(e)),s={...e.selection,domains:[...e.selection.domains]},c=await r.compileExtensionSet(n,e.cacheDirectory??i.default.join(e.repoRoot,a),{outputDirectory:e.outputDirectory??i.default.join(e.repoRoot,o),outputName:e.outputName??l(s)}),d=u(c),f={version:1,artifact:c,selection:s,extensionPaths:n,childExtensionPaths:(e.childExtensionPaths??[]).map(e=>i.default.resolve(e)),resources:{skillPaths:(e.skillPaths??[]).map(e=>i.default.resolve(e)),pluginRoots:(e.pluginRoots??[]).map(e=>i.default.resolve(e))}};return t.writeFileAtomic(d,`${JSON.stringify(f,null,2)}\n`),{bundle:c,manifest:d}}async function f(e,t=s(e)){let n=await d({repoRoot:e.options.repoRoot,selection:c(e.options),extensionPaths:[...t.extensions].reverse(),childExtensionPaths:t.childExtensions,skillPaths:e.resources.skillDirectories,pluginRoots:e.plugins.map(e=>e.directory)});return{...t,...n}}exports.buildRuntimeBundle=f,exports.compileModeExtension=d,exports.createRuntimeExtensionPlan=s;
|
|
2
|
-
//# sourceMappingURL=runtimeBundle.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeBundle.cjs","names":["path","assembleExtensions","assembleChildExtensions","compileExtensionSet"],"sources":["../../src/services/runtimeBundle.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport { writeFileAtomic } from '../utils/index.ts';\nimport type { HarnessContext } from './harnessContext.ts';\nimport { assembleChildExtensions, assembleExtensions } from './extensionAssembler.ts';\nimport { compileExtensionSet } from './extensionCompiler.ts';\n\nconst EXTENSION_CACHE_DIRECTORY = path.join('.pi', 'doom', 'cache');\nconst MODE_DIST_DIRECTORY = path.join('.pi', 'doom', 'dist');\nconst MODE_MANIFEST_VERSION = 1;\n\nexport interface RuntimeExtensionPlan {\n /** Pi CLI order. Pi evaluates explicit extension arguments in reverse. */\n extensions: string[];\n childExtensions: string[];\n}\n\nexport interface RuntimeBundleBuild extends RuntimeExtensionPlan {\n bundle: string;\n manifest: string;\n}\n\nexport interface ModeBuildSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n mute: boolean;\n autoStop: boolean;\n agents: boolean;\n mcp: boolean;\n}\n\nexport interface ModeBuildManifest {\n version: number;\n artifact: string;\n selection: ModeBuildSelection;\n /** Original source entries in the order their factories activate. */\n extensionPaths: string[];\n /** Original source entries inherited by detached child agents. */\n childExtensionPaths: string[];\n resources: {\n /** Exact SKILL.md paths; never derived from the bundled artifact path. */\n skillPaths: string[];\n pluginRoots: string[];\n };\n}\n\nexport interface ModeExtensionBuildOptions {\n repoRoot: string;\n selection: ModeBuildSelection;\n extensionPaths: readonly string[];\n childExtensionPaths?: readonly string[];\n skillPaths?: readonly string[];\n pluginRoots?: readonly string[];\n outputName?: string;\n cacheDirectory?: string;\n outputDirectory?: string;\n}\n\n/** Resolves the parent and detached-child extension lists for one launch. */\nexport function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan {\n const common = {\n agents: context.options.agents,\n preset: context.options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n };\n return {\n extensions: assembleExtensions({\n ...common,\n autoStop: context.options.autoStop,\n mute: context.options.mute,\n workflowExtension: context.workflowExtension,\n }),\n childExtensions: assembleChildExtensions({\n ...common,\n agents: false,\n autoStop: false,\n mute: true,\n }),\n };\n}\n\nfunction modeSelection(options: HarnessOptions): ModeBuildSelection {\n return {\n majorMode: options.majorMode,\n domains: [...options.domains],\n profile: options.profile,\n preset: options.preset,\n mute: options.mute,\n autoStop: options.autoStop,\n agents: options.agents,\n mcp: options.mcp,\n };\n}\n\nfunction modeOutputName(selection: ModeBuildSelection): string {\n return [selection.majorMode, selection.mute ? 'mute' : undefined, selection.autoStop ? 'auto-stop' : undefined]\n .filter((value): value is string => Boolean(value))\n .join('.');\n}\n\nfunction manifestPathFor(bundle: string): string {\n return bundle.replace(/\\.mjs$/, '.manifest.json');\n}\n\n/**\n * Emits one named mode extension and its original-path resource manifest.\n *\n * Extension code lives in dist while graph fingerprints remain in cache. Skill\n * loading never follows the bundle's import.meta.url: Pi receives the exact\n * original SKILL.md paths recorded here and in harness state.\n */\nexport async function compileModeExtension(options: ModeExtensionBuildOptions): Promise<{\n bundle: string;\n manifest: string;\n}> {\n const extensionPaths = options.extensionPaths.map((entry) => path.resolve(entry));\n const selection = { ...options.selection, domains: [...options.selection.domains] };\n const bundle = await compileExtensionSet(\n extensionPaths,\n options.cacheDirectory ?? path.join(options.repoRoot, EXTENSION_CACHE_DIRECTORY),\n {\n outputDirectory: options.outputDirectory ?? path.join(options.repoRoot, MODE_DIST_DIRECTORY),\n outputName: options.outputName ?? modeOutputName(selection),\n },\n );\n const manifest = manifestPathFor(bundle);\n const contents: ModeBuildManifest = {\n version: MODE_MANIFEST_VERSION,\n artifact: bundle,\n selection,\n extensionPaths,\n childExtensionPaths: (options.childExtensionPaths ?? []).map((entry) => path.resolve(entry)),\n resources: {\n skillPaths: (options.skillPaths ?? []).map((entry) => path.resolve(entry)),\n pluginRoots: (options.pluginRoots ?? []).map((entry) => path.resolve(entry)),\n },\n };\n writeFileAtomic(manifest, `${JSON.stringify(contents, null, 2)}\\n`);\n return { bundle, manifest };\n}\n\n/** Compiles the exact Pi load order used by the selected launch matrix. */\nexport async function buildRuntimeBundle(\n context: HarnessContext,\n plan: RuntimeExtensionPlan = createRuntimeExtensionPlan(context),\n): Promise<RuntimeBundleBuild> {\n const built = await compileModeExtension({\n repoRoot: context.options.repoRoot,\n selection: modeSelection(context.options),\n extensionPaths: [...plan.extensions].reverse(),\n childExtensionPaths: plan.childExtensions,\n skillPaths: context.resources.skillDirectories,\n pluginRoots: context.plugins.map((plugin) => plugin.directory),\n });\n return { ...plan, ...built };\n}\n"],"mappings":"+OAOA,MAAM,EAA4BA,EAAAA,QAAK,KAAK,MAAO,OAAQ,QAAQ,CAC7D,EAAsBA,EAAAA,QAAK,KAAK,MAAO,OAAQ,OAAO,CAqD5D,SAAgB,EAA2B,EAA+C,CACxF,IAAM,EAAS,CACb,OAAQ,EAAQ,QAAQ,OACxB,OAAQ,EAAQ,QAAQ,OACxB,SAAU,EAAQ,SAClB,aAAc,EAAQ,aACtB,OAAQ,EAAQ,eAChB,iBAAkB,EAAQ,iBAC3B,CACD,MAAO,CACL,WAAYC,EAAAA,mBAAmB,CAC7B,GAAG,EACH,SAAU,EAAQ,QAAQ,SAC1B,KAAM,EAAQ,QAAQ,KACtB,kBAAmB,EAAQ,kBAC5B,CAAC,CACF,gBAAiBC,EAAAA,wBAAwB,CACvC,GAAG,EACH,OAAQ,GACR,SAAU,GACV,KAAM,GACP,CAAC,CACH,CAGH,SAAS,EAAc,EAA6C,CAClE,MAAO,CACL,UAAW,EAAQ,UACnB,QAAS,CAAC,GAAG,EAAQ,QAAQ,CAC7B,QAAS,EAAQ,QACjB,OAAQ,EAAQ,OAChB,KAAM,EAAQ,KACd,SAAU,EAAQ,SAClB,OAAQ,EAAQ,OAChB,IAAK,EAAQ,IACd,CAGH,SAAS,EAAe,EAAuC,CAC7D,MAAO,CAAC,EAAU,UAAW,EAAU,KAAO,OAAS,IAAA,GAAW,EAAU,SAAW,YAAc,IAAA,GAAU,CAC5G,OAAQ,GAA2B,EAAQ,EAAO,CAClD,KAAK,IAAI,CAGd,SAAS,EAAgB,EAAwB,CAC/C,OAAO,EAAO,QAAQ,SAAU,iBAAiB,CAUnD,eAAsB,EAAqB,EAGxC,CACD,IAAM,EAAiB,EAAQ,eAAe,IAAK,GAAUF,EAAAA,QAAK,QAAQ,EAAM,CAAC,CAC3E,EAAY,CAAE,GAAG,EAAQ,UAAW,QAAS,CAAC,GAAG,EAAQ,UAAU,QAAQ,CAAE,CAC7E,EAAS,MAAMG,EAAAA,oBACnB,EACA,EAAQ,gBAAkBH,EAAAA,QAAK,KAAK,EAAQ,SAAU,EAA0B,CAChF,CACE,gBAAiB,EAAQ,iBAAmBA,EAAAA,QAAK,KAAK,EAAQ,SAAU,EAAoB,CAC5F,WAAY,EAAQ,YAAc,EAAe,EAAU,CAC5D,CACF,CACK,EAAW,EAAgB,EAAO,CAClC,EAA8B,CAClC,QAAS,EACT,SAAU,EACV,YACA,iBACA,qBAAsB,EAAQ,qBAAuB,EAAE,EAAE,IAAK,GAAUA,EAAAA,QAAK,QAAQ,EAAM,CAAC,CAC5F,UAAW,CACT,YAAa,EAAQ,YAAc,EAAE,EAAE,IAAK,GAAUA,EAAAA,QAAK,QAAQ,EAAM,CAAC,CAC1E,aAAc,EAAQ,aAAe,EAAE,EAAE,IAAK,GAAUA,EAAAA,QAAK,QAAQ,EAAM,CAAC,CAC7E,CACF,CAED,OADA,EAAA,gBAAgB,EAAU,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAAI,CAC5D,CAAE,SAAQ,WAAU,CAI7B,eAAsB,EACpB,EACA,EAA6B,EAA2B,EAAQ,CACnC,CAC7B,IAAM,EAAQ,MAAM,EAAqB,CACvC,SAAU,EAAQ,QAAQ,SAC1B,UAAW,EAAc,EAAQ,QAAQ,CACzC,eAAgB,CAAC,GAAG,EAAK,WAAW,CAAC,SAAS,CAC9C,oBAAqB,EAAK,gBAC1B,WAAY,EAAQ,UAAU,iBAC9B,YAAa,EAAQ,QAAQ,IAAK,GAAW,EAAO,UAAU,CAC/D,CAAC,CACF,MAAO,CAAE,GAAG,EAAM,GAAG,EAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeBundle.d.cts","names":[],"sources":["../../src/services/runtimeBundle.ts"],"mappings":";;;UAWiB,oBAAA;;EAEf,UAAA;EACA,eAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,oBAAA;EAC1C,MAAA;EACA,QAAA;AAAA;AAAA,UAGe,kBAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA,GAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA;EACA,QAAA;EACA,SAAA,EAAW,kBAAA;EAVX;EAYA,cAAA;EAVA;EAYA,mBAAA;EACA,SAAA;IAXG,0EAaD,UAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,yBAAA;EACf,QAAA;EACA,SAAA,EAAW,kBAAA;EACX,cAAA;EACA,mBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,cAAA;EACA,eAAA;AAAA;;iBAIc,0BAAA,CAA2B,OAAA,EAAS,cAAA,GAAiB,oBAAA;;;;;;;;iBAuD/C,oBAAA,CAAqB,OAAA,EAAS,yBAAA,GAA4B,OAAA;EAC9E,MAAA;EACA,QAAA;AAAA;;iBA6BoB,kBAAA,CACpB,OAAA,EAAS,cAAA,EACT,IAAA,GAAM,oBAAA,GACL,OAAA,CAAQ,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeBundle.d.mts","names":[],"sources":["../../src/services/runtimeBundle.ts"],"mappings":";;;UAWiB,oBAAA;;EAEf,UAAA;EACA,eAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,oBAAA;EAC1C,MAAA;EACA,QAAA;AAAA;AAAA,UAGe,kBAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA,GAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA;EACA,QAAA;EACA,SAAA,EAAW,kBAAA;EAVX;EAYA,cAAA;EAVA;EAYA,mBAAA;EACA,SAAA;IAXG,0EAaD,UAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,yBAAA;EACf,QAAA;EACA,SAAA,EAAW,kBAAA;EACX,cAAA;EACA,mBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,cAAA;EACA,eAAA;AAAA;;iBAIc,0BAAA,CAA2B,OAAA,EAAS,cAAA,GAAiB,oBAAA;;;;;;;;iBAuD/C,oBAAA,CAAqB,OAAA,EAAS,yBAAA,GAA4B,OAAA;EAC9E,MAAA;EACA,QAAA;AAAA;;iBA6BoB,kBAAA,CACpB,OAAA,EAAS,cAAA,EACT,IAAA,GAAM,oBAAA,GACL,OAAA,CAAQ,kBAAA"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{writeFileAtomic as e}from"../utils/json.mjs";import"../utils/index.mjs";import{assembleChildExtensions as t,assembleExtensions as n}from"./extensionAssembler.mjs";import{compileExtensionSet as r}from"./extensionCompiler.mjs";import i from"node:path";const a=i.join(`.pi`,`doom`,`cache`),o=i.join(`.pi`,`doom`,`dist`);function s(e){let r={agents:e.options.agents,preset:e.options.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig};return{extensions:n({...r,autoStop:e.options.autoStop,mute:e.options.mute,workflowExtension:e.workflowExtension}),childExtensions:t({...r,agents:!1,autoStop:!1,mute:!0})}}function c(e){return{majorMode:e.majorMode,domains:[...e.domains],profile:e.profile,preset:e.preset,mute:e.mute,autoStop:e.autoStop,agents:e.agents,mcp:e.mcp}}function l(e){return[e.majorMode,e.mute?`mute`:void 0,e.autoStop?`auto-stop`:void 0].filter(e=>!!e).join(`.`)}function u(e){return e.replace(/\.mjs$/,`.manifest.json`)}async function d(t){let n=t.extensionPaths.map(e=>i.resolve(e)),s={...t.selection,domains:[...t.selection.domains]},c=await r(n,t.cacheDirectory??i.join(t.repoRoot,a),{outputDirectory:t.outputDirectory??i.join(t.repoRoot,o),outputName:t.outputName??l(s)}),d=u(c),f={version:1,artifact:c,selection:s,extensionPaths:n,childExtensionPaths:(t.childExtensionPaths??[]).map(e=>i.resolve(e)),resources:{skillPaths:(t.skillPaths??[]).map(e=>i.resolve(e)),pluginRoots:(t.pluginRoots??[]).map(e=>i.resolve(e))}};return e(d,`${JSON.stringify(f,null,2)}\n`),{bundle:c,manifest:d}}async function f(e,t=s(e)){let n=await d({repoRoot:e.options.repoRoot,selection:c(e.options),extensionPaths:[...t.extensions].reverse(),childExtensionPaths:t.childExtensions,skillPaths:e.resources.skillDirectories,pluginRoots:e.plugins.map(e=>e.directory)});return{...t,...n}}export{f as buildRuntimeBundle,d as compileModeExtension,s as createRuntimeExtensionPlan};
|
|
2
|
-
//# sourceMappingURL=runtimeBundle.mjs.map
|