@agimon-ai/doompi 0.0.1-alpha.2 → 0.0.1-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -452
- package/assets/doompi-tui.png +0 -0
- package/dist/adapters/bootstrapClaim.cjs +2 -0
- package/dist/adapters/bootstrapClaim.cjs.map +1 -0
- package/dist/adapters/bootstrapClaim.mjs +2 -0
- package/dist/adapters/bootstrapClaim.mjs.map +1 -0
- package/dist/adapters/bootstrapLocator.cjs +2 -0
- package/dist/adapters/bootstrapLocator.cjs.map +1 -0
- package/dist/adapters/bootstrapLocator.d.cts +6 -0
- package/dist/adapters/bootstrapLocator.d.cts.map +1 -0
- package/dist/adapters/bootstrapLocator.d.mts +6 -0
- package/dist/adapters/bootstrapLocator.d.mts.map +1 -0
- package/dist/adapters/bootstrapLocator.mjs +2 -0
- package/dist/adapters/bootstrapLocator.mjs.map +1 -0
- package/dist/adapters/compatibility/antigravity.cjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.cjs.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.cts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.cts.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.mts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.mts.map +1 -1
- package/dist/adapters/compatibility/antigravity.mjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.mjs.map +1 -1
- package/dist/adapters/compatibility/codex.cjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.cjs.map +1 -1
- package/dist/adapters/compatibility/codex.d.cts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.cts.map +1 -1
- package/dist/adapters/compatibility/codex.d.mts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.mts.map +1 -1
- package/dist/adapters/compatibility/codex.mjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.mjs.map +1 -1
- package/dist/adapters/compatibility/index.cjs +2 -0
- package/dist/adapters/compatibility/index.cjs.map +1 -0
- package/dist/adapters/compatibility/index.d.cts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.cts.map +1 -1
- package/dist/adapters/compatibility/index.d.mts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.mts.map +1 -1
- package/dist/adapters/compatibility/index.mjs +2 -0
- package/dist/adapters/compatibility/index.mjs.map +1 -0
- package/dist/adapters/compatibility/process.cjs +2 -0
- package/dist/{services → adapters}/compatibility/process.cjs.map +1 -1
- package/dist/adapters/compatibility/process.d.cts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.cts.map +1 -1
- package/dist/adapters/compatibility/process.d.mts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.mts.map +1 -1
- package/dist/adapters/compatibility/process.mjs +2 -0
- package/dist/{services → adapters}/compatibility/process.mjs.map +1 -1
- package/dist/adapters/compatibility/shared.cjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.cjs.map +1 -1
- package/dist/adapters/compatibility/shared.d.cts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.cts.map +1 -1
- package/dist/adapters/compatibility/shared.d.mts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.mts.map +1 -1
- package/dist/adapters/compatibility/shared.mjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.mjs.map +1 -1
- package/dist/adapters/compatibilityContext.cjs +2 -0
- package/dist/adapters/compatibilityContext.cjs.map +1 -0
- package/dist/adapters/compatibilityContext.d.cts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.cts.map +1 -1
- package/dist/adapters/compatibilityContext.d.mts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.mts.map +1 -1
- package/dist/adapters/compatibilityContext.mjs +2 -0
- package/dist/adapters/compatibilityContext.mjs.map +1 -0
- package/dist/adapters/composer.cjs +2 -0
- package/dist/adapters/composer.cjs.map +1 -0
- package/dist/adapters/composer.d.cts +113 -0
- package/dist/adapters/composer.d.cts.map +1 -0
- package/dist/adapters/composer.d.mts +113 -0
- package/dist/adapters/composer.d.mts.map +1 -0
- package/dist/adapters/composer.mjs +2 -0
- package/dist/adapters/composer.mjs.map +1 -0
- package/dist/adapters/compositionState.cjs +2 -0
- package/dist/adapters/compositionState.cjs.map +1 -0
- package/dist/adapters/compositionState.d.cts +12 -0
- package/dist/adapters/compositionState.d.cts.map +1 -0
- package/dist/adapters/compositionState.d.mts +12 -0
- package/dist/adapters/compositionState.d.mts.map +1 -0
- package/dist/adapters/compositionState.mjs +2 -0
- package/dist/adapters/compositionState.mjs.map +1 -0
- package/dist/adapters/config/harnessState.cjs +2 -0
- package/dist/adapters/config/harnessState.cjs.map +1 -0
- package/dist/adapters/config/harnessState.d.cts +26 -0
- package/dist/adapters/config/harnessState.d.cts.map +1 -0
- package/dist/adapters/config/harnessState.d.mts +26 -0
- package/dist/adapters/config/harnessState.d.mts.map +1 -0
- package/dist/adapters/config/harnessState.mjs +2 -0
- package/dist/adapters/config/harnessState.mjs.map +1 -0
- package/dist/adapters/deferredSkills.cjs +12 -0
- package/dist/adapters/deferredSkills.cjs.map +1 -0
- package/dist/adapters/deferredSkills.mjs +12 -0
- package/dist/adapters/deferredSkills.mjs.map +1 -0
- package/dist/adapters/doomPackage.cjs +2 -0
- package/dist/adapters/doomPackage.cjs.map +1 -0
- package/dist/adapters/doomPackage.mjs +2 -0
- package/dist/adapters/doomPackage.mjs.map +1 -0
- package/dist/adapters/dpiRunner.cjs +3 -0
- package/dist/adapters/dpiRunner.cjs.map +1 -0
- package/dist/adapters/dpiRunner.mjs +3 -0
- package/dist/adapters/dpiRunner.mjs.map +1 -0
- package/dist/adapters/dpiSettings.cjs +2 -0
- package/dist/adapters/dpiSettings.cjs.map +1 -0
- package/dist/adapters/dpiSettings.mjs +2 -0
- package/dist/adapters/dpiSettings.mjs.map +1 -0
- package/dist/adapters/extensionCompiler.cjs +3 -0
- package/dist/adapters/extensionCompiler.cjs.map +1 -0
- package/dist/adapters/extensionCompiler.mjs +3 -0
- package/dist/adapters/extensionCompiler.mjs.map +1 -0
- package/dist/adapters/harnessContext.cjs +2 -0
- package/dist/adapters/harnessContext.cjs.map +1 -0
- package/dist/adapters/harnessContext.d.cts +61 -0
- package/dist/{services → adapters}/harnessContext.d.cts.map +1 -1
- package/dist/adapters/harnessContext.d.mts +61 -0
- package/dist/{services → adapters}/harnessContext.d.mts.map +1 -1
- package/dist/adapters/harnessContext.mjs +2 -0
- package/dist/adapters/harnessContext.mjs.map +1 -0
- package/dist/adapters/helpSkills.cjs +2 -0
- package/dist/adapters/helpSkills.cjs.map +1 -0
- package/dist/adapters/helpSkills.mjs +2 -0
- package/dist/adapters/helpSkills.mjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.cjs +2 -0
- package/dist/adapters/layerPackageInstaller.cjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.mjs +2 -0
- package/dist/adapters/layerPackageInstaller.mjs.map +1 -0
- package/dist/adapters/matrixSwitcher.cjs +2 -0
- package/dist/adapters/matrixSwitcher.cjs.map +1 -0
- package/dist/adapters/matrixSwitcher.d.cts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.cts.map +1 -1
- package/dist/adapters/matrixSwitcher.d.mts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.mts.map +1 -1
- package/dist/adapters/matrixSwitcher.mjs +2 -0
- package/dist/adapters/matrixSwitcher.mjs.map +1 -0
- package/dist/adapters/mcpFilter.cjs +3 -0
- package/dist/adapters/mcpFilter.cjs.map +1 -0
- package/dist/adapters/mcpFilter.d.cts +40 -0
- package/dist/adapters/mcpFilter.d.cts.map +1 -0
- package/dist/adapters/mcpFilter.d.mts +40 -0
- package/dist/adapters/mcpFilter.d.mts.map +1 -0
- package/dist/adapters/mcpFilter.mjs +3 -0
- package/dist/adapters/mcpFilter.mjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.cjs +2 -0
- package/dist/adapters/modules/moduleResolution.cjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.cts +69 -0
- package/dist/adapters/modules/moduleResolution.d.cts.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.mts +69 -0
- package/dist/adapters/modules/moduleResolution.d.mts.map +1 -0
- package/dist/adapters/modules/moduleResolution.mjs +2 -0
- package/dist/adapters/modules/moduleResolution.mjs.map +1 -0
- package/dist/adapters/packageBootstrap.cjs +2 -0
- package/dist/adapters/packageBootstrap.cjs.map +1 -0
- package/dist/adapters/packageBootstrap.d.cts +8 -0
- package/dist/adapters/packageBootstrap.d.cts.map +1 -0
- package/dist/adapters/packageBootstrap.d.mts +8 -0
- package/dist/adapters/packageBootstrap.d.mts.map +1 -0
- package/dist/adapters/packageBootstrap.mjs +2 -0
- package/dist/adapters/packageBootstrap.mjs.map +1 -0
- package/dist/adapters/piExtensionAlias.cjs +2 -0
- package/dist/adapters/piExtensionAlias.cjs.map +1 -0
- package/dist/adapters/piExtensionAlias.mjs +2 -0
- package/dist/adapters/piExtensionAlias.mjs.map +1 -0
- package/dist/adapters/piSettings.cjs +2 -0
- package/dist/adapters/piSettings.cjs.map +1 -0
- package/dist/adapters/piSettings.d.cts +25 -0
- package/dist/adapters/piSettings.d.cts.map +1 -0
- package/dist/adapters/piSettings.d.mts +25 -0
- package/dist/adapters/piSettings.d.mts.map +1 -0
- package/dist/adapters/piSettings.mjs +2 -0
- package/dist/adapters/piSettings.mjs.map +1 -0
- package/dist/adapters/pluginMaterializer.cjs +2 -0
- package/dist/adapters/pluginMaterializer.cjs.map +1 -0
- package/dist/adapters/pluginMaterializer.mjs +2 -0
- package/dist/adapters/pluginMaterializer.mjs.map +1 -0
- package/dist/adapters/projectPiSettings.cjs +2 -0
- package/dist/adapters/projectPiSettings.cjs.map +1 -0
- package/dist/adapters/projectPiSettings.d.cts +29 -0
- package/dist/adapters/projectPiSettings.d.cts.map +1 -0
- package/dist/adapters/projectPiSettings.d.mts +29 -0
- package/dist/adapters/projectPiSettings.d.mts.map +1 -0
- package/dist/adapters/projectPiSettings.mjs +2 -0
- package/dist/adapters/projectPiSettings.mjs.map +1 -0
- package/dist/adapters/repository/repository.cjs +2 -0
- package/dist/adapters/repository/repository.cjs.map +1 -0
- package/dist/adapters/repository/repository.d.cts +21 -0
- package/dist/adapters/repository/repository.d.cts.map +1 -0
- package/dist/adapters/repository/repository.d.mts +21 -0
- package/dist/adapters/repository/repository.d.mts.map +1 -0
- package/dist/adapters/repository/repository.mjs +2 -0
- package/dist/adapters/repository/repository.mjs.map +1 -0
- package/dist/adapters/resourceCollector.cjs +3 -0
- package/dist/adapters/resourceCollector.cjs.map +1 -0
- package/dist/adapters/resourceCollector.d.cts +25 -0
- package/dist/adapters/resourceCollector.d.cts.map +1 -0
- package/dist/adapters/resourceCollector.d.mts +25 -0
- package/dist/adapters/resourceCollector.d.mts.map +1 -0
- package/dist/adapters/resourceCollector.mjs +3 -0
- package/dist/adapters/resourceCollector.mjs.map +1 -0
- package/dist/adapters/runtimeBundle.cjs +2 -0
- package/dist/adapters/runtimeBundle.cjs.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.cts +4 -2
- package/dist/adapters/runtimeBundle.d.cts.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.mts +4 -2
- package/dist/adapters/runtimeBundle.d.mts.map +1 -0
- package/dist/adapters/runtimeBundle.mjs +2 -0
- package/dist/adapters/runtimeBundle.mjs.map +1 -0
- package/dist/adapters/serialization/json.cjs +2 -0
- package/dist/adapters/serialization/json.cjs.map +1 -0
- package/dist/adapters/serialization/json.d.cts +23 -0
- package/dist/adapters/serialization/json.d.cts.map +1 -0
- package/dist/adapters/serialization/json.d.mts +23 -0
- package/dist/adapters/serialization/json.d.mts.map +1 -0
- package/dist/adapters/serialization/json.mjs +2 -0
- package/dist/adapters/serialization/json.mjs.map +1 -0
- package/dist/adapters/sharedBuildCache.cjs +2 -0
- package/dist/adapters/sharedBuildCache.cjs.map +1 -0
- package/dist/adapters/sharedBuildCache.mjs +2 -0
- package/dist/adapters/sharedBuildCache.mjs.map +1 -0
- package/dist/adapters/skillCatalog.cjs +2 -0
- package/dist/adapters/skillCatalog.cjs.map +1 -0
- package/dist/adapters/skillCatalog.d.cts +61 -0
- package/dist/adapters/skillCatalog.d.cts.map +1 -0
- package/dist/adapters/skillCatalog.d.mts +61 -0
- package/dist/adapters/skillCatalog.d.mts.map +1 -0
- package/dist/adapters/skillCatalog.mjs +2 -0
- package/dist/adapters/skillCatalog.mjs.map +1 -0
- package/dist/adapters/skillSources.cjs +2 -0
- package/dist/{services → adapters}/skillSources.cjs.map +1 -1
- package/dist/adapters/skillSources.d.cts +24 -0
- package/dist/{services → adapters}/skillSources.d.cts.map +1 -1
- package/dist/adapters/skillSources.d.mts +24 -0
- package/dist/{services → adapters}/skillSources.d.mts.map +1 -1
- package/dist/adapters/skillSources.mjs +2 -0
- package/dist/{services → adapters}/skillSources.mjs.map +1 -1
- package/dist/adapters/startupPrecompiler.cjs +2 -0
- package/dist/adapters/startupPrecompiler.cjs.map +1 -0
- package/dist/adapters/startupPrecompiler.d.cts +13 -0
- package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
- package/dist/adapters/startupPrecompiler.d.mts +13 -0
- package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
- package/dist/adapters/startupPrecompiler.mjs +2 -0
- package/dist/adapters/startupPrecompiler.mjs.map +1 -0
- package/dist/adapters/syncLocation.cjs +2 -0
- package/dist/adapters/syncLocation.cjs.map +1 -0
- package/dist/adapters/syncLocation.d.cts +19 -0
- package/dist/adapters/syncLocation.d.cts.map +1 -0
- package/dist/adapters/syncLocation.d.mts +19 -0
- package/dist/adapters/syncLocation.d.mts.map +1 -0
- package/dist/adapters/syncLocation.mjs +2 -0
- package/dist/adapters/syncLocation.mjs.map +1 -0
- package/dist/adapters/syncState.cjs +2 -0
- package/dist/adapters/syncState.cjs.map +1 -0
- package/dist/adapters/syncState.d.cts +153 -0
- package/dist/adapters/syncState.d.cts.map +1 -0
- package/dist/adapters/syncState.d.mts +153 -0
- package/dist/adapters/syncState.d.mts.map +1 -0
- package/dist/adapters/syncState.mjs +2 -0
- package/dist/adapters/syncState.mjs.map +1 -0
- package/dist/adapters/syncStateContract.cjs +2 -0
- package/dist/adapters/syncStateContract.cjs.map +1 -0
- package/dist/adapters/syncStateContract.d.cts +13 -0
- package/dist/adapters/syncStateContract.d.cts.map +1 -0
- package/dist/adapters/syncStateContract.d.mts +13 -0
- package/dist/adapters/syncStateContract.d.mts.map +1 -0
- package/dist/adapters/syncStateContract.mjs +2 -0
- package/dist/adapters/syncStateContract.mjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
- package/dist/bin/cli.cjs +1 -1
- package/dist/bin/cli.cjs.map +1 -1
- package/dist/bin/cli.mjs +1 -1
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/dpi.cjs +3 -0
- package/dist/bin/dpi.cjs.map +1 -0
- package/dist/bin/dpi.d.cts +1 -0
- package/dist/bin/dpi.d.mts +1 -0
- package/dist/bin/dpi.mjs +3 -0
- package/dist/bin/dpi.mjs.map +1 -0
- package/dist/cli/cliApp.cjs +1 -2
- package/dist/cli/cliApp.d.cts +2 -45
- package/dist/cli/cliApp.d.mts +2 -45
- package/dist/cli/cliApp.mjs +1 -2
- package/dist/cli/compatibilityOptions.cjs +1 -2
- package/dist/cli/compatibilityOptions.d.cts +2 -15
- package/dist/cli/compatibilityOptions.d.mts +2 -15
- package/dist/cli/compatibilityOptions.mjs +1 -2
- package/dist/cli/help.cjs +1 -63
- package/dist/cli/help.d.cts +2 -6
- package/dist/cli/help.d.mts +2 -6
- package/dist/cli/help.mjs +1 -63
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.d.cts +4 -4
- package/dist/cli/index.d.mts +4 -4
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/matrixOptions.cjs +1 -2
- package/dist/cli/matrixOptions.d.cts +2 -99
- package/dist/cli/matrixOptions.d.mts +2 -99
- package/dist/cli/matrixOptions.mjs +1 -2
- package/dist/cli/options.cjs +1 -2
- package/dist/cli/options.d.cts +2 -7
- package/dist/cli/options.d.mts +2 -7
- package/dist/cli/options.mjs +1 -2
- package/dist/commands/baseCommand.cjs.map +1 -1
- package/dist/commands/baseCommand.d.cts +3 -3
- package/dist/commands/baseCommand.d.mts +3 -3
- package/dist/commands/baseCommand.mjs.map +1 -1
- package/dist/commands/buildCommand.cjs +2 -2
- package/dist/commands/buildCommand.cjs.map +1 -1
- package/dist/commands/buildCommand.mjs +2 -2
- package/dist/commands/buildCommand.mjs.map +1 -1
- package/dist/commands/cli/cliApp.cjs +2 -0
- package/dist/commands/cli/cliApp.cjs.map +1 -0
- package/dist/commands/cli/cliApp.d.cts +45 -0
- package/dist/commands/cli/cliApp.d.cts.map +1 -0
- package/dist/commands/cli/cliApp.d.mts +45 -0
- package/dist/commands/cli/cliApp.d.mts.map +1 -0
- package/dist/commands/cli/cliApp.mjs +2 -0
- package/dist/commands/cli/cliApp.mjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.cjs +2 -0
- package/dist/commands/cli/compatibilityOptions.cjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.cts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.cts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.mts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.mts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.mjs +2 -0
- package/dist/commands/cli/compatibilityOptions.mjs.map +1 -0
- package/dist/commands/cli/help.cjs +68 -0
- package/dist/{cli → commands/cli}/help.cjs.map +1 -1
- package/dist/commands/cli/help.d.cts +6 -0
- package/dist/commands/cli/help.d.cts.map +1 -0
- package/dist/commands/cli/help.d.mts +6 -0
- package/dist/commands/cli/help.d.mts.map +1 -0
- package/dist/commands/cli/help.mjs +68 -0
- package/dist/{cli → commands/cli}/help.mjs.map +1 -1
- package/dist/commands/cli/index.cjs +1 -0
- package/dist/commands/cli/index.d.cts +4 -0
- package/dist/commands/cli/index.d.mts +4 -0
- package/dist/commands/cli/index.mjs +1 -0
- package/dist/commands/cli/matrixOptions.cjs +2 -0
- package/dist/commands/cli/matrixOptions.cjs.map +1 -0
- package/dist/commands/cli/matrixOptions.d.cts +99 -0
- package/dist/commands/cli/matrixOptions.d.cts.map +1 -0
- package/dist/commands/cli/matrixOptions.d.mts +99 -0
- package/dist/commands/cli/matrixOptions.d.mts.map +1 -0
- package/dist/commands/cli/matrixOptions.mjs +2 -0
- package/dist/commands/cli/matrixOptions.mjs.map +1 -0
- package/dist/commands/cli/options.cjs +2 -0
- package/dist/commands/cli/options.cjs.map +1 -0
- package/dist/commands/cli/options.d.cts +7 -0
- package/dist/commands/cli/options.d.cts.map +1 -0
- package/dist/commands/cli/options.d.mts +7 -0
- package/dist/commands/cli/options.d.mts.map +1 -0
- package/dist/commands/cli/options.mjs +2 -0
- package/dist/commands/cli/options.mjs.map +1 -0
- package/dist/commands/compatibilityCommand.cjs +1 -1
- package/dist/commands/compatibilityCommand.cjs.map +1 -1
- package/dist/commands/compatibilityCommand.d.cts +1 -1
- package/dist/commands/compatibilityCommand.d.cts.map +1 -1
- package/dist/commands/compatibilityCommand.d.mts +1 -1
- package/dist/commands/compatibilityCommand.d.mts.map +1 -1
- package/dist/commands/compatibilityCommand.mjs +1 -1
- package/dist/commands/compatibilityCommand.mjs.map +1 -1
- package/dist/commands/emitMcpCommand.cjs +1 -1
- package/dist/commands/emitMcpCommand.cjs.map +1 -1
- package/dist/commands/emitMcpCommand.d.cts +2 -2
- package/dist/commands/emitMcpCommand.d.mts +2 -2
- package/dist/commands/emitMcpCommand.mjs +1 -1
- package/dist/commands/emitMcpCommand.mjs.map +1 -1
- package/dist/commands/explainCommand.cjs +2 -2
- package/dist/commands/explainCommand.cjs.map +1 -1
- package/dist/commands/explainCommand.d.cts +2 -2
- package/dist/commands/explainCommand.d.mts +2 -2
- package/dist/commands/explainCommand.mjs +2 -2
- package/dist/commands/explainCommand.mjs.map +1 -1
- package/dist/commands/index.cjs +1 -1
- package/dist/commands/index.d.cts +2 -3
- package/dist/commands/index.d.mts +2 -3
- package/dist/commands/index.mjs +1 -1
- package/dist/commands/initCommand.cjs +1 -2
- package/dist/commands/initCommand.cjs.map +1 -1
- package/dist/commands/initCommand.d.cts +4 -3
- package/dist/commands/initCommand.d.cts.map +1 -1
- package/dist/commands/initCommand.d.mts +4 -3
- package/dist/commands/initCommand.d.mts.map +1 -1
- package/dist/commands/initCommand.mjs +1 -2
- package/dist/commands/initCommand.mjs.map +1 -1
- package/dist/commands/initPresenter.cjs +3 -0
- package/dist/commands/initPresenter.cjs.map +1 -0
- package/dist/commands/initPresenter.d.cts +8 -0
- package/dist/commands/initPresenter.d.cts.map +1 -0
- package/dist/commands/initPresenter.d.mts +8 -0
- package/dist/commands/initPresenter.d.mts.map +1 -0
- package/dist/commands/initPresenter.mjs +3 -0
- package/dist/commands/initPresenter.mjs.map +1 -0
- package/dist/commands/launchCommand.cjs +1 -1
- package/dist/commands/launchCommand.cjs.map +1 -1
- package/dist/commands/launchCommand.d.cts +6 -4
- package/dist/commands/launchCommand.d.cts.map +1 -1
- package/dist/commands/launchCommand.d.mts +6 -4
- package/dist/commands/launchCommand.d.mts.map +1 -1
- package/dist/commands/launchCommand.mjs +1 -1
- package/dist/commands/launchCommand.mjs.map +1 -1
- package/dist/commands/syncCommand.cjs +5 -5
- package/dist/commands/syncCommand.cjs.map +1 -1
- package/dist/commands/syncCommand.d.cts +19 -7
- package/dist/commands/syncCommand.d.cts.map +1 -1
- package/dist/commands/syncCommand.d.mts +19 -7
- package/dist/commands/syncCommand.d.mts.map +1 -1
- package/dist/commands/syncCommand.mjs +5 -5
- package/dist/commands/syncCommand.mjs.map +1 -1
- package/dist/commands/syncPipeline.cjs +2 -0
- package/dist/commands/syncPipeline.cjs.map +1 -0
- package/dist/commands/syncPipeline.mjs +2 -0
- package/dist/commands/syncPipeline.mjs.map +1 -0
- package/dist/config/harnessState.cjs +1 -2
- package/dist/config/harnessState.d.cts +2 -24
- package/dist/config/harnessState.d.mts +2 -24
- package/dist/config/harnessState.mjs +1 -2
- package/dist/config/index.cjs +1 -1
- package/dist/config/index.d.cts +4 -7
- package/dist/config/index.d.mts +4 -7
- package/dist/config/index.mjs +1 -1
- package/dist/config/projectTrust.cjs +1 -2
- package/dist/config/projectTrust.d.cts +2 -14
- package/dist/config/projectTrust.d.mts +2 -14
- package/dist/config/projectTrust.mjs +1 -2
- package/dist/entries/autoStop.cjs +1 -2
- package/dist/entries/autoStop.d.cts +2 -6
- package/dist/entries/autoStop.d.mts +2 -7
- package/dist/entries/autoStop.mjs +1 -2
- package/dist/entries/components/matrixPicker.cjs +1 -2
- package/dist/entries/components/matrixPicker.d.cts +2 -55
- package/dist/entries/components/matrixPicker.d.mts +2 -55
- package/dist/entries/components/matrixPicker.mjs +1 -2
- package/dist/entries/components/skillsOverlay.cjs +1 -4
- package/dist/entries/components/skillsOverlay.d.cts +2 -58
- package/dist/entries/components/skillsOverlay.d.mts +2 -58
- package/dist/entries/components/skillsOverlay.mjs +1 -4
- package/dist/entries/domains.cjs +1 -2
- package/dist/entries/domains.d.cts +2 -10
- package/dist/entries/domains.d.mts +2 -10
- package/dist/entries/domains.mjs +1 -2
- package/dist/entries/doom.cjs +1 -2
- package/dist/entries/doom.d.cts +2 -13
- package/dist/entries/doom.d.mts +2 -14
- package/dist/entries/doom.mjs +1 -2
- package/dist/entries/effort.cjs +1 -2
- package/dist/entries/effort.d.cts +2 -10
- package/dist/entries/effort.d.mts +2 -10
- package/dist/entries/effort.mjs +1 -2
- package/dist/entries/majorMode.cjs +1 -6
- package/dist/entries/majorMode.d.cts +2 -29
- package/dist/entries/majorMode.d.mts +2 -29
- package/dist/entries/majorMode.mjs +1 -6
- package/dist/entries/modeCatalog.cjs +1 -0
- package/dist/entries/modeCatalog.d.cts +2 -0
- package/dist/entries/modeCatalog.d.mts +2 -0
- package/dist/entries/modeCatalog.mjs +1 -0
- package/dist/entries/notifications.cjs +1 -2
- package/dist/entries/notifications.d.cts +2 -13
- package/dist/entries/notifications.d.mts +2 -13
- package/dist/entries/notifications.mjs +1 -2
- package/dist/entries/ollamaProvider.cjs +1 -2
- package/dist/entries/ollamaProvider.d.cts +2 -6
- package/dist/entries/ollamaProvider.d.mts +2 -7
- package/dist/entries/ollamaProvider.mjs +1 -2
- package/dist/entries/persona.cjs +1 -2
- package/dist/entries/persona.d.cts +2 -14
- package/dist/entries/persona.d.mts +2 -15
- package/dist/entries/persona.mjs +1 -2
- package/dist/entries/profile.cjs +1 -3
- package/dist/entries/profile.d.cts +2 -16
- package/dist/entries/profile.d.mts +2 -16
- package/dist/entries/profile.mjs +1 -3
- package/dist/entries/repositoryHooks.cjs +1 -9
- package/dist/entries/repositoryHooks.d.cts +2 -7
- package/dist/entries/repositoryHooks.d.mts +2 -8
- package/dist/entries/repositoryHooks.mjs +1 -9
- package/dist/entries/skills.cjs +1 -2
- package/dist/entries/skills.d.cts +2 -34
- package/dist/entries/skills.d.mts +2 -34
- package/dist/entries/skills.mjs +1 -2
- package/dist/entries/styleSystem.cjs +1 -4
- package/dist/entries/styleSystem.d.cts +2 -32
- package/dist/entries/styleSystem.d.mts +2 -32
- package/dist/entries/styleSystem.mjs +1 -4
- package/dist/extensions/entries/autoStop.cjs +2 -0
- package/dist/extensions/entries/autoStop.cjs.map +1 -0
- package/dist/extensions/entries/autoStop.d.cts +7 -0
- package/dist/extensions/entries/autoStop.d.cts.map +1 -0
- package/dist/extensions/entries/autoStop.d.mts +7 -0
- package/dist/extensions/entries/autoStop.d.mts.map +1 -0
- package/dist/extensions/entries/autoStop.mjs +2 -0
- package/dist/extensions/entries/autoStop.mjs.map +1 -0
- package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
- package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.cjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.cjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.mjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.mjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs.map +1 -0
- package/dist/extensions/entries/domains.cjs +2 -0
- package/dist/extensions/entries/domains.cjs.map +1 -0
- package/dist/extensions/entries/domains.d.cts +18 -0
- package/dist/extensions/entries/domains.d.cts.map +1 -0
- package/dist/extensions/entries/domains.d.mts +18 -0
- package/dist/extensions/entries/domains.d.mts.map +1 -0
- package/dist/extensions/entries/domains.mjs +2 -0
- package/dist/extensions/entries/domains.mjs.map +1 -0
- package/dist/extensions/entries/doom.cjs +2 -0
- package/dist/extensions/entries/doom.cjs.map +1 -0
- package/dist/extensions/entries/doom.d.cts +14 -0
- package/dist/extensions/entries/doom.d.cts.map +1 -0
- package/dist/extensions/entries/doom.d.mts +14 -0
- package/dist/extensions/entries/doom.d.mts.map +1 -0
- package/dist/extensions/entries/doom.mjs +2 -0
- package/dist/extensions/entries/doom.mjs.map +1 -0
- package/dist/extensions/entries/effort.cjs +2 -0
- package/dist/extensions/entries/effort.cjs.map +1 -0
- package/dist/extensions/entries/effort.d.cts +10 -0
- package/dist/extensions/entries/effort.d.cts.map +1 -0
- package/dist/extensions/entries/effort.d.mts +10 -0
- package/dist/extensions/entries/effort.d.mts.map +1 -0
- package/dist/extensions/entries/effort.mjs +2 -0
- package/dist/extensions/entries/effort.mjs.map +1 -0
- package/dist/extensions/entries/majorMode.cjs +6 -0
- package/dist/extensions/entries/majorMode.cjs.map +1 -0
- package/dist/extensions/entries/majorMode.d.cts +27 -0
- package/dist/extensions/entries/majorMode.d.cts.map +1 -0
- package/dist/extensions/entries/majorMode.d.mts +27 -0
- package/dist/extensions/entries/majorMode.d.mts.map +1 -0
- package/dist/extensions/entries/majorMode.mjs +6 -0
- package/dist/extensions/entries/majorMode.mjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.cjs +2 -0
- package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.cts +7 -0
- package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.mts +7 -0
- package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
- package/dist/extensions/entries/modeCatalog.mjs +2 -0
- package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
- package/dist/extensions/entries/notifications.cjs +2 -0
- package/dist/extensions/entries/notifications.cjs.map +1 -0
- package/dist/extensions/entries/notifications.d.cts +14 -0
- package/dist/extensions/entries/notifications.d.cts.map +1 -0
- package/dist/extensions/entries/notifications.d.mts +14 -0
- package/dist/extensions/entries/notifications.d.mts.map +1 -0
- package/dist/extensions/entries/notifications.mjs +2 -0
- package/dist/extensions/entries/notifications.mjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.cjs +2 -0
- package/dist/extensions/entries/ollamaProvider.cjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.cts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.cts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.mts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.mts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.mjs +2 -0
- package/dist/extensions/entries/ollamaProvider.mjs.map +1 -0
- package/dist/extensions/entries/persona.cjs +2 -0
- package/dist/extensions/entries/persona.cjs.map +1 -0
- package/dist/extensions/entries/persona.d.cts +15 -0
- package/dist/extensions/entries/persona.d.cts.map +1 -0
- package/dist/extensions/entries/persona.d.mts +15 -0
- package/dist/extensions/entries/persona.d.mts.map +1 -0
- package/dist/extensions/entries/persona.mjs +2 -0
- package/dist/extensions/entries/persona.mjs.map +1 -0
- package/dist/extensions/entries/profile.cjs +3 -0
- package/dist/extensions/entries/profile.cjs.map +1 -0
- package/dist/extensions/entries/profile.d.cts +18 -0
- package/dist/extensions/entries/profile.d.cts.map +1 -0
- package/dist/extensions/entries/profile.d.mts +18 -0
- package/dist/extensions/entries/profile.d.mts.map +1 -0
- package/dist/extensions/entries/profile.mjs +3 -0
- package/dist/extensions/entries/profile.mjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.cjs +9 -0
- package/dist/extensions/entries/repositoryHooks.cjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.cts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.cts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.mts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.mts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.mjs +9 -0
- package/dist/extensions/entries/repositoryHooks.mjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.cjs +27 -0
- package/dist/extensions/entries/shellTitleController.cjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.cts +11 -0
- package/dist/extensions/entries/shellTitleController.d.cts.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.mts +11 -0
- package/dist/extensions/entries/shellTitleController.d.mts.map +1 -0
- package/dist/extensions/entries/shellTitleController.mjs +27 -0
- package/dist/extensions/entries/shellTitleController.mjs.map +1 -0
- package/dist/extensions/entries/skills.cjs +4 -0
- package/dist/extensions/entries/skills.cjs.map +1 -0
- package/dist/extensions/entries/skills.d.cts +34 -0
- package/dist/extensions/entries/skills.d.cts.map +1 -0
- package/dist/extensions/entries/skills.d.mts +34 -0
- package/dist/extensions/entries/skills.d.mts.map +1 -0
- package/dist/extensions/entries/skills.mjs +4 -0
- package/dist/extensions/entries/skills.mjs.map +1 -0
- package/dist/extensions/entries/styleSystem.cjs +4 -0
- package/dist/extensions/entries/styleSystem.cjs.map +1 -0
- package/dist/extensions/entries/styleSystem.d.cts +32 -0
- package/dist/extensions/entries/styleSystem.d.cts.map +1 -0
- package/dist/extensions/entries/styleSystem.d.mts +32 -0
- package/dist/extensions/entries/styleSystem.d.mts.map +1 -0
- package/dist/extensions/entries/styleSystem.mjs +4 -0
- package/dist/{entries/styleSystem.cjs.map → extensions/entries/styleSystem.mjs.map} +1 -1
- package/dist/extensions/pi.cjs +1 -0
- package/dist/extensions/pi.d.cts +2 -0
- package/dist/extensions/pi.d.mts +2 -0
- package/dist/extensions/pi.mjs +1 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs.map +1 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +33 -29
- package/dist/index.d.mts +33 -29
- package/dist/index.mjs +1 -1
- package/dist/logSinkTelemetry.cjs +1 -2
- package/dist/logSinkTelemetry.d.cts +2 -51
- package/dist/logSinkTelemetry.d.mts +2 -51
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
- package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
- package/dist/schemas/domainVoiceTools.cjs +2 -0
- package/dist/schemas/domainVoiceTools.cjs.map +1 -0
- package/dist/schemas/domainVoiceTools.mjs +2 -0
- package/dist/schemas/domainVoiceTools.mjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.cjs +2 -0
- package/dist/schemas/majorModeVoiceTools.cjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.mjs +2 -0
- package/dist/schemas/majorModeVoiceTools.mjs.map +1 -0
- package/dist/services/compatibility/antigravity.cjs +1 -2
- package/dist/services/compatibility/antigravity.d.cts +2 -11
- package/dist/services/compatibility/antigravity.d.mts +2 -11
- package/dist/services/compatibility/antigravity.mjs +1 -2
- package/dist/services/compatibility/codex.cjs +1 -2
- package/dist/services/compatibility/codex.d.cts +2 -19
- package/dist/services/compatibility/codex.d.mts +2 -19
- package/dist/services/compatibility/codex.mjs +1 -2
- package/dist/services/compatibility/index.cjs +1 -2
- package/dist/services/compatibility/index.d.cts +6 -16
- package/dist/services/compatibility/index.d.mts +6 -16
- package/dist/services/compatibility/index.mjs +1 -2
- package/dist/services/compatibility/process.cjs +1 -2
- package/dist/services/compatibility/process.d.cts +2 -35
- package/dist/services/compatibility/process.d.mts +2 -35
- package/dist/services/compatibility/process.mjs +1 -2
- package/dist/services/compatibility/shared.cjs +1 -2
- package/dist/services/compatibility/shared.d.cts +2 -33
- package/dist/services/compatibility/shared.d.mts +2 -33
- package/dist/services/compatibility/shared.mjs +1 -2
- package/dist/services/compatibilityContext.cjs +1 -2
- package/dist/services/compatibilityContext.d.cts +2 -23
- package/dist/services/compatibilityContext.d.mts +2 -23
- package/dist/services/compatibilityContext.mjs +1 -2
- package/dist/services/composer.cjs +1 -2
- package/dist/services/composer.d.cts +4 -135
- package/dist/services/composer.d.mts +4 -135
- package/dist/services/composer.mjs +1 -2
- package/dist/services/config/index.cjs +1 -0
- package/dist/services/config/index.d.cts +7 -0
- package/dist/services/config/index.d.mts +7 -0
- package/dist/services/config/index.mjs +1 -0
- package/dist/services/config/projectTrust.cjs +2 -0
- package/dist/services/config/projectTrust.cjs.map +1 -0
- package/dist/services/config/projectTrust.d.cts +14 -0
- package/dist/services/config/projectTrust.d.cts.map +1 -0
- package/dist/services/config/projectTrust.d.mts +14 -0
- package/dist/services/config/projectTrust.d.mts.map +1 -0
- package/dist/services/config/projectTrust.mjs +2 -0
- package/dist/services/config/projectTrust.mjs.map +1 -0
- package/dist/services/extensionAssembler.cjs +1 -1
- package/dist/services/extensionAssembler.cjs.map +1 -1
- package/dist/services/extensionAssembler.d.cts +13 -6
- package/dist/services/extensionAssembler.d.cts.map +1 -1
- package/dist/services/extensionAssembler.d.mts +13 -6
- package/dist/services/extensionAssembler.d.mts.map +1 -1
- package/dist/services/extensionAssembler.mjs +1 -1
- package/dist/services/extensionAssembler.mjs.map +1 -1
- package/dist/services/harnessContext.cjs +1 -2
- package/dist/services/harnessContext.d.cts +2 -61
- package/dist/services/harnessContext.d.mts +2 -61
- package/dist/services/harnessContext.mjs +1 -2
- package/dist/services/index.cjs +1 -1
- package/dist/services/index.d.cts +18 -14
- package/dist/services/index.d.mts +18 -14
- package/dist/services/index.mjs +1 -1
- package/dist/services/matrixSwitcher.cjs +1 -2
- package/dist/services/matrixSwitcher.d.cts +2 -46
- package/dist/services/matrixSwitcher.d.mts +2 -46
- package/dist/services/matrixSwitcher.mjs +1 -2
- package/dist/services/mcpFilter.cjs +1 -3
- package/dist/services/mcpFilter.d.cts +2 -40
- package/dist/services/mcpFilter.d.mts +2 -40
- package/dist/services/mcpFilter.mjs +1 -3
- package/dist/services/modeCatalog.cjs +2 -0
- package/dist/services/modeCatalog.cjs.map +1 -0
- package/dist/services/modeCatalog.d.cts +18 -0
- package/dist/services/modeCatalog.d.cts.map +1 -0
- package/dist/services/modeCatalog.d.mts +18 -0
- package/dist/services/modeCatalog.d.mts.map +1 -0
- package/dist/services/modeCatalog.mjs +2 -0
- package/dist/services/modeCatalog.mjs.map +1 -0
- package/dist/services/piSettings.cjs +1 -2
- package/dist/services/piSettings.d.cts +2 -24
- package/dist/services/piSettings.d.mts +2 -24
- package/dist/services/piSettings.mjs +1 -2
- package/dist/services/resourceCollector.cjs +1 -3
- package/dist/services/resourceCollector.d.cts +2 -23
- package/dist/services/resourceCollector.d.mts +2 -23
- package/dist/services/resourceCollector.mjs +1 -3
- package/dist/services/skillCatalog.cjs +1 -2
- package/dist/services/skillCatalog.d.cts +2 -56
- package/dist/services/skillCatalog.d.mts +2 -56
- package/dist/services/skillCatalog.mjs +1 -2
- package/dist/services/skillSources.cjs +1 -2
- package/dist/services/skillSources.d.cts +2 -24
- package/dist/services/skillSources.d.mts +2 -24
- package/dist/services/skillSources.mjs +1 -2
- package/dist/services/syncState.cjs +1 -2
- package/dist/services/syncState.d.cts +3 -133
- package/dist/services/syncState.d.mts +3 -133
- package/dist/services/syncState.mjs +1 -2
- package/dist/services/tools/toolNames.cjs +2 -0
- package/dist/services/tools/toolNames.cjs.map +1 -0
- package/dist/services/tools/toolNames.d.cts +25 -0
- package/dist/services/tools/toolNames.d.cts.map +1 -0
- package/dist/services/tools/toolNames.d.mts +25 -0
- package/dist/services/tools/toolNames.d.mts.map +1 -0
- package/dist/services/tools/toolNames.mjs +2 -0
- package/dist/services/tools/toolNames.mjs.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.cts +1 -1
- package/dist/types/interfaces/compatibility.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.mts +1 -1
- package/dist/types/interfaces/compatibility.d.mts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.cts +6 -2
- package/dist/types/interfaces/harness.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.mts +6 -2
- package/dist/types/interfaces/harness.d.mts.map +1 -0
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.cts +5 -5
- package/dist/utils/index.d.mts +5 -5
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/json.cjs +1 -2
- package/dist/utils/json.d.cts +2 -23
- package/dist/utils/json.d.mts +2 -23
- package/dist/utils/json.mjs +1 -2
- package/dist/utils/moduleResolution.cjs +1 -2
- package/dist/utils/moduleResolution.d.cts +2 -56
- package/dist/utils/moduleResolution.d.mts +2 -56
- package/dist/utils/moduleResolution.mjs +1 -2
- package/dist/utils/repository.cjs +1 -2
- package/dist/utils/repository.d.cts +2 -21
- package/dist/utils/repository.d.mts +2 -21
- package/dist/utils/repository.mjs +1 -2
- package/dist/utils/toolNames.cjs +1 -2
- package/dist/utils/toolNames.d.cts +2 -25
- package/dist/utils/toolNames.d.mts +2 -25
- package/dist/utils/toolNames.mjs +1 -2
- package/package.json +59 -37
- package/dist/cli/cliApp.cjs.map +0 -1
- package/dist/cli/cliApp.d.cts.map +0 -1
- package/dist/cli/cliApp.d.mts.map +0 -1
- package/dist/cli/cliApp.mjs.map +0 -1
- package/dist/cli/compatibilityOptions.cjs.map +0 -1
- package/dist/cli/compatibilityOptions.d.cts.map +0 -1
- package/dist/cli/compatibilityOptions.d.mts.map +0 -1
- package/dist/cli/compatibilityOptions.mjs.map +0 -1
- package/dist/cli/help.d.cts.map +0 -1
- package/dist/cli/help.d.mts.map +0 -1
- package/dist/cli/matrixOptions.cjs.map +0 -1
- package/dist/cli/matrixOptions.d.cts.map +0 -1
- package/dist/cli/matrixOptions.d.mts.map +0 -1
- package/dist/cli/matrixOptions.mjs.map +0 -1
- package/dist/cli/options.cjs.map +0 -1
- package/dist/cli/options.d.cts.map +0 -1
- package/dist/cli/options.d.mts.map +0 -1
- package/dist/cli/options.mjs.map +0 -1
- package/dist/commands/buildCommand.d.cts +0 -23
- package/dist/commands/buildCommand.d.cts.map +0 -1
- package/dist/commands/buildCommand.d.mts +0 -23
- package/dist/commands/buildCommand.d.mts.map +0 -1
- package/dist/config/harnessState.cjs.map +0 -1
- package/dist/config/harnessState.d.cts.map +0 -1
- package/dist/config/harnessState.d.mts.map +0 -1
- package/dist/config/harnessState.mjs.map +0 -1
- package/dist/config/projectTrust.cjs.map +0 -1
- package/dist/config/projectTrust.d.cts.map +0 -1
- package/dist/config/projectTrust.d.mts.map +0 -1
- package/dist/config/projectTrust.mjs.map +0 -1
- package/dist/entries/addDirCompatibility.cjs +0 -2
- package/dist/entries/addDirCompatibility.cjs.map +0 -1
- package/dist/entries/addDirCompatibility.d.cts +0 -13
- package/dist/entries/addDirCompatibility.d.cts.map +0 -1
- package/dist/entries/addDirCompatibility.d.mts +0 -14
- package/dist/entries/addDirCompatibility.d.mts.map +0 -1
- package/dist/entries/addDirCompatibility.mjs +0 -2
- package/dist/entries/addDirCompatibility.mjs.map +0 -1
- package/dist/entries/autoStop.cjs.map +0 -1
- package/dist/entries/autoStop.d.cts.map +0 -1
- package/dist/entries/autoStop.d.mts.map +0 -1
- package/dist/entries/autoStop.mjs.map +0 -1
- package/dist/entries/components/matrixPicker.cjs.map +0 -1
- package/dist/entries/components/matrixPicker.d.cts.map +0 -1
- package/dist/entries/components/matrixPicker.d.mts.map +0 -1
- package/dist/entries/components/matrixPicker.mjs.map +0 -1
- package/dist/entries/components/skillsOverlay.cjs.map +0 -1
- package/dist/entries/components/skillsOverlay.d.cts.map +0 -1
- package/dist/entries/components/skillsOverlay.d.mts.map +0 -1
- package/dist/entries/components/skillsOverlay.mjs.map +0 -1
- package/dist/entries/domains.cjs.map +0 -1
- package/dist/entries/domains.d.cts.map +0 -1
- package/dist/entries/domains.d.mts.map +0 -1
- package/dist/entries/domains.mjs.map +0 -1
- package/dist/entries/doom.cjs.map +0 -1
- package/dist/entries/doom.d.cts.map +0 -1
- package/dist/entries/doom.d.mts.map +0 -1
- package/dist/entries/doom.mjs.map +0 -1
- package/dist/entries/effort.cjs.map +0 -1
- package/dist/entries/effort.d.cts.map +0 -1
- package/dist/entries/effort.d.mts.map +0 -1
- package/dist/entries/effort.mjs.map +0 -1
- package/dist/entries/majorMode.cjs.map +0 -1
- package/dist/entries/majorMode.d.cts.map +0 -1
- package/dist/entries/majorMode.d.mts.map +0 -1
- package/dist/entries/majorMode.mjs.map +0 -1
- package/dist/entries/notifications.cjs.map +0 -1
- package/dist/entries/notifications.d.cts.map +0 -1
- package/dist/entries/notifications.d.mts.map +0 -1
- package/dist/entries/notifications.mjs.map +0 -1
- package/dist/entries/ollamaProvider.cjs.map +0 -1
- package/dist/entries/ollamaProvider.d.cts.map +0 -1
- package/dist/entries/ollamaProvider.d.mts.map +0 -1
- package/dist/entries/ollamaProvider.mjs.map +0 -1
- package/dist/entries/persona.cjs.map +0 -1
- package/dist/entries/persona.d.cts.map +0 -1
- package/dist/entries/persona.d.mts.map +0 -1
- package/dist/entries/persona.mjs.map +0 -1
- package/dist/entries/profile.cjs.map +0 -1
- package/dist/entries/profile.d.cts.map +0 -1
- package/dist/entries/profile.d.mts.map +0 -1
- package/dist/entries/profile.mjs.map +0 -1
- package/dist/entries/repositoryHooks.cjs.map +0 -1
- package/dist/entries/repositoryHooks.d.cts.map +0 -1
- package/dist/entries/repositoryHooks.d.mts.map +0 -1
- package/dist/entries/repositoryHooks.mjs.map +0 -1
- package/dist/entries/skills.cjs.map +0 -1
- package/dist/entries/skills.d.cts.map +0 -1
- package/dist/entries/skills.d.mts.map +0 -1
- package/dist/entries/skills.mjs.map +0 -1
- package/dist/entries/styleSystem.d.cts.map +0 -1
- package/dist/entries/styleSystem.d.mts.map +0 -1
- package/dist/entries/styleSystem.mjs.map +0 -1
- package/dist/interfaces/compatibility.d.cts.map +0 -1
- package/dist/interfaces/compatibility.d.mts.map +0 -1
- package/dist/interfaces/harness.d.cts.map +0 -1
- package/dist/interfaces/harness.d.mts.map +0 -1
- package/dist/logSinkTelemetry.cjs.map +0 -1
- package/dist/logSinkTelemetry.d.cts.map +0 -1
- package/dist/logSinkTelemetry.d.mts.map +0 -1
- package/dist/logSinkTelemetry.mjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +0 -1
- package/dist/services/compatibility/index.cjs.map +0 -1
- package/dist/services/compatibility/index.mjs.map +0 -1
- package/dist/services/compatibilityContext.cjs.map +0 -1
- package/dist/services/compatibilityContext.mjs.map +0 -1
- package/dist/services/composer.cjs.map +0 -1
- package/dist/services/composer.d.cts.map +0 -1
- package/dist/services/composer.d.mts.map +0 -1
- package/dist/services/composer.mjs.map +0 -1
- package/dist/services/extensionCompiler.cjs +0 -3
- package/dist/services/extensionCompiler.cjs.map +0 -1
- package/dist/services/extensionCompiler.mjs +0 -3
- package/dist/services/extensionCompiler.mjs.map +0 -1
- package/dist/services/harnessContext.cjs.map +0 -1
- package/dist/services/harnessContext.mjs.map +0 -1
- package/dist/services/matrixSwitcher.cjs.map +0 -1
- package/dist/services/matrixSwitcher.mjs.map +0 -1
- package/dist/services/mcpFilter.cjs.map +0 -1
- package/dist/services/mcpFilter.d.cts.map +0 -1
- package/dist/services/mcpFilter.d.mts.map +0 -1
- package/dist/services/mcpFilter.mjs.map +0 -1
- package/dist/services/piSettings.cjs.map +0 -1
- package/dist/services/piSettings.d.cts.map +0 -1
- package/dist/services/piSettings.d.mts.map +0 -1
- package/dist/services/piSettings.mjs.map +0 -1
- package/dist/services/resourceCollector.cjs.map +0 -1
- package/dist/services/resourceCollector.d.cts.map +0 -1
- package/dist/services/resourceCollector.d.mts.map +0 -1
- package/dist/services/resourceCollector.mjs.map +0 -1
- package/dist/services/runtimeBundle.cjs +0 -2
- package/dist/services/runtimeBundle.cjs.map +0 -1
- package/dist/services/runtimeBundle.d.cts.map +0 -1
- package/dist/services/runtimeBundle.d.mts.map +0 -1
- package/dist/services/runtimeBundle.mjs +0 -2
- package/dist/services/runtimeBundle.mjs.map +0 -1
- package/dist/services/skillCatalog.cjs.map +0 -1
- package/dist/services/skillCatalog.d.cts.map +0 -1
- package/dist/services/skillCatalog.d.mts.map +0 -1
- package/dist/services/skillCatalog.mjs.map +0 -1
- package/dist/services/syncState.cjs.map +0 -1
- package/dist/services/syncState.d.cts.map +0 -1
- package/dist/services/syncState.d.mts.map +0 -1
- package/dist/services/syncState.mjs.map +0 -1
- package/dist/utils/json.cjs.map +0 -1
- package/dist/utils/json.d.cts.map +0 -1
- package/dist/utils/json.d.mts.map +0 -1
- package/dist/utils/json.mjs.map +0 -1
- package/dist/utils/moduleResolution.cjs.map +0 -1
- package/dist/utils/moduleResolution.d.cts.map +0 -1
- package/dist/utils/moduleResolution.d.mts.map +0 -1
- package/dist/utils/moduleResolution.mjs.map +0 -1
- package/dist/utils/repository.cjs.map +0 -1
- package/dist/utils/repository.d.cts.map +0 -1
- package/dist/utils/repository.d.mts.map +0 -1
- package/dist/utils/repository.mjs.map +0 -1
- package/dist/utils/toolNames.cjs.map +0 -1
- package/dist/utils/toolNames.d.cts.map +0 -1
- package/dist/utils/toolNames.d.mts.map +0 -1
- package/dist/utils/toolNames.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeBundle.mjs","names":[],"sources":["../../src/services/runtimeBundle.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessOptions } from '../interfaces/index.ts';\nimport { writeFileAtomic } from '../utils/index.ts';\nimport type { HarnessContext } from './harnessContext.ts';\nimport { assembleChildExtensions, assembleExtensions } from './extensionAssembler.ts';\nimport { compileExtensionSet } from './extensionCompiler.ts';\n\nconst EXTENSION_CACHE_DIRECTORY = path.join('.pi', 'doom', 'cache');\nconst MODE_DIST_DIRECTORY = path.join('.pi', 'doom', 'dist');\nconst MODE_MANIFEST_VERSION = 1;\n\nexport interface RuntimeExtensionPlan {\n /** Pi CLI order. Pi evaluates explicit extension arguments in reverse. */\n extensions: string[];\n childExtensions: string[];\n}\n\nexport interface RuntimeBundleBuild extends RuntimeExtensionPlan {\n bundle: string;\n manifest: string;\n}\n\nexport interface ModeBuildSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n mute: boolean;\n autoStop: boolean;\n agents: boolean;\n mcp: boolean;\n}\n\nexport interface ModeBuildManifest {\n version: number;\n artifact: string;\n selection: ModeBuildSelection;\n /** Original source entries in the order their factories activate. */\n extensionPaths: string[];\n /** Original source entries inherited by detached child agents. */\n childExtensionPaths: string[];\n resources: {\n /** Exact SKILL.md paths; never derived from the bundled artifact path. */\n skillPaths: string[];\n pluginRoots: string[];\n };\n}\n\nexport interface ModeExtensionBuildOptions {\n repoRoot: string;\n selection: ModeBuildSelection;\n extensionPaths: readonly string[];\n childExtensionPaths?: readonly string[];\n skillPaths?: readonly string[];\n pluginRoots?: readonly string[];\n outputName?: string;\n cacheDirectory?: string;\n outputDirectory?: string;\n}\n\n/** Resolves the parent and detached-child extension lists for one launch. */\nexport function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan {\n const common = {\n agents: context.options.agents,\n preset: context.options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n };\n return {\n extensions: assembleExtensions({\n ...common,\n autoStop: context.options.autoStop,\n mute: context.options.mute,\n workflowExtension: context.workflowExtension,\n }),\n childExtensions: assembleChildExtensions({\n ...common,\n agents: false,\n autoStop: false,\n mute: true,\n }),\n };\n}\n\nfunction modeSelection(options: HarnessOptions): ModeBuildSelection {\n return {\n majorMode: options.majorMode,\n domains: [...options.domains],\n profile: options.profile,\n preset: options.preset,\n mute: options.mute,\n autoStop: options.autoStop,\n agents: options.agents,\n mcp: options.mcp,\n };\n}\n\nfunction modeOutputName(selection: ModeBuildSelection): string {\n return [selection.majorMode, selection.mute ? 'mute' : undefined, selection.autoStop ? 'auto-stop' : undefined]\n .filter((value): value is string => Boolean(value))\n .join('.');\n}\n\nfunction manifestPathFor(bundle: string): string {\n return bundle.replace(/\\.mjs$/, '.manifest.json');\n}\n\n/**\n * Emits one named mode extension and its original-path resource manifest.\n *\n * Extension code lives in dist while graph fingerprints remain in cache. Skill\n * loading never follows the bundle's import.meta.url: Pi receives the exact\n * original SKILL.md paths recorded here and in harness state.\n */\nexport async function compileModeExtension(options: ModeExtensionBuildOptions): Promise<{\n bundle: string;\n manifest: string;\n}> {\n const extensionPaths = options.extensionPaths.map((entry) => path.resolve(entry));\n const selection = { ...options.selection, domains: [...options.selection.domains] };\n const bundle = await compileExtensionSet(\n extensionPaths,\n options.cacheDirectory ?? path.join(options.repoRoot, EXTENSION_CACHE_DIRECTORY),\n {\n outputDirectory: options.outputDirectory ?? path.join(options.repoRoot, MODE_DIST_DIRECTORY),\n outputName: options.outputName ?? modeOutputName(selection),\n },\n );\n const manifest = manifestPathFor(bundle);\n const contents: ModeBuildManifest = {\n version: MODE_MANIFEST_VERSION,\n artifact: bundle,\n selection,\n extensionPaths,\n childExtensionPaths: (options.childExtensionPaths ?? []).map((entry) => path.resolve(entry)),\n resources: {\n skillPaths: (options.skillPaths ?? []).map((entry) => path.resolve(entry)),\n pluginRoots: (options.pluginRoots ?? []).map((entry) => path.resolve(entry)),\n },\n };\n writeFileAtomic(manifest, `${JSON.stringify(contents, null, 2)}\\n`);\n return { bundle, manifest };\n}\n\n/** Compiles the exact Pi load order used by the selected launch matrix. */\nexport async function buildRuntimeBundle(\n context: HarnessContext,\n plan: RuntimeExtensionPlan = createRuntimeExtensionPlan(context),\n): Promise<RuntimeBundleBuild> {\n const built = await compileModeExtension({\n repoRoot: context.options.repoRoot,\n selection: modeSelection(context.options),\n extensionPaths: [...plan.extensions].reverse(),\n childExtensionPaths: plan.childExtensions,\n skillPaths: context.resources.skillDirectories,\n pluginRoots: context.plugins.map((plugin) => plugin.directory),\n });\n return { ...plan, ...built };\n}\n"],"mappings":"iQAOA,MAAM,EAA4B,EAAK,KAAK,MAAO,OAAQ,QAAQ,CAC7D,EAAsB,EAAK,KAAK,MAAO,OAAQ,OAAO,CAqD5D,SAAgB,EAA2B,EAA+C,CACxF,IAAM,EAAS,CACb,OAAQ,EAAQ,QAAQ,OACxB,OAAQ,EAAQ,QAAQ,OACxB,SAAU,EAAQ,SAClB,aAAc,EAAQ,aACtB,OAAQ,EAAQ,eAChB,iBAAkB,EAAQ,iBAC3B,CACD,MAAO,CACL,WAAY,EAAmB,CAC7B,GAAG,EACH,SAAU,EAAQ,QAAQ,SAC1B,KAAM,EAAQ,QAAQ,KACtB,kBAAmB,EAAQ,kBAC5B,CAAC,CACF,gBAAiB,EAAwB,CACvC,GAAG,EACH,OAAQ,GACR,SAAU,GACV,KAAM,GACP,CAAC,CACH,CAGH,SAAS,EAAc,EAA6C,CAClE,MAAO,CACL,UAAW,EAAQ,UACnB,QAAS,CAAC,GAAG,EAAQ,QAAQ,CAC7B,QAAS,EAAQ,QACjB,OAAQ,EAAQ,OAChB,KAAM,EAAQ,KACd,SAAU,EAAQ,SAClB,OAAQ,EAAQ,OAChB,IAAK,EAAQ,IACd,CAGH,SAAS,EAAe,EAAuC,CAC7D,MAAO,CAAC,EAAU,UAAW,EAAU,KAAO,OAAS,IAAA,GAAW,EAAU,SAAW,YAAc,IAAA,GAAU,CAC5G,OAAQ,GAA2B,EAAQ,EAAO,CAClD,KAAK,IAAI,CAGd,SAAS,EAAgB,EAAwB,CAC/C,OAAO,EAAO,QAAQ,SAAU,iBAAiB,CAUnD,eAAsB,EAAqB,EAGxC,CACD,IAAM,EAAiB,EAAQ,eAAe,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC3E,EAAY,CAAE,GAAG,EAAQ,UAAW,QAAS,CAAC,GAAG,EAAQ,UAAU,QAAQ,CAAE,CAC7E,EAAS,MAAM,EACnB,EACA,EAAQ,gBAAkB,EAAK,KAAK,EAAQ,SAAU,EAA0B,CAChF,CACE,gBAAiB,EAAQ,iBAAmB,EAAK,KAAK,EAAQ,SAAU,EAAoB,CAC5F,WAAY,EAAQ,YAAc,EAAe,EAAU,CAC5D,CACF,CACK,EAAW,EAAgB,EAAO,CAClC,EAA8B,CAClC,QAAS,EACT,SAAU,EACV,YACA,iBACA,qBAAsB,EAAQ,qBAAuB,EAAE,EAAE,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC5F,UAAW,CACT,YAAa,EAAQ,YAAc,EAAE,EAAE,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC1E,aAAc,EAAQ,aAAe,EAAE,EAAE,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC7E,CACF,CAED,OADA,EAAgB,EAAU,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAAI,CAC5D,CAAE,SAAQ,WAAU,CAI7B,eAAsB,EACpB,EACA,EAA6B,EAA2B,EAAQ,CACnC,CAC7B,IAAM,EAAQ,MAAM,EAAqB,CACvC,SAAU,EAAQ,QAAQ,SAC1B,UAAW,EAAc,EAAQ,QAAQ,CACzC,eAAgB,CAAC,GAAG,EAAK,WAAW,CAAC,SAAS,CAC9C,oBAAqB,EAAK,gBAC1B,WAAY,EAAQ,UAAU,iBAC9B,YAAa,EAAQ,QAAQ,IAAK,GAAW,EAAO,UAAU,CAC/D,CAAC,CACF,MAAO,CAAE,GAAG,EAAM,GAAG,EAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillCatalog.cjs","names":["path","fs"],"sources":["../../src/services/skillCatalog.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport { formatSkillsForPrompt, loadSkillsFromDir, type Skill } from '@earendil-works/pi-coding-agent';\nimport type { SkillSourceEntry } from './skillSources.ts';\n\nconst SKILLS_DIRECTORY = 'skills';\nconst SHARED_SKILLS_OWNER = '.claude/skills';\n\nexport type SkillGroupKey = 'extensions' | 'plugins' | 'default';\n\nexport interface SkillEntry {\n name: string;\n description: string;\n filePath: string;\n baseDir: string;\n group: SkillGroupKey;\n /** Package name for an extension, plugin directory name, or `.claude/skills`. */\n owner: string;\n modelInvocable: boolean;\n}\n\nexport interface SkillOwnerNode {\n owner: string;\n skills: SkillEntry[];\n}\n\nexport interface SkillGroup {\n key: SkillGroupKey;\n label: string;\n owners: SkillOwnerNode[];\n}\n\nexport interface SkillCatalog {\n groups: SkillGroup[];\n skillCount: number;\n /** Tokens the `<available_skills>` prompt block costs on every request. */\n promptTokens: number;\n /** Tokens every loaded SKILL.md costs in full, if all of them were read. */\n bodyTokens: number;\n /** Frontmatter and read failures, surfaced instead of thrown. */\n diagnostics: string[];\n}\n\nexport interface SkillCatalogOptions {\n repoRoot: string;\n /** Exact files the current selection resolved to, from `HarnessState.skillDirectories`. */\n activeSkillDirectories: readonly string[];\n extensionSources: readonly SkillSourceEntry[];\n}\n\n/**\n * The tokenizer, loaded on first use rather than at import.\n *\n * `gpt-tokenizer` carries its whole vocabulary and costs about a tenth of a\n * second to load. This module is reachable from the skills extension, which Pi\n * loads at session start, so a top-level import would charge every session for\n * a surface most of them never open.\n */\nlet tokenizer: Promise<typeof import('gpt-tokenizer')> | undefined;\n\nexport async function counter(): Promise<(text: string) => number> {\n tokenizer ??= import('gpt-tokenizer');\n return (await tokenizer).countTokens;\n}\n\n/**\n * Matches a directory against the active set.\n *\n * A domain that lists a plugin subset puts individual skill directories in the\n * set rather than the plugin's `skills` root, so containment has to be checked\n * both ways: the set may hold an ancestor of the directory, or a descendant of\n * it.\n */\nfunction createActiveMatcher(directories: readonly string[]): (directory: string) => boolean {\n const active = directories.map((directory) => path.resolve(directory));\n return (directory) => {\n const resolved = path.resolve(directory);\n return active.some(\n (entry) =>\n entry === resolved || entry.startsWith(`${resolved}${path.sep}`) || resolved.startsWith(`${entry}${path.sep}`),\n );\n };\n}\n\nfunction collect(\n directory: string,\n group: SkillGroupKey,\n owner: string,\n isActive: (directory: string) => boolean,\n loaded: Skill[],\n diagnostics: string[],\n): SkillEntry[] {\n const result = loadSkillsFromDir({ dir: directory, source: owner });\n for (const diagnostic of result.diagnostics) {\n diagnostics.push(`${diagnostic.path ?? directory}: ${diagnostic.message}`);\n }\n // Checked per skill, not per root: a subset domain selects some of a plugin's\n // skills and leaves the rest on disk, unloaded and therefore not listed.\n const kept = result.skills.filter((skill) => isActive(path.dirname(skill.filePath)));\n // Kept in their loaded form as well, because the prompt-block cost is measured\n // by handing them back to Pi's own formatter.\n loaded.push(...kept);\n return kept\n .map((skill) => ({\n name: skill.name,\n description: skill.description,\n filePath: skill.filePath,\n baseDir: skill.baseDir,\n group,\n owner,\n modelInvocable: !skill.disableModelInvocation,\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction sortOwners(owners: SkillOwnerNode[]): SkillOwnerNode[] {\n return owners.sort((left, right) => left.owner.localeCompare(right.owner));\n}\n\n/**\n * Every skill this session actually loaded, grouped by where it comes from,\n * priced in tokens.\n *\n * Discovery runs over `loadSkillsFromDir` from Pi rather than the harness's own\n * walker so the listing matches what Pi would load, including its ignore-file\n * handling; the same skills are then handed to Pi's `formatSkillsForPrompt` so\n * the always-on figure is the real prompt block rather than a reconstruction of\n * it.\n */\nexport async function buildSkillCatalog(options: SkillCatalogOptions): Promise<SkillCatalog> {\n const { repoRoot } = options;\n const isActive = createActiveMatcher(options.activeSkillDirectories);\n const diagnostics: string[] = [];\n const loaded: Skill[] = [];\n\n const extensionOwners: SkillOwnerNode[] = [];\n for (const entry of options.extensionSources) {\n const skills = entry.directories.flatMap((directory) =>\n collect(directory, 'extensions', entry.source, () => true, loaded, diagnostics),\n );\n if (skills.length > 0) extensionOwners.push({ owner: entry.source, skills });\n }\n\n const pluginOwners: SkillOwnerNode[] = [];\n for (const entry of resolvePluginEntries(repoRoot, listDomainNames(repoRoot), [])) {\n const directory = path.join(entry.directory, SKILLS_DIRECTORY);\n if (!fs.existsSync(directory)) continue;\n const owner = path.basename(entry.directory);\n const skills = collect(directory, 'plugins', owner, isActive, loaded, diagnostics);\n if (skills.length > 0) pluginOwners.push({ owner, skills });\n }\n\n const sharedDirectory = path.join(repoRoot, '.claude', SKILLS_DIRECTORY);\n const sharedSkills = collect(sharedDirectory, 'default', SHARED_SKILLS_OWNER, isActive, loaded, diagnostics);\n const defaultOwners = sharedSkills.length > 0 ? [{ owner: SHARED_SKILLS_OWNER, skills: sharedSkills }] : [];\n\n const groups: SkillGroup[] = [\n { key: 'extensions', label: 'extensions', owners: sortOwners(extensionOwners) },\n { key: 'plugins', label: 'plugins', owners: sortOwners(pluginOwners) },\n { key: 'default', label: 'default', owners: defaultOwners },\n ];\n\n const countTokens = await counter();\n const prompt = formatSkillsForPrompt(loaded);\n let bodyTokens = 0;\n for (const skill of loaded) {\n try {\n bodyTokens += countTokens(fs.readFileSync(skill.filePath, 'utf8'));\n } catch (error) {\n diagnostics.push(`${skill.filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return {\n groups,\n skillCount: loaded.length,\n promptTokens: prompt ? countTokens(prompt) : 0,\n bodyTokens,\n diagnostics,\n };\n}\n\n/** The skills a name resolves to, used to decide what `enter` can invoke. */\nexport function findSkill(catalog: SkillCatalog, name: string): SkillEntry | undefined {\n for (const group of catalog.groups) {\n for (const owner of group.owners) {\n const match = owner.skills.find((skill) => skill.name === name);\n if (match) return match;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillCatalog.d.cts","names":[],"sources":["../../src/services/skillCatalog.ts"],"mappings":";;;KASY,aAAA;AAAA,UAEK,UAAA;EACf,IAAA;EACA,WAAA;EACA,QAAA;EACA,OAAA;EACA,KAAA,EAAO,aAAA;EALQ;EAOf,KAAA;EACA,cAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,MAAA,EAAQ,UAAA;AAAA;AAAA,UAGO,UAAA;EACf,GAAA,EAAK,aAAA;EACL,KAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGO,YAAA;EACf,MAAA,EAAQ,UAAA;EACR,UAAA;;EAEA,YAAA;EAdA;EAgBA,UAAA;EAfQ;EAiBR,WAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA;;EAEA,sBAAA;EACA,gBAAA,WAA2B,gBAAA;AAAA;AAAA,iBAaP,OAAA,CAAA,GAAW,OAAA,EAAS,IAAA;;;;;AA5B1C;;;;;;iBAiGsB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,YAAA;;iBAsD/D,SAAA,CAAU,OAAA,EAAS,YAAA,EAAc,IAAA,WAAe,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillCatalog.d.mts","names":[],"sources":["../../src/services/skillCatalog.ts"],"mappings":";;;KASY,aAAA;AAAA,UAEK,UAAA;EACf,IAAA;EACA,WAAA;EACA,QAAA;EACA,OAAA;EACA,KAAA,EAAO,aAAA;EALQ;EAOf,KAAA;EACA,cAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,MAAA,EAAQ,UAAA;AAAA;AAAA,UAGO,UAAA;EACf,GAAA,EAAK,aAAA;EACL,KAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGO,YAAA;EACf,MAAA,EAAQ,UAAA;EACR,UAAA;;EAEA,YAAA;EAdA;EAgBA,UAAA;EAfQ;EAiBR,WAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA;;EAEA,sBAAA;EACA,gBAAA,WAA2B,gBAAA;AAAA;AAAA,iBAaP,OAAA,CAAA,GAAW,OAAA,EAAS,IAAA;;;;;AA5B1C;;;;;;iBAiGsB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,YAAA;;iBAsD/D,SAAA,CAAU,OAAA,EAAS,YAAA,EAAc,IAAA,WAAe,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillCatalog.mjs","names":[],"sources":["../../src/services/skillCatalog.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { listDomainNames, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport { formatSkillsForPrompt, loadSkillsFromDir, type Skill } from '@earendil-works/pi-coding-agent';\nimport type { SkillSourceEntry } from './skillSources.ts';\n\nconst SKILLS_DIRECTORY = 'skills';\nconst SHARED_SKILLS_OWNER = '.claude/skills';\n\nexport type SkillGroupKey = 'extensions' | 'plugins' | 'default';\n\nexport interface SkillEntry {\n name: string;\n description: string;\n filePath: string;\n baseDir: string;\n group: SkillGroupKey;\n /** Package name for an extension, plugin directory name, or `.claude/skills`. */\n owner: string;\n modelInvocable: boolean;\n}\n\nexport interface SkillOwnerNode {\n owner: string;\n skills: SkillEntry[];\n}\n\nexport interface SkillGroup {\n key: SkillGroupKey;\n label: string;\n owners: SkillOwnerNode[];\n}\n\nexport interface SkillCatalog {\n groups: SkillGroup[];\n skillCount: number;\n /** Tokens the `<available_skills>` prompt block costs on every request. */\n promptTokens: number;\n /** Tokens every loaded SKILL.md costs in full, if all of them were read. */\n bodyTokens: number;\n /** Frontmatter and read failures, surfaced instead of thrown. */\n diagnostics: string[];\n}\n\nexport interface SkillCatalogOptions {\n repoRoot: string;\n /** Exact files the current selection resolved to, from `HarnessState.skillDirectories`. */\n activeSkillDirectories: readonly string[];\n extensionSources: readonly SkillSourceEntry[];\n}\n\n/**\n * The tokenizer, loaded on first use rather than at import.\n *\n * `gpt-tokenizer` carries its whole vocabulary and costs about a tenth of a\n * second to load. This module is reachable from the skills extension, which Pi\n * loads at session start, so a top-level import would charge every session for\n * a surface most of them never open.\n */\nlet tokenizer: Promise<typeof import('gpt-tokenizer')> | undefined;\n\nexport async function counter(): Promise<(text: string) => number> {\n tokenizer ??= import('gpt-tokenizer');\n return (await tokenizer).countTokens;\n}\n\n/**\n * Matches a directory against the active set.\n *\n * A domain that lists a plugin subset puts individual skill directories in the\n * set rather than the plugin's `skills` root, so containment has to be checked\n * both ways: the set may hold an ancestor of the directory, or a descendant of\n * it.\n */\nfunction createActiveMatcher(directories: readonly string[]): (directory: string) => boolean {\n const active = directories.map((directory) => path.resolve(directory));\n return (directory) => {\n const resolved = path.resolve(directory);\n return active.some(\n (entry) =>\n entry === resolved || entry.startsWith(`${resolved}${path.sep}`) || resolved.startsWith(`${entry}${path.sep}`),\n );\n };\n}\n\nfunction collect(\n directory: string,\n group: SkillGroupKey,\n owner: string,\n isActive: (directory: string) => boolean,\n loaded: Skill[],\n diagnostics: string[],\n): SkillEntry[] {\n const result = loadSkillsFromDir({ dir: directory, source: owner });\n for (const diagnostic of result.diagnostics) {\n diagnostics.push(`${diagnostic.path ?? directory}: ${diagnostic.message}`);\n }\n // Checked per skill, not per root: a subset domain selects some of a plugin's\n // skills and leaves the rest on disk, unloaded and therefore not listed.\n const kept = result.skills.filter((skill) => isActive(path.dirname(skill.filePath)));\n // Kept in their loaded form as well, because the prompt-block cost is measured\n // by handing them back to Pi's own formatter.\n loaded.push(...kept);\n return kept\n .map((skill) => ({\n name: skill.name,\n description: skill.description,\n filePath: skill.filePath,\n baseDir: skill.baseDir,\n group,\n owner,\n modelInvocable: !skill.disableModelInvocation,\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction sortOwners(owners: SkillOwnerNode[]): SkillOwnerNode[] {\n return owners.sort((left, right) => left.owner.localeCompare(right.owner));\n}\n\n/**\n * Every skill this session actually loaded, grouped by where it comes from,\n * priced in tokens.\n *\n * Discovery runs over `loadSkillsFromDir` from Pi rather than the harness's own\n * walker so the listing matches what Pi would load, including its ignore-file\n * handling; the same skills are then handed to Pi's `formatSkillsForPrompt` so\n * the always-on figure is the real prompt block rather than a reconstruction of\n * it.\n */\nexport async function buildSkillCatalog(options: SkillCatalogOptions): Promise<SkillCatalog> {\n const { repoRoot } = options;\n const isActive = createActiveMatcher(options.activeSkillDirectories);\n const diagnostics: string[] = [];\n const loaded: Skill[] = [];\n\n const extensionOwners: SkillOwnerNode[] = [];\n for (const entry of options.extensionSources) {\n const skills = entry.directories.flatMap((directory) =>\n collect(directory, 'extensions', entry.source, () => true, loaded, diagnostics),\n );\n if (skills.length > 0) extensionOwners.push({ owner: entry.source, skills });\n }\n\n const pluginOwners: SkillOwnerNode[] = [];\n for (const entry of resolvePluginEntries(repoRoot, listDomainNames(repoRoot), [])) {\n const directory = path.join(entry.directory, SKILLS_DIRECTORY);\n if (!fs.existsSync(directory)) continue;\n const owner = path.basename(entry.directory);\n const skills = collect(directory, 'plugins', owner, isActive, loaded, diagnostics);\n if (skills.length > 0) pluginOwners.push({ owner, skills });\n }\n\n const sharedDirectory = path.join(repoRoot, '.claude', SKILLS_DIRECTORY);\n const sharedSkills = collect(sharedDirectory, 'default', SHARED_SKILLS_OWNER, isActive, loaded, diagnostics);\n const defaultOwners = sharedSkills.length > 0 ? [{ owner: SHARED_SKILLS_OWNER, skills: sharedSkills }] : [];\n\n const groups: SkillGroup[] = [\n { key: 'extensions', label: 'extensions', owners: sortOwners(extensionOwners) },\n { key: 'plugins', label: 'plugins', owners: sortOwners(pluginOwners) },\n { key: 'default', label: 'default', owners: defaultOwners },\n ];\n\n const countTokens = await counter();\n const prompt = formatSkillsForPrompt(loaded);\n let bodyTokens = 0;\n for (const skill of loaded) {\n try {\n bodyTokens += countTokens(fs.readFileSync(skill.filePath, 'utf8'));\n } catch (error) {\n diagnostics.push(`${skill.filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return {\n groups,\n skillCount: loaded.length,\n promptTokens: prompt ? countTokens(prompt) : 0,\n bodyTokens,\n diagnostics,\n };\n}\n\n/** The skills a name resolves to, used to decide what `enter` can invoke. */\nexport function findSkill(catalog: SkillCatalog, name: string): SkillEntry | undefined {\n for (const group of catalog.groups) {\n for (const owner of group.owners) {\n const match = owner.skills.find((skill) => skill.name === name);\n if (match) return match;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncState.cjs","names":["path","fs","os","crypto","isRecord","LAYER_RESOLVERS","CONTEXT_PACKAGES","PERSONA_ENTRY","OLLAMA_PRESET"],"sources":["../../src/services/syncState.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { HarnessState } from '@agimon-ai/doompi-config';\nimport type { LayerResolvers, MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { isRecord, type JsonObject } from '../utils/index.ts';\nimport {\n CONTEXT_PACKAGES,\n LAYER_RESOLVERS,\n OLLAMA_PRESET,\n PERSONA_ENTRY,\n assembleExtensions,\n} from './extensionAssembler.ts';\n\n/**\n * The file `doom-pi sync` writes and the doom-pi Pi extension reads back.\n *\n * This is the whole contract between the two halves of the synced path. Sync\n * runs in plain Node, where module resolution and the repository config are\n * available; the extension runs inside a Pi session, where neither can be\n * relied on. Everything the extension needs is therefore resolved once here,\n * and everything in this file has to survive JSON.\n */\n\n/**\n * Bumped whenever the recorded shape changes, so a stale file re-syncs.\n *\n * 5 adds graph-aware aggregate bundles for each synced mode. Older states do\n * not have enough information to select a bundle safely.\n */\nexport const SYNC_STATE_VERSION = 5;\nconst PI_DIRECTORY = '.pi';\nconst DOOM_DIRECTORY = 'doom';\n/** The `.doom` config directory name, under both the repo root and `~/.pi`. */\nconst DOOM_CONFIG_DIRECTORY = '.doom';\nconst STATE_FILE = 'state.json';\nconst RUN_DIRECTORY = 'run';\nconst DEFAULT_PRESET = 'default';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst OWN_PREFIX = 'own:';\nconst PACKAGE_PREFIX = 'pkg:';\nconst LOCAL_PREFIX = 'local:';\n\n/** Config that feeds a sync, in the order the hash reads it. */\nconst HASHED_CONFIG_FILES = ['config.yaml', 'modes.yaml', 'domains.yaml', 'profiles.yaml', 'hooks.yaml'] as const;\n\nexport interface SyncSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n}\n\n/** Paths to the resources sync staged, before any live switch replaces them. */\nexport interface SyncBaseline {\n mcpConfigPath?: string;\n personaFile?: string;\n themePath: string;\n themeName: string;\n}\n\nexport interface SyncState {\n version: number;\n root: string;\n /** Hash of the config that produced this state, for the staleness warning. */\n inputsHash: string;\n selection: SyncSelection;\n /** Harness environment the extension applies when the values are unset. */\n env: Record<string, string>;\n /**\n * State the environment does not carry, so it has to be recorded on its own.\n *\n * Plugin hooks and the profile's environment defaults live in the session\n * state file rather than in variables. Without them here a synced session\n * would start with no plugin hooks at all, which fails silently.\n */\n fileState: Pick<HarnessState, 'profileEnvironment' | 'pluginHooks'>;\n /** Entry name to absolute path, covering every layer, not just the selected mode's. */\n resolved: Record<string, string>;\n /**\n * The same entries after TypeScript ones were bundled to plain ESM.\n *\n * Kept apart from `resolved` so the staleness check still compares resolution\n * against resolution; a state written before this existed simply has none and\n * falls back to loading the source.\n */\n compiled?: Record<string, string>;\n /** Aggregate entry by ordered extension-set key. */\n bundles?: Record<string, string>;\n /** Graph-compiled synced bootstrap written to Pi project settings. */\n bootstrap?: string;\n baseline: SyncBaseline;\n}\n\nexport function syncDirectory(repoRoot: string): string {\n return path.join(repoRoot, PI_DIRECTORY, DOOM_DIRECTORY);\n}\n\nexport function syncStatePath(repoRoot: string): string {\n return path.join(syncDirectory(repoRoot), STATE_FILE);\n}\n\n/**\n * Per-process scratch directory for live `/domains` and `/profile` switches.\n *\n * Switching rewrites the MCP config and the persona prompt. Writing those back\n * into the synced directory would both mutate the pinned baseline and let two\n * Pi sessions in one repository overwrite each other, which the launcher avoids\n * by giving every run its own temporary directory.\n */\nexport function runDirectory(repoRoot: string, processId: number = process.pid): string {\n return path.join(syncDirectory(repoRoot), RUN_DIRECTORY, String(processId));\n}\n\n/**\n * How a Pi project settings file should refer to a generated path.\n *\n * Relative to `.pi` when the target lives in the repository, which keeps the\n * committed settings file identical on every machine. A doom-pi installed\n * outside the repository stays absolute: Pi accepts both, and a relative path\n * climbing out of the project would be neither portable nor readable.\n */\nexport function settingsRelativePath(repoRoot: string, target: string): string {\n const relative = path.relative(repoRoot, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) return target;\n return path.relative(path.join(repoRoot, PI_DIRECTORY), target).split(path.sep).join('/');\n}\n\nfunction readIfPresent(filePath: string): string {\n return fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n}\n\n/**\n * Hashes the configuration a sync consumed.\n *\n * Deliberately cheap: the extension recomputes this on every session start, so\n * it reads text files and never re-resolves packages. A dependency upgrade that\n * moves a package path therefore does not show up here; `doom-pi sync --check`\n * re-resolves and is the check that catches that.\n */\nexport function computeInputsHash(\n repoRoot: string,\n selection: SyncSelection,\n homeDirectory: string = os.homedir(),\n): string {\n const hash = crypto.createHash('sha256');\n hash.update(JSON.stringify({ ...selection, domains: [...selection.domains].sort() }));\n // Every .doom document layers the global copy under the repository one, so an\n // edit in either location is a real change.\n for (const directory of [\n path.join(homeDirectory, PI_DIRECTORY, DOOM_CONFIG_DIRECTORY),\n path.join(repoRoot, DOOM_CONFIG_DIRECTORY),\n ]) {\n for (const fileName of HASHED_CONFIG_FILES) hash.update(readIfPresent(path.join(directory, fileName)));\n }\n return hash.digest('hex');\n}\n\nfunction stringRecord(value: unknown, field: string, statePath: string): Record<string, string> {\n if (!isRecord(value)) throw new Error(`Doom sync state at ${statePath} requires ${field} to be an object`);\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n}\n\nfunction parseSyncState(source: string, statePath: string): SyncState {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`Doom sync state at ${statePath} is not valid JSON`, { cause: error });\n }\n if (!isRecord(parsed)) throw new Error(`Doom sync state at ${statePath} must be an object`);\n if (parsed.version !== SYNC_STATE_VERSION) {\n throw new Error(\n `Doom sync state at ${statePath} has version ${String(parsed.version)}, expected ${SYNC_STATE_VERSION}. Run doompi sync.`,\n );\n }\n if (typeof parsed.root !== 'string' || typeof parsed.inputsHash !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires string root and inputsHash`);\n }\n if (!isRecord(parsed.selection) || typeof parsed.selection.majorMode !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires a selection with a majorMode`);\n }\n if (!isRecord(parsed.baseline) || typeof parsed.baseline.themePath !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires a baseline with a themePath`);\n }\n const { majorMode, domains, profile, preset } = parsed.selection;\n const fileState = isRecord(parsed.fileState) ? parsed.fileState : {};\n return {\n version: SYNC_STATE_VERSION,\n root: parsed.root,\n inputsHash: parsed.inputsHash,\n selection: {\n majorMode,\n domains: Array.isArray(domains) ? domains.filter((name): name is string => typeof name === 'string') : [],\n profile: typeof profile === 'string' ? profile : undefined,\n preset: typeof preset === 'string' ? preset : DEFAULT_PRESET,\n },\n env: stringRecord(parsed.env, 'env', statePath),\n fileState: {\n profileEnvironment: isRecord(fileState.profileEnvironment)\n ? (fileState.profileEnvironment as Record<string, string>)\n : {},\n pluginHooks: Array.isArray(fileState.pluginHooks) ? (fileState.pluginHooks as HarnessState['pluginHooks']) : [],\n },\n resolved: stringRecord(parsed.resolved, 'resolved', statePath),\n // Absent from a state written before compilation existed, which is why it\n // is read back optionally rather than demanded.\n compiled: parsed.compiled === undefined ? undefined : stringRecord(parsed.compiled, 'compiled', statePath),\n bundles: parsed.bundles === undefined ? undefined : stringRecord(parsed.bundles, 'bundles', statePath),\n bootstrap: typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined,\n baseline: parsed.baseline as unknown as SyncBaseline,\n };\n}\n\n/** Reads the synced state, or undefined when the repository was never synced. */\nexport function readSyncState(repoRoot: string): SyncState | undefined {\n const statePath = syncStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return undefined;\n return parseSyncState(fs.readFileSync(statePath, 'utf8'), statePath);\n}\n\nexport function serializeSyncState(state: SyncState): string {\n return `${JSON.stringify(state, null, 2)}\\n`;\n}\n\nexport async function writeSyncState(repoRoot: string, state: SyncState): Promise<string> {\n const statePath = syncStatePath(repoRoot);\n await fs.promises.mkdir(path.dirname(statePath), { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n // Holds resolved environment values, so it stays readable by its owner only.\n await fs.promises.writeFile(statePath, serializeSyncState(state), { mode: PRIVATE_FILE_MODE });\n return statePath;\n}\n\nexport function ownKey(name: string): string {\n return `${OWN_PREFIX}${name}`;\n}\n\nexport function packageKey(specifier: string): string {\n return `${PACKAGE_PREFIX}${specifier}`;\n}\n\n/**\n * Keyed by the absolute target, because the same relative specifier means\n * different files under the repository and the global config directory.\n */\nexport function localKey(specifier: string, baseDirectory: string): string {\n return `${LOCAL_PREFIX}${path.resolve(baseDirectory, specifier)}`;\n}\n\nexport interface RecordingResolvers extends LayerResolvers {\n /** Every name this resolver was asked for, keyed for the state file. */\n readonly resolved: Record<string, string>;\n}\n\n/**\n * Resolvers that record what they resolve.\n *\n * Sync composes once with every layer selected and hands the recording to the\n * state file, so the extension never has to resolve a specifier itself.\n */\nexport function createRecordingResolvers(base: LayerResolvers = LAYER_RESOLVERS): RecordingResolvers {\n const resolved: Record<string, string> = {};\n return {\n resolved,\n ownEntry(name) {\n const entry = base.ownEntry(name);\n resolved[ownKey(name)] = entry;\n return entry;\n },\n packageEntry(name) {\n const entry = base.packageEntry(name);\n resolved[packageKey(name)] = entry;\n return entry;\n },\n optionalPackageEntry(name) {\n const entry = base.optionalPackageEntry(name);\n // A miss is recorded by omission, which is what later makes the extension\n // treat it as absent instead of failing the whole composition.\n if (entry) resolved[packageKey(name)] = entry;\n return entry;\n },\n localEntry(specifier, baseDirectory) {\n const entry = base.localEntry(specifier, baseDirectory);\n if (entry) resolved[localKey(specifier, baseDirectory)] = entry;\n return entry;\n },\n };\n}\n\n/**\n * Resolves every entry any layer could contribute, in one pass.\n *\n * Composing with every layer selected and the widest options is what makes the\n * map complete: a later `/major-mode` switch inside a Pi session can then pick a\n * different set without resolving anything itself. The context packages and the\n * persona entry are asked for separately because they reach `assembleExtensions`\n * as already-resolved paths rather than through the resolvers.\n */\nexport function recordResolvedEntries(\n majorModesConfig: MajorModesConfig,\n base: LayerResolvers = LAYER_RESOLVERS,\n): Record<string, string> {\n const recording = createRecordingResolvers(base);\n for (const specifier of Object.values(CONTEXT_PACKAGES)) recording.optionalPackageEntry(specifier);\n recording.ownEntry(PERSONA_ENTRY);\n assembleExtensions({\n agents: true,\n autoStop: true,\n mute: false,\n // The one preset that contributes an extension of its own.\n preset: OLLAMA_PRESET,\n layers: Object.keys(majorModesConfig.layers),\n majorModesConfig,\n resolvers: recording,\n });\n return recording.resolved;\n}\n\n/** Resolvers backed by a synced map, for composing inside a Pi session. */\nexport function createMapResolvers(\n resolved: Record<string, string>,\n compiled: Record<string, string> = {},\n): LayerResolvers {\n // The compiled bundle when this entry has one, the source otherwise.\n const entryFor = (key: string): string | undefined => compiled[key] ?? resolved[key];\n const lookup = (key: string, name: string): string => {\n const entry = entryFor(key);\n if (!entry) throw new Error(`${name} is missing from the doompi sync state. Run doompi sync.`);\n return entry;\n };\n return {\n ownEntry: (name) => lookup(ownKey(name), name),\n packageEntry: (name) => lookup(packageKey(name), name),\n optionalPackageEntry: (name) => entryFor(packageKey(name)),\n localEntry: (specifier, baseDirectory) => entryFor(localKey(specifier, baseDirectory)),\n };\n}\n\n/** Reads the resolved MCP servers back out of a generated config. */\nexport function readMcpServerNames(configPath: string): string[] {\n if (!fs.existsSync(configPath)) return [];\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n return isRecord(config.mcpServers) ? Object.keys(config.mcpServers) : [];\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncState.d.cts","names":[],"sources":["../../src/services/syncState.ts"],"mappings":";;;;;;AA+BA;;;;;AAiBA;;;;;;;;cAjBa,kBAAA;AAAA,UAiBI,aAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;AAAA;;UAIe,YAAA;EACf,aAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,SAAA;EACf,OAAA;EACA,IAAA;EAagB;EAXhB,UAAA;EACA,SAAA,EAAW,aAAA;EAoBA;EAlBX,GAAA,EAAK,MAAA;EAuBK;;;;;;;EAfV,SAAA,EAAW,IAAA,CAAK,YAAA;EARhB;EAUA,QAAA,EAAU,MAAA;EAFV;;;;;;;EAUA,QAAA,GAAW,MAAA;EAED;EAAV,OAAA,GAAU,MAAA;EAGV;EADA,SAAA;EACA,QAAA,EAAU,YAAA;AAAA;AAAA,iBAGI,aAAA,CAAc,QAAA;AAAA,iBAId,aAAA,CAAc,QAAA;;;;AAA9B;;;;;iBAYgB,YAAA,CAAa,QAAA,UAAkB,SAAA;;;;;AAY/C;;;;iBAAgB,oBAAA,CAAqB,QAAA,UAAkB,MAAA;AAkBvD;;;;;;;;AAAA,iBAAgB,iBAAA,CACd,QAAA,UACA,SAAA,EAAW,aAAA,EACX,aAAA;;iBA0Ec,aAAA,CAAc,QAAA,WAAmB,SAAA;AAAA,iBAMjC,kBAAA,CAAmB,KAAA,EAAO,SAAA;AAAA,iBAIpB,cAAA,CAAe,QAAA,UAAkB,KAAA,EAAO,SAAA,GAAY,OAAA;AAAA,iBAQ1D,MAAA,CAAO,IAAA;AAAA,iBAIP,UAAA,CAAW,SAAA;AAhB3B;;;;AAAA,iBAwBgB,QAAA,CAAS,SAAA,UAAmB,aAAA;AAAA,UAI3B,kBAAA,SAA2B,cAAA;EAxBR;EAAA,SA0BzB,QAAA,EAAU,MAAA;AAAA;;;;;;;iBASL,wBAAA,CAAyB,IAAA,GAAM,cAAA,GAAmC,kBAAA;;;;;AAvBlF;;;;;iBA6DgB,qBAAA,CACd,gBAAA,EAAkB,gBAAA,EAClB,IAAA,GAAM,cAAA,GACL,MAAA;;iBAkBa,kBAAA,CACd,QAAA,EAAU,MAAA,kBACV,QAAA,GAAU,MAAA,mBACT,cAAA;;iBAiBa,kBAAA,CAAmB,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncState.d.mts","names":[],"sources":["../../src/services/syncState.ts"],"mappings":";;;;;;AA+BA;;;;;AAiBA;;;;;;;;cAjBa,kBAAA;AAAA,UAiBI,aAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;AAAA;;UAIe,YAAA;EACf,aAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,SAAA;EACf,OAAA;EACA,IAAA;EAagB;EAXhB,UAAA;EACA,SAAA,EAAW,aAAA;EAoBA;EAlBX,GAAA,EAAK,MAAA;EAuBK;;;;;;;EAfV,SAAA,EAAW,IAAA,CAAK,YAAA;EARhB;EAUA,QAAA,EAAU,MAAA;EAFV;;;;;;;EAUA,QAAA,GAAW,MAAA;EAED;EAAV,OAAA,GAAU,MAAA;EAGV;EADA,SAAA;EACA,QAAA,EAAU,YAAA;AAAA;AAAA,iBAGI,aAAA,CAAc,QAAA;AAAA,iBAId,aAAA,CAAc,QAAA;;;;AAA9B;;;;;iBAYgB,YAAA,CAAa,QAAA,UAAkB,SAAA;;;;;AAY/C;;;;iBAAgB,oBAAA,CAAqB,QAAA,UAAkB,MAAA;AAkBvD;;;;;;;;AAAA,iBAAgB,iBAAA,CACd,QAAA,UACA,SAAA,EAAW,aAAA,EACX,aAAA;;iBA0Ec,aAAA,CAAc,QAAA,WAAmB,SAAA;AAAA,iBAMjC,kBAAA,CAAmB,KAAA,EAAO,SAAA;AAAA,iBAIpB,cAAA,CAAe,QAAA,UAAkB,KAAA,EAAO,SAAA,GAAY,OAAA;AAAA,iBAQ1D,MAAA,CAAO,IAAA;AAAA,iBAIP,UAAA,CAAW,SAAA;AAhB3B;;;;AAAA,iBAwBgB,QAAA,CAAS,SAAA,UAAmB,aAAA;AAAA,UAI3B,kBAAA,SAA2B,cAAA;EAxBR;EAAA,SA0BzB,QAAA,EAAU,MAAA;AAAA;;;;;;;iBASL,wBAAA,CAAyB,IAAA,GAAM,cAAA,GAAmC,kBAAA;;;;;AAvBlF;;;;;iBA6DgB,qBAAA,CACd,gBAAA,EAAkB,gBAAA,EAClB,IAAA,GAAM,cAAA,GACL,MAAA;;iBAkBa,kBAAA,CACd,QAAA,EAAU,MAAA,kBACV,QAAA,GAAU,MAAA,mBACT,cAAA;;iBAiBa,kBAAA,CAAmB,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncState.mjs","names":[],"sources":["../../src/services/syncState.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { HarnessState } from '@agimon-ai/doompi-config';\nimport type { LayerResolvers, MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { isRecord, type JsonObject } from '../utils/index.ts';\nimport {\n CONTEXT_PACKAGES,\n LAYER_RESOLVERS,\n OLLAMA_PRESET,\n PERSONA_ENTRY,\n assembleExtensions,\n} from './extensionAssembler.ts';\n\n/**\n * The file `doom-pi sync` writes and the doom-pi Pi extension reads back.\n *\n * This is the whole contract between the two halves of the synced path. Sync\n * runs in plain Node, where module resolution and the repository config are\n * available; the extension runs inside a Pi session, where neither can be\n * relied on. Everything the extension needs is therefore resolved once here,\n * and everything in this file has to survive JSON.\n */\n\n/**\n * Bumped whenever the recorded shape changes, so a stale file re-syncs.\n *\n * 5 adds graph-aware aggregate bundles for each synced mode. Older states do\n * not have enough information to select a bundle safely.\n */\nexport const SYNC_STATE_VERSION = 5;\nconst PI_DIRECTORY = '.pi';\nconst DOOM_DIRECTORY = 'doom';\n/** The `.doom` config directory name, under both the repo root and `~/.pi`. */\nconst DOOM_CONFIG_DIRECTORY = '.doom';\nconst STATE_FILE = 'state.json';\nconst RUN_DIRECTORY = 'run';\nconst DEFAULT_PRESET = 'default';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst OWN_PREFIX = 'own:';\nconst PACKAGE_PREFIX = 'pkg:';\nconst LOCAL_PREFIX = 'local:';\n\n/** Config that feeds a sync, in the order the hash reads it. */\nconst HASHED_CONFIG_FILES = ['config.yaml', 'modes.yaml', 'domains.yaml', 'profiles.yaml', 'hooks.yaml'] as const;\n\nexport interface SyncSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n}\n\n/** Paths to the resources sync staged, before any live switch replaces them. */\nexport interface SyncBaseline {\n mcpConfigPath?: string;\n personaFile?: string;\n themePath: string;\n themeName: string;\n}\n\nexport interface SyncState {\n version: number;\n root: string;\n /** Hash of the config that produced this state, for the staleness warning. */\n inputsHash: string;\n selection: SyncSelection;\n /** Harness environment the extension applies when the values are unset. */\n env: Record<string, string>;\n /**\n * State the environment does not carry, so it has to be recorded on its own.\n *\n * Plugin hooks and the profile's environment defaults live in the session\n * state file rather than in variables. Without them here a synced session\n * would start with no plugin hooks at all, which fails silently.\n */\n fileState: Pick<HarnessState, 'profileEnvironment' | 'pluginHooks'>;\n /** Entry name to absolute path, covering every layer, not just the selected mode's. */\n resolved: Record<string, string>;\n /**\n * The same entries after TypeScript ones were bundled to plain ESM.\n *\n * Kept apart from `resolved` so the staleness check still compares resolution\n * against resolution; a state written before this existed simply has none and\n * falls back to loading the source.\n */\n compiled?: Record<string, string>;\n /** Aggregate entry by ordered extension-set key. */\n bundles?: Record<string, string>;\n /** Graph-compiled synced bootstrap written to Pi project settings. */\n bootstrap?: string;\n baseline: SyncBaseline;\n}\n\nexport function syncDirectory(repoRoot: string): string {\n return path.join(repoRoot, PI_DIRECTORY, DOOM_DIRECTORY);\n}\n\nexport function syncStatePath(repoRoot: string): string {\n return path.join(syncDirectory(repoRoot), STATE_FILE);\n}\n\n/**\n * Per-process scratch directory for live `/domains` and `/profile` switches.\n *\n * Switching rewrites the MCP config and the persona prompt. Writing those back\n * into the synced directory would both mutate the pinned baseline and let two\n * Pi sessions in one repository overwrite each other, which the launcher avoids\n * by giving every run its own temporary directory.\n */\nexport function runDirectory(repoRoot: string, processId: number = process.pid): string {\n return path.join(syncDirectory(repoRoot), RUN_DIRECTORY, String(processId));\n}\n\n/**\n * How a Pi project settings file should refer to a generated path.\n *\n * Relative to `.pi` when the target lives in the repository, which keeps the\n * committed settings file identical on every machine. A doom-pi installed\n * outside the repository stays absolute: Pi accepts both, and a relative path\n * climbing out of the project would be neither portable nor readable.\n */\nexport function settingsRelativePath(repoRoot: string, target: string): string {\n const relative = path.relative(repoRoot, target);\n if (relative.startsWith('..') || path.isAbsolute(relative)) return target;\n return path.relative(path.join(repoRoot, PI_DIRECTORY), target).split(path.sep).join('/');\n}\n\nfunction readIfPresent(filePath: string): string {\n return fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';\n}\n\n/**\n * Hashes the configuration a sync consumed.\n *\n * Deliberately cheap: the extension recomputes this on every session start, so\n * it reads text files and never re-resolves packages. A dependency upgrade that\n * moves a package path therefore does not show up here; `doom-pi sync --check`\n * re-resolves and is the check that catches that.\n */\nexport function computeInputsHash(\n repoRoot: string,\n selection: SyncSelection,\n homeDirectory: string = os.homedir(),\n): string {\n const hash = crypto.createHash('sha256');\n hash.update(JSON.stringify({ ...selection, domains: [...selection.domains].sort() }));\n // Every .doom document layers the global copy under the repository one, so an\n // edit in either location is a real change.\n for (const directory of [\n path.join(homeDirectory, PI_DIRECTORY, DOOM_CONFIG_DIRECTORY),\n path.join(repoRoot, DOOM_CONFIG_DIRECTORY),\n ]) {\n for (const fileName of HASHED_CONFIG_FILES) hash.update(readIfPresent(path.join(directory, fileName)));\n }\n return hash.digest('hex');\n}\n\nfunction stringRecord(value: unknown, field: string, statePath: string): Record<string, string> {\n if (!isRecord(value)) throw new Error(`Doom sync state at ${statePath} requires ${field} to be an object`);\n return Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),\n );\n}\n\nfunction parseSyncState(source: string, statePath: string): SyncState {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch (error) {\n throw new Error(`Doom sync state at ${statePath} is not valid JSON`, { cause: error });\n }\n if (!isRecord(parsed)) throw new Error(`Doom sync state at ${statePath} must be an object`);\n if (parsed.version !== SYNC_STATE_VERSION) {\n throw new Error(\n `Doom sync state at ${statePath} has version ${String(parsed.version)}, expected ${SYNC_STATE_VERSION}. Run doompi sync.`,\n );\n }\n if (typeof parsed.root !== 'string' || typeof parsed.inputsHash !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires string root and inputsHash`);\n }\n if (!isRecord(parsed.selection) || typeof parsed.selection.majorMode !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires a selection with a majorMode`);\n }\n if (!isRecord(parsed.baseline) || typeof parsed.baseline.themePath !== 'string') {\n throw new Error(`Doom sync state at ${statePath} requires a baseline with a themePath`);\n }\n const { majorMode, domains, profile, preset } = parsed.selection;\n const fileState = isRecord(parsed.fileState) ? parsed.fileState : {};\n return {\n version: SYNC_STATE_VERSION,\n root: parsed.root,\n inputsHash: parsed.inputsHash,\n selection: {\n majorMode,\n domains: Array.isArray(domains) ? domains.filter((name): name is string => typeof name === 'string') : [],\n profile: typeof profile === 'string' ? profile : undefined,\n preset: typeof preset === 'string' ? preset : DEFAULT_PRESET,\n },\n env: stringRecord(parsed.env, 'env', statePath),\n fileState: {\n profileEnvironment: isRecord(fileState.profileEnvironment)\n ? (fileState.profileEnvironment as Record<string, string>)\n : {},\n pluginHooks: Array.isArray(fileState.pluginHooks) ? (fileState.pluginHooks as HarnessState['pluginHooks']) : [],\n },\n resolved: stringRecord(parsed.resolved, 'resolved', statePath),\n // Absent from a state written before compilation existed, which is why it\n // is read back optionally rather than demanded.\n compiled: parsed.compiled === undefined ? undefined : stringRecord(parsed.compiled, 'compiled', statePath),\n bundles: parsed.bundles === undefined ? undefined : stringRecord(parsed.bundles, 'bundles', statePath),\n bootstrap: typeof parsed.bootstrap === 'string' ? parsed.bootstrap : undefined,\n baseline: parsed.baseline as unknown as SyncBaseline,\n };\n}\n\n/** Reads the synced state, or undefined when the repository was never synced. */\nexport function readSyncState(repoRoot: string): SyncState | undefined {\n const statePath = syncStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return undefined;\n return parseSyncState(fs.readFileSync(statePath, 'utf8'), statePath);\n}\n\nexport function serializeSyncState(state: SyncState): string {\n return `${JSON.stringify(state, null, 2)}\\n`;\n}\n\nexport async function writeSyncState(repoRoot: string, state: SyncState): Promise<string> {\n const statePath = syncStatePath(repoRoot);\n await fs.promises.mkdir(path.dirname(statePath), { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n // Holds resolved environment values, so it stays readable by its owner only.\n await fs.promises.writeFile(statePath, serializeSyncState(state), { mode: PRIVATE_FILE_MODE });\n return statePath;\n}\n\nexport function ownKey(name: string): string {\n return `${OWN_PREFIX}${name}`;\n}\n\nexport function packageKey(specifier: string): string {\n return `${PACKAGE_PREFIX}${specifier}`;\n}\n\n/**\n * Keyed by the absolute target, because the same relative specifier means\n * different files under the repository and the global config directory.\n */\nexport function localKey(specifier: string, baseDirectory: string): string {\n return `${LOCAL_PREFIX}${path.resolve(baseDirectory, specifier)}`;\n}\n\nexport interface RecordingResolvers extends LayerResolvers {\n /** Every name this resolver was asked for, keyed for the state file. */\n readonly resolved: Record<string, string>;\n}\n\n/**\n * Resolvers that record what they resolve.\n *\n * Sync composes once with every layer selected and hands the recording to the\n * state file, so the extension never has to resolve a specifier itself.\n */\nexport function createRecordingResolvers(base: LayerResolvers = LAYER_RESOLVERS): RecordingResolvers {\n const resolved: Record<string, string> = {};\n return {\n resolved,\n ownEntry(name) {\n const entry = base.ownEntry(name);\n resolved[ownKey(name)] = entry;\n return entry;\n },\n packageEntry(name) {\n const entry = base.packageEntry(name);\n resolved[packageKey(name)] = entry;\n return entry;\n },\n optionalPackageEntry(name) {\n const entry = base.optionalPackageEntry(name);\n // A miss is recorded by omission, which is what later makes the extension\n // treat it as absent instead of failing the whole composition.\n if (entry) resolved[packageKey(name)] = entry;\n return entry;\n },\n localEntry(specifier, baseDirectory) {\n const entry = base.localEntry(specifier, baseDirectory);\n if (entry) resolved[localKey(specifier, baseDirectory)] = entry;\n return entry;\n },\n };\n}\n\n/**\n * Resolves every entry any layer could contribute, in one pass.\n *\n * Composing with every layer selected and the widest options is what makes the\n * map complete: a later `/major-mode` switch inside a Pi session can then pick a\n * different set without resolving anything itself. The context packages and the\n * persona entry are asked for separately because they reach `assembleExtensions`\n * as already-resolved paths rather than through the resolvers.\n */\nexport function recordResolvedEntries(\n majorModesConfig: MajorModesConfig,\n base: LayerResolvers = LAYER_RESOLVERS,\n): Record<string, string> {\n const recording = createRecordingResolvers(base);\n for (const specifier of Object.values(CONTEXT_PACKAGES)) recording.optionalPackageEntry(specifier);\n recording.ownEntry(PERSONA_ENTRY);\n assembleExtensions({\n agents: true,\n autoStop: true,\n mute: false,\n // The one preset that contributes an extension of its own.\n preset: OLLAMA_PRESET,\n layers: Object.keys(majorModesConfig.layers),\n majorModesConfig,\n resolvers: recording,\n });\n return recording.resolved;\n}\n\n/** Resolvers backed by a synced map, for composing inside a Pi session. */\nexport function createMapResolvers(\n resolved: Record<string, string>,\n compiled: Record<string, string> = {},\n): LayerResolvers {\n // The compiled bundle when this entry has one, the source otherwise.\n const entryFor = (key: string): string | undefined => compiled[key] ?? resolved[key];\n const lookup = (key: string, name: string): string => {\n const entry = entryFor(key);\n if (!entry) throw new Error(`${name} is missing from the doompi sync state. Run doompi sync.`);\n return entry;\n };\n return {\n ownEntry: (name) => lookup(ownKey(name), name),\n packageEntry: (name) => lookup(packageKey(name), name),\n optionalPackageEntry: (name) => entryFor(packageKey(name)),\n localEntry: (specifier, baseDirectory) => entryFor(localKey(specifier, baseDirectory)),\n };\n}\n\n/** Reads the resolved MCP servers back out of a generated config. */\nexport function readMcpServerNames(configPath: string): string[] {\n if (!fs.existsSync(configPath)) return [];\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n return isRecord(config.mcpServers) ? Object.keys(config.mcpServers) : [];\n}\n"],"mappings":"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"}
|
package/dist/utils/json.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.cjs","names":["fs","path"],"sources":["../../src/utils/json.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * JSON state helpers for files the harness owns on disk.\n *\n * Compatibility frontends read these files while another repository's harness\n * may be writing them, so writes go through a rename rather than a truncate.\n */\n\nexport type JsonObject = Record<string, unknown>;\n\nconst ATOMIC_FILE_SUFFIX = '.tmp';\n\nexport function isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON object, treating a missing or empty file as the fallback. */\nexport function readJson(filePath: string, fallback: JsonObject = {}): JsonObject {\n if (!fs.existsSync(filePath)) return fallback;\n const content = fs.readFileSync(filePath, 'utf8').trim();\n return content ? (JSON.parse(content) as JsonObject) : fallback;\n}\n\n/**\n * Writes through a uniquely named temporary file in the same directory.\n *\n * The pid and a UUID are both in the name so two harnesses writing the same\n * target cannot collide on the temporary path, and a failed write cleans up\n * after itself rather than leaving the fragment behind.\n */\nexport function writeFileAtomic(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}${ATOMIC_FILE_SUFFIX}`;\n try {\n fs.writeFileSync(temporaryPath, content);\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\nexport function writeJson(filePath: string, value: JsonObject): void {\n writeFileAtomic(filePath, `${JSON.stringify(value, null, 2)}\\n`);\n}\n"],"mappings":"2OAeA,SAAgB,EAAS,EAAqC,CAC5D,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAI7E,SAAgB,EAAS,EAAkB,EAAuB,EAAE,CAAc,CAChF,GAAI,CAACA,EAAAA,QAAG,WAAW,EAAS,CAAE,OAAO,EACrC,IAAM,EAAUA,EAAAA,QAAG,aAAa,EAAU,OAAO,CAAC,MAAM,CACxD,OAAO,EAAW,KAAK,MAAM,EAAQ,CAAkB,EAUzD,SAAgB,EAAgB,EAAkB,EAAuB,CACvE,EAAA,QAAG,UAAUC,EAAAA,QAAK,QAAQ,EAAS,CAAE,CAAE,UAAW,GAAM,CAAC,CACzD,IAAM,EAAgB,GAAG,EAAS,GAAG,QAAQ,IAAI,IAAA,EAAA,EAAA,aAAe,OAChE,GAAI,CACF,EAAA,QAAG,cAAc,EAAe,EAAQ,CACxC,EAAA,QAAG,WAAW,EAAe,EAAS,OAC/B,EAAO,CAEd,MADA,EAAA,QAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACnC,GAIV,SAAgB,EAAU,EAAkB,EAAyB,CACnE,EAAgB,EAAU,GAAG,KAAK,UAAU,EAAO,KAAM,EAAE,CAAC,IAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.cts","names":[],"sources":["../../src/utils/json.ts"],"mappings":";;AAWA;;;;;KAAY,UAAA,GAAa,MAAA;AAAA,iBAIT,QAAA,CAAS,KAAA,YAAiB,KAAA,IAAS,UAAA;;iBAKnC,QAAA,CAAS,QAAA,UAAkB,QAAA,GAAU,UAAA,GAAkB,UAAA;;;;;;AAAvE;;iBAagB,eAAA,CAAgB,QAAA,UAAkB,OAAA;AAAA,iBAYlC,SAAA,CAAU,QAAA,UAAkB,KAAA,EAAO,UAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.mts","names":[],"sources":["../../src/utils/json.ts"],"mappings":";;AAWA;;;;;KAAY,UAAA,GAAa,MAAA;AAAA,iBAIT,QAAA,CAAS,KAAA,YAAiB,KAAA,IAAS,UAAA;;iBAKnC,QAAA,CAAS,QAAA,UAAkB,QAAA,GAAU,UAAA,GAAkB,UAAA;;;;;;AAAvE;;iBAagB,eAAA,CAAgB,QAAA,UAAkB,OAAA;AAAA,iBAYlC,SAAA,CAAU,QAAA,UAAkB,KAAA,EAAO,UAAA"}
|
package/dist/utils/json.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"json.mjs","names":[],"sources":["../../src/utils/json.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * JSON state helpers for files the harness owns on disk.\n *\n * Compatibility frontends read these files while another repository's harness\n * may be writing them, so writes go through a rename rather than a truncate.\n */\n\nexport type JsonObject = Record<string, unknown>;\n\nconst ATOMIC_FILE_SUFFIX = '.tmp';\n\nexport function isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON object, treating a missing or empty file as the fallback. */\nexport function readJson(filePath: string, fallback: JsonObject = {}): JsonObject {\n if (!fs.existsSync(filePath)) return fallback;\n const content = fs.readFileSync(filePath, 'utf8').trim();\n return content ? (JSON.parse(content) as JsonObject) : fallback;\n}\n\n/**\n * Writes through a uniquely named temporary file in the same directory.\n *\n * The pid and a UUID are both in the name so two harnesses writing the same\n * target cannot collide on the temporary path, and a failed write cleans up\n * after itself rather than leaving the fragment behind.\n */\nexport function writeFileAtomic(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}${ATOMIC_FILE_SUFFIX}`;\n try {\n fs.writeFileSync(temporaryPath, content);\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\nexport function writeJson(filePath: string, value: JsonObject): void {\n writeFileAtomic(filePath, `${JSON.stringify(value, null, 2)}\\n`);\n}\n"],"mappings":"yFAeA,SAAgB,EAAS,EAAqC,CAC5D,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAI7E,SAAgB,EAAS,EAAkB,EAAuB,EAAE,CAAc,CAChF,GAAI,CAAC,EAAG,WAAW,EAAS,CAAE,OAAO,EACrC,IAAM,EAAU,EAAG,aAAa,EAAU,OAAO,CAAC,MAAM,CACxD,OAAO,EAAW,KAAK,MAAM,EAAQ,CAAkB,EAUzD,SAAgB,EAAgB,EAAkB,EAAuB,CACvE,EAAG,UAAU,EAAK,QAAQ,EAAS,CAAE,CAAE,UAAW,GAAM,CAAC,CACzD,IAAM,EAAgB,GAAG,EAAS,GAAG,QAAQ,IAAI,GAAG,GAAY,OAChE,GAAI,CACF,EAAG,cAAc,EAAe,EAAQ,CACxC,EAAG,WAAW,EAAe,EAAS,OAC/B,EAAO,CAEd,MADA,EAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACnC,GAIV,SAAgB,EAAU,EAAkB,EAAyB,CACnE,EAAgB,EAAU,GAAG,KAAK,UAAU,EAAO,KAAM,EAAE,CAAC,IAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"moduleResolution.cjs","names":["path","fs"],"sources":["../../src/utils/moduleResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst PACKAGE_MANIFEST = 'package.json';\nconst NODE_MODULES = 'node_modules';\nconst CURRENT_DIRECTORY_PREFIX = './';\n/** Import-side conditions, in the order Node prefers them for an ESM consumer. */\nconst IMPORT_CONDITIONS = ['import', 'module', 'node', 'default'] as const;\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/**\n * Resolves a specifier against the consumer repository's own 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. Anchoring\n * a require at the consumer's manifest is what lets a repository-declared layer\n * package resolve from the repository that declared it.\n *\n * The `node_modules` chain is walked directly rather than handed to\n * `require.resolve`, which would answer with the CJS build that Pi cannot load\n * as an extension. The package's own `exports` map then supplies the\n * import-side target.\n */\nexport function consumerPackageEntry(specifier: string, consumerRoot: string): string | undefined {\n const { name, subpath } = splitPackageSpecifier(specifier);\n const packageRoot = findInstalledPackage(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 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 === '.' ? undefined : 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 * Resolves a path-style layer package against the config that declared it.\n *\n * A file is taken as the extension entry as written. A directory is read as a\n * package: its import-side `exports` target first, then module/main. This is\n * what lets an extension that was never published to npm live in the\n * repository, or beside the global config in `~/.pi/.doom`, and still load.\n */\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 undefined;\n}\n\n/**\n * Resolves one of this package's own extensions in src/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/utils, so entries is one directory up.\n const sourceRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url)));\n return path.join(sourceRoot, '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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"moduleResolution.d.cts","names":[],"sources":["../../src/utils/moduleResolution.ts"],"mappings":";;AAgBA;;;;;iBAAgB,YAAA,CAAa,IAAA;;iBAKb,oBAAA,CAAqB,IAAA;;;AAcrC;;;;iBAAgB,qBAAA,CAAsB,SAAA;EAAsB,IAAA;EAAc,OAAA;AAAA;;AA4D1E;;;;;AA6CA;;;;;AA4CA;;iBAzFgB,oBAAA,CAAqB,SAAA,UAAmB,YAAA;;;AAiGxD;;;;;;iBApDgB,UAAA,CAAW,SAAA,UAAmB,aAAA;;;;;;;;iBA4C9B,QAAA,CAAS,IAAA;;iBAQT,SAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"moduleResolution.d.mts","names":[],"sources":["../../src/utils/moduleResolution.ts"],"mappings":";;AAgBA;;;;;iBAAgB,YAAA,CAAa,IAAA;;iBAKb,oBAAA,CAAqB,IAAA;;;AAcrC;;;;iBAAgB,qBAAA,CAAsB,SAAA;EAAsB,IAAA;EAAc,OAAA;AAAA;;AA4D1E;;;;;AA6CA;;;;;AA4CA;;iBAzFgB,oBAAA,CAAqB,SAAA,UAAmB,YAAA;;;AAiGxD;;;;;;iBApDgB,UAAA,CAAW,SAAA,UAAmB,aAAA;;;;;;;;iBA4C9B,QAAA,CAAS,IAAA;;iBAQT,SAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"moduleResolution.mjs","names":[],"sources":["../../src/utils/moduleResolution.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst PACKAGE_MANIFEST = 'package.json';\nconst NODE_MODULES = 'node_modules';\nconst CURRENT_DIRECTORY_PREFIX = './';\n/** Import-side conditions, in the order Node prefers them for an ESM consumer. */\nconst IMPORT_CONDITIONS = ['import', 'module', 'node', 'default'] as const;\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/**\n * Resolves a specifier against the consumer repository's own 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. Anchoring\n * a require at the consumer's manifest is what lets a repository-declared layer\n * package resolve from the repository that declared it.\n *\n * The `node_modules` chain is walked directly rather than handed to\n * `require.resolve`, which would answer with the CJS build that Pi cannot load\n * as an extension. The package's own `exports` map then supplies the\n * import-side target.\n */\nexport function consumerPackageEntry(specifier: string, consumerRoot: string): string | undefined {\n const { name, subpath } = splitPackageSpecifier(specifier);\n const packageRoot = findInstalledPackage(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 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 === '.' ? undefined : 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 * Resolves a path-style layer package against the config that declared it.\n *\n * A file is taken as the extension entry as written. A directory is read as a\n * package: its import-side `exports` target first, then module/main. This is\n * what lets an extension that was never published to npm live in the\n * repository, or beside the global config in `~/.pi/.doom`, and still load.\n */\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 undefined;\n}\n\n/**\n * Resolves one of this package's own extensions in src/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/utils, so entries is one directory up.\n const sourceRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url)));\n return path.join(sourceRoot, '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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.cjs","names":["path","fs"],"sources":["../../src/utils/repository.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/** Doom's own repository configuration directory. */\nconst DOOM_DIRECTORY = '.doom';\n/** A Pi project that has been configured, rather than any stray `.pi` folder. */\nconst PI_SETTINGS = path.join('.pi', 'settings.json');\n\nfunction isDirectory(target: string): boolean {\n try {\n return fs.statSync(target).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(target: string): boolean {\n try {\n return fs.statSync(target).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * True when a directory carries a marker Doom Pi is willing to treat as a root.\n *\n * Only Doom's own directory or an existing Pi settings file count. Build tooling\n * markers are deliberately not consulted: a consumer repository has no Nx, pnpm\n * workspace, or plugins profile to offer, and trusting arbitrary project config\n * would let an unapproved directory decide what gets loaded.\n */\nexport function isRepositoryRoot(directory: string): boolean {\n return isDirectory(path.join(directory, DOOM_DIRECTORY)) || isFile(path.join(directory, PI_SETTINGS));\n}\n\n/**\n * Walks up from `start` looking for the repository root.\n *\n * The nearest marked ancestor wins, so a session started in a subdirectory\n * resolves to the repository that configured Doom rather than to a parent\n * checkout that happens to sit above it.\n */\nexport function findRepositoryRoot(start: string): string {\n let directory = path.resolve(start);\n while (true) {\n if (isRepositoryRoot(directory)) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`Could not find repository root from ${start}`);\n directory = parent;\n }\n}\n"],"mappings":"8MAIA,MAEM,EAAcA,EAAAA,QAAK,KAAK,MAAO,gBAAgB,CAErD,SAAS,EAAY,EAAyB,CAC5C,GAAI,CACF,OAAOC,EAAAA,QAAG,SAAS,EAAO,CAAC,aAAa,MAClC,CACN,MAAO,IAIX,SAAS,EAAO,EAAyB,CACvC,GAAI,CACF,OAAOA,EAAAA,QAAG,SAAS,EAAO,CAAC,QAAQ,MAC7B,CACN,MAAO,IAYX,SAAgB,EAAiB,EAA4B,CAC3D,OAAO,EAAYD,EAAAA,QAAK,KAAK,EAAW,QAAe,CAAC,EAAI,EAAOA,EAAAA,QAAK,KAAK,EAAW,EAAY,CAAC,CAUvG,SAAgB,EAAmB,EAAuB,CACxD,IAAI,EAAYA,EAAAA,QAAK,QAAQ,EAAM,CACnC,OAAa,CACX,GAAI,EAAiB,EAAU,CAAE,OAAO,EACxC,IAAM,EAASA,EAAAA,QAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,MAAU,MAAM,uCAAuC,IAAQ,CACzF,EAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.cts","names":[],"sources":["../../src/utils/repository.ts"],"mappings":";;AAgCA;;;;;AAWA;;iBAXgB,gBAAA,CAAiB,SAAA;;;;;;;;iBAWjB,kBAAA,CAAmB,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.mts","names":[],"sources":["../../src/utils/repository.ts"],"mappings":";;AAgCA;;;;;AAWA;;iBAXgB,gBAAA,CAAiB,SAAA;;;;;;;;iBAWjB,kBAAA,CAAmB,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","names":[],"sources":["../../src/utils/repository.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/** Doom's own repository configuration directory. */\nconst DOOM_DIRECTORY = '.doom';\n/** A Pi project that has been configured, rather than any stray `.pi` folder. */\nconst PI_SETTINGS = path.join('.pi', 'settings.json');\n\nfunction isDirectory(target: string): boolean {\n try {\n return fs.statSync(target).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isFile(target: string): boolean {\n try {\n return fs.statSync(target).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * True when a directory carries a marker Doom Pi is willing to treat as a root.\n *\n * Only Doom's own directory or an existing Pi settings file count. Build tooling\n * markers are deliberately not consulted: a consumer repository has no Nx, pnpm\n * workspace, or plugins profile to offer, and trusting arbitrary project config\n * would let an unapproved directory decide what gets loaded.\n */\nexport function isRepositoryRoot(directory: string): boolean {\n return isDirectory(path.join(directory, DOOM_DIRECTORY)) || isFile(path.join(directory, PI_SETTINGS));\n}\n\n/**\n * Walks up from `start` looking for the repository root.\n *\n * The nearest marked ancestor wins, so a session started in a subdirectory\n * resolves to the repository that configured Doom rather than to a parent\n * checkout that happens to sit above it.\n */\nexport function findRepositoryRoot(start: string): string {\n let directory = path.resolve(start);\n while (true) {\n if (isRepositoryRoot(directory)) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`Could not find repository root from ${start}`);\n directory = parent;\n }\n}\n"],"mappings":"gDAIA,MAEM,EAAc,EAAK,KAAK,MAAO,gBAAgB,CAErD,SAAS,EAAY,EAAyB,CAC5C,GAAI,CACF,OAAO,EAAG,SAAS,EAAO,CAAC,aAAa,MAClC,CACN,MAAO,IAIX,SAAS,EAAO,EAAyB,CACvC,GAAI,CACF,OAAO,EAAG,SAAS,EAAO,CAAC,QAAQ,MAC7B,CACN,MAAO,IAYX,SAAgB,EAAiB,EAA4B,CAC3D,OAAO,EAAY,EAAK,KAAK,EAAW,QAAe,CAAC,EAAI,EAAO,EAAK,KAAK,EAAW,EAAY,CAAC,CAUvG,SAAgB,EAAmB,EAAuB,CACxD,IAAI,EAAY,EAAK,QAAQ,EAAM,CACnC,OAAa,CACX,GAAI,EAAiB,EAAU,CAAE,OAAO,EACxC,IAAM,EAAS,EAAK,QAAQ,EAAU,CACtC,GAAI,IAAW,EAAW,MAAU,MAAM,uCAAuC,IAAQ,CACzF,EAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.cjs","names":[],"sources":["../../src/utils/toolNames.ts"],"sourcesContent":["/**\n * Translation between Claude and Pi tool names.\n *\n * Both directions are needed: agent definitions are authored with Claude names\n * and have to be rewritten for Pi, while repository hook matchers are written\n * against Claude names and are tested against the Pi name of the tool that\n * fired. Deriving the reverse map from the forward one is what stops the two\n * drifting, which they previously could because each direction had its own\n * hand-maintained table.\n */\n\nconst CLAUDE_TO_PI = new Map([\n ['Read', 'read'],\n ['Edit', 'edit'],\n ['Write', 'write'],\n ['Bash', 'bash'],\n ['Glob', 'find'],\n ['Grep', 'grep'],\n ['Agent', 'subagent'],\n]);\n\nconst PI_TO_CLAUDE = new Map([...CLAUDE_TO_PI].map(([claudeName, piName]) => [piName, claudeName]));\n\nconst MCP_TOOL = 'mcp';\nconst SKILL_TOOL = 'Skill';\nconst MCP_TOOL_PREFIX = 'mcp__';\nconst WEB_TOOLS = new Set(['WebFetch', 'WebSearch']);\n\n/**\n * Pi's name for a tool named in an agent definition.\n *\n * Returns undefined for Skill, which Pi discovers rather than declares. Web and\n * MCP tools all collapse onto Pi's single `mcp` tool. Definitions already\n * written against Pi pass through unchanged, and an unrecognised name throws\n * rather than reaching Pi as a tool it will silently ignore.\n */\nexport function toPiToolName(tool: string): string | undefined {\n if (tool === SKILL_TOOL) return undefined;\n if (WEB_TOOLS.has(tool) || tool.startsWith(MCP_TOOL_PREFIX)) return MCP_TOOL;\n const mapped = CLAUDE_TO_PI.get(tool);\n if (mapped) return mapped;\n if (tool === MCP_TOOL || PI_TO_CLAUDE.has(tool)) return tool;\n throw new Error(`Unsupported agent tool: ${tool}`);\n}\n\n/** The Claude name a hook matcher expects for a tool Pi just ran. */\nexport function toClaudeToolName(tool: string): string {\n return PI_TO_CLAUDE.get(tool) ?? tool;\n}\n"],"mappings":"mEAWA,MAAM,EAAe,IAAI,IAAI,CAC3B,CAAC,OAAQ,OAAO,CAChB,CAAC,OAAQ,OAAO,CAChB,CAAC,QAAS,QAAQ,CAClB,CAAC,OAAQ,OAAO,CAChB,CAAC,OAAQ,OAAO,CAChB,CAAC,OAAQ,OAAO,CAChB,CAAC,QAAS,WAAW,CACtB,CAAC,CAEI,EAAe,IAAI,IAAI,CAAC,GAAG,EAAa,CAAC,KAAK,CAAC,EAAY,KAAY,CAAC,EAAQ,EAAW,CAAC,CAAC,CAK7F,EAAY,IAAI,IAAI,CAAC,WAAY,YAAY,CAAC,CAUpD,SAAgB,EAAa,EAAkC,CAC7D,GAAI,IAAS,QAAY,OACzB,GAAI,EAAU,IAAI,EAAK,EAAI,EAAK,WAAW,QAAgB,CAAE,MAAO,MACpE,IAAM,EAAS,EAAa,IAAI,EAAK,CACrC,GAAI,EAAQ,OAAO,EACnB,GAAI,IAAS,OAAY,EAAa,IAAI,EAAK,CAAE,OAAO,EACxD,MAAU,MAAM,2BAA2B,IAAO,CAIpD,SAAgB,EAAiB,EAAsB,CACrD,OAAO,EAAa,IAAI,EAAK,EAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.d.cts","names":[],"sources":["../../src/utils/toolNames.ts"],"mappings":";;AAoCA;;;;;AAUA;;;;;;;;;;;;iBAVgB,YAAA,CAAa,IAAA;;iBAUb,gBAAA,CAAiB,IAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.d.mts","names":[],"sources":["../../src/utils/toolNames.ts"],"mappings":";;AAoCA;;;;;AAUA;;;;;;;;;;;;iBAVgB,YAAA,CAAa,IAAA;;iBAUb,gBAAA,CAAiB,IAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolNames.mjs","names":[],"sources":["../../src/utils/toolNames.ts"],"sourcesContent":["/**\n * Translation between Claude and Pi tool names.\n *\n * Both directions are needed: agent definitions are authored with Claude names\n * and have to be rewritten for Pi, while repository hook matchers are written\n * against Claude names and are tested against the Pi name of the tool that\n * fired. Deriving the reverse map from the forward one is what stops the two\n * drifting, which they previously could because each direction had its own\n * hand-maintained table.\n */\n\nconst CLAUDE_TO_PI = new Map([\n ['Read', 'read'],\n ['Edit', 'edit'],\n ['Write', 'write'],\n ['Bash', 'bash'],\n ['Glob', 'find'],\n ['Grep', 'grep'],\n ['Agent', 'subagent'],\n]);\n\nconst PI_TO_CLAUDE = new Map([...CLAUDE_TO_PI].map(([claudeName, piName]) => [piName, claudeName]));\n\nconst MCP_TOOL = 'mcp';\nconst SKILL_TOOL = 'Skill';\nconst MCP_TOOL_PREFIX = 'mcp__';\nconst WEB_TOOLS = new Set(['WebFetch', 'WebSearch']);\n\n/**\n * Pi's name for a tool named in an agent definition.\n *\n * Returns undefined for Skill, which Pi discovers rather than declares. Web and\n * MCP tools all collapse onto Pi's single `mcp` tool. Definitions already\n * written against Pi pass through unchanged, and an unrecognised name throws\n * rather than reaching Pi as a tool it will silently ignore.\n */\nexport function toPiToolName(tool: string): string | undefined {\n if (tool === SKILL_TOOL) return undefined;\n if (WEB_TOOLS.has(tool) || tool.startsWith(MCP_TOOL_PREFIX)) return MCP_TOOL;\n const mapped = CLAUDE_TO_PI.get(tool);\n if (mapped) return mapped;\n if (tool === MCP_TOOL || PI_TO_CLAUDE.has(tool)) return tool;\n throw new Error(`Unsupported agent tool: ${tool}`);\n}\n\n/** The Claude name a hook matcher expects for a tool Pi just ran. */\nexport function toClaudeToolName(tool: string): string {\n return PI_TO_CLAUDE.get(tool) ?? tool;\n}\n"],"mappings":"AAWA,MAAM,EAAe,IAAI,IAAI,CAC3B,CAAC,OAAQ,OAAO,CAChB,CAAC,OAAQ,OAAO,CAChB,CAAC,QAAS,QAAQ,CAClB,CAAC,OAAQ,OAAO,CAChB,CAAC,OAAQ,OAAO,CAChB,CAAC,OAAQ,OAAO,CAChB,CAAC,QAAS,WAAW,CACtB,CAAC,CAEI,EAAe,IAAI,IAAI,CAAC,GAAG,EAAa,CAAC,KAAK,CAAC,EAAY,KAAY,CAAC,EAAQ,EAAW,CAAC,CAAC,CAK7F,EAAY,IAAI,IAAI,CAAC,WAAY,YAAY,CAAC,CAUpD,SAAgB,EAAa,EAAkC,CAC7D,GAAI,IAAS,QAAY,OACzB,GAAI,EAAU,IAAI,EAAK,EAAI,EAAK,WAAW,QAAgB,CAAE,MAAO,MACpE,IAAM,EAAS,EAAa,IAAI,EAAK,CACrC,GAAI,EAAQ,OAAO,EACnB,GAAI,IAAS,OAAY,EAAa,IAAI,EAAK,CAAE,OAAO,EACxD,MAAU,MAAM,2BAA2B,IAAO,CAIpD,SAAgB,EAAiB,EAAsB,CACrD,OAAO,EAAa,IAAI,EAAK,EAAI"}
|