@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpFilter.mjs","names":["parseYaml","stringifyYaml"],"sources":["../../src/adapters/mcpFilter.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { type DomainMcpAllowlist, expandDomainNames, loadDomains } from '@agimon-ai/doompi-config/domains';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\n\n/** Server name in .mcp.json whose upstreams are declared in mcp-config.yaml. */\nexport const PROXY_SERVER_NAME = 'agiflow-proxy';\nconst PROXY_CONFIG_FILE = 'mcp-config.yaml';\nconst CONFIG_ARGUMENT = '--config';\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\nasync function copyFileIfPresent(source: string, target: string): Promise<boolean> {\n try {\n await fs.promises.copyFile(source, target);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return false;\n throw error;\n }\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(await fs.promises.readFile(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, PROXY_CONFIG_FILE);\n\n if (proxy) {\n const args = [...((proxy.args ?? []) as string[])];\n const configIndex = args.indexOf(CONFIG_ARGUMENT);\n if (configIndex !== -1) {\n const targetProxyConfig = path.join(targetDirectory, PROXY_CONFIG_FILE);\n if (await copyFileIfPresent(generatedProxyConfig, targetProxyConfig)) {\n args[configIndex + 1] = targetProxyConfig;\n servers[PROXY_SERVER_NAME] = { ...proxy, args };\n }\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_ARGUMENT);\n if (configIndex === -1 || !args[configIndex + 1]) return filtered;\n\n const sourcePath = path.resolve(repoRoot, args[configIndex + 1]);\n let sourceConfig: string;\n try {\n sourceConfig = await fs.promises.readFile(sourcePath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return filtered;\n throw error;\n }\n const targetPath = path.join(temporaryDirectory, PROXY_CONFIG_FILE);\n await fs.promises.writeFile(targetPath, filterProxyConfig(sourceConfig, allowlist.proxy), { mode: 0o600 });\n args[configIndex + 1] = targetPath;\n return { ...filtered, mcpServers: { ...servers, [PROXY_SERVER_NAME]: { ...proxy, args } } };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../_virtual/_rolldown/runtime.cjs`);let t=require(`node:url`),n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`minimatch`);const a=`package.json`,o=`node_modules`,s=n.default.join(`.pi`,`npm`,o),c=[`!`,`+`,`-`],l=/[*?[\]{}()]/,u=[`index.ts`,`index.js`,`index.mts`,`index.mjs`,`index.cts`,`index.cjs`],d=new Set([`.ts`,`.js`,`.mts`,`.mjs`,`.cts`,`.cjs`]),f=[`import`,`module`,`node`,`default`];function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function m(e){try{let t=JSON.parse(r.default.readFileSync(n.default.join(e,a),`utf8`));return p(t)?t:void 0}catch{return}}function h(e){return!!(e&&p(e.pi)&&Object.hasOwn(e.pi,`extensions`))}function g(e){return c.some(t=>e.startsWith(t))}function _(e,t){return n.default.relative(e,t).split(n.default.sep).join(`/`)}function v(e,t,r){let a=t.replaceAll(`\\`,`/`).replace(/^\.\//,``);return(0,i.minimatch)(_(r,e),a)||(0,i.minimatch)(n.default.basename(e),a)||(0,i.minimatch)(e.split(n.default.sep).join(`/`),a)}function y(e,t,r){let i=t.replaceAll(`\\`,`/`).replace(/^\.\//,``);return _(r,e)===i||e.split(n.default.sep).join(`/`)===i}function b(e){for(let t of u){let i=n.default.join(e,t);if(r.default.existsSync(i))return i}}function x(e){let t;try{t=r.default.statSync(e)}catch{return[]}if(t.isFile())return[e];if(!t.isDirectory())return[];let i=[];for(let t of r.default.readdirSync(e,{withFileTypes:!0}).sort((e,t)=>e.name.localeCompare(t.name))){let r=n.default.join(e,t.name);if((t.isFile()||t.isSymbolicLink())&&d.has(n.default.extname(t.name))){i.push(r);continue}if(!t.isDirectory()&&!t.isSymbolicLink())continue;let a=b(r);a&&i.push(a)}return i}function S(e,t,i){if(!h(t)||!p(t?.pi))return;let a=t.pi.extensions;if(!Array.isArray(a)||!a.every(e=>typeof e==`string`))throw Error(`${i} package.json pi.extensions must be an array of strings.`);let o=[];for(let t of a.filter(e=>!g(e))){let i=l.test(t)?r.default.globSync(t,{cwd:e}).sort():[t];for(let t of i)for(let r of x(n.default.resolve(e,t)))o.includes(r)||o.push(r)}let s=a.filter(e=>e.startsWith(`!`)).map(e=>e.slice(1)),c=a.filter(e=>e.startsWith(`+`)).map(e=>e.slice(1)),u=a.filter(e=>e.startsWith(`-`)).map(e=>e.slice(1)),d=o.filter(t=>!s.some(n=>v(t,n,e)));for(let t of o)!d.includes(t)&&c.some(n=>y(t,n,e))&&d.push(t);let f=d.filter(t=>!u.some(n=>y(t,n,e)));return f.length>0?f:void 0}function C(e){return(0,t.fileURLToPath)({}.resolve(e))}function w(e){try{return C(e)}catch{return}}function T(e){let t=e.split(`/`),n=e.startsWith(`@`)?2:1,r=t.slice(0,n).join(`/`),i=t.slice(n).join(`/`);return{name:r,subpath:i?`./${i}`:`.`}}function E(e){if(typeof e==`string`)return e;if(Array.isArray(e)){for(let t of e){let e=E(t);if(e)return e}return}if(typeof e!=`object`||!e)return;let t=e;for(let e of f)if(e in t){let n=E(t[e]);if(n)return n}}function D(e,t){let i=n.default.resolve(t);for(;;){let t=n.default.join(i,o,e);if(r.default.existsSync(n.default.join(t,a)))return t;let s=n.default.dirname(i);if(s===i)return;i=s}}function O(e,t){let i=n.default.join(n.default.resolve(t),s,e);return r.default.existsSync(n.default.join(i,a))?i:void 0}function k(e,t){return D(e,t)??O(e,t)}function A(e){let{name:r,subpath:i}=T(e);if(i!==`.`)return[C(e)];let a=D(r,n.default.dirname((0,t.fileURLToPath)(require(`url`).pathToFileURL(__filename).href))),o=a?m(a):void 0;return(a?S(a,o,r):void 0)||[(a&&h(o)?b(a):void 0)??C(e)]}function j(e){try{return A(e)}catch{return}}function M(e,t){let{name:n,subpath:r}=T(e),i=k(n,t);if(!i)return;if(r===`.`){let e=S(i,m(i),n);if(e!==void 0)return e}let a=N(e,t);return a?[a]:[]}function N(e,t){let{name:i,subpath:o}=T(e),s=k(i,t);if(!s)return;let c=n.default.join(s,a),l=n.default.join(s,o),u;try{u=JSON.parse(r.default.readFileSync(c,`utf8`))}catch{return o===`.`?b(s):r.default.existsSync(l)?l:void 0}let d=u.exports;if(d!=null){let e=E(typeof d==`object`&&!Array.isArray(d)?d[o]:o===`.`?d:void 0);if(e){let t=n.default.join(s,e);if(r.default.existsSync(t))return t}}return o===`.`?b(s):r.default.existsSync(l)?l:void 0}const P=[`module`,`main`];function F(e,t){let i=n.default.resolve(t,e);try{if(!r.default.statSync(i).isDirectory())return;let e=JSON.parse(r.default.readFileSync(n.default.join(i,a),`utf8`));return typeof e.name==`string`&&e.name.trim()?e.name.trim():void 0}catch{return}}function I(e,t){let i=n.default.resolve(t,e),a;try{a=r.default.statSync(i)}catch{return}if(a.isFile())return[i];if(!a.isDirectory())return;let o=S(i,m(i),F(e,t)??i);if(o!==void 0)return o;let s=L(e,t);return s?[s]:x(i)}function L(e,t){let i=n.default.resolve(t,e),o;try{let e=r.default.statSync(i);if(e.isFile())return i;o=e.isDirectory()}catch{return}if(!o)return;let s;try{s=JSON.parse(r.default.readFileSync(n.default.join(i,a),`utf8`))}catch{return}let c=s.exports,l=[E(typeof c==`object`&&c&&!Array.isArray(c)?c[`.`]:c)];for(let e of P)typeof s[e]==`string`&&l.push(s[e]);for(let e of l){if(!e)continue;let t=n.default.join(i,e);if(r.default.existsSync(t))return t}return b(i)}function R(e){let r=require(`url`).pathToFileURL(__filename).href.endsWith(`.ts`)?`ts`:`mjs`,i=n.default.dirname(n.default.dirname(n.default.dirname((0,t.fileURLToPath)(require(`url`).pathToFileURL(__filename).href))));return n.default.join(i,`extensions`,`entries`,`${e}.${r}`)}function z(){return n.default.join(n.default.dirname(C(`@earendil-works/pi-coding-agent`)),`cli.js`)}exports.consumerPackageEntries=M,exports.consumerPackageEntry=N,exports.localEntries=I,exports.localEntry=L,exports.localPackageName=F,exports.optionalPackageEntries=j,exports.optionalPackageEntry=w,exports.ownEntry=R,exports.packageEntries=A,exports.packageEntry=C,exports.piCliPath=z,exports.splitPackageSpecifier=T;
|
|
2
|
+
//# sourceMappingURL=moduleResolution.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleResolution.cjs","names":["path","fs"],"sources":["../../../src/adapters/modules/moduleResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { minimatch } from 'minimatch';\n\nconst PACKAGE_MANIFEST = 'package.json';\nconst NODE_MODULES = 'node_modules';\nconst PI_MANAGED_NPM_DIRECTORY = path.join('.pi', 'npm', NODE_MODULES);\nconst CURRENT_DIRECTORY_PREFIX = './';\nconst MANIFEST_PATTERN_PREFIXES = ['!', '+', '-'] as const;\nconst GLOB_CHARACTERS = /[*?[\\]{}()]/;\nconst EXTENSION_INDEX_NAMES = ['index.ts', 'index.js', 'index.mts', 'index.mjs', 'index.cts', 'index.cjs'] as const;\nconst EXTENSION_FILE_SUFFIXES = new Set(['.ts', '.js', '.mts', '.mjs', '.cts', '.cjs']);\n/** Import-side conditions, in the order Node prefers them for an ESM consumer. */\nconst IMPORT_CONDITIONS = ['import', 'module', 'node', 'default'] as const;\n\ninterface PackageManifest {\n name?: unknown;\n exports?: unknown;\n module?: unknown;\n main?: unknown;\n pi?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readPackageManifest(packageRoot: string): PackageManifest | undefined {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(path.join(packageRoot, PACKAGE_MANIFEST), 'utf8'));\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n // An unreadable manifest is equivalent to an absent package declaration;\n // the normal export resolver remains available as the compatibility path.\n return undefined;\n }\n}\n\nfunction manifestDeclaresExtensions(manifest: PackageManifest | undefined): boolean {\n return Boolean(manifest && isRecord(manifest.pi) && Object.hasOwn(manifest.pi, 'extensions'));\n}\n\nfunction isManifestPattern(entry: string): boolean {\n return MANIFEST_PATTERN_PREFIXES.some((prefix) => entry.startsWith(prefix));\n}\n\nfunction normalizedRelativePath(packageRoot: string, target: string): string {\n return path.relative(packageRoot, target).split(path.sep).join('/');\n}\n\nfunction matchesManifestPattern(target: string, pattern: string, packageRoot: string): boolean {\n const normalizedPattern = pattern.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n const relative = normalizedRelativePath(packageRoot, target);\n return (\n minimatch(relative, normalizedPattern) ||\n minimatch(path.basename(target), normalizedPattern) ||\n minimatch(target.split(path.sep).join('/'), normalizedPattern)\n );\n}\n\nfunction matchesExactManifestPath(target: string, pattern: string, packageRoot: string): boolean {\n const normalizedPattern = pattern.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n return (\n normalizedRelativePath(packageRoot, target) === normalizedPattern ||\n target.split(path.sep).join('/') === normalizedPattern\n );\n}\n\nfunction extensionIndexEntry(directory: string): string | undefined {\n for (const indexName of EXTENSION_INDEX_NAMES) {\n const candidate = path.join(directory, indexName);\n if (fs.existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction extensionFilesAt(target: string): string[] {\n let stats: fs.Stats;\n try {\n stats = fs.statSync(target);\n } catch {\n return [];\n }\n if (stats.isFile()) return [target];\n if (!stats.isDirectory()) return [];\n\n const files: string[] = [];\n for (const entry of fs\n .readdirSync(target, { withFileTypes: true })\n .sort((left, right) => left.name.localeCompare(right.name))) {\n const entryPath = path.join(target, entry.name);\n if ((entry.isFile() || entry.isSymbolicLink()) && EXTENSION_FILE_SUFFIXES.has(path.extname(entry.name))) {\n files.push(entryPath);\n continue;\n }\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const indexEntry = extensionIndexEntry(entryPath);\n if (indexEntry) files.push(indexEntry);\n }\n return files;\n}\n\n/** Resolves the standard package.json pi.extensions declaration exactly as a layer contribution. */\nfunction manifestExtensionEntries(\n packageRoot: string,\n manifest: PackageManifest | undefined,\n packageName: string,\n): string[] | undefined {\n if (!manifestDeclaresExtensions(manifest) || !isRecord(manifest?.pi)) return undefined;\n const configured = manifest.pi.extensions;\n if (!Array.isArray(configured) || !configured.every((entry) => typeof entry === 'string')) {\n throw new Error(`${packageName} package.json pi.extensions must be an array of strings.`);\n }\n\n const allPaths: string[] = [];\n for (const configuredEntry of configured.filter((entry) => !isManifestPattern(entry))) {\n const candidates = GLOB_CHARACTERS.test(configuredEntry)\n ? fs.globSync(configuredEntry, { cwd: packageRoot }).sort()\n : [configuredEntry];\n for (const candidate of candidates) {\n for (const target of extensionFilesAt(path.resolve(packageRoot, candidate))) {\n if (!allPaths.includes(target)) allPaths.push(target);\n }\n }\n }\n\n const excluded = configured.filter((entry) => entry.startsWith('!')).map((entry) => entry.slice(1));\n const forceIncluded = configured.filter((entry) => entry.startsWith('+')).map((entry) => entry.slice(1));\n const forceExcluded = configured.filter((entry) => entry.startsWith('-')).map((entry) => entry.slice(1));\n const selected = allPaths.filter(\n (target) => !excluded.some((pattern) => matchesManifestPattern(target, pattern, packageRoot)),\n );\n for (const target of allPaths) {\n if (\n !selected.includes(target) &&\n forceIncluded.some((pattern) => matchesExactManifestPath(target, pattern, packageRoot))\n ) {\n selected.push(target);\n }\n }\n const filtered = selected.filter(\n (target) => !forceExcluded.some((pattern) => matchesExactManifestPath(target, pattern, packageRoot)),\n );\n return filtered.length > 0 ? filtered : undefined;\n}\n\n/**\n * Resolves the on-disk entry point of an installed package.\n *\n * Pi loads extensions by absolute path, so anything contributed as an\n * extension has to be resolved to a file before it can be passed along.\n */\nexport function packageEntry(name: string): string {\n return fileURLToPath(import.meta.resolve(name));\n}\n\n/** Same as packageEntry, but returns undefined when the package is absent. */\nexport function optionalPackageEntry(name: string): string | undefined {\n try {\n return packageEntry(name);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Splits `@scope/name/sub/path` into the package name and its export subpath.\n *\n * A scoped name owns two segments, an unscoped name one. Everything after that\n * is the subpath the package's own `exports` map has to answer for.\n */\nexport function splitPackageSpecifier(specifier: string): { name: string; subpath: string } {\n const segments = specifier.split('/');\n const nameSegments = specifier.startsWith('@') ? 2 : 1;\n const name = segments.slice(0, nameSegments).join('/');\n const rest = segments.slice(nameSegments).join('/');\n return { name, subpath: rest ? `${CURRENT_DIRECTORY_PREFIX}${rest}` : '.' };\n}\n\n/** Picks the import-side target out of one `exports` entry. */\nfunction selectImportTarget(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) {\n for (const candidate of value) {\n const target = selectImportTarget(candidate);\n if (target) return target;\n }\n return undefined;\n }\n if (typeof value !== 'object' || value === null) return undefined;\n const conditions = value as Record<string, unknown>;\n for (const condition of IMPORT_CONDITIONS) {\n if (condition in conditions) {\n const target = selectImportTarget(conditions[condition]);\n if (target) return target;\n }\n }\n return undefined;\n}\n\n/**\n * Finds an installed package directory by walking the consumer's module chain.\n *\n * Node's own lookup order, so a workspace link in the repository root is found\n * exactly where the repository installed it, and nothing outside that chain can\n * answer for a specifier the repository declared.\n */\nfunction findInstalledPackage(name: string, consumerRoot: string): string | undefined {\n let directory = path.resolve(consumerRoot);\n while (true) {\n const candidate = path.join(directory, NODE_MODULES, name);\n if (fs.existsSync(path.join(candidate, PACKAGE_MANIFEST))) return candidate;\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\n/** Finds a package provisioned by Pi without mutating the consumer's package manifest. */\nfunction findManagedPackage(name: string, consumerRoot: string): string | undefined {\n const candidate = path.join(path.resolve(consumerRoot), PI_MANAGED_NPM_DIRECTORY, name);\n return fs.existsSync(path.join(candidate, PACKAGE_MANIFEST)) ? candidate : undefined;\n}\n\nfunction findConsumerPackage(name: string, consumerRoot: string): string | undefined {\n return findInstalledPackage(name, consumerRoot) ?? findManagedPackage(name, consumerRoot);\n}\n\n/** Resolves every extension declared by a bare package's standard Pi manifest. */\nexport function packageEntries(specifier: string): string[] {\n const { name, subpath } = splitPackageSpecifier(specifier);\n if (subpath !== '.') return [packageEntry(specifier)];\n\n const packageRoot = findInstalledPackage(name, path.dirname(fileURLToPath(import.meta.url)));\n const manifest = packageRoot ? readPackageManifest(packageRoot) : undefined;\n const manifestEntries = packageRoot ? manifestExtensionEntries(packageRoot, manifest, name) : undefined;\n if (manifestEntries) return manifestEntries;\n const indexEntry = packageRoot && manifestDeclaresExtensions(manifest) ? extensionIndexEntry(packageRoot) : undefined;\n return [indexEntry ?? packageEntry(specifier)];\n}\n\n/** Same as packageEntries, but returns undefined when the package is absent. */\nexport function optionalPackageEntries(specifier: string): string[] | undefined {\n try {\n return packageEntries(specifier);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves manifest entries from the consumer repository's dependency tree.\n *\n * The meta-package cannot resolve what the repository declares: under an\n * isolated node_modules layout Doom Pi only sees its own dependencies. Walking\n * the consumer's module chain lets its package manifest answer first without\n * accidentally falling through to DoomPi's dependency tree.\n */\nexport function consumerPackageEntries(specifier: string, consumerRoot: string): string[] | undefined {\n const { name, subpath } = splitPackageSpecifier(specifier);\n const packageRoot = findConsumerPackage(name, consumerRoot);\n if (!packageRoot) return undefined;\n if (subpath === '.') {\n const manifestEntries = manifestExtensionEntries(packageRoot, readPackageManifest(packageRoot), name);\n if (manifestEntries !== undefined) return manifestEntries;\n }\n const entry = consumerPackageEntry(specifier, consumerRoot);\n return entry ? [entry] : [];\n}\n\n/** Resolves one explicit package export or direct package-relative path from the consumer. */\nexport function consumerPackageEntry(specifier: string, consumerRoot: string): string | undefined {\n const { name, subpath } = splitPackageSpecifier(specifier);\n const packageRoot = findConsumerPackage(name, consumerRoot);\n if (!packageRoot) return undefined;\n\n const manifestPath = path.join(packageRoot, PACKAGE_MANIFEST);\n // A relative subpath that the package does not export is still loadable by\n // path, which is how layers point at a file inside a package (`.../index.ts`).\n const directTarget = path.join(packageRoot, subpath);\n let manifest: { exports?: unknown };\n try {\n manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as { exports?: unknown };\n } catch {\n return subpath === '.' ? extensionIndexEntry(packageRoot) : fs.existsSync(directTarget) ? directTarget : undefined;\n }\n\n const exports = manifest.exports;\n if (exports !== undefined && exports !== null) {\n const entry =\n typeof exports === 'object' && !Array.isArray(exports)\n ? (exports as Record<string, unknown>)[subpath]\n : subpath === '.'\n ? exports\n : undefined;\n const target = selectImportTarget(entry);\n if (target) {\n const resolved = path.join(packageRoot, target);\n if (fs.existsSync(resolved)) return resolved;\n }\n }\n\n return subpath === '.' ? extensionIndexEntry(packageRoot) : fs.existsSync(directTarget) ? directTarget : undefined;\n}\n\n/** Manifest fields consulted when a local package declares no `exports`. */\nconst MAIN_FIELDS = ['module', 'main'] as const;\n\n/**\n * Returns the canonical name of a path-style package directory.\n *\n * A direct file is intentionally anonymous: treating the repository manifest\n * above it as the file's identity would collapse every local extension in that\n * repository. Only a directory with its own named manifest represents a package\n * that can replace another installed version by logical identity.\n */\nexport function localPackageName(specifier: string, baseDirectory: string): string | undefined {\n const target = path.resolve(baseDirectory, specifier);\n try {\n if (!fs.statSync(target).isDirectory()) return undefined;\n const manifest = JSON.parse(fs.readFileSync(path.join(target, PACKAGE_MANIFEST), 'utf8')) as {\n name?: unknown;\n };\n return typeof manifest.name === 'string' && manifest.name.trim() ? manifest.name.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves Pi extension entries from a local file, extension directory, or package.\n *\n * A file is taken as the extension entry as written. A package directory uses\n * its native `pi.extensions` declaration or legacy root entry. A plain directory\n * follows Pi's extension discovery convention for scripts and child `index`\n * modules. This lets unpublished extensions live in the repository, or beside\n * the global config in `~/.pi/.doom`, and still load in deterministic order.\n */\nexport function localEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const target = path.resolve(baseDirectory, specifier);\n let stats: fs.Stats;\n try {\n stats = fs.statSync(target);\n } catch {\n return undefined;\n }\n if (stats.isFile()) return [target];\n if (!stats.isDirectory()) return undefined;\n\n const manifest = readPackageManifest(target);\n const manifestEntries = manifestExtensionEntries(\n target,\n manifest,\n localPackageName(specifier, baseDirectory) ?? target,\n );\n if (manifestEntries !== undefined) return manifestEntries;\n const entry = localEntry(specifier, baseDirectory);\n return entry ? [entry] : extensionFilesAt(target);\n}\n\n/** Resolves the legacy single entry from a local package's exports, module, or main field. */\nexport function localEntry(specifier: string, baseDirectory: string): string | undefined {\n const target = path.resolve(baseDirectory, specifier);\n let isDirectory: boolean;\n try {\n const stats = fs.statSync(target);\n if (stats.isFile()) return target;\n isDirectory = stats.isDirectory();\n } catch {\n return undefined;\n }\n if (!isDirectory) return undefined;\n\n let manifest: { exports?: unknown; module?: unknown; main?: unknown };\n try {\n manifest = JSON.parse(fs.readFileSync(path.join(target, PACKAGE_MANIFEST), 'utf8')) as typeof manifest;\n } catch {\n return undefined;\n }\n\n const exports = manifest.exports;\n const rootExport =\n typeof exports === 'object' && exports !== null && !Array.isArray(exports)\n ? (exports as Record<string, unknown>)['.']\n : exports;\n const candidates = [selectImportTarget(rootExport)];\n for (const field of MAIN_FIELDS) {\n if (typeof manifest[field] === 'string') candidates.push(manifest[field]);\n }\n\n for (const candidate of candidates) {\n if (!candidate) continue;\n const resolved = path.join(target, candidate);\n if (fs.existsSync(resolved)) return resolved;\n }\n return extensionIndexEntry(target);\n}\n\n/**\n * Resolves one of this package's own extensions in src/extensions/entries.\n *\n * The file extension differs between running from source (.ts, how the shell\n * launchers invoke this) and running the build output (.mjs), so it is derived\n * from this module's own URL rather than assumed.\n */\nexport function ownEntry(name: string): string {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'mjs';\n // This file sits in src/adapters/modules, so the source root is two directories up.\n const sourceRoot = path.dirname(path.dirname(path.dirname(fileURLToPath(import.meta.url))));\n return path.join(sourceRoot, 'extensions', 'entries', `${name}.${extension}`);\n}\n\n/** Path to Pi's own CLI, which the launch command spawns. */\nexport function piCliPath(): string {\n return path.join(path.dirname(packageEntry('@earendil-works/pi-coding-agent')), 'cli.js');\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//#region src/adapters/modules/moduleResolution.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the on-disk entry point of an installed package.
|
|
4
|
+
*
|
|
5
|
+
* Pi loads extensions by absolute path, so anything contributed as an
|
|
6
|
+
* extension has to be resolved to a file before it can be passed along.
|
|
7
|
+
*/
|
|
8
|
+
declare function packageEntry(name: string): string;
|
|
9
|
+
/** Same as packageEntry, but returns undefined when the package is absent. */
|
|
10
|
+
declare function optionalPackageEntry(name: string): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Splits `@scope/name/sub/path` into the package name and its export subpath.
|
|
13
|
+
*
|
|
14
|
+
* A scoped name owns two segments, an unscoped name one. Everything after that
|
|
15
|
+
* is the subpath the package's own `exports` map has to answer for.
|
|
16
|
+
*/
|
|
17
|
+
declare function splitPackageSpecifier(specifier: string): {
|
|
18
|
+
name: string;
|
|
19
|
+
subpath: string;
|
|
20
|
+
};
|
|
21
|
+
/** Resolves every extension declared by a bare package's standard Pi manifest. */
|
|
22
|
+
declare function packageEntries(specifier: string): string[];
|
|
23
|
+
/** Same as packageEntries, but returns undefined when the package is absent. */
|
|
24
|
+
declare function optionalPackageEntries(specifier: string): string[] | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Resolves manifest entries from the consumer repository's dependency tree.
|
|
27
|
+
*
|
|
28
|
+
* The meta-package cannot resolve what the repository declares: under an
|
|
29
|
+
* isolated node_modules layout Doom Pi only sees its own dependencies. Walking
|
|
30
|
+
* the consumer's module chain lets its package manifest answer first without
|
|
31
|
+
* accidentally falling through to DoomPi's dependency tree.
|
|
32
|
+
*/
|
|
33
|
+
declare function consumerPackageEntries(specifier: string, consumerRoot: string): string[] | undefined;
|
|
34
|
+
/** Resolves one explicit package export or direct package-relative path from the consumer. */
|
|
35
|
+
declare function consumerPackageEntry(specifier: string, consumerRoot: string): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Returns the canonical name of a path-style package directory.
|
|
38
|
+
*
|
|
39
|
+
* A direct file is intentionally anonymous: treating the repository manifest
|
|
40
|
+
* above it as the file's identity would collapse every local extension in that
|
|
41
|
+
* repository. Only a directory with its own named manifest represents a package
|
|
42
|
+
* that can replace another installed version by logical identity.
|
|
43
|
+
*/
|
|
44
|
+
declare function localPackageName(specifier: string, baseDirectory: string): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Resolves Pi extension entries from a local file, extension directory, or package.
|
|
47
|
+
*
|
|
48
|
+
* A file is taken as the extension entry as written. A package directory uses
|
|
49
|
+
* its native `pi.extensions` declaration or legacy root entry. A plain directory
|
|
50
|
+
* follows Pi's extension discovery convention for scripts and child `index`
|
|
51
|
+
* modules. This lets unpublished extensions live in the repository, or beside
|
|
52
|
+
* the global config in `~/.pi/.doom`, and still load in deterministic order.
|
|
53
|
+
*/
|
|
54
|
+
declare function localEntries(specifier: string, baseDirectory: string): string[] | undefined;
|
|
55
|
+
/** Resolves the legacy single entry from a local package's exports, module, or main field. */
|
|
56
|
+
declare function localEntry(specifier: string, baseDirectory: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Resolves one of this package's own extensions in src/extensions/entries.
|
|
59
|
+
*
|
|
60
|
+
* The file extension differs between running from source (.ts, how the shell
|
|
61
|
+
* launchers invoke this) and running the build output (.mjs), so it is derived
|
|
62
|
+
* from this module's own URL rather than assumed.
|
|
63
|
+
*/
|
|
64
|
+
declare function ownEntry(name: string): string;
|
|
65
|
+
/** Path to Pi's own CLI, which the launch command spawns. */
|
|
66
|
+
declare function piCliPath(): string;
|
|
67
|
+
//#endregion
|
|
68
|
+
export { consumerPackageEntries, consumerPackageEntry, localEntries, localEntry, localPackageName, optionalPackageEntries, optionalPackageEntry, ownEntry, packageEntries, packageEntry, piCliPath, splitPackageSpecifier };
|
|
69
|
+
//# sourceMappingURL=moduleResolution.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleResolution.d.cts","names":[],"sources":["../../../src/adapters/modules/moduleResolution.ts"],"mappings":";;AAyJA;;;;;iBAAgB,YAAA,CAAa,IAAA;;iBAKb,oBAAA,CAAqB,IAAA;;;AAcrC;;;;iBAAgB,qBAAA,CAAsB,SAAA;EAAsB,IAAA;EAAc,OAAA;AAAA;;iBA0D1D,cAAA,CAAe,SAAA;;iBAaf,sBAAA,CAAuB,SAAA;;;AAAvC;;;;;AAgBA;iBAAgB,sBAAA,CAAuB,SAAA,UAAmB,YAAA;;iBAa1C,oBAAA,CAAqB,SAAA,UAAmB,YAAA;;AAAxD;;;;;AA6CA;;iBAAgB,gBAAA,CAAiB,SAAA,UAAmB,aAAA;;;AAsBpD;;;;;AAuBA;;iBAvBgB,YAAA,CAAa,SAAA,UAAmB,aAAA;;iBAuBhC,UAAA,CAAW,SAAA,UAAmB,aAAA;AA4C9C;;;;;AAQA;;AARA,iBAAgB,QAAA,CAAS,IAAA;;iBAQT,SAAA,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//#region src/adapters/modules/moduleResolution.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the on-disk entry point of an installed package.
|
|
4
|
+
*
|
|
5
|
+
* Pi loads extensions by absolute path, so anything contributed as an
|
|
6
|
+
* extension has to be resolved to a file before it can be passed along.
|
|
7
|
+
*/
|
|
8
|
+
declare function packageEntry(name: string): string;
|
|
9
|
+
/** Same as packageEntry, but returns undefined when the package is absent. */
|
|
10
|
+
declare function optionalPackageEntry(name: string): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Splits `@scope/name/sub/path` into the package name and its export subpath.
|
|
13
|
+
*
|
|
14
|
+
* A scoped name owns two segments, an unscoped name one. Everything after that
|
|
15
|
+
* is the subpath the package's own `exports` map has to answer for.
|
|
16
|
+
*/
|
|
17
|
+
declare function splitPackageSpecifier(specifier: string): {
|
|
18
|
+
name: string;
|
|
19
|
+
subpath: string;
|
|
20
|
+
};
|
|
21
|
+
/** Resolves every extension declared by a bare package's standard Pi manifest. */
|
|
22
|
+
declare function packageEntries(specifier: string): string[];
|
|
23
|
+
/** Same as packageEntries, but returns undefined when the package is absent. */
|
|
24
|
+
declare function optionalPackageEntries(specifier: string): string[] | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Resolves manifest entries from the consumer repository's dependency tree.
|
|
27
|
+
*
|
|
28
|
+
* The meta-package cannot resolve what the repository declares: under an
|
|
29
|
+
* isolated node_modules layout Doom Pi only sees its own dependencies. Walking
|
|
30
|
+
* the consumer's module chain lets its package manifest answer first without
|
|
31
|
+
* accidentally falling through to DoomPi's dependency tree.
|
|
32
|
+
*/
|
|
33
|
+
declare function consumerPackageEntries(specifier: string, consumerRoot: string): string[] | undefined;
|
|
34
|
+
/** Resolves one explicit package export or direct package-relative path from the consumer. */
|
|
35
|
+
declare function consumerPackageEntry(specifier: string, consumerRoot: string): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Returns the canonical name of a path-style package directory.
|
|
38
|
+
*
|
|
39
|
+
* A direct file is intentionally anonymous: treating the repository manifest
|
|
40
|
+
* above it as the file's identity would collapse every local extension in that
|
|
41
|
+
* repository. Only a directory with its own named manifest represents a package
|
|
42
|
+
* that can replace another installed version by logical identity.
|
|
43
|
+
*/
|
|
44
|
+
declare function localPackageName(specifier: string, baseDirectory: string): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Resolves Pi extension entries from a local file, extension directory, or package.
|
|
47
|
+
*
|
|
48
|
+
* A file is taken as the extension entry as written. A package directory uses
|
|
49
|
+
* its native `pi.extensions` declaration or legacy root entry. A plain directory
|
|
50
|
+
* follows Pi's extension discovery convention for scripts and child `index`
|
|
51
|
+
* modules. This lets unpublished extensions live in the repository, or beside
|
|
52
|
+
* the global config in `~/.pi/.doom`, and still load in deterministic order.
|
|
53
|
+
*/
|
|
54
|
+
declare function localEntries(specifier: string, baseDirectory: string): string[] | undefined;
|
|
55
|
+
/** Resolves the legacy single entry from a local package's exports, module, or main field. */
|
|
56
|
+
declare function localEntry(specifier: string, baseDirectory: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Resolves one of this package's own extensions in src/extensions/entries.
|
|
59
|
+
*
|
|
60
|
+
* The file extension differs between running from source (.ts, how the shell
|
|
61
|
+
* launchers invoke this) and running the build output (.mjs), so it is derived
|
|
62
|
+
* from this module's own URL rather than assumed.
|
|
63
|
+
*/
|
|
64
|
+
declare function ownEntry(name: string): string;
|
|
65
|
+
/** Path to Pi's own CLI, which the launch command spawns. */
|
|
66
|
+
declare function piCliPath(): string;
|
|
67
|
+
//#endregion
|
|
68
|
+
export { consumerPackageEntries, consumerPackageEntry, localEntries, localEntry, localPackageName, optionalPackageEntries, optionalPackageEntry, ownEntry, packageEntries, packageEntry, piCliPath, splitPackageSpecifier };
|
|
69
|
+
//# sourceMappingURL=moduleResolution.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleResolution.d.mts","names":[],"sources":["../../../src/adapters/modules/moduleResolution.ts"],"mappings":";;AAyJA;;;;;iBAAgB,YAAA,CAAa,IAAA;;iBAKb,oBAAA,CAAqB,IAAA;;;AAcrC;;;;iBAAgB,qBAAA,CAAsB,SAAA;EAAsB,IAAA;EAAc,OAAA;AAAA;;iBA0D1D,cAAA,CAAe,SAAA;;iBAaf,sBAAA,CAAuB,SAAA;;;AAAvC;;;;;AAgBA;iBAAgB,sBAAA,CAAuB,SAAA,UAAmB,YAAA;;iBAa1C,oBAAA,CAAqB,SAAA,UAAmB,YAAA;;AAAxD;;;;;AA6CA;;iBAAgB,gBAAA,CAAiB,SAAA,UAAmB,aAAA;;;AAsBpD;;;;;AAuBA;;iBAvBgB,YAAA,CAAa,SAAA,UAAmB,aAAA;;iBAuBhC,UAAA,CAAW,SAAA,UAAmB,aAAA;AA4C9C;;;;;AAQA;;AARA,iBAAgB,QAAA,CAAS,IAAA;;iBAQT,SAAA,CAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{fileURLToPath as e}from"node:url";import t from"node:path";import n from"node:fs";import{minimatch as r}from"minimatch";const i=`package.json`,a=`node_modules`,o=t.join(`.pi`,`npm`,a),s=[`!`,`+`,`-`],c=/[*?[\]{}()]/,l=[`index.ts`,`index.js`,`index.mts`,`index.mjs`,`index.cts`,`index.cjs`],u=new Set([`.ts`,`.js`,`.mts`,`.mjs`,`.cts`,`.cjs`]),d=[`import`,`module`,`node`,`default`];function f(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function p(e){try{let r=JSON.parse(n.readFileSync(t.join(e,i),`utf8`));return f(r)?r:void 0}catch{return}}function m(e){return!!(e&&f(e.pi)&&Object.hasOwn(e.pi,`extensions`))}function h(e){return s.some(t=>e.startsWith(t))}function g(e,n){return t.relative(e,n).split(t.sep).join(`/`)}function _(e,n,i){let a=n.replaceAll(`\\`,`/`).replace(/^\.\//,``);return r(g(i,e),a)||r(t.basename(e),a)||r(e.split(t.sep).join(`/`),a)}function v(e,n,r){let i=n.replaceAll(`\\`,`/`).replace(/^\.\//,``);return g(r,e)===i||e.split(t.sep).join(`/`)===i}function y(e){for(let r of l){let i=t.join(e,r);if(n.existsSync(i))return i}}function b(e){let r;try{r=n.statSync(e)}catch{return[]}if(r.isFile())return[e];if(!r.isDirectory())return[];let i=[];for(let r of n.readdirSync(e,{withFileTypes:!0}).sort((e,t)=>e.name.localeCompare(t.name))){let n=t.join(e,r.name);if((r.isFile()||r.isSymbolicLink())&&u.has(t.extname(r.name))){i.push(n);continue}if(!r.isDirectory()&&!r.isSymbolicLink())continue;let a=y(n);a&&i.push(a)}return i}function x(e,r,i){if(!m(r)||!f(r?.pi))return;let a=r.pi.extensions;if(!Array.isArray(a)||!a.every(e=>typeof e==`string`))throw Error(`${i} package.json pi.extensions must be an array of strings.`);let o=[];for(let r of a.filter(e=>!h(e))){let i=c.test(r)?n.globSync(r,{cwd:e}).sort():[r];for(let n of i)for(let r of b(t.resolve(e,n)))o.includes(r)||o.push(r)}let s=a.filter(e=>e.startsWith(`!`)).map(e=>e.slice(1)),l=a.filter(e=>e.startsWith(`+`)).map(e=>e.slice(1)),u=a.filter(e=>e.startsWith(`-`)).map(e=>e.slice(1)),d=o.filter(t=>!s.some(n=>_(t,n,e)));for(let t of o)!d.includes(t)&&l.some(n=>v(t,n,e))&&d.push(t);let p=d.filter(t=>!u.some(n=>v(t,n,e)));return p.length>0?p:void 0}function S(t){return e(import.meta.resolve(t))}function C(e){try{return S(e)}catch{return}}function w(e){let t=e.split(`/`),n=e.startsWith(`@`)?2:1,r=t.slice(0,n).join(`/`),i=t.slice(n).join(`/`);return{name:r,subpath:i?`./${i}`:`.`}}function T(e){if(typeof e==`string`)return e;if(Array.isArray(e)){for(let t of e){let e=T(t);if(e)return e}return}if(typeof e!=`object`||!e)return;let t=e;for(let e of d)if(e in t){let n=T(t[e]);if(n)return n}}function E(e,r){let o=t.resolve(r);for(;;){let r=t.join(o,a,e);if(n.existsSync(t.join(r,i)))return r;let s=t.dirname(o);if(s===o)return;o=s}}function D(e,r){let a=t.join(t.resolve(r),o,e);return n.existsSync(t.join(a,i))?a:void 0}function O(e,t){return E(e,t)??D(e,t)}function k(n){let{name:r,subpath:i}=w(n);if(i!==`.`)return[S(n)];let a=E(r,t.dirname(e(import.meta.url))),o=a?p(a):void 0;return(a?x(a,o,r):void 0)||[(a&&m(o)?y(a):void 0)??S(n)]}function A(e){try{return k(e)}catch{return}}function j(e,t){let{name:n,subpath:r}=w(e),i=O(n,t);if(!i)return;if(r===`.`){let e=x(i,p(i),n);if(e!==void 0)return e}let a=M(e,t);return a?[a]:[]}function M(e,r){let{name:a,subpath:o}=w(e),s=O(a,r);if(!s)return;let c=t.join(s,i),l=t.join(s,o),u;try{u=JSON.parse(n.readFileSync(c,`utf8`))}catch{return o===`.`?y(s):n.existsSync(l)?l:void 0}let d=u.exports;if(d!=null){let e=T(typeof d==`object`&&!Array.isArray(d)?d[o]:o===`.`?d:void 0);if(e){let r=t.join(s,e);if(n.existsSync(r))return r}}return o===`.`?y(s):n.existsSync(l)?l:void 0}const N=[`module`,`main`];function P(e,r){let a=t.resolve(r,e);try{if(!n.statSync(a).isDirectory())return;let e=JSON.parse(n.readFileSync(t.join(a,i),`utf8`));return typeof e.name==`string`&&e.name.trim()?e.name.trim():void 0}catch{return}}function F(e,r){let i=t.resolve(r,e),a;try{a=n.statSync(i)}catch{return}if(a.isFile())return[i];if(!a.isDirectory())return;let o=x(i,p(i),P(e,r)??i);if(o!==void 0)return o;let s=I(e,r);return s?[s]:b(i)}function I(e,r){let a=t.resolve(r,e),o;try{let e=n.statSync(a);if(e.isFile())return a;o=e.isDirectory()}catch{return}if(!o)return;let s;try{s=JSON.parse(n.readFileSync(t.join(a,i),`utf8`))}catch{return}let c=s.exports,l=[T(typeof c==`object`&&c&&!Array.isArray(c)?c[`.`]:c)];for(let e of N)typeof s[e]==`string`&&l.push(s[e]);for(let e of l){if(!e)continue;let r=t.join(a,e);if(n.existsSync(r))return r}return y(a)}function L(n){let r=import.meta.url.endsWith(`.ts`)?`ts`:`mjs`,i=t.dirname(t.dirname(t.dirname(e(import.meta.url))));return t.join(i,`extensions`,`entries`,`${n}.${r}`)}function R(){return t.join(t.dirname(S(`@earendil-works/pi-coding-agent`)),`cli.js`)}export{j as consumerPackageEntries,M as consumerPackageEntry,F as localEntries,I as localEntry,P as localPackageName,A as optionalPackageEntries,C as optionalPackageEntry,L as ownEntry,k as packageEntries,S as packageEntry,R as piCliPath,w as splitPackageSpecifier};
|
|
2
|
+
//# sourceMappingURL=moduleResolution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moduleResolution.mjs","names":[],"sources":["../../../src/adapters/modules/moduleResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { minimatch } from 'minimatch';\n\nconst PACKAGE_MANIFEST = 'package.json';\nconst NODE_MODULES = 'node_modules';\nconst PI_MANAGED_NPM_DIRECTORY = path.join('.pi', 'npm', NODE_MODULES);\nconst CURRENT_DIRECTORY_PREFIX = './';\nconst MANIFEST_PATTERN_PREFIXES = ['!', '+', '-'] as const;\nconst GLOB_CHARACTERS = /[*?[\\]{}()]/;\nconst EXTENSION_INDEX_NAMES = ['index.ts', 'index.js', 'index.mts', 'index.mjs', 'index.cts', 'index.cjs'] as const;\nconst EXTENSION_FILE_SUFFIXES = new Set(['.ts', '.js', '.mts', '.mjs', '.cts', '.cjs']);\n/** Import-side conditions, in the order Node prefers them for an ESM consumer. */\nconst IMPORT_CONDITIONS = ['import', 'module', 'node', 'default'] as const;\n\ninterface PackageManifest {\n name?: unknown;\n exports?: unknown;\n module?: unknown;\n main?: unknown;\n pi?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readPackageManifest(packageRoot: string): PackageManifest | undefined {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(path.join(packageRoot, PACKAGE_MANIFEST), 'utf8'));\n return isRecord(parsed) ? parsed : undefined;\n } catch {\n // An unreadable manifest is equivalent to an absent package declaration;\n // the normal export resolver remains available as the compatibility path.\n return undefined;\n }\n}\n\nfunction manifestDeclaresExtensions(manifest: PackageManifest | undefined): boolean {\n return Boolean(manifest && isRecord(manifest.pi) && Object.hasOwn(manifest.pi, 'extensions'));\n}\n\nfunction isManifestPattern(entry: string): boolean {\n return MANIFEST_PATTERN_PREFIXES.some((prefix) => entry.startsWith(prefix));\n}\n\nfunction normalizedRelativePath(packageRoot: string, target: string): string {\n return path.relative(packageRoot, target).split(path.sep).join('/');\n}\n\nfunction matchesManifestPattern(target: string, pattern: string, packageRoot: string): boolean {\n const normalizedPattern = pattern.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n const relative = normalizedRelativePath(packageRoot, target);\n return (\n minimatch(relative, normalizedPattern) ||\n minimatch(path.basename(target), normalizedPattern) ||\n minimatch(target.split(path.sep).join('/'), normalizedPattern)\n );\n}\n\nfunction matchesExactManifestPath(target: string, pattern: string, packageRoot: string): boolean {\n const normalizedPattern = pattern.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n return (\n normalizedRelativePath(packageRoot, target) === normalizedPattern ||\n target.split(path.sep).join('/') === normalizedPattern\n );\n}\n\nfunction extensionIndexEntry(directory: string): string | undefined {\n for (const indexName of EXTENSION_INDEX_NAMES) {\n const candidate = path.join(directory, indexName);\n if (fs.existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction extensionFilesAt(target: string): string[] {\n let stats: fs.Stats;\n try {\n stats = fs.statSync(target);\n } catch {\n return [];\n }\n if (stats.isFile()) return [target];\n if (!stats.isDirectory()) return [];\n\n const files: string[] = [];\n for (const entry of fs\n .readdirSync(target, { withFileTypes: true })\n .sort((left, right) => left.name.localeCompare(right.name))) {\n const entryPath = path.join(target, entry.name);\n if ((entry.isFile() || entry.isSymbolicLink()) && EXTENSION_FILE_SUFFIXES.has(path.extname(entry.name))) {\n files.push(entryPath);\n continue;\n }\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const indexEntry = extensionIndexEntry(entryPath);\n if (indexEntry) files.push(indexEntry);\n }\n return files;\n}\n\n/** Resolves the standard package.json pi.extensions declaration exactly as a layer contribution. */\nfunction manifestExtensionEntries(\n packageRoot: string,\n manifest: PackageManifest | undefined,\n packageName: string,\n): string[] | undefined {\n if (!manifestDeclaresExtensions(manifest) || !isRecord(manifest?.pi)) return undefined;\n const configured = manifest.pi.extensions;\n if (!Array.isArray(configured) || !configured.every((entry) => typeof entry === 'string')) {\n throw new Error(`${packageName} package.json pi.extensions must be an array of strings.`);\n }\n\n const allPaths: string[] = [];\n for (const configuredEntry of configured.filter((entry) => !isManifestPattern(entry))) {\n const candidates = GLOB_CHARACTERS.test(configuredEntry)\n ? fs.globSync(configuredEntry, { cwd: packageRoot }).sort()\n : [configuredEntry];\n for (const candidate of candidates) {\n for (const target of extensionFilesAt(path.resolve(packageRoot, candidate))) {\n if (!allPaths.includes(target)) allPaths.push(target);\n }\n }\n }\n\n const excluded = configured.filter((entry) => entry.startsWith('!')).map((entry) => entry.slice(1));\n const forceIncluded = configured.filter((entry) => entry.startsWith('+')).map((entry) => entry.slice(1));\n const forceExcluded = configured.filter((entry) => entry.startsWith('-')).map((entry) => entry.slice(1));\n const selected = allPaths.filter(\n (target) => !excluded.some((pattern) => matchesManifestPattern(target, pattern, packageRoot)),\n );\n for (const target of allPaths) {\n if (\n !selected.includes(target) &&\n forceIncluded.some((pattern) => matchesExactManifestPath(target, pattern, packageRoot))\n ) {\n selected.push(target);\n }\n }\n const filtered = selected.filter(\n (target) => !forceExcluded.some((pattern) => matchesExactManifestPath(target, pattern, packageRoot)),\n );\n return filtered.length > 0 ? filtered : undefined;\n}\n\n/**\n * Resolves the on-disk entry point of an installed package.\n *\n * Pi loads extensions by absolute path, so anything contributed as an\n * extension has to be resolved to a file before it can be passed along.\n */\nexport function packageEntry(name: string): string {\n return fileURLToPath(import.meta.resolve(name));\n}\n\n/** Same as packageEntry, but returns undefined when the package is absent. */\nexport function optionalPackageEntry(name: string): string | undefined {\n try {\n return packageEntry(name);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Splits `@scope/name/sub/path` into the package name and its export subpath.\n *\n * A scoped name owns two segments, an unscoped name one. Everything after that\n * is the subpath the package's own `exports` map has to answer for.\n */\nexport function splitPackageSpecifier(specifier: string): { name: string; subpath: string } {\n const segments = specifier.split('/');\n const nameSegments = specifier.startsWith('@') ? 2 : 1;\n const name = segments.slice(0, nameSegments).join('/');\n const rest = segments.slice(nameSegments).join('/');\n return { name, subpath: rest ? `${CURRENT_DIRECTORY_PREFIX}${rest}` : '.' };\n}\n\n/** Picks the import-side target out of one `exports` entry. */\nfunction selectImportTarget(value: unknown): string | undefined {\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) {\n for (const candidate of value) {\n const target = selectImportTarget(candidate);\n if (target) return target;\n }\n return undefined;\n }\n if (typeof value !== 'object' || value === null) return undefined;\n const conditions = value as Record<string, unknown>;\n for (const condition of IMPORT_CONDITIONS) {\n if (condition in conditions) {\n const target = selectImportTarget(conditions[condition]);\n if (target) return target;\n }\n }\n return undefined;\n}\n\n/**\n * Finds an installed package directory by walking the consumer's module chain.\n *\n * Node's own lookup order, so a workspace link in the repository root is found\n * exactly where the repository installed it, and nothing outside that chain can\n * answer for a specifier the repository declared.\n */\nfunction findInstalledPackage(name: string, consumerRoot: string): string | undefined {\n let directory = path.resolve(consumerRoot);\n while (true) {\n const candidate = path.join(directory, NODE_MODULES, name);\n if (fs.existsSync(path.join(candidate, PACKAGE_MANIFEST))) return candidate;\n const parent = path.dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\n/** Finds a package provisioned by Pi without mutating the consumer's package manifest. */\nfunction findManagedPackage(name: string, consumerRoot: string): string | undefined {\n const candidate = path.join(path.resolve(consumerRoot), PI_MANAGED_NPM_DIRECTORY, name);\n return fs.existsSync(path.join(candidate, PACKAGE_MANIFEST)) ? candidate : undefined;\n}\n\nfunction findConsumerPackage(name: string, consumerRoot: string): string | undefined {\n return findInstalledPackage(name, consumerRoot) ?? findManagedPackage(name, consumerRoot);\n}\n\n/** Resolves every extension declared by a bare package's standard Pi manifest. */\nexport function packageEntries(specifier: string): string[] {\n const { name, subpath } = splitPackageSpecifier(specifier);\n if (subpath !== '.') return [packageEntry(specifier)];\n\n const packageRoot = findInstalledPackage(name, path.dirname(fileURLToPath(import.meta.url)));\n const manifest = packageRoot ? readPackageManifest(packageRoot) : undefined;\n const manifestEntries = packageRoot ? manifestExtensionEntries(packageRoot, manifest, name) : undefined;\n if (manifestEntries) return manifestEntries;\n const indexEntry = packageRoot && manifestDeclaresExtensions(manifest) ? extensionIndexEntry(packageRoot) : undefined;\n return [indexEntry ?? packageEntry(specifier)];\n}\n\n/** Same as packageEntries, but returns undefined when the package is absent. */\nexport function optionalPackageEntries(specifier: string): string[] | undefined {\n try {\n return packageEntries(specifier);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves manifest entries from the consumer repository's dependency tree.\n *\n * The meta-package cannot resolve what the repository declares: under an\n * isolated node_modules layout Doom Pi only sees its own dependencies. Walking\n * the consumer's module chain lets its package manifest answer first without\n * accidentally falling through to DoomPi's dependency tree.\n */\nexport function consumerPackageEntries(specifier: string, consumerRoot: string): string[] | undefined {\n const { name, subpath } = splitPackageSpecifier(specifier);\n const packageRoot = findConsumerPackage(name, consumerRoot);\n if (!packageRoot) return undefined;\n if (subpath === '.') {\n const manifestEntries = manifestExtensionEntries(packageRoot, readPackageManifest(packageRoot), name);\n if (manifestEntries !== undefined) return manifestEntries;\n }\n const entry = consumerPackageEntry(specifier, consumerRoot);\n return entry ? [entry] : [];\n}\n\n/** Resolves one explicit package export or direct package-relative path from the consumer. */\nexport function consumerPackageEntry(specifier: string, consumerRoot: string): string | undefined {\n const { name, subpath } = splitPackageSpecifier(specifier);\n const packageRoot = findConsumerPackage(name, consumerRoot);\n if (!packageRoot) return undefined;\n\n const manifestPath = path.join(packageRoot, PACKAGE_MANIFEST);\n // A relative subpath that the package does not export is still loadable by\n // path, which is how layers point at a file inside a package (`.../index.ts`).\n const directTarget = path.join(packageRoot, subpath);\n let manifest: { exports?: unknown };\n try {\n manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as { exports?: unknown };\n } catch {\n return subpath === '.' ? extensionIndexEntry(packageRoot) : fs.existsSync(directTarget) ? directTarget : undefined;\n }\n\n const exports = manifest.exports;\n if (exports !== undefined && exports !== null) {\n const entry =\n typeof exports === 'object' && !Array.isArray(exports)\n ? (exports as Record<string, unknown>)[subpath]\n : subpath === '.'\n ? exports\n : undefined;\n const target = selectImportTarget(entry);\n if (target) {\n const resolved = path.join(packageRoot, target);\n if (fs.existsSync(resolved)) return resolved;\n }\n }\n\n return subpath === '.' ? extensionIndexEntry(packageRoot) : fs.existsSync(directTarget) ? directTarget : undefined;\n}\n\n/** Manifest fields consulted when a local package declares no `exports`. */\nconst MAIN_FIELDS = ['module', 'main'] as const;\n\n/**\n * Returns the canonical name of a path-style package directory.\n *\n * A direct file is intentionally anonymous: treating the repository manifest\n * above it as the file's identity would collapse every local extension in that\n * repository. Only a directory with its own named manifest represents a package\n * that can replace another installed version by logical identity.\n */\nexport function localPackageName(specifier: string, baseDirectory: string): string | undefined {\n const target = path.resolve(baseDirectory, specifier);\n try {\n if (!fs.statSync(target).isDirectory()) return undefined;\n const manifest = JSON.parse(fs.readFileSync(path.join(target, PACKAGE_MANIFEST), 'utf8')) as {\n name?: unknown;\n };\n return typeof manifest.name === 'string' && manifest.name.trim() ? manifest.name.trim() : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolves Pi extension entries from a local file, extension directory, or package.\n *\n * A file is taken as the extension entry as written. A package directory uses\n * its native `pi.extensions` declaration or legacy root entry. A plain directory\n * follows Pi's extension discovery convention for scripts and child `index`\n * modules. This lets unpublished extensions live in the repository, or beside\n * the global config in `~/.pi/.doom`, and still load in deterministic order.\n */\nexport function localEntries(specifier: string, baseDirectory: string): string[] | undefined {\n const target = path.resolve(baseDirectory, specifier);\n let stats: fs.Stats;\n try {\n stats = fs.statSync(target);\n } catch {\n return undefined;\n }\n if (stats.isFile()) return [target];\n if (!stats.isDirectory()) return undefined;\n\n const manifest = readPackageManifest(target);\n const manifestEntries = manifestExtensionEntries(\n target,\n manifest,\n localPackageName(specifier, baseDirectory) ?? target,\n );\n if (manifestEntries !== undefined) return manifestEntries;\n const entry = localEntry(specifier, baseDirectory);\n return entry ? [entry] : extensionFilesAt(target);\n}\n\n/** Resolves the legacy single entry from a local package's exports, module, or main field. */\nexport function localEntry(specifier: string, baseDirectory: string): string | undefined {\n const target = path.resolve(baseDirectory, specifier);\n let isDirectory: boolean;\n try {\n const stats = fs.statSync(target);\n if (stats.isFile()) return target;\n isDirectory = stats.isDirectory();\n } catch {\n return undefined;\n }\n if (!isDirectory) return undefined;\n\n let manifest: { exports?: unknown; module?: unknown; main?: unknown };\n try {\n manifest = JSON.parse(fs.readFileSync(path.join(target, PACKAGE_MANIFEST), 'utf8')) as typeof manifest;\n } catch {\n return undefined;\n }\n\n const exports = manifest.exports;\n const rootExport =\n typeof exports === 'object' && exports !== null && !Array.isArray(exports)\n ? (exports as Record<string, unknown>)['.']\n : exports;\n const candidates = [selectImportTarget(rootExport)];\n for (const field of MAIN_FIELDS) {\n if (typeof manifest[field] === 'string') candidates.push(manifest[field]);\n }\n\n for (const candidate of candidates) {\n if (!candidate) continue;\n const resolved = path.join(target, candidate);\n if (fs.existsSync(resolved)) return resolved;\n }\n return extensionIndexEntry(target);\n}\n\n/**\n * Resolves one of this package's own extensions in src/extensions/entries.\n *\n * The file extension differs between running from source (.ts, how the shell\n * launchers invoke this) and running the build output (.mjs), so it is derived\n * from this module's own URL rather than assumed.\n */\nexport function ownEntry(name: string): string {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'mjs';\n // This file sits in src/adapters/modules, so the source root is two directories up.\n const sourceRoot = path.dirname(path.dirname(path.dirname(fileURLToPath(import.meta.url))));\n return path.join(sourceRoot, 'extensions', 'entries', `${name}.${extension}`);\n}\n\n/** Path to Pi's own CLI, which the launch command spawns. */\nexport function piCliPath(): string {\n return path.join(path.dirname(packageEntry('@earendil-works/pi-coding-agent')), 'cli.js');\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./bootstrapClaim.cjs`),t=require(`./bootstrapLocator.cjs`);let n=require(`node:url`);const r=`session_start`;async function i(e){let n=t.readBootstrapStatus(e);if(n.fresh&&n.bootstrap)return n.bootstrap;let{precompileSyncedRuntime:r}=await Promise.resolve().then(()=>require(`./startupPrecompiler.cjs`));return r(e).bootstrap}function a(e,t){let n=t instanceof Error?t.message:String(t);e.on(r,(e,t)=>{t.ui.notify(`doompi could not read its synchronized state. Run doompi sync. (${n})`,`warning`)})}async function o(o){let s=t.findSyncedRoot(process.cwd());if(!s)return;let c=e.acquireBootstrapClaim(s);if(!c)return;let l;try{l=await i(s)}catch(e){c(),a(o,e);return}try{let e=await import((0,n.pathToFileURL)(l).href);if(typeof e.default!=`function`)throw Error(`DoomPi bootstrap does not export an extension factory: ${l}`);await e.default(o),o.on(r,()=>{c()})}catch(e){throw c(),e}}exports.default=o;
|
|
2
|
+
//# sourceMappingURL=packageBootstrap.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageBootstrap.cjs","names":["readBootstrapStatus","findSyncedRoot","acquireBootstrapClaim"],"sources":["../../src/adapters/packageBootstrap.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { acquireBootstrapClaim } from './bootstrapClaim.ts';\nimport { findSyncedRoot, readBootstrapStatus } from './bootstrapLocator.ts';\n\ntype ExtensionFactory = (api: ExtensionAPI) => void | Promise<void>;\n\nconst SESSION_START = 'session_start';\nconst WARNING = 'warning';\nconst UNUSABLE_STATE_MESSAGE = 'doompi could not read its synchronized state. Run doompi sync.';\n\nasync function currentBootstrap(repoRoot: string): Promise<string> {\n const status = readBootstrapStatus(repoRoot);\n if (status.fresh && status.bootstrap) return status.bootstrap;\n\n // The native shim writer and Doom runtime stay outside the static package\n // entry graph. A normal cache hit never evaluates either module.\n const { precompileSyncedRuntime } = await import('./startupPrecompiler.ts');\n return precompileSyncedRuntime(repoRoot).bootstrap;\n}\n\n/**\n * Reports a state this install cannot honour without failing Pi's startup.\n *\n * A state file written by a different DoomPi version, or by a different\n * repository, is a synchronization problem the user fixes with one command.\n * Throwing here would only turn it into an extension load failure, so the\n * detail is carried to the UI instead, which does not exist yet at load time.\n */\nfunction reportUnusableState(pi: ExtensionAPI, error: unknown): void {\n const detail = error instanceof Error ? error.message : String(error);\n pi.on(SESSION_START, (_event, ctx) => {\n ctx.ui.notify(`${UNUSABLE_STATE_MESSAGE} (${detail})`, WARNING);\n });\n}\n\n/** Stable user-package entry that delegates to a fresh synchronized bootstrap. */\nexport async function packageBootstrap(pi: ExtensionAPI): Promise<void> {\n const repoRoot = findSyncedRoot(process.cwd());\n // DoomPi is registered in user settings, so it is also discovered outside a\n // synchronized repository. Staying inert avoids loading the runtime globally.\n if (!repoRoot) return;\n\n // Claimed before the first await, so a sibling install registered from the\n // other settings scope cannot interleave. It reads nothing, compiles nothing,\n // and writes nothing: one install owns this repository's load cycle.\n const releaseClaim = acquireBootstrapClaim(repoRoot);\n if (!releaseClaim) return;\n\n let bootstrap: string;\n try {\n bootstrap = await currentBootstrap(repoRoot);\n } catch (error) {\n releaseClaim();\n reportUnusableState(pi, error);\n return;\n }\n\n try {\n const module = (await import(pathToFileURL(bootstrap).href)) as { default?: unknown };\n if (typeof module.default !== 'function') {\n throw new Error(`DoomPi bootstrap does not export an extension factory: ${bootstrap}`);\n }\n await (module.default as ExtensionFactory)(pi);\n // Released once Pi has started the runner this load produced, so a later\n // /reload composes again instead of finding the cycle still owned.\n pi.on(SESSION_START, () => {\n releaseClaim();\n });\n } catch (error) {\n releaseClaim();\n throw error;\n }\n}\n\nexport default packageBootstrap;\n"],"mappings":"mJAOA,MAAM,EAAgB,gBAItB,eAAe,EAAiB,EAAmC,CACjE,IAAM,EAASA,EAAAA,oBAAoB,EAAS,CAC5C,GAAI,EAAO,OAAS,EAAO,UAAW,OAAO,EAAO,UAIpD,GAAM,CAAE,2BAA4B,MAAA,QAAA,SAAA,CAAA,SAAA,QAAM,2BAAA,CAAA,CAC1C,OAAO,EAAwB,EAAS,CAAC,UAW3C,SAAS,EAAoB,EAAkB,EAAsB,CACnE,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACrE,EAAG,GAAG,GAAgB,EAAQ,IAAQ,CACpC,EAAI,GAAG,OAAO,mEAA8B,EAAO,GAAI,UAAQ,EAC/D,CAIJ,eAAsB,EAAiB,EAAiC,CACtE,IAAM,EAAWC,EAAAA,eAAe,QAAQ,KAAK,CAAC,CAG9C,GAAI,CAAC,EAAU,OAKf,IAAM,EAAeC,EAAAA,sBAAsB,EAAS,CACpD,GAAI,CAAC,EAAc,OAEnB,IAAI,EACJ,GAAI,CACF,EAAY,MAAM,EAAiB,EAAS,OACrC,EAAO,CACd,GAAc,CACd,EAAoB,EAAI,EAAM,CAC9B,OAGF,GAAI,CACF,IAAM,EAAU,MAAM,QAAA,EAAA,EAAA,eAAqB,EAAU,CAAC,MACtD,GAAI,OAAO,EAAO,SAAY,WAC5B,MAAU,MAAM,0DAA0D,IAAY,CAExF,MAAO,EAAO,QAA6B,EAAG,CAG9C,EAAG,GAAG,MAAqB,CACzB,GAAc,EACd,OACK,EAAO,CAEd,MADA,GAAc,CACR"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/packageBootstrap.d.ts
|
|
4
|
+
/** Stable user-package entry that delegates to a fresh synchronized bootstrap. */
|
|
5
|
+
declare function packageBootstrap(pi: ExtensionAPI): Promise<void>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { packageBootstrap };
|
|
8
|
+
//# sourceMappingURL=packageBootstrap.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageBootstrap.d.cts","names":[],"sources":["../../src/adapters/packageBootstrap.ts"],"mappings":";;;;iBAqCsB,gBAAA,CAAiB,EAAA,EAAI,YAAA,GAAe,OAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/packageBootstrap.d.ts
|
|
4
|
+
/** Stable user-package entry that delegates to a fresh synchronized bootstrap. */
|
|
5
|
+
declare function packageBootstrap(pi: ExtensionAPI): Promise<void>;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { packageBootstrap };
|
|
8
|
+
//# sourceMappingURL=packageBootstrap.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageBootstrap.d.mts","names":[],"sources":["../../src/adapters/packageBootstrap.ts"],"mappings":";;;;iBAqCsB,gBAAA,CAAiB,EAAA,EAAI,YAAA,GAAe,OAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{acquireBootstrapClaim as e}from"./bootstrapClaim.mjs";import{findSyncedRoot as t,readBootstrapStatus as n}from"./bootstrapLocator.mjs";import{pathToFileURL as r}from"node:url";const i=`session_start`;async function a(e){let t=n(e);if(t.fresh&&t.bootstrap)return t.bootstrap;let{precompileSyncedRuntime:r}=await import(`./startupPrecompiler.mjs`);return r(e).bootstrap}function o(e,t){let n=t instanceof Error?t.message:String(t);e.on(i,(e,t)=>{t.ui.notify(`doompi could not read its synchronized state. Run doompi sync. (${n})`,`warning`)})}async function s(n){let s=t(process.cwd());if(!s)return;let c=e(s);if(!c)return;let l;try{l=await a(s)}catch(e){c(),o(n,e);return}try{let e=await import(r(l).href);if(typeof e.default!=`function`)throw Error(`DoomPi bootstrap does not export an extension factory: ${l}`);await e.default(n),n.on(i,()=>{c()})}catch(e){throw c(),e}}export{s as default};
|
|
2
|
+
//# sourceMappingURL=packageBootstrap.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageBootstrap.mjs","names":[],"sources":["../../src/adapters/packageBootstrap.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { acquireBootstrapClaim } from './bootstrapClaim.ts';\nimport { findSyncedRoot, readBootstrapStatus } from './bootstrapLocator.ts';\n\ntype ExtensionFactory = (api: ExtensionAPI) => void | Promise<void>;\n\nconst SESSION_START = 'session_start';\nconst WARNING = 'warning';\nconst UNUSABLE_STATE_MESSAGE = 'doompi could not read its synchronized state. Run doompi sync.';\n\nasync function currentBootstrap(repoRoot: string): Promise<string> {\n const status = readBootstrapStatus(repoRoot);\n if (status.fresh && status.bootstrap) return status.bootstrap;\n\n // The native shim writer and Doom runtime stay outside the static package\n // entry graph. A normal cache hit never evaluates either module.\n const { precompileSyncedRuntime } = await import('./startupPrecompiler.ts');\n return precompileSyncedRuntime(repoRoot).bootstrap;\n}\n\n/**\n * Reports a state this install cannot honour without failing Pi's startup.\n *\n * A state file written by a different DoomPi version, or by a different\n * repository, is a synchronization problem the user fixes with one command.\n * Throwing here would only turn it into an extension load failure, so the\n * detail is carried to the UI instead, which does not exist yet at load time.\n */\nfunction reportUnusableState(pi: ExtensionAPI, error: unknown): void {\n const detail = error instanceof Error ? error.message : String(error);\n pi.on(SESSION_START, (_event, ctx) => {\n ctx.ui.notify(`${UNUSABLE_STATE_MESSAGE} (${detail})`, WARNING);\n });\n}\n\n/** Stable user-package entry that delegates to a fresh synchronized bootstrap. */\nexport async function packageBootstrap(pi: ExtensionAPI): Promise<void> {\n const repoRoot = findSyncedRoot(process.cwd());\n // DoomPi is registered in user settings, so it is also discovered outside a\n // synchronized repository. Staying inert avoids loading the runtime globally.\n if (!repoRoot) return;\n\n // Claimed before the first await, so a sibling install registered from the\n // other settings scope cannot interleave. It reads nothing, compiles nothing,\n // and writes nothing: one install owns this repository's load cycle.\n const releaseClaim = acquireBootstrapClaim(repoRoot);\n if (!releaseClaim) return;\n\n let bootstrap: string;\n try {\n bootstrap = await currentBootstrap(repoRoot);\n } catch (error) {\n releaseClaim();\n reportUnusableState(pi, error);\n return;\n }\n\n try {\n const module = (await import(pathToFileURL(bootstrap).href)) as { default?: unknown };\n if (typeof module.default !== 'function') {\n throw new Error(`DoomPi bootstrap does not export an extension factory: ${bootstrap}`);\n }\n await (module.default as ExtensionFactory)(pi);\n // Released once Pi has started the runner this load produced, so a later\n // /reload composes again instead of finding the cycle still owned.\n pi.on(SESSION_START, () => {\n releaseClaim();\n });\n } catch (error) {\n releaseClaim();\n throw error;\n }\n}\n\nexport default packageBootstrap;\n"],"mappings":"uLAOA,MAAM,EAAgB,gBAItB,eAAe,EAAiB,EAAmC,CACjE,IAAM,EAAS,EAAoB,EAAS,CAC5C,GAAI,EAAO,OAAS,EAAO,UAAW,OAAO,EAAO,UAIpD,GAAM,CAAE,2BAA4B,MAAM,OAAO,4BACjD,OAAO,EAAwB,EAAS,CAAC,UAW3C,SAAS,EAAoB,EAAkB,EAAsB,CACnE,IAAM,EAAS,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CACrE,EAAG,GAAG,GAAgB,EAAQ,IAAQ,CACpC,EAAI,GAAG,OAAO,mEAA8B,EAAO,GAAI,UAAQ,EAC/D,CAIJ,eAAsB,EAAiB,EAAiC,CACtE,IAAM,EAAW,EAAe,QAAQ,KAAK,CAAC,CAG9C,GAAI,CAAC,EAAU,OAKf,IAAM,EAAe,EAAsB,EAAS,CACpD,GAAI,CAAC,EAAc,OAEnB,IAAI,EACJ,GAAI,CACF,EAAY,MAAM,EAAiB,EAAS,OACrC,EAAO,CACd,GAAc,CACd,EAAoB,EAAI,EAAM,CAC9B,OAGF,GAAI,CACF,IAAM,EAAU,MAAM,OAAO,EAAc,EAAU,CAAC,MACtD,GAAI,OAAO,EAAO,SAAY,WAC5B,MAAU,MAAM,0DAA0D,IAAY,CAExF,MAAO,EAAO,QAA6B,EAAG,CAG9C,EAAG,GAAG,MAAqB,CACzB,GAAc,EACd,OACK,EAAO,CAEd,MADA,GAAc,CACR"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./doomPackage.cjs`);let n=require(`node:url`),r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:fs`);i=e.__toESM(i,1);const a=t.DOOM_PACKAGE_NAME;function o(e){let n=r.default.resolve(e);for(;;){if(t.manifestName(n)===a)return n;let i=r.default.dirname(n);if(i===n)throw Error(`Could not locate installed ${a} package from ${e}`);n=i}}function s(e=require(`url`).pathToFileURL(__filename).href){return o(r.default.dirname((0,n.fileURLToPath)(e)))}function c(e){return r.default.join(e,...a.split(`/`))}function l(e){if(i.default.lstatSync(e,{throwIfNoEntry:!1})?.isSymbolicLink())try{return i.default.realpathSync(e)}catch{return}}function u(e,n=s()){let r=l(c(e));if(!r)return!1;try{return i.default.realpathSync(r)===i.default.realpathSync(n)&&t.manifestName(r)===a}catch{return!1}}function d(e,n=s()){if(t.manifestName(n)!==a)throw Error(`Cannot alias ${a} to a different package: ${n}`);let o=c(e),l=i.default.lstatSync(o,{throwIfNoEntry:!1});if(l&&!l.isSymbolicLink())throw Error(`Refusing to replace unmanaged Pi extension path: ${o}`);if(u(e,n))return o;let d=r.default.dirname(o),f=i.default.lstatSync(d,{throwIfNoEntry:!1});if(f&&!f.isDirectory())throw Error(`Refusing to use unmanaged Pi extension scope: ${d}`);i.default.mkdirSync(d,{recursive:!0});let p=process.platform===`win32`,m=i.default.realpathSync(d),h=i.default.realpathSync(n),g=p?h:r.default.relative(m,h),_=`${o}.${process.pid}.tmp`;i.default.rmSync(_,{force:!0}),i.default.symlinkSync(g,_,p?`junction`:`dir`);try{l&&i.default.rmSync(o,{force:!0}),i.default.renameSync(_,o)}catch(e){throw i.default.rmSync(_,{force:!0}),e}return o}exports.piExtensionAliasIsCurrent=u,exports.piExtensionAliasPath=c,exports.writePiExtensionAlias=d;
|
|
2
|
+
//# sourceMappingURL=piExtensionAlias.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piExtensionAlias.cjs","names":["DOOM_PACKAGE_NAME","path","manifestName","fs"],"sources":["../../src/adapters/piExtensionAlias.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { DOOM_PACKAGE_NAME, manifestName } from './doomPackage.ts';\n\n/**\n * Local package alias used by Pi's path-based user extension resolver.\n *\n * Pi resolves values in `settings.extensions` from its user configuration\n * directory instead of using Node's package resolver. Sync therefore creates\n * `$PI_CODING_AGENT_DIR/@agimon-ai/doompi` as a directory link to this installed\n * package while keeping the public settings value stable.\n */\nconst PACKAGE_NAME = DOOM_PACKAGE_NAME;\n\nfunction nearestPackageRoot(start: string): string {\n let directory = path.resolve(start);\n while (true) {\n if (manifestName(directory) === PACKAGE_NAME) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`Could not locate installed ${PACKAGE_NAME} package from ${start}`);\n directory = parent;\n }\n}\n\n/** Installed package root for the source or compiled module executing sync. */\nexport function doomPiPackageRoot(moduleUrl = import.meta.url): string {\n return nearestPackageRoot(path.dirname(fileURLToPath(moduleUrl)));\n}\n\n/** Path Pi derives from the stable settings extension value. */\nexport function piExtensionAliasPath(piDirectory: string): string {\n return path.join(piDirectory, ...PACKAGE_NAME.split('/'));\n}\n\nfunction linkedDirectory(linkPath: string): string | undefined {\n const stat = fs.lstatSync(linkPath, { throwIfNoEntry: false });\n if (!stat?.isSymbolicLink()) return undefined;\n try {\n return fs.realpathSync(linkPath);\n } catch {\n return undefined;\n }\n}\n\n/** True when the internal alias points at this installed package. */\nexport function piExtensionAliasIsCurrent(piDirectory: string, packageRoot = doomPiPackageRoot()): boolean {\n const aliasPath = piExtensionAliasPath(piDirectory);\n const linked = linkedDirectory(aliasPath);\n if (!linked) return false;\n try {\n return fs.realpathSync(linked) === fs.realpathSync(packageRoot) && manifestName(linked) === PACKAGE_NAME;\n } catch {\n return false;\n }\n}\n\n/**\n * Creates or repairs the DoomPi-owned local package alias.\n *\n * The link target is relative where the platform supports it so the user\n * configuration and its package installation can move together. Existing\n * non-links are never removed because sync cannot prove that it owns them.\n */\nexport function writePiExtensionAlias(piDirectory: string, packageRoot = doomPiPackageRoot()): string {\n if (manifestName(packageRoot) !== PACKAGE_NAME) {\n throw new Error(`Cannot alias ${PACKAGE_NAME} to a different package: ${packageRoot}`);\n }\n\n const aliasPath = piExtensionAliasPath(piDirectory);\n const current = fs.lstatSync(aliasPath, { throwIfNoEntry: false });\n if (current && !current.isSymbolicLink()) {\n throw new Error(`Refusing to replace unmanaged Pi extension path: ${aliasPath}`);\n }\n if (piExtensionAliasIsCurrent(piDirectory, packageRoot)) return aliasPath;\n\n const parent = path.dirname(aliasPath);\n const parentStat = fs.lstatSync(parent, { throwIfNoEntry: false });\n if (parentStat && !parentStat.isDirectory()) {\n throw new Error(`Refusing to use unmanaged Pi extension scope: ${parent}`);\n }\n fs.mkdirSync(parent, { recursive: true });\n\n const windows = process.platform === 'win32';\n // A Windows junction does not require symlink privileges, but its target must\n // be absolute. Other platforms use a relative directory link so moving the\n // repository and its local install together keeps the alias valid. Canonical\n // paths avoid macOS's `/tmp` -> `/private/tmp` spelling crossing the link.\n const canonicalParent = fs.realpathSync(parent);\n const canonicalPackageRoot = fs.realpathSync(packageRoot);\n const target = windows ? canonicalPackageRoot : path.relative(canonicalParent, canonicalPackageRoot);\n const temporaryPath = `${aliasPath}.${process.pid}.tmp`;\n fs.rmSync(temporaryPath, { force: true });\n fs.symlinkSync(target, temporaryPath, windows ? 'junction' : 'dir');\n try {\n // Rename is atomic on Unix. Windows cannot replace an existing junction in\n // one rename, so remove only the previously verified link immediately\n // before installing the complete replacement.\n if (current) fs.rmSync(aliasPath, { force: true });\n fs.renameSync(temporaryPath, aliasPath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n return aliasPath;\n}\n"],"mappings":"gMAaA,MAAM,EAAeA,EAAAA,kBAErB,SAAS,EAAmB,EAAuB,CACjD,IAAI,EAAYC,EAAAA,QAAK,QAAQ,EAAM,CACnC,OAAa,CACX,GAAIC,EAAAA,aAAa,EAAU,GAAK,EAAc,OAAO,EACrD,IAAM,EAASD,EAAAA,QAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,MAAU,MAAM,8BAA8B,EAAa,gBAAgB,IAAQ,CAC7G,EAAY,GAKhB,SAAgB,EAAkB,EAAA,QAAA,MAAA,CAAA,cAAA,WAAA,CAAA,KAAqC,CACrE,OAAO,EAAmBA,EAAAA,QAAK,SAAA,EAAA,EAAA,eAAsB,EAAU,CAAC,CAAC,CAInE,SAAgB,EAAqB,EAA6B,CAChE,OAAOA,EAAAA,QAAK,KAAK,EAAa,GAAG,EAAa,MAAM,IAAI,CAAC,CAG3D,SAAS,EAAgB,EAAsC,CAChDE,KAAAA,QAAG,UAAU,EAAU,CAAE,eAAgB,GAAO,CACpD,EAAE,gBAAgB,CAC3B,GAAI,CACF,OAAOA,EAAAA,QAAG,aAAa,EAAS,MAC1B,CACN,QAKJ,SAAgB,EAA0B,EAAqB,EAAc,GAAmB,CAAW,CAEzG,IAAM,EAAS,EADG,EAAqB,EACC,CAAC,CACzC,GAAI,CAAC,EAAQ,MAAO,GACpB,GAAI,CACF,OAAOA,EAAAA,QAAG,aAAa,EAAO,GAAKA,EAAAA,QAAG,aAAa,EAAY,EAAID,EAAAA,aAAa,EAAO,GAAK,OACtF,CACN,MAAO,IAWX,SAAgB,EAAsB,EAAqB,EAAc,GAAmB,CAAU,CACpG,GAAIA,EAAAA,aAAa,EAAY,GAAK,EAChC,MAAU,MAAM,gBAAgB,EAAa,2BAA2B,IAAc,CAGxF,IAAM,EAAY,EAAqB,EAAY,CAC7C,EAAUC,EAAAA,QAAG,UAAU,EAAW,CAAE,eAAgB,GAAO,CAAC,CAClE,GAAI,GAAW,CAAC,EAAQ,gBAAgB,CACtC,MAAU,MAAM,oDAAoD,IAAY,CAElF,GAAI,EAA0B,EAAa,EAAY,CAAE,OAAO,EAEhE,IAAM,EAASF,EAAAA,QAAK,QAAQ,EAAU,CAChC,EAAaE,EAAAA,QAAG,UAAU,EAAQ,CAAE,eAAgB,GAAO,CAAC,CAClE,GAAI,GAAc,CAAC,EAAW,aAAa,CACzC,MAAU,MAAM,iDAAiD,IAAS,CAE5E,EAAA,QAAG,UAAU,EAAQ,CAAE,UAAW,GAAM,CAAC,CAEzC,IAAM,EAAU,QAAQ,WAAa,QAK/B,EAAkBA,EAAAA,QAAG,aAAa,EAAO,CACzC,EAAuBA,EAAAA,QAAG,aAAa,EAAY,CACnD,EAAS,EAAU,EAAuBF,EAAAA,QAAK,SAAS,EAAiB,EAAqB,CAC9F,EAAgB,GAAG,EAAU,GAAG,QAAQ,IAAI,MAClD,EAAA,QAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACzC,EAAA,QAAG,YAAY,EAAQ,EAAe,EAAU,WAAa,MAAM,CACnE,GAAI,CAIE,GAAS,EAAA,QAAG,OAAO,EAAW,CAAE,MAAO,GAAM,CAAC,CAClD,EAAA,QAAG,WAAW,EAAe,EAAU,OAChC,EAAO,CAEd,MADA,EAAA,QAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACnC,EAER,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{DOOM_PACKAGE_NAME as e,manifestName as t}from"./doomPackage.mjs";import{fileURLToPath as n}from"node:url";import r from"node:path";import i from"node:fs";const a=e;function o(e){let n=r.resolve(e);for(;;){if(t(n)===a)return n;let i=r.dirname(n);if(i===n)throw Error(`Could not locate installed ${a} package from ${e}`);n=i}}function s(e=import.meta.url){return o(r.dirname(n(e)))}function c(e){return r.join(e,...a.split(`/`))}function l(e){if(i.lstatSync(e,{throwIfNoEntry:!1})?.isSymbolicLink())try{return i.realpathSync(e)}catch{return}}function u(e,n=s()){let r=l(c(e));if(!r)return!1;try{return i.realpathSync(r)===i.realpathSync(n)&&t(r)===a}catch{return!1}}function d(e,n=s()){if(t(n)!==a)throw Error(`Cannot alias ${a} to a different package: ${n}`);let o=c(e),l=i.lstatSync(o,{throwIfNoEntry:!1});if(l&&!l.isSymbolicLink())throw Error(`Refusing to replace unmanaged Pi extension path: ${o}`);if(u(e,n))return o;let d=r.dirname(o),f=i.lstatSync(d,{throwIfNoEntry:!1});if(f&&!f.isDirectory())throw Error(`Refusing to use unmanaged Pi extension scope: ${d}`);i.mkdirSync(d,{recursive:!0});let p=process.platform===`win32`,m=i.realpathSync(d),h=i.realpathSync(n),g=p?h:r.relative(m,h),_=`${o}.${process.pid}.tmp`;i.rmSync(_,{force:!0}),i.symlinkSync(g,_,p?`junction`:`dir`);try{l&&i.rmSync(o,{force:!0}),i.renameSync(_,o)}catch(e){throw i.rmSync(_,{force:!0}),e}return o}export{u as piExtensionAliasIsCurrent,c as piExtensionAliasPath,d as writePiExtensionAlias};
|
|
2
|
+
//# sourceMappingURL=piExtensionAlias.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piExtensionAlias.mjs","names":[],"sources":["../../src/adapters/piExtensionAlias.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { DOOM_PACKAGE_NAME, manifestName } from './doomPackage.ts';\n\n/**\n * Local package alias used by Pi's path-based user extension resolver.\n *\n * Pi resolves values in `settings.extensions` from its user configuration\n * directory instead of using Node's package resolver. Sync therefore creates\n * `$PI_CODING_AGENT_DIR/@agimon-ai/doompi` as a directory link to this installed\n * package while keeping the public settings value stable.\n */\nconst PACKAGE_NAME = DOOM_PACKAGE_NAME;\n\nfunction nearestPackageRoot(start: string): string {\n let directory = path.resolve(start);\n while (true) {\n if (manifestName(directory) === PACKAGE_NAME) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`Could not locate installed ${PACKAGE_NAME} package from ${start}`);\n directory = parent;\n }\n}\n\n/** Installed package root for the source or compiled module executing sync. */\nexport function doomPiPackageRoot(moduleUrl = import.meta.url): string {\n return nearestPackageRoot(path.dirname(fileURLToPath(moduleUrl)));\n}\n\n/** Path Pi derives from the stable settings extension value. */\nexport function piExtensionAliasPath(piDirectory: string): string {\n return path.join(piDirectory, ...PACKAGE_NAME.split('/'));\n}\n\nfunction linkedDirectory(linkPath: string): string | undefined {\n const stat = fs.lstatSync(linkPath, { throwIfNoEntry: false });\n if (!stat?.isSymbolicLink()) return undefined;\n try {\n return fs.realpathSync(linkPath);\n } catch {\n return undefined;\n }\n}\n\n/** True when the internal alias points at this installed package. */\nexport function piExtensionAliasIsCurrent(piDirectory: string, packageRoot = doomPiPackageRoot()): boolean {\n const aliasPath = piExtensionAliasPath(piDirectory);\n const linked = linkedDirectory(aliasPath);\n if (!linked) return false;\n try {\n return fs.realpathSync(linked) === fs.realpathSync(packageRoot) && manifestName(linked) === PACKAGE_NAME;\n } catch {\n return false;\n }\n}\n\n/**\n * Creates or repairs the DoomPi-owned local package alias.\n *\n * The link target is relative where the platform supports it so the user\n * configuration and its package installation can move together. Existing\n * non-links are never removed because sync cannot prove that it owns them.\n */\nexport function writePiExtensionAlias(piDirectory: string, packageRoot = doomPiPackageRoot()): string {\n if (manifestName(packageRoot) !== PACKAGE_NAME) {\n throw new Error(`Cannot alias ${PACKAGE_NAME} to a different package: ${packageRoot}`);\n }\n\n const aliasPath = piExtensionAliasPath(piDirectory);\n const current = fs.lstatSync(aliasPath, { throwIfNoEntry: false });\n if (current && !current.isSymbolicLink()) {\n throw new Error(`Refusing to replace unmanaged Pi extension path: ${aliasPath}`);\n }\n if (piExtensionAliasIsCurrent(piDirectory, packageRoot)) return aliasPath;\n\n const parent = path.dirname(aliasPath);\n const parentStat = fs.lstatSync(parent, { throwIfNoEntry: false });\n if (parentStat && !parentStat.isDirectory()) {\n throw new Error(`Refusing to use unmanaged Pi extension scope: ${parent}`);\n }\n fs.mkdirSync(parent, { recursive: true });\n\n const windows = process.platform === 'win32';\n // A Windows junction does not require symlink privileges, but its target must\n // be absolute. Other platforms use a relative directory link so moving the\n // repository and its local install together keeps the alias valid. Canonical\n // paths avoid macOS's `/tmp` -> `/private/tmp` spelling crossing the link.\n const canonicalParent = fs.realpathSync(parent);\n const canonicalPackageRoot = fs.realpathSync(packageRoot);\n const target = windows ? canonicalPackageRoot : path.relative(canonicalParent, canonicalPackageRoot);\n const temporaryPath = `${aliasPath}.${process.pid}.tmp`;\n fs.rmSync(temporaryPath, { force: true });\n fs.symlinkSync(target, temporaryPath, windows ? 'junction' : 'dir');\n try {\n // Rename is atomic on Unix. Windows cannot replace an existing junction in\n // one rename, so remove only the previously verified link immediately\n // before installing the complete replacement.\n if (current) fs.rmSync(aliasPath, { force: true });\n fs.renameSync(temporaryPath, aliasPath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n return aliasPath;\n}\n"],"mappings":"iKAaA,MAAM,EAAe,EAErB,SAAS,EAAmB,EAAuB,CACjD,IAAI,EAAY,EAAK,QAAQ,EAAM,CACnC,OAAa,CACX,GAAI,EAAa,EAAU,GAAK,EAAc,OAAO,EACrD,IAAM,EAAS,EAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,MAAU,MAAM,8BAA8B,EAAa,gBAAgB,IAAQ,CAC7G,EAAY,GAKhB,SAAgB,EAAkB,EAAY,OAAO,KAAK,IAAa,CACrE,OAAO,EAAmB,EAAK,QAAQ,EAAc,EAAU,CAAC,CAAC,CAInE,SAAgB,EAAqB,EAA6B,CAChE,OAAO,EAAK,KAAK,EAAa,GAAG,EAAa,MAAM,IAAI,CAAC,CAG3D,SAAS,EAAgB,EAAsC,CAChD,KAAG,UAAU,EAAU,CAAE,eAAgB,GAAO,CACpD,EAAE,gBAAgB,CAC3B,GAAI,CACF,OAAO,EAAG,aAAa,EAAS,MAC1B,CACN,QAKJ,SAAgB,EAA0B,EAAqB,EAAc,GAAmB,CAAW,CAEzG,IAAM,EAAS,EADG,EAAqB,EACC,CAAC,CACzC,GAAI,CAAC,EAAQ,MAAO,GACpB,GAAI,CACF,OAAO,EAAG,aAAa,EAAO,GAAK,EAAG,aAAa,EAAY,EAAI,EAAa,EAAO,GAAK,OACtF,CACN,MAAO,IAWX,SAAgB,EAAsB,EAAqB,EAAc,GAAmB,CAAU,CACpG,GAAI,EAAa,EAAY,GAAK,EAChC,MAAU,MAAM,gBAAgB,EAAa,2BAA2B,IAAc,CAGxF,IAAM,EAAY,EAAqB,EAAY,CAC7C,EAAU,EAAG,UAAU,EAAW,CAAE,eAAgB,GAAO,CAAC,CAClE,GAAI,GAAW,CAAC,EAAQ,gBAAgB,CACtC,MAAU,MAAM,oDAAoD,IAAY,CAElF,GAAI,EAA0B,EAAa,EAAY,CAAE,OAAO,EAEhE,IAAM,EAAS,EAAK,QAAQ,EAAU,CAChC,EAAa,EAAG,UAAU,EAAQ,CAAE,eAAgB,GAAO,CAAC,CAClE,GAAI,GAAc,CAAC,EAAW,aAAa,CACzC,MAAU,MAAM,iDAAiD,IAAS,CAE5E,EAAG,UAAU,EAAQ,CAAE,UAAW,GAAM,CAAC,CAEzC,IAAM,EAAU,QAAQ,WAAa,QAK/B,EAAkB,EAAG,aAAa,EAAO,CACzC,EAAuB,EAAG,aAAa,EAAY,CACnD,EAAS,EAAU,EAAuB,EAAK,SAAS,EAAiB,EAAqB,CAC9F,EAAgB,GAAG,EAAU,GAAG,QAAQ,IAAI,MAClD,EAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACzC,EAAG,YAAY,EAAQ,EAAe,EAAU,WAAa,MAAM,CACnE,GAAI,CAIE,GAAS,EAAG,OAAO,EAAW,CAAE,MAAO,GAAM,CAAC,CAClD,EAAG,WAAW,EAAe,EAAU,OAChC,EAAO,CAEd,MADA,EAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACnC,EAER,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./serialization/json.cjs`);require(`../utils/index.cjs`);const n=require(`./doomPackage.cjs`);let r=require(`node:path`);r=e.__toESM(r,1);let i=require(`node:os`);i=e.__toESM(i,1);const a=`extensions`,o=`themes`,s=`theme`,c=n.DOOM_PACKAGE_NAME,l=`!extensions/**`;function u(e=process.env,t=i.default.homedir()){let n=e.PI_CODING_AGENT_DIR?.trim();return n?n===`~`?t:n.startsWith(`~/`)?r.default.join(t,n.slice(2)):r.default.resolve(n):r.default.join(t,`.pi`,`agent`)}function d(e){return r.default.join(e,`settings.json`)}function f(e){return r.default.join(e,`themes`)}function p(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function m(e,t){let n=r.default.relative(e,t);return n.startsWith(`..`)||r.default.isAbsolute(n)?t:n.split(r.default.sep).join(`/`)}function h(e){let t=e.replaceAll(`\\`,`/`);return t===c||t===`!extensions/**`}function g(e,t){let n=e.replaceAll(`\\`,`/`);return n.endsWith(`/doom/${t}.json`)||n===`doom/${t}.json`}function _(e,t,n){let r=m(t,n.themePath),i=[c,l,...p(e[a]).filter(e=>!h(e))],u=[r,...p(e[o]).filter(e=>e!==r&&!g(e,n.themeName))];return{...e,quietStartup:!0,[a]:i,[o]:u,[s]:typeof e[s]==`string`?e[s]:n.themeName}}function v(e){let n=t.readJson(d(e));return t.isRecord(n)?n:{}}function y(e){return`${JSON.stringify(e,null,2)}\n`}function b(e,n){let r=d(e);return t.writeFileAtomic(r,y(_(v(e),e,n))),r}exports.AMBIENT_EXTENSION_FILTER=l,exports.DOOM_EXTENSION=c,exports.mergePiSettings=_,exports.piAgentDirectory=u,exports.piSettingsPath=d,exports.piThemeDirectory=f,exports.readPiSettings=v,exports.serializePiSettings=y,exports.writePiSettings=b;
|
|
2
|
+
//# sourceMappingURL=piSettings.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piSettings.cjs","names":["DOOM_PACKAGE_NAME","os","path","readJson","isRecord"],"sources":["../../src/adapters/piSettings.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport { isRecord, type JsonObject, readJson, writeFileAtomic } from '../utils/index.ts';\nimport { DOOM_PACKAGE_NAME } from './doomPackage.ts';\n\n/**\n * Pi's user settings, as `doompi sync` maintains them.\n *\n * The Doom package is registered globally so a plain `pi` process can find the\n * lightweight package bootstrap before project resources are trusted. Sync owns\n * the extension registration, ambient-discovery filter, theme resource, selected default theme, and quiet-startup keys\n * while preserving every unrelated user setting.\n */\n\nconst PI_CODING_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nconst PI_DIRECTORY = '.pi';\nconst AGENT_DIRECTORY = 'agent';\nconst SETTINGS_FILE = 'settings.json';\nconst THEMES_DIRECTORY = 'themes';\nconst EXTENSIONS_KEY = 'extensions';\nconst THEMES_KEY = 'themes';\nconst THEME_KEY = 'theme';\nconst QUIET_STARTUP_KEY = 'quietStartup';\nconst HOME_ALIAS = '~';\nconst HOME_ALIAS_PREFIX = '~/';\n/** The stable package entry Pi loads for every synced repository. */\nexport const DOOM_EXTENSION = DOOM_PACKAGE_NAME;\n/** Suppresses Pi's ambient extension-directory scan while leaving explicit sources intact. */\nexport const AMBIENT_EXTENSION_FILTER = '!extensions/**';\nexport interface PiSettingsUpdate {\n /** Absolute path to the synchronized user theme file. */\n themePath: string;\n themeName: string;\n}\n\n/** Pi's user configuration directory, honoring its documented override. */\nexport function piAgentDirectory(\n environment: NodeJS.ProcessEnv = process.env,\n homeDirectory: string = os.homedir(),\n): string {\n const configured = environment[PI_CODING_AGENT_DIR_ENV]?.trim();\n if (!configured) return path.join(homeDirectory, PI_DIRECTORY, AGENT_DIRECTORY);\n if (configured === HOME_ALIAS) return homeDirectory;\n if (configured.startsWith(HOME_ALIAS_PREFIX)) {\n return path.join(homeDirectory, configured.slice(HOME_ALIAS_PREFIX.length));\n }\n return path.resolve(configured);\n}\n\nexport function piSettingsPath(agentDirectory: string): string {\n return path.join(agentDirectory, SETTINGS_FILE);\n}\n\nexport function piThemeDirectory(agentDirectory: string): string {\n return path.join(agentDirectory, THEMES_DIRECTORY);\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n}\n\nfunction settingsRelativePath(agentDirectory: string, target: string): string {\n const relative = path.relative(agentDirectory, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) return target;\n return relative.split(path.sep).join('/');\n}\n\nfunction isManagedExtension(value: string): boolean {\n const normalized = value.replaceAll('\\\\', '/');\n return normalized === DOOM_EXTENSION || normalized === AMBIENT_EXTENSION_FILTER;\n}\n\nfunction isLegacyDoomTheme(value: string, themeName: string): boolean {\n const normalized = value.replaceAll('\\\\', '/');\n return normalized.endsWith(`/doom/${themeName}.json`) || normalized === `doom/${themeName}.json`;\n}\n\n/** Produces the user settings content for an update, without writing it. */\nexport function mergePiSettings(current: JsonObject, agentDirectory: string, update: PiSettingsUpdate): JsonObject {\n const theme = settingsRelativePath(agentDirectory, update.themePath);\n // First in the list, so the harness environment is hydrated before any\n // extension a user added themselves runs. The filter affects only Pi's\n // automatic extensions/** scan; explicit settings and CLI entries still load.\n const extensions = [\n DOOM_EXTENSION,\n AMBIENT_EXTENSION_FILTER,\n ...stringList(current[EXTENSIONS_KEY]).filter((value) => !isManagedExtension(value)),\n ];\n const themes = [\n theme,\n ...stringList(current[THEMES_KEY]).filter(\n (value) => value !== theme && !isLegacyDoomTheme(value, update.themeName),\n ),\n ];\n return {\n ...current,\n [QUIET_STARTUP_KEY]: true,\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(agentDirectory: string): JsonObject {\n const settings = readJson(piSettingsPath(agentDirectory));\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 Pi's user settings file. */\nexport function writePiSettings(agentDirectory: string, update: PiSettingsUpdate): string {\n const settingsPath = piSettingsPath(agentDirectory);\n writeFileAtomic(\n settingsPath,\n serializePiSettings(mergePiSettings(readPiSettings(agentDirectory), agentDirectory, update)),\n );\n return settingsPath;\n}\n"],"mappings":"oPAcA,MAKM,EAAiB,aACjB,EAAa,SACb,EAAY,QAKL,EAAiBA,EAAAA,kBAEjB,EAA2B,iBAQxC,SAAgB,EACd,EAAiC,QAAQ,IACzC,EAAwBC,EAAAA,QAAG,SAAS,CAC5B,CACR,IAAM,EAAa,EAAY,qBAA0B,MAAM,CAM/D,OALK,EACD,IAAe,IAAmB,EAClC,EAAW,WAAW,KAAkB,CACnCC,EAAAA,QAAK,KAAK,EAAe,EAAW,MAAM,EAAyB,CAAC,CAEtEA,EAAAA,QAAK,QAAQ,EAAW,CALPA,EAAAA,QAAK,KAAK,EAAe,MAAc,QAAgB,CAQjF,SAAgB,EAAe,EAAgC,CAC7D,OAAOA,EAAAA,QAAK,KAAK,EAAgB,gBAAc,CAGjD,SAAgB,EAAiB,EAAgC,CAC/D,OAAOA,EAAAA,QAAK,KAAK,EAAgB,SAAiB,CAGpD,SAAS,EAAW,EAA0B,CAC5C,OAAO,MAAM,QAAQ,EAAM,CAAG,EAAM,OAAQ,GAA2B,OAAO,GAAU,SAAS,CAAG,EAAE,CAGxG,SAAS,EAAqB,EAAwB,EAAwB,CAC5E,IAAM,EAAWA,EAAAA,QAAK,SAAS,EAAgB,EAAO,CAEtD,OADI,EAAS,WAAW,KAAK,EAAIA,EAAAA,QAAK,WAAW,EAAS,CAAS,EAC5D,EAAS,MAAMA,EAAAA,QAAK,IAAI,CAAC,KAAK,IAAI,CAG3C,SAAS,EAAmB,EAAwB,CAClD,IAAM,EAAa,EAAM,WAAW,KAAM,IAAI,CAC9C,OAAO,IAAe,GAAkB,IAAA,iBAG1C,SAAS,EAAkB,EAAe,EAA4B,CACpE,IAAM,EAAa,EAAM,WAAW,KAAM,IAAI,CAC9C,OAAO,EAAW,SAAS,SAAS,EAAU,OAAO,EAAI,IAAe,QAAQ,EAAU,OAI5F,SAAgB,EAAgB,EAAqB,EAAwB,EAAsC,CACjH,IAAM,EAAQ,EAAqB,EAAgB,EAAO,UAAU,CAI9D,EAAa,CACjB,EACA,EACA,GAAG,EAAW,EAAQ,GAAgB,CAAC,OAAQ,GAAU,CAAC,EAAmB,EAAM,CAAC,CACrF,CACK,EAAS,CACb,EACA,GAAG,EAAW,EAAQ,GAAY,CAAC,OAChC,GAAU,IAAU,GAAS,CAAC,EAAkB,EAAO,EAAO,UAAU,CAC1E,CACF,CACD,MAAO,CACL,GAAG,EACF,aAAoB,IACpB,GAAiB,GACjB,GAAa,GAGb,GAAY,OAAO,EAAQ,IAAe,SAAW,EAAQ,GAAa,EAAO,UACnF,CAGH,SAAgB,EAAe,EAAoC,CACjE,IAAM,EAAWC,EAAAA,SAAS,EAAe,EAAe,CAAC,CACzD,OAAOC,EAAAA,SAAS,EAAS,CAAG,EAAW,EAAE,CAG3C,SAAgB,EAAoB,EAA8B,CAChE,MAAO,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAI9C,SAAgB,EAAgB,EAAwB,EAAkC,CACxF,IAAM,EAAe,EAAe,EAAe,CAKnD,OAJA,EAAA,gBACE,EACA,EAAoB,EAAgB,EAAe,EAAe,CAAE,EAAgB,EAAO,CAAC,CAC7F,CACM"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { JsonObject } from "./serialization/json.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/piSettings.d.ts
|
|
4
|
+
/** The stable package entry Pi loads for every synced repository. */
|
|
5
|
+
declare const DOOM_EXTENSION = "@agimon-ai/doompi";
|
|
6
|
+
/** Suppresses Pi's ambient extension-directory scan while leaving explicit sources intact. */
|
|
7
|
+
declare const AMBIENT_EXTENSION_FILTER = "!extensions/**";
|
|
8
|
+
interface PiSettingsUpdate {
|
|
9
|
+
/** Absolute path to the synchronized user theme file. */
|
|
10
|
+
themePath: string;
|
|
11
|
+
themeName: string;
|
|
12
|
+
}
|
|
13
|
+
/** Pi's user configuration directory, honoring its documented override. */
|
|
14
|
+
declare function piAgentDirectory(environment?: NodeJS.ProcessEnv, homeDirectory?: string): string;
|
|
15
|
+
declare function piSettingsPath(agentDirectory: string): string;
|
|
16
|
+
declare function piThemeDirectory(agentDirectory: string): string;
|
|
17
|
+
/** Produces the user settings content for an update, without writing it. */
|
|
18
|
+
declare function mergePiSettings(current: JsonObject, agentDirectory: string, update: PiSettingsUpdate): JsonObject;
|
|
19
|
+
declare function readPiSettings(agentDirectory: string): JsonObject;
|
|
20
|
+
declare function serializePiSettings(settings: JsonObject): string;
|
|
21
|
+
/** Merges the Doom-owned keys into Pi's user settings file. */
|
|
22
|
+
declare function writePiSettings(agentDirectory: string, update: PiSettingsUpdate): string;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { AMBIENT_EXTENSION_FILTER, DOOM_EXTENSION, PiSettingsUpdate, mergePiSettings, piAgentDirectory, piSettingsPath, piThemeDirectory, readPiSettings, serializePiSettings, writePiSettings };
|
|
25
|
+
//# sourceMappingURL=piSettings.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piSettings.d.cts","names":[],"sources":["../../src/adapters/piSettings.ts"],"mappings":";;;;cA0Ba,cAAA;AAAb;AAAA,cAEa,wBAAA;AAAA,UACI,gBAAA;EAHU;EAKzB,SAAA;EACA,SAAA;AAAA;;iBAIc,gBAAA,CACd,WAAA,GAAa,MAAA,CAAO,UAAA,EACpB,aAAA;AAAA,iBAWc,cAAA,CAAe,cAAA;AAAA,iBAIf,gBAAA,CAAiB,cAAA;;iBAyBjB,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,cAAA,UAAwB,MAAA,EAAQ,gBAAA,GAAmB,UAAA;AAAA,iBA2BxF,cAAA,CAAe,cAAA,WAAyB,UAAA;AAAA,iBAKxC,mBAAA,CAAoB,QAAA,EAAU,UAAA;AA1E9C;AAAA,iBA+EgB,eAAA,CAAgB,cAAA,UAAwB,MAAA,EAAQ,gBAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { JsonObject } from "./serialization/json.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/piSettings.d.ts
|
|
4
|
+
/** The stable package entry Pi loads for every synced repository. */
|
|
5
|
+
declare const DOOM_EXTENSION = "@agimon-ai/doompi";
|
|
6
|
+
/** Suppresses Pi's ambient extension-directory scan while leaving explicit sources intact. */
|
|
7
|
+
declare const AMBIENT_EXTENSION_FILTER = "!extensions/**";
|
|
8
|
+
interface PiSettingsUpdate {
|
|
9
|
+
/** Absolute path to the synchronized user theme file. */
|
|
10
|
+
themePath: string;
|
|
11
|
+
themeName: string;
|
|
12
|
+
}
|
|
13
|
+
/** Pi's user configuration directory, honoring its documented override. */
|
|
14
|
+
declare function piAgentDirectory(environment?: NodeJS.ProcessEnv, homeDirectory?: string): string;
|
|
15
|
+
declare function piSettingsPath(agentDirectory: string): string;
|
|
16
|
+
declare function piThemeDirectory(agentDirectory: string): string;
|
|
17
|
+
/** Produces the user settings content for an update, without writing it. */
|
|
18
|
+
declare function mergePiSettings(current: JsonObject, agentDirectory: string, update: PiSettingsUpdate): JsonObject;
|
|
19
|
+
declare function readPiSettings(agentDirectory: string): JsonObject;
|
|
20
|
+
declare function serializePiSettings(settings: JsonObject): string;
|
|
21
|
+
/** Merges the Doom-owned keys into Pi's user settings file. */
|
|
22
|
+
declare function writePiSettings(agentDirectory: string, update: PiSettingsUpdate): string;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { AMBIENT_EXTENSION_FILTER, DOOM_EXTENSION, PiSettingsUpdate, mergePiSettings, piAgentDirectory, piSettingsPath, piThemeDirectory, readPiSettings, serializePiSettings, writePiSettings };
|
|
25
|
+
//# sourceMappingURL=piSettings.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piSettings.d.mts","names":[],"sources":["../../src/adapters/piSettings.ts"],"mappings":";;;;cA0Ba,cAAA;AAAb;AAAA,cAEa,wBAAA;AAAA,UACI,gBAAA;EAHU;EAKzB,SAAA;EACA,SAAA;AAAA;;iBAIc,gBAAA,CACd,WAAA,GAAa,MAAA,CAAO,UAAA,EACpB,aAAA;AAAA,iBAWc,cAAA,CAAe,cAAA;AAAA,iBAIf,gBAAA,CAAiB,cAAA;;iBAyBjB,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,cAAA,UAAwB,MAAA,EAAQ,gBAAA,GAAmB,UAAA;AAAA,iBA2BxF,cAAA,CAAe,cAAA,WAAyB,UAAA;AAAA,iBAKxC,mBAAA,CAAoB,QAAA,EAAU,UAAA;AA1E9C;AAAA,iBA+EgB,eAAA,CAAgB,cAAA,UAAwB,MAAA,EAAQ,gBAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{isRecord as e,readJson as t,writeFileAtomic as n}from"./serialization/json.mjs";import"../utils/index.mjs";import{DOOM_PACKAGE_NAME as r}from"./doomPackage.mjs";import i from"node:path";import a from"node:os";const o=`extensions`,s=`themes`,c=`theme`,l=r,u=`!extensions/**`;function d(e=process.env,t=a.homedir()){let n=e.PI_CODING_AGENT_DIR?.trim();return n?n===`~`?t:n.startsWith(`~/`)?i.join(t,n.slice(2)):i.resolve(n):i.join(t,`.pi`,`agent`)}function f(e){return i.join(e,`settings.json`)}function p(e){return i.join(e,`themes`)}function m(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function h(e,t){let n=i.relative(e,t);return n.startsWith(`..`)||i.isAbsolute(n)?t:n.split(i.sep).join(`/`)}function g(e){let t=e.replaceAll(`\\`,`/`);return t===l||t===`!extensions/**`}function _(e,t){let n=e.replaceAll(`\\`,`/`);return n.endsWith(`/doom/${t}.json`)||n===`doom/${t}.json`}function v(e,t,n){let r=h(t,n.themePath),i=[l,u,...m(e[o]).filter(e=>!g(e))],a=[r,...m(e[s]).filter(e=>e!==r&&!_(e,n.themeName))];return{...e,quietStartup:!0,[o]:i,[s]:a,[c]:typeof e[c]==`string`?e[c]:n.themeName}}function y(n){let r=t(f(n));return e(r)?r:{}}function b(e){return`${JSON.stringify(e,null,2)}\n`}function x(e,t){let r=f(e);return n(r,b(v(y(e),e,t))),r}export{u as AMBIENT_EXTENSION_FILTER,l as DOOM_EXTENSION,v as mergePiSettings,d as piAgentDirectory,f as piSettingsPath,p as piThemeDirectory,y as readPiSettings,b as serializePiSettings,x as writePiSettings};
|
|
2
|
+
//# sourceMappingURL=piSettings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"piSettings.mjs","names":[],"sources":["../../src/adapters/piSettings.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport { isRecord, type JsonObject, readJson, writeFileAtomic } from '../utils/index.ts';\nimport { DOOM_PACKAGE_NAME } from './doomPackage.ts';\n\n/**\n * Pi's user settings, as `doompi sync` maintains them.\n *\n * The Doom package is registered globally so a plain `pi` process can find the\n * lightweight package bootstrap before project resources are trusted. Sync owns\n * the extension registration, ambient-discovery filter, theme resource, selected default theme, and quiet-startup keys\n * while preserving every unrelated user setting.\n */\n\nconst PI_CODING_AGENT_DIR_ENV = 'PI_CODING_AGENT_DIR';\nconst PI_DIRECTORY = '.pi';\nconst AGENT_DIRECTORY = 'agent';\nconst SETTINGS_FILE = 'settings.json';\nconst THEMES_DIRECTORY = 'themes';\nconst EXTENSIONS_KEY = 'extensions';\nconst THEMES_KEY = 'themes';\nconst THEME_KEY = 'theme';\nconst QUIET_STARTUP_KEY = 'quietStartup';\nconst HOME_ALIAS = '~';\nconst HOME_ALIAS_PREFIX = '~/';\n/** The stable package entry Pi loads for every synced repository. */\nexport const DOOM_EXTENSION = DOOM_PACKAGE_NAME;\n/** Suppresses Pi's ambient extension-directory scan while leaving explicit sources intact. */\nexport const AMBIENT_EXTENSION_FILTER = '!extensions/**';\nexport interface PiSettingsUpdate {\n /** Absolute path to the synchronized user theme file. */\n themePath: string;\n themeName: string;\n}\n\n/** Pi's user configuration directory, honoring its documented override. */\nexport function piAgentDirectory(\n environment: NodeJS.ProcessEnv = process.env,\n homeDirectory: string = os.homedir(),\n): string {\n const configured = environment[PI_CODING_AGENT_DIR_ENV]?.trim();\n if (!configured) return path.join(homeDirectory, PI_DIRECTORY, AGENT_DIRECTORY);\n if (configured === HOME_ALIAS) return homeDirectory;\n if (configured.startsWith(HOME_ALIAS_PREFIX)) {\n return path.join(homeDirectory, configured.slice(HOME_ALIAS_PREFIX.length));\n }\n return path.resolve(configured);\n}\n\nexport function piSettingsPath(agentDirectory: string): string {\n return path.join(agentDirectory, SETTINGS_FILE);\n}\n\nexport function piThemeDirectory(agentDirectory: string): string {\n return path.join(agentDirectory, THEMES_DIRECTORY);\n}\n\nfunction stringList(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : [];\n}\n\nfunction settingsRelativePath(agentDirectory: string, target: string): string {\n const relative = path.relative(agentDirectory, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) return target;\n return relative.split(path.sep).join('/');\n}\n\nfunction isManagedExtension(value: string): boolean {\n const normalized = value.replaceAll('\\\\', '/');\n return normalized === DOOM_EXTENSION || normalized === AMBIENT_EXTENSION_FILTER;\n}\n\nfunction isLegacyDoomTheme(value: string, themeName: string): boolean {\n const normalized = value.replaceAll('\\\\', '/');\n return normalized.endsWith(`/doom/${themeName}.json`) || normalized === `doom/${themeName}.json`;\n}\n\n/** Produces the user settings content for an update, without writing it. */\nexport function mergePiSettings(current: JsonObject, agentDirectory: string, update: PiSettingsUpdate): JsonObject {\n const theme = settingsRelativePath(agentDirectory, update.themePath);\n // First in the list, so the harness environment is hydrated before any\n // extension a user added themselves runs. The filter affects only Pi's\n // automatic extensions/** scan; explicit settings and CLI entries still load.\n const extensions = [\n DOOM_EXTENSION,\n AMBIENT_EXTENSION_FILTER,\n ...stringList(current[EXTENSIONS_KEY]).filter((value) => !isManagedExtension(value)),\n ];\n const themes = [\n theme,\n ...stringList(current[THEMES_KEY]).filter(\n (value) => value !== theme && !isLegacyDoomTheme(value, update.themeName),\n ),\n ];\n return {\n ...current,\n [QUIET_STARTUP_KEY]: true,\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(agentDirectory: string): JsonObject {\n const settings = readJson(piSettingsPath(agentDirectory));\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 Pi's user settings file. */\nexport function writePiSettings(agentDirectory: string, update: PiSettingsUpdate): string {\n const settingsPath = piSettingsPath(agentDirectory);\n writeFileAtomic(\n settingsPath,\n serializePiSettings(mergePiSettings(readPiSettings(agentDirectory), agentDirectory, update)),\n );\n return settingsPath;\n}\n"],"mappings":"wNAcA,MAKM,EAAiB,aACjB,EAAa,SACb,EAAY,QAKL,EAAiB,EAEjB,EAA2B,iBAQxC,SAAgB,EACd,EAAiC,QAAQ,IACzC,EAAwB,EAAG,SAAS,CAC5B,CACR,IAAM,EAAa,EAAY,qBAA0B,MAAM,CAM/D,OALK,EACD,IAAe,IAAmB,EAClC,EAAW,WAAW,KAAkB,CACnC,EAAK,KAAK,EAAe,EAAW,MAAM,EAAyB,CAAC,CAEtE,EAAK,QAAQ,EAAW,CALP,EAAK,KAAK,EAAe,MAAc,QAAgB,CAQjF,SAAgB,EAAe,EAAgC,CAC7D,OAAO,EAAK,KAAK,EAAgB,gBAAc,CAGjD,SAAgB,EAAiB,EAAgC,CAC/D,OAAO,EAAK,KAAK,EAAgB,SAAiB,CAGpD,SAAS,EAAW,EAA0B,CAC5C,OAAO,MAAM,QAAQ,EAAM,CAAG,EAAM,OAAQ,GAA2B,OAAO,GAAU,SAAS,CAAG,EAAE,CAGxG,SAAS,EAAqB,EAAwB,EAAwB,CAC5E,IAAM,EAAW,EAAK,SAAS,EAAgB,EAAO,CAEtD,OADI,EAAS,WAAW,KAAK,EAAI,EAAK,WAAW,EAAS,CAAS,EAC5D,EAAS,MAAM,EAAK,IAAI,CAAC,KAAK,IAAI,CAG3C,SAAS,EAAmB,EAAwB,CAClD,IAAM,EAAa,EAAM,WAAW,KAAM,IAAI,CAC9C,OAAO,IAAe,GAAkB,IAAA,iBAG1C,SAAS,EAAkB,EAAe,EAA4B,CACpE,IAAM,EAAa,EAAM,WAAW,KAAM,IAAI,CAC9C,OAAO,EAAW,SAAS,SAAS,EAAU,OAAO,EAAI,IAAe,QAAQ,EAAU,OAI5F,SAAgB,EAAgB,EAAqB,EAAwB,EAAsC,CACjH,IAAM,EAAQ,EAAqB,EAAgB,EAAO,UAAU,CAI9D,EAAa,CACjB,EACA,EACA,GAAG,EAAW,EAAQ,GAAgB,CAAC,OAAQ,GAAU,CAAC,EAAmB,EAAM,CAAC,CACrF,CACK,EAAS,CACb,EACA,GAAG,EAAW,EAAQ,GAAY,CAAC,OAChC,GAAU,IAAU,GAAS,CAAC,EAAkB,EAAO,EAAO,UAAU,CAC1E,CACF,CACD,MAAO,CACL,GAAG,EACF,aAAoB,IACpB,GAAiB,GACjB,GAAa,GAGb,GAAY,OAAO,EAAQ,IAAe,SAAW,EAAQ,GAAa,EAAO,UACnF,CAGH,SAAgB,EAAe,EAAoC,CACjE,IAAM,EAAW,EAAS,EAAe,EAAe,CAAC,CACzD,OAAO,EAAS,EAAS,CAAG,EAAW,EAAE,CAG3C,SAAgB,EAAoB,EAA8B,CAChE,MAAO,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAI9C,SAAgB,EAAgB,EAAwB,EAAkC,CACxF,IAAM,EAAe,EAAe,EAAe,CAKnD,OAJA,EACE,EACA,EAAoB,EAAgB,EAAe,EAAe,CAAE,EAAgB,EAAO,CAAC,CAC7F,CACM"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`);t=e.__toESM(t,1);let n=require(`node:fs`);n=e.__toESM(n,1);let r=require(`@agimon-ai/doompi-config/domains`),i=require(`node:child_process`);const a=`.doompi-plugin.json`,o=64*1024;function s(e,t){let n=e+t.toString(`utf8`);return n.length<=o?n:n.slice(-o)}function c(e,t,n={}){return new Promise((r,a)=>{let o=(0,i.spawn)(e,t,{cwd:n.cwd,env:n.environment??process.env,stdio:[`ignore`,`pipe`,`pipe`]}),c=``,l=``;o.stdout.on(`data`,e=>{c=s(c,e)}),o.stderr.on(`data`,e=>{l=s(l,e)}),o.once(`error`,t=>{a(Error(`Failed to run ${e}: ${t.message}`,{cause:t}))}),o.once(`close`,(n,i)=>{if(n===0){r(c.trim());return}let o=i?`signal ${i}`:`exit code ${n??`unknown`}`,s=l.trim()||c.trim();a(Error(`${e} ${t.join(` `)} failed with ${o}${s?`\n${s}`:``}`))})})}function l(e,n,r){let i=t.default.relative(e,n);if(!(i===``||!i.startsWith(`..`)&&!t.default.isAbsolute(i)))throw Error(`${r} resolves outside ${e}`)}async function u(e,n){let r=t.default.join(n,`checkout`),i=[`clone`,`--filter=blob:none`];e.path&&i.push(`--sparse`,`--no-checkout`),i.push(e.url,r);let a={...process.env,GIT_TERMINAL_PROMPT:`0`};if(await c(`git`,i,{environment:a}),e.path&&await c(`git`,[`sparse-checkout`,`set`,`--no-cone`,`--`,e.path],{cwd:r,environment:a}),e.sha){await c(`git`,[`checkout`,e.sha],{cwd:r,environment:a});let t=await c(`git`,[`rev-parse`,`HEAD`],{cwd:r,environment:a});if(t.toLowerCase()!==e.sha.toLowerCase())throw Error(`Checked out Git SHA ${t} does not match requested SHA ${e.sha}`)}else e.ref?await c(`git`,[`checkout`,e.ref],{cwd:r,environment:a}):e.path&&await c(`git`,[`checkout`],{cwd:r,environment:a});let o=e.path?t.default.resolve(r,e.path):r;return l(r,o,`Git plugin path`),o}async function d(e,n){let r=t.default.join(n,`npm`),i=[`install`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--package-lock=false`,`--prefix`,r,e.version?`${e.package}@${e.version}`:e.package];e.registry&&i.push(`--registry`,e.registry),await c(`npm`,i,{environment:{...process.env,NPM_CONFIG_AUDIT:`false`,NPM_CONFIG_FUND:`false`,NPM_CONFIG_IGNORE_SCRIPTS:`true`}});let a=t.default.resolve(r,`node_modules`,...e.package.split(`/`));return l(t.default.join(r,`node_modules`),a,`npm plugin package`),a}const f={git:u,npm:d};async function p(e){try{return(await n.default.promises.lstat(e)).isDirectory()?`directory`:`other`}catch(e){if(e.code===`ENOENT`)return`missing`;throw e}}function m(e,r){try{let i=JSON.parse(n.default.readFileSync(r,`utf8`));if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`manifest must contain a JSON object`);return r===t.default.join(e,`plugin.json`)&&`$schema`in i&&i.$schema===`https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`?`direct-children`:`recursive`}catch(e){throw Error(`Invalid plugin manifest ${r}: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async function h(e){let i=await p(e.directory);if(i===`missing`)return!1;if(i!==`directory`)throw Error(`Remote plugin cache path is not a directory: ${e.directory}`);if(!e.source||!(0,r.isRemotePluginSource)(e.source))throw Error(`Remote plugin entry is missing its source: ${e.name??e.directory}`);let o;try{o=JSON.parse(await n.default.promises.readFile(t.default.join(e.directory,a),`utf8`))}catch(t){throw Error(`Remote plugin cache is not managed by DoomPi: ${e.directory}`,{cause:t})}if(o.version!==1||JSON.stringify(o.source)!==JSON.stringify(e.source))throw Error(`Remote plugin cache metadata does not match ${e.name??e.directory}: ${e.directory}`);let s=(0,r.findPluginManifestPath)(e.directory);if(!s)throw Error(`Remote plugin cache is missing a supported plugin manifest: ${e.directory}`);return m(e.directory,s)}async function g(e,r){if(await p(e)!==`directory`)throw Error(`Materialized plugin source is not a directory: ${e}`);await n.default.promises.cp(e,r,{recursive:!0,filter:e=>t.default.basename(e)!==`.git`})}function _(e){let t=e.code;return t===`EEXIST`||t===`ENOTEMPTY`}async function v(e,i){if(!e.source||!(0,r.isRemotePluginSource)(e.source))return e;let o=await h(e);if(o)return{...e,skillDiscovery:o};let s=t.default.dirname(e.directory);if(await n.default.promises.mkdir(s,{recursive:!0,mode:448}),await p(s)!==`directory`)throw Error(`Remote plugin cache root is not a directory: ${s}`);await n.default.promises.chmod(s,448);let c=await n.default.promises.mkdtemp(t.default.join(s,`.plugin-staging-`)),l=t.default.join(c,`installation`);try{await g(e.source.type===`git`?await i.git(e.source,c):await i.npm(e.source,c),l);let o=(0,r.findPluginManifestPath)(l);if(!o)throw Error(`Remote plugin ${e.name??e.directory} does not contain a supported plugin manifest`);let s=m(l,o),u=t.default.join(l,a);if(await p(u)!==`missing`)throw Error(`Remote plugin contains reserved cache metadata path: ${a}`);let d={version:1,source:e.source};await n.default.promises.writeFile(u,`${JSON.stringify(d,null,2)}\n`,{flag:`wx`,mode:384});try{await n.default.promises.rename(l,e.directory)}catch(t){if(!_(t))throw t;if(await n.default.promises.rm(l,{recursive:!0,force:!0}),!await h(e))throw Error(`Remote plugin installation race left no cache: ${e.directory}`)}return{...e,skillDiscovery:s}}catch(t){throw Error(`Failed to install remote plugin ${e.name??e.directory}: ${t instanceof Error?t.message:String(t)}`,{cause:t})}finally{await n.default.promises.rm(c,{recursive:!0,force:!0})}}async function y(e,t={}){let n={git:t.materializers?.git??f.git,npm:t.materializers?.npm??f.npm};return Promise.all(e.map(e=>v(e,n)))}exports.materializePluginEntries=y;
|
|
2
|
+
//# sourceMappingURL=pluginMaterializer.cjs.map
|