@agimon-ai/doompi 0.0.1-alpha.2 → 0.0.1-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -452
- package/assets/doompi-tui.png +0 -0
- package/dist/adapters/bootstrapClaim.cjs +2 -0
- package/dist/adapters/bootstrapClaim.cjs.map +1 -0
- package/dist/adapters/bootstrapClaim.mjs +2 -0
- package/dist/adapters/bootstrapClaim.mjs.map +1 -0
- package/dist/adapters/bootstrapLocator.cjs +2 -0
- package/dist/adapters/bootstrapLocator.cjs.map +1 -0
- package/dist/adapters/bootstrapLocator.d.cts +6 -0
- package/dist/adapters/bootstrapLocator.d.cts.map +1 -0
- package/dist/adapters/bootstrapLocator.d.mts +6 -0
- package/dist/adapters/bootstrapLocator.d.mts.map +1 -0
- package/dist/adapters/bootstrapLocator.mjs +2 -0
- package/dist/adapters/bootstrapLocator.mjs.map +1 -0
- package/dist/adapters/compatibility/antigravity.cjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.cjs.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.cts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.cts.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.mts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.mts.map +1 -1
- package/dist/adapters/compatibility/antigravity.mjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.mjs.map +1 -1
- package/dist/adapters/compatibility/codex.cjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.cjs.map +1 -1
- package/dist/adapters/compatibility/codex.d.cts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.cts.map +1 -1
- package/dist/adapters/compatibility/codex.d.mts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.mts.map +1 -1
- package/dist/adapters/compatibility/codex.mjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.mjs.map +1 -1
- package/dist/adapters/compatibility/index.cjs +2 -0
- package/dist/adapters/compatibility/index.cjs.map +1 -0
- package/dist/adapters/compatibility/index.d.cts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.cts.map +1 -1
- package/dist/adapters/compatibility/index.d.mts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.mts.map +1 -1
- package/dist/adapters/compatibility/index.mjs +2 -0
- package/dist/adapters/compatibility/index.mjs.map +1 -0
- package/dist/adapters/compatibility/process.cjs +2 -0
- package/dist/{services → adapters}/compatibility/process.cjs.map +1 -1
- package/dist/adapters/compatibility/process.d.cts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.cts.map +1 -1
- package/dist/adapters/compatibility/process.d.mts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.mts.map +1 -1
- package/dist/adapters/compatibility/process.mjs +2 -0
- package/dist/{services → adapters}/compatibility/process.mjs.map +1 -1
- package/dist/adapters/compatibility/shared.cjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.cjs.map +1 -1
- package/dist/adapters/compatibility/shared.d.cts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.cts.map +1 -1
- package/dist/adapters/compatibility/shared.d.mts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.mts.map +1 -1
- package/dist/adapters/compatibility/shared.mjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.mjs.map +1 -1
- package/dist/adapters/compatibilityContext.cjs +2 -0
- package/dist/adapters/compatibilityContext.cjs.map +1 -0
- package/dist/adapters/compatibilityContext.d.cts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.cts.map +1 -1
- package/dist/adapters/compatibilityContext.d.mts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.mts.map +1 -1
- package/dist/adapters/compatibilityContext.mjs +2 -0
- package/dist/adapters/compatibilityContext.mjs.map +1 -0
- package/dist/adapters/composer.cjs +2 -0
- package/dist/adapters/composer.cjs.map +1 -0
- package/dist/adapters/composer.d.cts +113 -0
- package/dist/adapters/composer.d.cts.map +1 -0
- package/dist/adapters/composer.d.mts +113 -0
- package/dist/adapters/composer.d.mts.map +1 -0
- package/dist/adapters/composer.mjs +2 -0
- package/dist/adapters/composer.mjs.map +1 -0
- package/dist/adapters/compositionState.cjs +2 -0
- package/dist/adapters/compositionState.cjs.map +1 -0
- package/dist/adapters/compositionState.d.cts +12 -0
- package/dist/adapters/compositionState.d.cts.map +1 -0
- package/dist/adapters/compositionState.d.mts +12 -0
- package/dist/adapters/compositionState.d.mts.map +1 -0
- package/dist/adapters/compositionState.mjs +2 -0
- package/dist/adapters/compositionState.mjs.map +1 -0
- package/dist/adapters/config/harnessState.cjs +2 -0
- package/dist/adapters/config/harnessState.cjs.map +1 -0
- package/dist/adapters/config/harnessState.d.cts +26 -0
- package/dist/adapters/config/harnessState.d.cts.map +1 -0
- package/dist/adapters/config/harnessState.d.mts +26 -0
- package/dist/adapters/config/harnessState.d.mts.map +1 -0
- package/dist/adapters/config/harnessState.mjs +2 -0
- package/dist/adapters/config/harnessState.mjs.map +1 -0
- package/dist/adapters/deferredSkills.cjs +12 -0
- package/dist/adapters/deferredSkills.cjs.map +1 -0
- package/dist/adapters/deferredSkills.mjs +12 -0
- package/dist/adapters/deferredSkills.mjs.map +1 -0
- package/dist/adapters/doomPackage.cjs +2 -0
- package/dist/adapters/doomPackage.cjs.map +1 -0
- package/dist/adapters/doomPackage.mjs +2 -0
- package/dist/adapters/doomPackage.mjs.map +1 -0
- package/dist/adapters/dpiRunner.cjs +3 -0
- package/dist/adapters/dpiRunner.cjs.map +1 -0
- package/dist/adapters/dpiRunner.mjs +3 -0
- package/dist/adapters/dpiRunner.mjs.map +1 -0
- package/dist/adapters/dpiSettings.cjs +2 -0
- package/dist/adapters/dpiSettings.cjs.map +1 -0
- package/dist/adapters/dpiSettings.mjs +2 -0
- package/dist/adapters/dpiSettings.mjs.map +1 -0
- package/dist/adapters/extensionCompiler.cjs +3 -0
- package/dist/adapters/extensionCompiler.cjs.map +1 -0
- package/dist/adapters/extensionCompiler.mjs +3 -0
- package/dist/adapters/extensionCompiler.mjs.map +1 -0
- package/dist/adapters/harnessContext.cjs +2 -0
- package/dist/adapters/harnessContext.cjs.map +1 -0
- package/dist/adapters/harnessContext.d.cts +61 -0
- package/dist/{services → adapters}/harnessContext.d.cts.map +1 -1
- package/dist/adapters/harnessContext.d.mts +61 -0
- package/dist/{services → adapters}/harnessContext.d.mts.map +1 -1
- package/dist/adapters/harnessContext.mjs +2 -0
- package/dist/adapters/harnessContext.mjs.map +1 -0
- package/dist/adapters/helpSkills.cjs +2 -0
- package/dist/adapters/helpSkills.cjs.map +1 -0
- package/dist/adapters/helpSkills.mjs +2 -0
- package/dist/adapters/helpSkills.mjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.cjs +2 -0
- package/dist/adapters/layerPackageInstaller.cjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.mjs +2 -0
- package/dist/adapters/layerPackageInstaller.mjs.map +1 -0
- package/dist/adapters/matrixSwitcher.cjs +2 -0
- package/dist/adapters/matrixSwitcher.cjs.map +1 -0
- package/dist/adapters/matrixSwitcher.d.cts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.cts.map +1 -1
- package/dist/adapters/matrixSwitcher.d.mts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.mts.map +1 -1
- package/dist/adapters/matrixSwitcher.mjs +2 -0
- package/dist/adapters/matrixSwitcher.mjs.map +1 -0
- package/dist/adapters/mcpFilter.cjs +3 -0
- package/dist/adapters/mcpFilter.cjs.map +1 -0
- package/dist/adapters/mcpFilter.d.cts +40 -0
- package/dist/adapters/mcpFilter.d.cts.map +1 -0
- package/dist/adapters/mcpFilter.d.mts +40 -0
- package/dist/adapters/mcpFilter.d.mts.map +1 -0
- package/dist/adapters/mcpFilter.mjs +3 -0
- package/dist/adapters/mcpFilter.mjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.cjs +2 -0
- package/dist/adapters/modules/moduleResolution.cjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.cts +69 -0
- package/dist/adapters/modules/moduleResolution.d.cts.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.mts +69 -0
- package/dist/adapters/modules/moduleResolution.d.mts.map +1 -0
- package/dist/adapters/modules/moduleResolution.mjs +2 -0
- package/dist/adapters/modules/moduleResolution.mjs.map +1 -0
- package/dist/adapters/packageBootstrap.cjs +2 -0
- package/dist/adapters/packageBootstrap.cjs.map +1 -0
- package/dist/adapters/packageBootstrap.d.cts +8 -0
- package/dist/adapters/packageBootstrap.d.cts.map +1 -0
- package/dist/adapters/packageBootstrap.d.mts +8 -0
- package/dist/adapters/packageBootstrap.d.mts.map +1 -0
- package/dist/adapters/packageBootstrap.mjs +2 -0
- package/dist/adapters/packageBootstrap.mjs.map +1 -0
- package/dist/adapters/piExtensionAlias.cjs +2 -0
- package/dist/adapters/piExtensionAlias.cjs.map +1 -0
- package/dist/adapters/piExtensionAlias.mjs +2 -0
- package/dist/adapters/piExtensionAlias.mjs.map +1 -0
- package/dist/adapters/piSettings.cjs +2 -0
- package/dist/adapters/piSettings.cjs.map +1 -0
- package/dist/adapters/piSettings.d.cts +25 -0
- package/dist/adapters/piSettings.d.cts.map +1 -0
- package/dist/adapters/piSettings.d.mts +25 -0
- package/dist/adapters/piSettings.d.mts.map +1 -0
- package/dist/adapters/piSettings.mjs +2 -0
- package/dist/adapters/piSettings.mjs.map +1 -0
- package/dist/adapters/pluginMaterializer.cjs +2 -0
- package/dist/adapters/pluginMaterializer.cjs.map +1 -0
- package/dist/adapters/pluginMaterializer.mjs +2 -0
- package/dist/adapters/pluginMaterializer.mjs.map +1 -0
- package/dist/adapters/projectPiSettings.cjs +2 -0
- package/dist/adapters/projectPiSettings.cjs.map +1 -0
- package/dist/adapters/projectPiSettings.d.cts +29 -0
- package/dist/adapters/projectPiSettings.d.cts.map +1 -0
- package/dist/adapters/projectPiSettings.d.mts +29 -0
- package/dist/adapters/projectPiSettings.d.mts.map +1 -0
- package/dist/adapters/projectPiSettings.mjs +2 -0
- package/dist/adapters/projectPiSettings.mjs.map +1 -0
- package/dist/adapters/repository/repository.cjs +2 -0
- package/dist/adapters/repository/repository.cjs.map +1 -0
- package/dist/adapters/repository/repository.d.cts +21 -0
- package/dist/adapters/repository/repository.d.cts.map +1 -0
- package/dist/adapters/repository/repository.d.mts +21 -0
- package/dist/adapters/repository/repository.d.mts.map +1 -0
- package/dist/adapters/repository/repository.mjs +2 -0
- package/dist/adapters/repository/repository.mjs.map +1 -0
- package/dist/adapters/resourceCollector.cjs +3 -0
- package/dist/adapters/resourceCollector.cjs.map +1 -0
- package/dist/adapters/resourceCollector.d.cts +25 -0
- package/dist/adapters/resourceCollector.d.cts.map +1 -0
- package/dist/adapters/resourceCollector.d.mts +25 -0
- package/dist/adapters/resourceCollector.d.mts.map +1 -0
- package/dist/adapters/resourceCollector.mjs +3 -0
- package/dist/adapters/resourceCollector.mjs.map +1 -0
- package/dist/adapters/runtimeBundle.cjs +2 -0
- package/dist/adapters/runtimeBundle.cjs.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.cts +4 -2
- package/dist/adapters/runtimeBundle.d.cts.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.mts +4 -2
- package/dist/adapters/runtimeBundle.d.mts.map +1 -0
- package/dist/adapters/runtimeBundle.mjs +2 -0
- package/dist/adapters/runtimeBundle.mjs.map +1 -0
- package/dist/adapters/serialization/json.cjs +2 -0
- package/dist/adapters/serialization/json.cjs.map +1 -0
- package/dist/adapters/serialization/json.d.cts +23 -0
- package/dist/adapters/serialization/json.d.cts.map +1 -0
- package/dist/adapters/serialization/json.d.mts +23 -0
- package/dist/adapters/serialization/json.d.mts.map +1 -0
- package/dist/adapters/serialization/json.mjs +2 -0
- package/dist/adapters/serialization/json.mjs.map +1 -0
- package/dist/adapters/sharedBuildCache.cjs +2 -0
- package/dist/adapters/sharedBuildCache.cjs.map +1 -0
- package/dist/adapters/sharedBuildCache.mjs +2 -0
- package/dist/adapters/sharedBuildCache.mjs.map +1 -0
- package/dist/adapters/skillCatalog.cjs +2 -0
- package/dist/adapters/skillCatalog.cjs.map +1 -0
- package/dist/adapters/skillCatalog.d.cts +61 -0
- package/dist/adapters/skillCatalog.d.cts.map +1 -0
- package/dist/adapters/skillCatalog.d.mts +61 -0
- package/dist/adapters/skillCatalog.d.mts.map +1 -0
- package/dist/adapters/skillCatalog.mjs +2 -0
- package/dist/adapters/skillCatalog.mjs.map +1 -0
- package/dist/adapters/skillSources.cjs +2 -0
- package/dist/{services → adapters}/skillSources.cjs.map +1 -1
- package/dist/adapters/skillSources.d.cts +24 -0
- package/dist/{services → adapters}/skillSources.d.cts.map +1 -1
- package/dist/adapters/skillSources.d.mts +24 -0
- package/dist/{services → adapters}/skillSources.d.mts.map +1 -1
- package/dist/adapters/skillSources.mjs +2 -0
- package/dist/{services → adapters}/skillSources.mjs.map +1 -1
- package/dist/adapters/startupPrecompiler.cjs +2 -0
- package/dist/adapters/startupPrecompiler.cjs.map +1 -0
- package/dist/adapters/startupPrecompiler.d.cts +13 -0
- package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
- package/dist/adapters/startupPrecompiler.d.mts +13 -0
- package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
- package/dist/adapters/startupPrecompiler.mjs +2 -0
- package/dist/adapters/startupPrecompiler.mjs.map +1 -0
- package/dist/adapters/syncLocation.cjs +2 -0
- package/dist/adapters/syncLocation.cjs.map +1 -0
- package/dist/adapters/syncLocation.d.cts +19 -0
- package/dist/adapters/syncLocation.d.cts.map +1 -0
- package/dist/adapters/syncLocation.d.mts +19 -0
- package/dist/adapters/syncLocation.d.mts.map +1 -0
- package/dist/adapters/syncLocation.mjs +2 -0
- package/dist/adapters/syncLocation.mjs.map +1 -0
- package/dist/adapters/syncState.cjs +2 -0
- package/dist/adapters/syncState.cjs.map +1 -0
- package/dist/adapters/syncState.d.cts +153 -0
- package/dist/adapters/syncState.d.cts.map +1 -0
- package/dist/adapters/syncState.d.mts +153 -0
- package/dist/adapters/syncState.d.mts.map +1 -0
- package/dist/adapters/syncState.mjs +2 -0
- package/dist/adapters/syncState.mjs.map +1 -0
- package/dist/adapters/syncStateContract.cjs +2 -0
- package/dist/adapters/syncStateContract.cjs.map +1 -0
- package/dist/adapters/syncStateContract.d.cts +13 -0
- package/dist/adapters/syncStateContract.d.cts.map +1 -0
- package/dist/adapters/syncStateContract.d.mts +13 -0
- package/dist/adapters/syncStateContract.d.mts.map +1 -0
- package/dist/adapters/syncStateContract.mjs +2 -0
- package/dist/adapters/syncStateContract.mjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
- package/dist/bin/cli.cjs +1 -1
- package/dist/bin/cli.cjs.map +1 -1
- package/dist/bin/cli.mjs +1 -1
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/dpi.cjs +3 -0
- package/dist/bin/dpi.cjs.map +1 -0
- package/dist/bin/dpi.d.cts +1 -0
- package/dist/bin/dpi.d.mts +1 -0
- package/dist/bin/dpi.mjs +3 -0
- package/dist/bin/dpi.mjs.map +1 -0
- package/dist/cli/cliApp.cjs +1 -2
- package/dist/cli/cliApp.d.cts +2 -45
- package/dist/cli/cliApp.d.mts +2 -45
- package/dist/cli/cliApp.mjs +1 -2
- package/dist/cli/compatibilityOptions.cjs +1 -2
- package/dist/cli/compatibilityOptions.d.cts +2 -15
- package/dist/cli/compatibilityOptions.d.mts +2 -15
- package/dist/cli/compatibilityOptions.mjs +1 -2
- package/dist/cli/help.cjs +1 -63
- package/dist/cli/help.d.cts +2 -6
- package/dist/cli/help.d.mts +2 -6
- package/dist/cli/help.mjs +1 -63
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.d.cts +4 -4
- package/dist/cli/index.d.mts +4 -4
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/matrixOptions.cjs +1 -2
- package/dist/cli/matrixOptions.d.cts +2 -99
- package/dist/cli/matrixOptions.d.mts +2 -99
- package/dist/cli/matrixOptions.mjs +1 -2
- package/dist/cli/options.cjs +1 -2
- package/dist/cli/options.d.cts +2 -7
- package/dist/cli/options.d.mts +2 -7
- package/dist/cli/options.mjs +1 -2
- package/dist/commands/baseCommand.cjs.map +1 -1
- package/dist/commands/baseCommand.d.cts +3 -3
- package/dist/commands/baseCommand.d.mts +3 -3
- package/dist/commands/baseCommand.mjs.map +1 -1
- package/dist/commands/buildCommand.cjs +2 -2
- package/dist/commands/buildCommand.cjs.map +1 -1
- package/dist/commands/buildCommand.mjs +2 -2
- package/dist/commands/buildCommand.mjs.map +1 -1
- package/dist/commands/cli/cliApp.cjs +2 -0
- package/dist/commands/cli/cliApp.cjs.map +1 -0
- package/dist/commands/cli/cliApp.d.cts +45 -0
- package/dist/commands/cli/cliApp.d.cts.map +1 -0
- package/dist/commands/cli/cliApp.d.mts +45 -0
- package/dist/commands/cli/cliApp.d.mts.map +1 -0
- package/dist/commands/cli/cliApp.mjs +2 -0
- package/dist/commands/cli/cliApp.mjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.cjs +2 -0
- package/dist/commands/cli/compatibilityOptions.cjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.cts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.cts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.mts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.mts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.mjs +2 -0
- package/dist/commands/cli/compatibilityOptions.mjs.map +1 -0
- package/dist/commands/cli/help.cjs +68 -0
- package/dist/{cli → commands/cli}/help.cjs.map +1 -1
- package/dist/commands/cli/help.d.cts +6 -0
- package/dist/commands/cli/help.d.cts.map +1 -0
- package/dist/commands/cli/help.d.mts +6 -0
- package/dist/commands/cli/help.d.mts.map +1 -0
- package/dist/commands/cli/help.mjs +68 -0
- package/dist/{cli → commands/cli}/help.mjs.map +1 -1
- package/dist/commands/cli/index.cjs +1 -0
- package/dist/commands/cli/index.d.cts +4 -0
- package/dist/commands/cli/index.d.mts +4 -0
- package/dist/commands/cli/index.mjs +1 -0
- package/dist/commands/cli/matrixOptions.cjs +2 -0
- package/dist/commands/cli/matrixOptions.cjs.map +1 -0
- package/dist/commands/cli/matrixOptions.d.cts +99 -0
- package/dist/commands/cli/matrixOptions.d.cts.map +1 -0
- package/dist/commands/cli/matrixOptions.d.mts +99 -0
- package/dist/commands/cli/matrixOptions.d.mts.map +1 -0
- package/dist/commands/cli/matrixOptions.mjs +2 -0
- package/dist/commands/cli/matrixOptions.mjs.map +1 -0
- package/dist/commands/cli/options.cjs +2 -0
- package/dist/commands/cli/options.cjs.map +1 -0
- package/dist/commands/cli/options.d.cts +7 -0
- package/dist/commands/cli/options.d.cts.map +1 -0
- package/dist/commands/cli/options.d.mts +7 -0
- package/dist/commands/cli/options.d.mts.map +1 -0
- package/dist/commands/cli/options.mjs +2 -0
- package/dist/commands/cli/options.mjs.map +1 -0
- package/dist/commands/compatibilityCommand.cjs +1 -1
- package/dist/commands/compatibilityCommand.cjs.map +1 -1
- package/dist/commands/compatibilityCommand.d.cts +1 -1
- package/dist/commands/compatibilityCommand.d.cts.map +1 -1
- package/dist/commands/compatibilityCommand.d.mts +1 -1
- package/dist/commands/compatibilityCommand.d.mts.map +1 -1
- package/dist/commands/compatibilityCommand.mjs +1 -1
- package/dist/commands/compatibilityCommand.mjs.map +1 -1
- package/dist/commands/emitMcpCommand.cjs +1 -1
- package/dist/commands/emitMcpCommand.cjs.map +1 -1
- package/dist/commands/emitMcpCommand.d.cts +2 -2
- package/dist/commands/emitMcpCommand.d.mts +2 -2
- package/dist/commands/emitMcpCommand.mjs +1 -1
- package/dist/commands/emitMcpCommand.mjs.map +1 -1
- package/dist/commands/explainCommand.cjs +2 -2
- package/dist/commands/explainCommand.cjs.map +1 -1
- package/dist/commands/explainCommand.d.cts +2 -2
- package/dist/commands/explainCommand.d.mts +2 -2
- package/dist/commands/explainCommand.mjs +2 -2
- package/dist/commands/explainCommand.mjs.map +1 -1
- package/dist/commands/index.cjs +1 -1
- package/dist/commands/index.d.cts +2 -3
- package/dist/commands/index.d.mts +2 -3
- package/dist/commands/index.mjs +1 -1
- package/dist/commands/initCommand.cjs +1 -2
- package/dist/commands/initCommand.cjs.map +1 -1
- package/dist/commands/initCommand.d.cts +4 -3
- package/dist/commands/initCommand.d.cts.map +1 -1
- package/dist/commands/initCommand.d.mts +4 -3
- package/dist/commands/initCommand.d.mts.map +1 -1
- package/dist/commands/initCommand.mjs +1 -2
- package/dist/commands/initCommand.mjs.map +1 -1
- package/dist/commands/initPresenter.cjs +3 -0
- package/dist/commands/initPresenter.cjs.map +1 -0
- package/dist/commands/initPresenter.d.cts +8 -0
- package/dist/commands/initPresenter.d.cts.map +1 -0
- package/dist/commands/initPresenter.d.mts +8 -0
- package/dist/commands/initPresenter.d.mts.map +1 -0
- package/dist/commands/initPresenter.mjs +3 -0
- package/dist/commands/initPresenter.mjs.map +1 -0
- package/dist/commands/launchCommand.cjs +1 -1
- package/dist/commands/launchCommand.cjs.map +1 -1
- package/dist/commands/launchCommand.d.cts +6 -4
- package/dist/commands/launchCommand.d.cts.map +1 -1
- package/dist/commands/launchCommand.d.mts +6 -4
- package/dist/commands/launchCommand.d.mts.map +1 -1
- package/dist/commands/launchCommand.mjs +1 -1
- package/dist/commands/launchCommand.mjs.map +1 -1
- package/dist/commands/syncCommand.cjs +5 -5
- package/dist/commands/syncCommand.cjs.map +1 -1
- package/dist/commands/syncCommand.d.cts +19 -7
- package/dist/commands/syncCommand.d.cts.map +1 -1
- package/dist/commands/syncCommand.d.mts +19 -7
- package/dist/commands/syncCommand.d.mts.map +1 -1
- package/dist/commands/syncCommand.mjs +5 -5
- package/dist/commands/syncCommand.mjs.map +1 -1
- package/dist/commands/syncPipeline.cjs +2 -0
- package/dist/commands/syncPipeline.cjs.map +1 -0
- package/dist/commands/syncPipeline.mjs +2 -0
- package/dist/commands/syncPipeline.mjs.map +1 -0
- package/dist/config/harnessState.cjs +1 -2
- package/dist/config/harnessState.d.cts +2 -24
- package/dist/config/harnessState.d.mts +2 -24
- package/dist/config/harnessState.mjs +1 -2
- package/dist/config/index.cjs +1 -1
- package/dist/config/index.d.cts +4 -7
- package/dist/config/index.d.mts +4 -7
- package/dist/config/index.mjs +1 -1
- package/dist/config/projectTrust.cjs +1 -2
- package/dist/config/projectTrust.d.cts +2 -14
- package/dist/config/projectTrust.d.mts +2 -14
- package/dist/config/projectTrust.mjs +1 -2
- package/dist/entries/autoStop.cjs +1 -2
- package/dist/entries/autoStop.d.cts +2 -6
- package/dist/entries/autoStop.d.mts +2 -7
- package/dist/entries/autoStop.mjs +1 -2
- package/dist/entries/components/matrixPicker.cjs +1 -2
- package/dist/entries/components/matrixPicker.d.cts +2 -55
- package/dist/entries/components/matrixPicker.d.mts +2 -55
- package/dist/entries/components/matrixPicker.mjs +1 -2
- package/dist/entries/components/skillsOverlay.cjs +1 -4
- package/dist/entries/components/skillsOverlay.d.cts +2 -58
- package/dist/entries/components/skillsOverlay.d.mts +2 -58
- package/dist/entries/components/skillsOverlay.mjs +1 -4
- package/dist/entries/domains.cjs +1 -2
- package/dist/entries/domains.d.cts +2 -10
- package/dist/entries/domains.d.mts +2 -10
- package/dist/entries/domains.mjs +1 -2
- package/dist/entries/doom.cjs +1 -2
- package/dist/entries/doom.d.cts +2 -13
- package/dist/entries/doom.d.mts +2 -14
- package/dist/entries/doom.mjs +1 -2
- package/dist/entries/effort.cjs +1 -2
- package/dist/entries/effort.d.cts +2 -10
- package/dist/entries/effort.d.mts +2 -10
- package/dist/entries/effort.mjs +1 -2
- package/dist/entries/majorMode.cjs +1 -6
- package/dist/entries/majorMode.d.cts +2 -29
- package/dist/entries/majorMode.d.mts +2 -29
- package/dist/entries/majorMode.mjs +1 -6
- package/dist/entries/modeCatalog.cjs +1 -0
- package/dist/entries/modeCatalog.d.cts +2 -0
- package/dist/entries/modeCatalog.d.mts +2 -0
- package/dist/entries/modeCatalog.mjs +1 -0
- package/dist/entries/notifications.cjs +1 -2
- package/dist/entries/notifications.d.cts +2 -13
- package/dist/entries/notifications.d.mts +2 -13
- package/dist/entries/notifications.mjs +1 -2
- package/dist/entries/ollamaProvider.cjs +1 -2
- package/dist/entries/ollamaProvider.d.cts +2 -6
- package/dist/entries/ollamaProvider.d.mts +2 -7
- package/dist/entries/ollamaProvider.mjs +1 -2
- package/dist/entries/persona.cjs +1 -2
- package/dist/entries/persona.d.cts +2 -14
- package/dist/entries/persona.d.mts +2 -15
- package/dist/entries/persona.mjs +1 -2
- package/dist/entries/profile.cjs +1 -3
- package/dist/entries/profile.d.cts +2 -16
- package/dist/entries/profile.d.mts +2 -16
- package/dist/entries/profile.mjs +1 -3
- package/dist/entries/repositoryHooks.cjs +1 -9
- package/dist/entries/repositoryHooks.d.cts +2 -7
- package/dist/entries/repositoryHooks.d.mts +2 -8
- package/dist/entries/repositoryHooks.mjs +1 -9
- package/dist/entries/skills.cjs +1 -2
- package/dist/entries/skills.d.cts +2 -34
- package/dist/entries/skills.d.mts +2 -34
- package/dist/entries/skills.mjs +1 -2
- package/dist/entries/styleSystem.cjs +1 -4
- package/dist/entries/styleSystem.d.cts +2 -32
- package/dist/entries/styleSystem.d.mts +2 -32
- package/dist/entries/styleSystem.mjs +1 -4
- package/dist/extensions/entries/autoStop.cjs +2 -0
- package/dist/extensions/entries/autoStop.cjs.map +1 -0
- package/dist/extensions/entries/autoStop.d.cts +7 -0
- package/dist/extensions/entries/autoStop.d.cts.map +1 -0
- package/dist/extensions/entries/autoStop.d.mts +7 -0
- package/dist/extensions/entries/autoStop.d.mts.map +1 -0
- package/dist/extensions/entries/autoStop.mjs +2 -0
- package/dist/extensions/entries/autoStop.mjs.map +1 -0
- package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
- package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.cjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.cjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.mjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.mjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs.map +1 -0
- package/dist/extensions/entries/domains.cjs +2 -0
- package/dist/extensions/entries/domains.cjs.map +1 -0
- package/dist/extensions/entries/domains.d.cts +18 -0
- package/dist/extensions/entries/domains.d.cts.map +1 -0
- package/dist/extensions/entries/domains.d.mts +18 -0
- package/dist/extensions/entries/domains.d.mts.map +1 -0
- package/dist/extensions/entries/domains.mjs +2 -0
- package/dist/extensions/entries/domains.mjs.map +1 -0
- package/dist/extensions/entries/doom.cjs +2 -0
- package/dist/extensions/entries/doom.cjs.map +1 -0
- package/dist/extensions/entries/doom.d.cts +14 -0
- package/dist/extensions/entries/doom.d.cts.map +1 -0
- package/dist/extensions/entries/doom.d.mts +14 -0
- package/dist/extensions/entries/doom.d.mts.map +1 -0
- package/dist/extensions/entries/doom.mjs +2 -0
- package/dist/extensions/entries/doom.mjs.map +1 -0
- package/dist/extensions/entries/effort.cjs +2 -0
- package/dist/extensions/entries/effort.cjs.map +1 -0
- package/dist/extensions/entries/effort.d.cts +10 -0
- package/dist/extensions/entries/effort.d.cts.map +1 -0
- package/dist/extensions/entries/effort.d.mts +10 -0
- package/dist/extensions/entries/effort.d.mts.map +1 -0
- package/dist/extensions/entries/effort.mjs +2 -0
- package/dist/extensions/entries/effort.mjs.map +1 -0
- package/dist/extensions/entries/majorMode.cjs +6 -0
- package/dist/extensions/entries/majorMode.cjs.map +1 -0
- package/dist/extensions/entries/majorMode.d.cts +27 -0
- package/dist/extensions/entries/majorMode.d.cts.map +1 -0
- package/dist/extensions/entries/majorMode.d.mts +27 -0
- package/dist/extensions/entries/majorMode.d.mts.map +1 -0
- package/dist/extensions/entries/majorMode.mjs +6 -0
- package/dist/extensions/entries/majorMode.mjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.cjs +2 -0
- package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.cts +7 -0
- package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.mts +7 -0
- package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
- package/dist/extensions/entries/modeCatalog.mjs +2 -0
- package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
- package/dist/extensions/entries/notifications.cjs +2 -0
- package/dist/extensions/entries/notifications.cjs.map +1 -0
- package/dist/extensions/entries/notifications.d.cts +14 -0
- package/dist/extensions/entries/notifications.d.cts.map +1 -0
- package/dist/extensions/entries/notifications.d.mts +14 -0
- package/dist/extensions/entries/notifications.d.mts.map +1 -0
- package/dist/extensions/entries/notifications.mjs +2 -0
- package/dist/extensions/entries/notifications.mjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.cjs +2 -0
- package/dist/extensions/entries/ollamaProvider.cjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.cts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.cts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.mts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.mts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.mjs +2 -0
- package/dist/extensions/entries/ollamaProvider.mjs.map +1 -0
- package/dist/extensions/entries/persona.cjs +2 -0
- package/dist/extensions/entries/persona.cjs.map +1 -0
- package/dist/extensions/entries/persona.d.cts +15 -0
- package/dist/extensions/entries/persona.d.cts.map +1 -0
- package/dist/extensions/entries/persona.d.mts +15 -0
- package/dist/extensions/entries/persona.d.mts.map +1 -0
- package/dist/extensions/entries/persona.mjs +2 -0
- package/dist/extensions/entries/persona.mjs.map +1 -0
- package/dist/extensions/entries/profile.cjs +3 -0
- package/dist/extensions/entries/profile.cjs.map +1 -0
- package/dist/extensions/entries/profile.d.cts +18 -0
- package/dist/extensions/entries/profile.d.cts.map +1 -0
- package/dist/extensions/entries/profile.d.mts +18 -0
- package/dist/extensions/entries/profile.d.mts.map +1 -0
- package/dist/extensions/entries/profile.mjs +3 -0
- package/dist/extensions/entries/profile.mjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.cjs +9 -0
- package/dist/extensions/entries/repositoryHooks.cjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.cts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.cts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.mts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.mts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.mjs +9 -0
- package/dist/extensions/entries/repositoryHooks.mjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.cjs +27 -0
- package/dist/extensions/entries/shellTitleController.cjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.cts +11 -0
- package/dist/extensions/entries/shellTitleController.d.cts.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.mts +11 -0
- package/dist/extensions/entries/shellTitleController.d.mts.map +1 -0
- package/dist/extensions/entries/shellTitleController.mjs +27 -0
- package/dist/extensions/entries/shellTitleController.mjs.map +1 -0
- package/dist/extensions/entries/skills.cjs +4 -0
- package/dist/extensions/entries/skills.cjs.map +1 -0
- package/dist/extensions/entries/skills.d.cts +34 -0
- package/dist/extensions/entries/skills.d.cts.map +1 -0
- package/dist/extensions/entries/skills.d.mts +34 -0
- package/dist/extensions/entries/skills.d.mts.map +1 -0
- package/dist/extensions/entries/skills.mjs +4 -0
- package/dist/extensions/entries/skills.mjs.map +1 -0
- package/dist/extensions/entries/styleSystem.cjs +4 -0
- package/dist/extensions/entries/styleSystem.cjs.map +1 -0
- package/dist/extensions/entries/styleSystem.d.cts +32 -0
- package/dist/extensions/entries/styleSystem.d.cts.map +1 -0
- package/dist/extensions/entries/styleSystem.d.mts +32 -0
- package/dist/extensions/entries/styleSystem.d.mts.map +1 -0
- package/dist/extensions/entries/styleSystem.mjs +4 -0
- package/dist/{entries/styleSystem.cjs.map → extensions/entries/styleSystem.mjs.map} +1 -1
- package/dist/extensions/pi.cjs +1 -0
- package/dist/extensions/pi.d.cts +2 -0
- package/dist/extensions/pi.d.mts +2 -0
- package/dist/extensions/pi.mjs +1 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs.map +1 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +33 -29
- package/dist/index.d.mts +33 -29
- package/dist/index.mjs +1 -1
- package/dist/logSinkTelemetry.cjs +1 -2
- package/dist/logSinkTelemetry.d.cts +2 -51
- package/dist/logSinkTelemetry.d.mts +2 -51
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
- package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
- package/dist/schemas/domainVoiceTools.cjs +2 -0
- package/dist/schemas/domainVoiceTools.cjs.map +1 -0
- package/dist/schemas/domainVoiceTools.mjs +2 -0
- package/dist/schemas/domainVoiceTools.mjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.cjs +2 -0
- package/dist/schemas/majorModeVoiceTools.cjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.mjs +2 -0
- package/dist/schemas/majorModeVoiceTools.mjs.map +1 -0
- package/dist/services/compatibility/antigravity.cjs +1 -2
- package/dist/services/compatibility/antigravity.d.cts +2 -11
- package/dist/services/compatibility/antigravity.d.mts +2 -11
- package/dist/services/compatibility/antigravity.mjs +1 -2
- package/dist/services/compatibility/codex.cjs +1 -2
- package/dist/services/compatibility/codex.d.cts +2 -19
- package/dist/services/compatibility/codex.d.mts +2 -19
- package/dist/services/compatibility/codex.mjs +1 -2
- package/dist/services/compatibility/index.cjs +1 -2
- package/dist/services/compatibility/index.d.cts +6 -16
- package/dist/services/compatibility/index.d.mts +6 -16
- package/dist/services/compatibility/index.mjs +1 -2
- package/dist/services/compatibility/process.cjs +1 -2
- package/dist/services/compatibility/process.d.cts +2 -35
- package/dist/services/compatibility/process.d.mts +2 -35
- package/dist/services/compatibility/process.mjs +1 -2
- package/dist/services/compatibility/shared.cjs +1 -2
- package/dist/services/compatibility/shared.d.cts +2 -33
- package/dist/services/compatibility/shared.d.mts +2 -33
- package/dist/services/compatibility/shared.mjs +1 -2
- package/dist/services/compatibilityContext.cjs +1 -2
- package/dist/services/compatibilityContext.d.cts +2 -23
- package/dist/services/compatibilityContext.d.mts +2 -23
- package/dist/services/compatibilityContext.mjs +1 -2
- package/dist/services/composer.cjs +1 -2
- package/dist/services/composer.d.cts +4 -135
- package/dist/services/composer.d.mts +4 -135
- package/dist/services/composer.mjs +1 -2
- package/dist/services/config/index.cjs +1 -0
- package/dist/services/config/index.d.cts +7 -0
- package/dist/services/config/index.d.mts +7 -0
- package/dist/services/config/index.mjs +1 -0
- package/dist/services/config/projectTrust.cjs +2 -0
- package/dist/services/config/projectTrust.cjs.map +1 -0
- package/dist/services/config/projectTrust.d.cts +14 -0
- package/dist/services/config/projectTrust.d.cts.map +1 -0
- package/dist/services/config/projectTrust.d.mts +14 -0
- package/dist/services/config/projectTrust.d.mts.map +1 -0
- package/dist/services/config/projectTrust.mjs +2 -0
- package/dist/services/config/projectTrust.mjs.map +1 -0
- package/dist/services/extensionAssembler.cjs +1 -1
- package/dist/services/extensionAssembler.cjs.map +1 -1
- package/dist/services/extensionAssembler.d.cts +13 -6
- package/dist/services/extensionAssembler.d.cts.map +1 -1
- package/dist/services/extensionAssembler.d.mts +13 -6
- package/dist/services/extensionAssembler.d.mts.map +1 -1
- package/dist/services/extensionAssembler.mjs +1 -1
- package/dist/services/extensionAssembler.mjs.map +1 -1
- package/dist/services/harnessContext.cjs +1 -2
- package/dist/services/harnessContext.d.cts +2 -61
- package/dist/services/harnessContext.d.mts +2 -61
- package/dist/services/harnessContext.mjs +1 -2
- package/dist/services/index.cjs +1 -1
- package/dist/services/index.d.cts +18 -14
- package/dist/services/index.d.mts +18 -14
- package/dist/services/index.mjs +1 -1
- package/dist/services/matrixSwitcher.cjs +1 -2
- package/dist/services/matrixSwitcher.d.cts +2 -46
- package/dist/services/matrixSwitcher.d.mts +2 -46
- package/dist/services/matrixSwitcher.mjs +1 -2
- package/dist/services/mcpFilter.cjs +1 -3
- package/dist/services/mcpFilter.d.cts +2 -40
- package/dist/services/mcpFilter.d.mts +2 -40
- package/dist/services/mcpFilter.mjs +1 -3
- package/dist/services/modeCatalog.cjs +2 -0
- package/dist/services/modeCatalog.cjs.map +1 -0
- package/dist/services/modeCatalog.d.cts +18 -0
- package/dist/services/modeCatalog.d.cts.map +1 -0
- package/dist/services/modeCatalog.d.mts +18 -0
- package/dist/services/modeCatalog.d.mts.map +1 -0
- package/dist/services/modeCatalog.mjs +2 -0
- package/dist/services/modeCatalog.mjs.map +1 -0
- package/dist/services/piSettings.cjs +1 -2
- package/dist/services/piSettings.d.cts +2 -24
- package/dist/services/piSettings.d.mts +2 -24
- package/dist/services/piSettings.mjs +1 -2
- package/dist/services/resourceCollector.cjs +1 -3
- package/dist/services/resourceCollector.d.cts +2 -23
- package/dist/services/resourceCollector.d.mts +2 -23
- package/dist/services/resourceCollector.mjs +1 -3
- package/dist/services/skillCatalog.cjs +1 -2
- package/dist/services/skillCatalog.d.cts +2 -56
- package/dist/services/skillCatalog.d.mts +2 -56
- package/dist/services/skillCatalog.mjs +1 -2
- package/dist/services/skillSources.cjs +1 -2
- package/dist/services/skillSources.d.cts +2 -24
- package/dist/services/skillSources.d.mts +2 -24
- package/dist/services/skillSources.mjs +1 -2
- package/dist/services/syncState.cjs +1 -2
- package/dist/services/syncState.d.cts +3 -133
- package/dist/services/syncState.d.mts +3 -133
- package/dist/services/syncState.mjs +1 -2
- package/dist/services/tools/toolNames.cjs +2 -0
- package/dist/services/tools/toolNames.cjs.map +1 -0
- package/dist/services/tools/toolNames.d.cts +25 -0
- package/dist/services/tools/toolNames.d.cts.map +1 -0
- package/dist/services/tools/toolNames.d.mts +25 -0
- package/dist/services/tools/toolNames.d.mts.map +1 -0
- package/dist/services/tools/toolNames.mjs +2 -0
- package/dist/services/tools/toolNames.mjs.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.cts +1 -1
- package/dist/types/interfaces/compatibility.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.mts +1 -1
- package/dist/types/interfaces/compatibility.d.mts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.cts +6 -2
- package/dist/types/interfaces/harness.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.mts +6 -2
- package/dist/types/interfaces/harness.d.mts.map +1 -0
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.cts +5 -5
- package/dist/utils/index.d.mts +5 -5
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/json.cjs +1 -2
- package/dist/utils/json.d.cts +2 -23
- package/dist/utils/json.d.mts +2 -23
- package/dist/utils/json.mjs +1 -2
- package/dist/utils/moduleResolution.cjs +1 -2
- package/dist/utils/moduleResolution.d.cts +2 -56
- package/dist/utils/moduleResolution.d.mts +2 -56
- package/dist/utils/moduleResolution.mjs +1 -2
- package/dist/utils/repository.cjs +1 -2
- package/dist/utils/repository.d.cts +2 -21
- package/dist/utils/repository.d.mts +2 -21
- package/dist/utils/repository.mjs +1 -2
- package/dist/utils/toolNames.cjs +1 -2
- package/dist/utils/toolNames.d.cts +2 -25
- package/dist/utils/toolNames.d.mts +2 -25
- package/dist/utils/toolNames.mjs +1 -2
- package/package.json +59 -37
- package/dist/cli/cliApp.cjs.map +0 -1
- package/dist/cli/cliApp.d.cts.map +0 -1
- package/dist/cli/cliApp.d.mts.map +0 -1
- package/dist/cli/cliApp.mjs.map +0 -1
- package/dist/cli/compatibilityOptions.cjs.map +0 -1
- package/dist/cli/compatibilityOptions.d.cts.map +0 -1
- package/dist/cli/compatibilityOptions.d.mts.map +0 -1
- package/dist/cli/compatibilityOptions.mjs.map +0 -1
- package/dist/cli/help.d.cts.map +0 -1
- package/dist/cli/help.d.mts.map +0 -1
- package/dist/cli/matrixOptions.cjs.map +0 -1
- package/dist/cli/matrixOptions.d.cts.map +0 -1
- package/dist/cli/matrixOptions.d.mts.map +0 -1
- package/dist/cli/matrixOptions.mjs.map +0 -1
- package/dist/cli/options.cjs.map +0 -1
- package/dist/cli/options.d.cts.map +0 -1
- package/dist/cli/options.d.mts.map +0 -1
- package/dist/cli/options.mjs.map +0 -1
- package/dist/commands/buildCommand.d.cts +0 -23
- package/dist/commands/buildCommand.d.cts.map +0 -1
- package/dist/commands/buildCommand.d.mts +0 -23
- package/dist/commands/buildCommand.d.mts.map +0 -1
- package/dist/config/harnessState.cjs.map +0 -1
- package/dist/config/harnessState.d.cts.map +0 -1
- package/dist/config/harnessState.d.mts.map +0 -1
- package/dist/config/harnessState.mjs.map +0 -1
- package/dist/config/projectTrust.cjs.map +0 -1
- package/dist/config/projectTrust.d.cts.map +0 -1
- package/dist/config/projectTrust.d.mts.map +0 -1
- package/dist/config/projectTrust.mjs.map +0 -1
- package/dist/entries/addDirCompatibility.cjs +0 -2
- package/dist/entries/addDirCompatibility.cjs.map +0 -1
- package/dist/entries/addDirCompatibility.d.cts +0 -13
- package/dist/entries/addDirCompatibility.d.cts.map +0 -1
- package/dist/entries/addDirCompatibility.d.mts +0 -14
- package/dist/entries/addDirCompatibility.d.mts.map +0 -1
- package/dist/entries/addDirCompatibility.mjs +0 -2
- package/dist/entries/addDirCompatibility.mjs.map +0 -1
- package/dist/entries/autoStop.cjs.map +0 -1
- package/dist/entries/autoStop.d.cts.map +0 -1
- package/dist/entries/autoStop.d.mts.map +0 -1
- package/dist/entries/autoStop.mjs.map +0 -1
- package/dist/entries/components/matrixPicker.cjs.map +0 -1
- package/dist/entries/components/matrixPicker.d.cts.map +0 -1
- package/dist/entries/components/matrixPicker.d.mts.map +0 -1
- package/dist/entries/components/matrixPicker.mjs.map +0 -1
- package/dist/entries/components/skillsOverlay.cjs.map +0 -1
- package/dist/entries/components/skillsOverlay.d.cts.map +0 -1
- package/dist/entries/components/skillsOverlay.d.mts.map +0 -1
- package/dist/entries/components/skillsOverlay.mjs.map +0 -1
- package/dist/entries/domains.cjs.map +0 -1
- package/dist/entries/domains.d.cts.map +0 -1
- package/dist/entries/domains.d.mts.map +0 -1
- package/dist/entries/domains.mjs.map +0 -1
- package/dist/entries/doom.cjs.map +0 -1
- package/dist/entries/doom.d.cts.map +0 -1
- package/dist/entries/doom.d.mts.map +0 -1
- package/dist/entries/doom.mjs.map +0 -1
- package/dist/entries/effort.cjs.map +0 -1
- package/dist/entries/effort.d.cts.map +0 -1
- package/dist/entries/effort.d.mts.map +0 -1
- package/dist/entries/effort.mjs.map +0 -1
- package/dist/entries/majorMode.cjs.map +0 -1
- package/dist/entries/majorMode.d.cts.map +0 -1
- package/dist/entries/majorMode.d.mts.map +0 -1
- package/dist/entries/majorMode.mjs.map +0 -1
- package/dist/entries/notifications.cjs.map +0 -1
- package/dist/entries/notifications.d.cts.map +0 -1
- package/dist/entries/notifications.d.mts.map +0 -1
- package/dist/entries/notifications.mjs.map +0 -1
- package/dist/entries/ollamaProvider.cjs.map +0 -1
- package/dist/entries/ollamaProvider.d.cts.map +0 -1
- package/dist/entries/ollamaProvider.d.mts.map +0 -1
- package/dist/entries/ollamaProvider.mjs.map +0 -1
- package/dist/entries/persona.cjs.map +0 -1
- package/dist/entries/persona.d.cts.map +0 -1
- package/dist/entries/persona.d.mts.map +0 -1
- package/dist/entries/persona.mjs.map +0 -1
- package/dist/entries/profile.cjs.map +0 -1
- package/dist/entries/profile.d.cts.map +0 -1
- package/dist/entries/profile.d.mts.map +0 -1
- package/dist/entries/profile.mjs.map +0 -1
- package/dist/entries/repositoryHooks.cjs.map +0 -1
- package/dist/entries/repositoryHooks.d.cts.map +0 -1
- package/dist/entries/repositoryHooks.d.mts.map +0 -1
- package/dist/entries/repositoryHooks.mjs.map +0 -1
- package/dist/entries/skills.cjs.map +0 -1
- package/dist/entries/skills.d.cts.map +0 -1
- package/dist/entries/skills.d.mts.map +0 -1
- package/dist/entries/skills.mjs.map +0 -1
- package/dist/entries/styleSystem.d.cts.map +0 -1
- package/dist/entries/styleSystem.d.mts.map +0 -1
- package/dist/entries/styleSystem.mjs.map +0 -1
- package/dist/interfaces/compatibility.d.cts.map +0 -1
- package/dist/interfaces/compatibility.d.mts.map +0 -1
- package/dist/interfaces/harness.d.cts.map +0 -1
- package/dist/interfaces/harness.d.mts.map +0 -1
- package/dist/logSinkTelemetry.cjs.map +0 -1
- package/dist/logSinkTelemetry.d.cts.map +0 -1
- package/dist/logSinkTelemetry.d.mts.map +0 -1
- package/dist/logSinkTelemetry.mjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +0 -1
- package/dist/services/compatibility/index.cjs.map +0 -1
- package/dist/services/compatibility/index.mjs.map +0 -1
- package/dist/services/compatibilityContext.cjs.map +0 -1
- package/dist/services/compatibilityContext.mjs.map +0 -1
- package/dist/services/composer.cjs.map +0 -1
- package/dist/services/composer.d.cts.map +0 -1
- package/dist/services/composer.d.mts.map +0 -1
- package/dist/services/composer.mjs.map +0 -1
- package/dist/services/extensionCompiler.cjs +0 -3
- package/dist/services/extensionCompiler.cjs.map +0 -1
- package/dist/services/extensionCompiler.mjs +0 -3
- package/dist/services/extensionCompiler.mjs.map +0 -1
- package/dist/services/harnessContext.cjs.map +0 -1
- package/dist/services/harnessContext.mjs.map +0 -1
- package/dist/services/matrixSwitcher.cjs.map +0 -1
- package/dist/services/matrixSwitcher.mjs.map +0 -1
- package/dist/services/mcpFilter.cjs.map +0 -1
- package/dist/services/mcpFilter.d.cts.map +0 -1
- package/dist/services/mcpFilter.d.mts.map +0 -1
- package/dist/services/mcpFilter.mjs.map +0 -1
- package/dist/services/piSettings.cjs.map +0 -1
- package/dist/services/piSettings.d.cts.map +0 -1
- package/dist/services/piSettings.d.mts.map +0 -1
- package/dist/services/piSettings.mjs.map +0 -1
- package/dist/services/resourceCollector.cjs.map +0 -1
- package/dist/services/resourceCollector.d.cts.map +0 -1
- package/dist/services/resourceCollector.d.mts.map +0 -1
- package/dist/services/resourceCollector.mjs.map +0 -1
- package/dist/services/runtimeBundle.cjs +0 -2
- package/dist/services/runtimeBundle.cjs.map +0 -1
- package/dist/services/runtimeBundle.d.cts.map +0 -1
- package/dist/services/runtimeBundle.d.mts.map +0 -1
- package/dist/services/runtimeBundle.mjs +0 -2
- package/dist/services/runtimeBundle.mjs.map +0 -1
- package/dist/services/skillCatalog.cjs.map +0 -1
- package/dist/services/skillCatalog.d.cts.map +0 -1
- package/dist/services/skillCatalog.d.mts.map +0 -1
- package/dist/services/skillCatalog.mjs.map +0 -1
- package/dist/services/syncState.cjs.map +0 -1
- package/dist/services/syncState.d.cts.map +0 -1
- package/dist/services/syncState.d.mts.map +0 -1
- package/dist/services/syncState.mjs.map +0 -1
- package/dist/utils/json.cjs.map +0 -1
- package/dist/utils/json.d.cts.map +0 -1
- package/dist/utils/json.d.mts.map +0 -1
- package/dist/utils/json.mjs.map +0 -1
- package/dist/utils/moduleResolution.cjs.map +0 -1
- package/dist/utils/moduleResolution.d.cts.map +0 -1
- package/dist/utils/moduleResolution.d.mts.map +0 -1
- package/dist/utils/moduleResolution.mjs.map +0 -1
- package/dist/utils/repository.cjs.map +0 -1
- package/dist/utils/repository.d.cts.map +0 -1
- package/dist/utils/repository.d.mts.map +0 -1
- package/dist/utils/repository.mjs.map +0 -1
- package/dist/utils/toolNames.cjs.map +0 -1
- package/dist/utils/toolNames.d.cts.map +0 -1
- package/dist/utils/toolNames.d.mts.map +0 -1
- package/dist/utils/toolNames.mjs.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defaultDomainsForMajorMode as e}from"../../commands/cli/matrixOptions.mjs";import{EMPTY_DOMAIN_INPUT_SCHEMA as t,LIST_DOMAINS_RESULT_SCHEMA as n,SAFE_DOMAIN_NAME as r,SWITCH_DOMAINS_INPUT_SCHEMA as i,SWITCH_DOMAINS_RESULT_SCHEMA as a}from"../../schemas/domainVoiceTools.mjs";import{createDomainSwitchHandoffStore as o}from"../services/domainSwitchHandoff.mjs";import{readDoomConfigSelection as s,requireDoomConfigContext as c}from"@agimon-ai/doompi-config/piContext";import{VOICE_TOOL_MAX_DOMAIN_COUNT as l,VOICE_TOOL_MAX_IDENTIFIER_LENGTH as u,commitVoiceReloadHandoff as d,discardVoiceReloadHandoff as f,prepareVoiceReloadHandoff as p,registerVoiceToolContribution as m}from"@agimon-ai/doompi-extension-contracts/voice-tools";const h=`info`,g=`(none)`,_=`@agimon-ai/doompi`,v=`--voice-switch-token=`;function y(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function b(t,n){return t.domains.length>0?[...t.domains]:e(t.majorMode,process.env,n)}function x(e){return`Active domains: ${e.effective.join(`, `)||g}\nAvailable domains: ${e.available.join(`, `)}\nUse /domains <name[,name...]> to switch.`}function S(e){if(e.length>l)throw Error(`A maximum of ${l} domains may be selected.`);let t=[],n=new Set;for(let i of e){let e=i.trim();if(!e||e.length>u||!r.test(e))throw Error(`Invalid domain name: ${i}`);n.has(e)||(n.add(e),t.push(e))}return t}function C(e){let t=e.trim();if(!t.startsWith(v))return;let n=t.split(/\s+/u);if(n.length!==1)throw Error(`The voice domain switch token must be the only command argument.`);let r=n[0]?.slice(21).trim();if(!r)throw Error(`The voice domain switch token is missing.`);return r}function w(e){return e instanceof Error?e.message:String(e)}function T(e,t={}){return e.map(e=>({value:e,label:e,...t[e]?{description:t[e]}:{}}))}async function E(e){let t=c(e).harness,{requireHarnessRoot:n}=await import(`../../adapters/config/harnessState.mjs`),r=n(t),{listDomainNames:i,loadDomains:a}=await import(`@agimon-ai/doompi-config/domains`),o=[...new Set(i(r))].sort(),l=s(e),u=l?[...l.domains]:[],d=a(r);return{active:u,effective:l?[...l.domains]:b(t,d.defaultDomains),available:o}}async function D(e,t){let n=S(t),r=c(e).harness,{requireHarnessRoot:i}=await import(`../../adapters/config/harnessState.mjs`),a=i(r),{listDomainNames:o,resolvePluginEntries:s}=await import(`@agimon-ai/doompi-config/domains`),l=new Set(o(a)),u=n.filter(e=>!l.has(e));if(u.length>0)throw Error(`Unknown domain: ${u.join(`, `)}`);return s(a,n,[...r.pluginDirectories]),n}function O(e,r){let o=e;m(o,{descriptor:{source:_,id:`domains-list`,name:`list_domains`,label:`List domains`,description:`List active, effective, and available Doom domains.`,order:100,inputSchema:t,resultSchema:n},execute:async(e,t)=>E(t.context)}),m(o,{descriptor:{source:_,id:`domains-switch`,name:`switch_domains`,label:`Switch domains`,description:`Queue a validated Doom domain selection and reload the session.`,order:110,inputSchema:i,resultSchema:a},execute:async(t,n)=>{let i=t,a=await D(n.context,i.domains),o=p({sessionId:n.sessionId,hostGeneration:n.hostGeneration,operationId:n.operationId,domains:a}),s;try{s=r.issue({sessionId:n.sessionId,hostGeneration:n.hostGeneration,operationId:n.operationId,domains:a,reloadHandoffToken:o.token}),e.sendUserMessage.bind(e)(`/domains ${v}${s.token}`,{deliverAs:`followUp`,expandPromptTemplates:!0})}catch(e){throw s&&r.discard(s.token,n),o.discard(),e}return{status:`queued`,stopBatch:`session-reload`}}})}function k(e){let t=o();O(e,t);let n,r,i,a,s=()=>n??=import(`@agimon-ai/doompi-config/domains`),l=()=>r??=import(`../../adapters/config/harnessState.mjs`),u=()=>i??=import(`../../adapters/matrixSwitcher.mjs`),p=()=>a??=import(`./components/matrixPicker.mjs`);e.on(`resources_discover`,(e,t)=>({skillPaths:[...c(t).harness.skillDirectories]})),e.on(`session_shutdown`,(e,n)=>{t.clearSession(n.sessionManager.getSessionId())}),e.on(`session_start`,(e,t)=>{let n=c(t).harness;t.ui.addAutocompleteProvider(e=>({triggerCharacters:[`,`],async getSuggestions(t,r,i,a){let o=t[r]??``,{domainCompletionItems:c,domainCompletionPrefix:l,listDomainNames:u}=await s(),d=l(o.slice(0,i));if(d===void 0)return e.getSuggestions(t,r,i,a);let f=n.root;if(!f)return e.getSuggestions(t,r,i,a);let p=c(u(f),d);return p.length===0?e.getSuggestions(t,r,i,a):{prefix:d,items:p}},applyCompletion(t,n,r,i,a){return e.applyCompletion(t,n,r,i,a)},shouldTriggerFileCompletion(t,n,r){return e.shouldTriggerFileCompletion?.(t,n,r)??!0}}))}),e.registerCommand(`domains`,{description:`Show the selected domains and pick a different set`,handler:async(n,r)=>{let i=c(r).harness,a,o,m;try{if(m=C(n),m&&(a={sessionId:r.sessionManager.getSessionId()},o=t.consume(m,a),!o))throw Error(`The voice domain switch token is stale or belongs to another session.`);let c=o?[...o.domains]:y(n),f=!1;if(!o&&c.length===0&&r.mode===`tui`){let e=await E(r),{MatrixPickerComponent:t}=await p(),{loadDomains:n}=await s(),a=i.root?Object.fromEntries(Object.entries(n(i.root).domains).map(([e,t])=>[e,t.description])):{},o=await r.ui.custom((n,r,i,o)=>new t({title:`Domains (active: ${e.effective.join(`, `)||g})`,items:T(e.available,a),selected:[...e.effective],multi:!0},r,i,o));if(o===void 0)return;c=o,f=!0}if(!o&&c.length===0&&!f){let e=await E(r);r.ui.notify(x(e),h);return}c=await D(r,c),await r.waitForIdle();let[{applyDomains:_},{persistHarnessSelection:v}]=await Promise.all([u(),l()]);if(v(e,await _(c,i)),o&&!d(o.reloadHandoffToken,{sessionId:o.sessionId,hostGeneration:o.hostGeneration}))throw Error(`The voice reload handoff is stale or was already consumed.`);r.ui.notify(`Switched domains to: ${c.join(`, `)||g}`,h),await r.reload()}catch(e){o&&a&&(t.discard(o.token,a),f(o.reloadHandoffToken,{sessionId:o.sessionId,hostGeneration:o.hostGeneration})),r.ui.notify(w(e),`error`)}}})}export{k as default,T as domainItems,E as listDomains,D as validateDomainSelection};
|
|
2
|
+
//# sourceMappingURL=domains.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.mjs","names":[],"sources":["../../../src/extensions/entries/domains.ts"],"sourcesContent":["import { readDoomConfigSelection, requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { DoomExtensionHost } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n commitVoiceReloadHandoff,\n discardVoiceReloadHandoff,\n prepareVoiceReloadHandoff,\n registerVoiceToolContribution,\n VOICE_TOOL_MAX_DOMAIN_COUNT,\n VOICE_TOOL_MAX_IDENTIFIER_LENGTH,\n} from '@agimon-ai/doompi-extension-contracts/voice-tools';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport type { DoomHarnessContext } from '../../adapters/config/harnessState.ts';\nimport { defaultDomainsForMajorMode } from '../../commands/cli/matrixOptions.ts';\nimport {\n EMPTY_DOMAIN_INPUT_SCHEMA,\n LIST_DOMAINS_RESULT_SCHEMA,\n SAFE_DOMAIN_NAME,\n SWITCH_DOMAINS_INPUT_SCHEMA,\n SWITCH_DOMAINS_RESULT_SCHEMA,\n} from '../../schemas/domainVoiceTools.ts';\nimport { createDomainSwitchHandoffStore, type DomainSwitchHandoff } from '../services/domainSwitchHandoff.ts';\n\nconst DOMAIN_SEPARATOR = ',';\nconst INFO = 'info';\nconst ERROR = 'error';\nconst NONE = '(none)';\nconst DOMAIN_SOURCE = '@agimon-ai/doompi';\nconst LIST_DOMAINS_ID = 'domains-list';\nconst SWITCH_DOMAINS_ID = 'domains-switch';\nconst VOICE_SWITCH_TOKEN_PREFIX = '--voice-switch-token=';\ninterface DomainListing {\n readonly active: string[];\n readonly effective: string[];\n readonly available: string[];\n}\n\ntype DomainVoiceContext = ExtensionContext;\ntype VoiceMessageSender = (\n content: string,\n options: { readonly deliverAs: 'followUp'; readonly expandPromptTemplates: true },\n) => void;\n\nfunction splitDomains(value: string): string[] {\n return value\n .split(DOMAIN_SEPARATOR)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction currentDomains(state: DoomHarnessContext, defaultDomains?: readonly string[]): string[] {\n if (state.domains.length > 0) return [...state.domains];\n return defaultDomainsForMajorMode(state.majorMode, process.env, defaultDomains);\n}\n\nfunction domainSummary(listing: DomainListing): string {\n const active = listing.effective.join(', ') || NONE;\n return `Active domains: ${active}\\nAvailable domains: ${listing.available.join(', ')}\\nUse /domains <name[,name...]> to switch.`;\n}\n\nfunction normalizeDomainNames(values: readonly string[]): string[] {\n if (values.length > VOICE_TOOL_MAX_DOMAIN_COUNT) {\n throw new Error(`A maximum of ${VOICE_TOOL_MAX_DOMAIN_COUNT} domains may be selected.`);\n }\n const result: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const name = value.trim();\n if (!name || name.length > VOICE_TOOL_MAX_IDENTIFIER_LENGTH || !SAFE_DOMAIN_NAME.test(name)) {\n throw new Error(`Invalid domain name: ${value}`);\n }\n if (seen.has(name)) continue;\n seen.add(name);\n result.push(name);\n }\n return result;\n}\n\nfunction voiceSwitchToken(args: string): string | undefined {\n const trimmed = args.trim();\n if (!trimmed.startsWith(VOICE_SWITCH_TOKEN_PREFIX)) return undefined;\n const parts = trimmed.split(/\\s+/u);\n if (parts.length !== 1) throw new Error('The voice domain switch token must be the only command argument.');\n const token = parts[0]?.slice(VOICE_SWITCH_TOKEN_PREFIX.length).trim();\n if (!token) throw new Error('The voice domain switch token is missing.');\n return token;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** Picker rows for the domain multi-select. */\nexport function domainItems(\n names: string[],\n descriptions: Readonly<Record<string, string | undefined>> = {},\n): SelectItem[] {\n return names.map((name) => ({\n value: name,\n label: name,\n ...(descriptions[name] ? { description: descriptions[name] } : {}),\n }));\n}\n\nexport async function listDomains(ctx: DomainVoiceContext): Promise<DomainListing> {\n const state = requireDoomConfigContext(ctx).harness;\n const { requireHarnessRoot } = await import('../../adapters/config/harnessState.ts');\n const repoRoot = requireHarnessRoot(state);\n const { listDomainNames, loadDomains } = await import('@agimon-ai/doompi-config/domains');\n const available = [...new Set(listDomainNames(repoRoot))].sort();\n const selection = readDoomConfigSelection(ctx);\n const active = selection ? [...selection.domains] : [];\n const manifest = loadDomains(repoRoot);\n const effective = selection ? [...selection.domains] : currentDomains(state, manifest.defaultDomains);\n return { active, effective, available };\n}\n\nexport async function validateDomainSelection(ctx: DomainVoiceContext, values: readonly string[]): Promise<string[]> {\n const selected = normalizeDomainNames(values);\n const state = requireDoomConfigContext(ctx).harness;\n const { requireHarnessRoot } = await import('../../adapters/config/harnessState.ts');\n const repoRoot = requireHarnessRoot(state);\n const { listDomainNames, resolvePluginEntries } = await import('@agimon-ai/doompi-config/domains');\n const available = new Set(listDomainNames(repoRoot));\n const unknown = selected.filter((name) => !available.has(name));\n if (unknown.length > 0) throw new Error(`Unknown domain: ${unknown.join(', ')}`);\n resolvePluginEntries(repoRoot, selected, [...state.pluginDirectories]);\n return selected;\n}\n\nfunction registerVoiceCapabilities(pi: ExtensionAPI, store: ReturnType<typeof createDomainSwitchHandoffStore>): void {\n const host = pi as unknown as DoomExtensionHost<DomainVoiceContext>;\n registerVoiceToolContribution(host, {\n descriptor: {\n source: DOMAIN_SOURCE,\n id: LIST_DOMAINS_ID,\n name: 'list_domains',\n label: 'List domains',\n description: 'List active, effective, and available Doom domains.',\n order: 100,\n inputSchema: EMPTY_DOMAIN_INPUT_SCHEMA,\n resultSchema: LIST_DOMAINS_RESULT_SCHEMA,\n },\n execute: async (_input, execution) => listDomains(execution.context),\n });\n registerVoiceToolContribution(host, {\n descriptor: {\n source: DOMAIN_SOURCE,\n id: SWITCH_DOMAINS_ID,\n name: 'switch_domains',\n label: 'Switch domains',\n description: 'Queue a validated Doom domain selection and reload the session.',\n order: 110,\n inputSchema: SWITCH_DOMAINS_INPUT_SCHEMA,\n resultSchema: SWITCH_DOMAINS_RESULT_SCHEMA,\n },\n execute: async (input, execution) => {\n const request = input as { domains: readonly string[] };\n const domains = await validateDomainSelection(execution.context, request.domains);\n const reloadHandoff = prepareVoiceReloadHandoff({\n sessionId: execution.sessionId,\n hostGeneration: execution.hostGeneration,\n operationId: execution.operationId,\n domains,\n });\n let queued: DomainSwitchHandoff | undefined;\n try {\n queued = store.issue({\n sessionId: execution.sessionId,\n hostGeneration: execution.hostGeneration,\n operationId: execution.operationId,\n domains,\n reloadHandoffToken: reloadHandoff.token,\n });\n const sendUserMessage = pi.sendUserMessage.bind(pi) as unknown as VoiceMessageSender;\n sendUserMessage(`${'/domains'} ${VOICE_SWITCH_TOKEN_PREFIX}${queued.token}`, {\n deliverAs: 'followUp',\n expandPromptTemplates: true,\n });\n } catch (error) {\n if (queued) store.discard(queued.token, execution);\n reloadHandoff.discard();\n throw error;\n }\n return { status: 'queued', stopBatch: 'session-reload' };\n },\n });\n}\n\nexport function domainsExtension(pi: ExtensionAPI): void {\n const handoffs = createDomainSwitchHandoffStore();\n registerVoiceCapabilities(pi, handoffs);\n\n let domainConfigPromise: Promise<typeof import('@agimon-ai/doompi-config/domains')> | undefined;\n let harnessStatePromise: Promise<typeof import('../../adapters/config/harnessState.ts')> | undefined;\n let matrixSwitcherPromise: Promise<typeof import('../../adapters/matrixSwitcher.ts')> | undefined;\n let pickerPromise: Promise<typeof import('./components/matrixPicker.ts')> | undefined;\n\n const loadDomainConfig = () => (domainConfigPromise ??= import('@agimon-ai/doompi-config/domains'));\n const loadHarnessState = () => (harnessStatePromise ??= import('../../adapters/config/harnessState.ts'));\n const loadMatrixSwitcher = () => (matrixSwitcherPromise ??= import('../../adapters/matrixSwitcher.ts'));\n const loadPicker = () => (pickerPromise ??= import('./components/matrixPicker.ts'));\n\n // Pi reloads base resources, then asks extensions to extend them again.\n // Read the rebound context so a domain switch discovers only the new selection.\n pi.on('resources_discover', (_event, ctx) => ({\n skillPaths: [...requireDoomConfigContext(ctx).harness.skillDirectories],\n }));\n\n pi.on('session_shutdown', (_event, ctx) => {\n handoffs.clearSession(ctx.sessionManager.getSessionId());\n });\n\n pi.on('session_start', (_event, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n ctx.ui.addAutocompleteProvider((current) => ({\n triggerCharacters: [','],\n async getSuggestions(lines, cursorLine, cursorCol, options) {\n const line = lines[cursorLine] ?? '';\n const { domainCompletionItems, domainCompletionPrefix, listDomainNames } = await loadDomainConfig();\n const prefix = domainCompletionPrefix(line.slice(0, cursorCol));\n if (prefix === undefined) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n\n const repoRoot = state.root;\n if (!repoRoot) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n\n const items = domainCompletionItems(listDomainNames(repoRoot), prefix);\n if (items.length === 0) return current.getSuggestions(lines, cursorLine, cursorCol, options);\n return { prefix, items };\n },\n applyCompletion(lines, cursorLine, cursorCol, item, prefix) {\n return current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);\n },\n shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {\n return current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? true;\n },\n }));\n });\n\n pi.registerCommand('domains', {\n description: 'Show the selected domains and pick a different set',\n handler: async (args, ctx) => {\n const state = requireDoomConfigContext(ctx).harness;\n let sessionIdentity: { readonly sessionId: string } | undefined;\n let queued: DomainSwitchHandoff | undefined;\n let token: string | undefined;\n try {\n token = voiceSwitchToken(args);\n if (token) {\n sessionIdentity = { sessionId: ctx.sessionManager.getSessionId() };\n queued = handoffs.consume(token, sessionIdentity);\n if (!queued) throw new Error('The voice domain switch token is stale or belongs to another session.');\n }\n\n let requested = queued ? [...queued.domains] : splitDomains(args);\n let pickerConfirmed = false;\n // No argument opens the multi-select. Domains compose, unlike a layer\n // base, so this picker toggles with space and confirms the whole set.\n if (!queued && requested.length === 0 && ctx.mode === 'tui') {\n const listing = await listDomains(ctx);\n const { MatrixPickerComponent } = await loadPicker();\n const { loadDomains } = await loadDomainConfig();\n const descriptions = state.root\n ? Object.fromEntries(\n Object.entries(loadDomains(state.root).domains).map(([name, domain]) => [name, domain.description]),\n )\n : {};\n const chosen = await ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n {\n title: `Domains (active: ${listing.effective.join(', ') || NONE})`,\n items: domainItems(listing.available, descriptions),\n selected: [...listing.effective],\n multi: true,\n },\n theme,\n keybindings,\n done,\n ),\n );\n if (chosen === undefined) return;\n requested = chosen;\n pickerConfirmed = true;\n }\n\n if (!queued && requested.length === 0 && !pickerConfirmed) {\n const listing = await listDomains(ctx);\n ctx.ui.notify(domainSummary(listing), INFO);\n return;\n }\n\n requested = await validateDomainSelection(ctx, requested);\n await ctx.waitForIdle();\n const [{ applyDomains }, { persistHarnessSelection }] = await Promise.all([\n loadMatrixSwitcher(),\n loadHarnessState(),\n ]);\n const updated = await applyDomains(requested, state);\n persistHarnessSelection(pi, updated);\n\n if (queued) {\n const committed = commitVoiceReloadHandoff(queued.reloadHandoffToken, {\n sessionId: queued.sessionId,\n hostGeneration: queued.hostGeneration,\n });\n if (!committed) throw new Error('The voice reload handoff is stale or was already consumed.');\n }\n\n ctx.ui.notify(`Switched domains to: ${requested.join(', ') || NONE}`, INFO);\n await ctx.reload();\n } catch (error) {\n if (queued && sessionIdentity) {\n handoffs.discard(queued.token, sessionIdentity);\n discardVoiceReloadHandoff(queued.reloadHandoffToken, {\n sessionId: queued.sessionId,\n hostGeneration: queued.hostGeneration,\n });\n }\n ctx.ui.notify(errorMessage(error), ERROR);\n }\n },\n });\n}\n\nexport default domainsExtension;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../adapters/bootstrapLocator.cjs`),t=require(`../../adapters/compositionState.cjs`),n=require(`../../adapters/composer.cjs`);let r=require(`@agimon-ai/doompi-config/harnessStore`);const i=`warning`;async function a(a){let o=t.acquireCompositionClaim();if(o)try{n.registerDoomFlags(a);let t=await n.composeDoomSession(a);a.on(`session_start`,(e,n)=>{o();for(let e of t.problems)n.ui.notify(e,i);t.stale&&n.ui.notify(`doompi config changed since the last sync. Run doompi sync.`,i)}),a.on(`session_shutdown`,async(t,i)=>{let a=e.findSyncedRoot(i.cwd);a&&((0,r.disposeHarnessState)(),await n.cleanupRunDirectory(a))})}catch(e){throw o(),e}}exports.default=a;
|
|
2
|
+
//# sourceMappingURL=doom.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doom.cjs","names":["acquireCompositionClaim","composeDoomSession","findSyncedRoot","cleanupRunDirectory"],"sources":["../../../src/extensions/entries/doom.ts"],"sourcesContent":["import { disposeHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n// Imported from the module rather than the barrel: Pi loads this file directly\n// and it is the first thing a synced session runs, so it pulls in nothing it\n// does not use.\nimport {\n type ComposeOutcome,\n cleanupRunDirectory,\n composeDoomSession,\n findSyncedRoot,\n registerDoomFlags,\n} from '../../adapters/composer.ts';\nimport { acquireCompositionClaim } from '../../adapters/compositionState.ts';\n\nconst WARNING = 'warning';\nconst STALE_MESSAGE = 'doompi config changed since the last sync. Run doompi sync.';\n\n/**\n * The one entry `doom-pi sync` puts in Pi's own config.\n *\n * Everything doom-pi contributes to a plain `pi` session is loaded from here,\n * which is what keeps `.pi/settings.json` to a single stable line and lets the\n * whole matrix be recomposed on `/reload` rather than frozen at startup.\n */\nexport async function doomExtension(pi: ExtensionAPI): Promise<void> {\n const releaseClaim = acquireCompositionClaim();\n if (!releaseClaim) return;\n\n try {\n registerDoomFlags(pi);\n const outcome: ComposeOutcome = await composeDoomSession(pi);\n\n // Reported on session_start rather than thrown: composition problems have to\n // reach the user through the UI, and the UI does not exist yet at load time.\n pi.on('session_start', (_event, ctx) => {\n // Every configured factory has loaded. A later /reload gets a new claim,\n // while a duplicate registration in this runner has already stood down.\n releaseClaim();\n for (const problem of outcome.problems) ctx.ui.notify(problem, WARNING);\n if (outcome.stale) ctx.ui.notify(STALE_MESSAGE, WARNING);\n });\n\n pi.on('session_shutdown', async (_event, ctx) => {\n const repoRoot = findSyncedRoot(ctx.cwd);\n if (!repoRoot) return;\n // The state file first, so nothing is left pointing at a path that is\n // about to disappear, then the directory it lived in.\n disposeHarnessState();\n await cleanupRunDirectory(repoRoot);\n });\n } catch (error) {\n // Pi discards a failed factory, including the session_start handler that\n // would normally release ownership. Leave a retry or reload possible.\n releaseClaim();\n throw error;\n }\n}\n\nexport default doomExtension;\n"],"mappings":"wPAcA,MAAM,EAAU,UAUhB,eAAsB,EAAc,EAAiC,CACnE,IAAM,EAAeA,EAAAA,yBAAyB,CACzC,KAEL,GAAI,CACF,EAAA,kBAAkB,EAAG,CACrB,IAAM,EAA0B,MAAMC,EAAAA,mBAAmB,EAAG,CAI5D,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CAGtC,GAAc,CACd,IAAK,IAAM,KAAW,EAAQ,SAAU,EAAI,GAAG,OAAO,EAAS,EAAQ,CACnE,EAAQ,OAAO,EAAI,GAAG,OAAO,8DAAe,EAAQ,EACxD,CAEF,EAAG,GAAG,mBAAoB,MAAO,EAAQ,IAAQ,CAC/C,IAAM,EAAWC,EAAAA,eAAe,EAAI,IAAI,CACnC,KAGL,EAAA,EAAA,sBAAqB,CACrB,MAAMC,EAAAA,oBAAoB,EAAS,GACnC,OACK,EAAO,CAId,MADA,GAAc,CACR"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/doom.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The one entry `doom-pi sync` puts in Pi's own config.
|
|
6
|
+
*
|
|
7
|
+
* Everything doom-pi contributes to a plain `pi` session is loaded from here,
|
|
8
|
+
* which is what keeps `.pi/settings.json` to a single stable line and lets the
|
|
9
|
+
* whole matrix be recomposed on `/reload` rather than frozen at startup.
|
|
10
|
+
*/
|
|
11
|
+
declare function doomExtension(pi: ExtensionAPI): Promise<void>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { doomExtension };
|
|
14
|
+
//# sourceMappingURL=doom.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doom.d.cts","names":[],"sources":["../../../src/extensions/entries/doom.ts"],"mappings":";;;;;AAwBA;;;;;iBAAsB,aAAA,CAAc,EAAA,EAAI,YAAA,GAAe,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/doom.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* The one entry `doom-pi sync` puts in Pi's own config.
|
|
6
|
+
*
|
|
7
|
+
* Everything doom-pi contributes to a plain `pi` session is loaded from here,
|
|
8
|
+
* which is what keeps `.pi/settings.json` to a single stable line and lets the
|
|
9
|
+
* whole matrix be recomposed on `/reload` rather than frozen at startup.
|
|
10
|
+
*/
|
|
11
|
+
declare function doomExtension(pi: ExtensionAPI): Promise<void>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { doomExtension };
|
|
14
|
+
//# sourceMappingURL=doom.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doom.d.mts","names":[],"sources":["../../../src/extensions/entries/doom.ts"],"mappings":";;;;;AAwBA;;;;;iBAAsB,aAAA,CAAc,EAAA,EAAI,YAAA,GAAe,OAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{findSyncedRoot as e}from"../../adapters/bootstrapLocator.mjs";import{acquireCompositionClaim as t}from"../../adapters/compositionState.mjs";import{cleanupRunDirectory as n,composeDoomSession as r,registerDoomFlags as i}from"../../adapters/composer.mjs";import{disposeHarnessState as a}from"@agimon-ai/doompi-config/harnessStore";const o=`warning`;async function s(s){let c=t();if(c)try{i(s);let t=await r(s);s.on(`session_start`,(e,n)=>{c();for(let e of t.problems)n.ui.notify(e,o);t.stale&&n.ui.notify(`doompi config changed since the last sync. Run doompi sync.`,o)}),s.on(`session_shutdown`,async(t,r)=>{let i=e(r.cwd);i&&(a(),await n(i))})}catch(e){throw c(),e}}export{s as default};
|
|
2
|
+
//# sourceMappingURL=doom.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doom.mjs","names":[],"sources":["../../../src/extensions/entries/doom.ts"],"sourcesContent":["import { disposeHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n// Imported from the module rather than the barrel: Pi loads this file directly\n// and it is the first thing a synced session runs, so it pulls in nothing it\n// does not use.\nimport {\n type ComposeOutcome,\n cleanupRunDirectory,\n composeDoomSession,\n findSyncedRoot,\n registerDoomFlags,\n} from '../../adapters/composer.ts';\nimport { acquireCompositionClaim } from '../../adapters/compositionState.ts';\n\nconst WARNING = 'warning';\nconst STALE_MESSAGE = 'doompi config changed since the last sync. Run doompi sync.';\n\n/**\n * The one entry `doom-pi sync` puts in Pi's own config.\n *\n * Everything doom-pi contributes to a plain `pi` session is loaded from here,\n * which is what keeps `.pi/settings.json` to a single stable line and lets the\n * whole matrix be recomposed on `/reload` rather than frozen at startup.\n */\nexport async function doomExtension(pi: ExtensionAPI): Promise<void> {\n const releaseClaim = acquireCompositionClaim();\n if (!releaseClaim) return;\n\n try {\n registerDoomFlags(pi);\n const outcome: ComposeOutcome = await composeDoomSession(pi);\n\n // Reported on session_start rather than thrown: composition problems have to\n // reach the user through the UI, and the UI does not exist yet at load time.\n pi.on('session_start', (_event, ctx) => {\n // Every configured factory has loaded. A later /reload gets a new claim,\n // while a duplicate registration in this runner has already stood down.\n releaseClaim();\n for (const problem of outcome.problems) ctx.ui.notify(problem, WARNING);\n if (outcome.stale) ctx.ui.notify(STALE_MESSAGE, WARNING);\n });\n\n pi.on('session_shutdown', async (_event, ctx) => {\n const repoRoot = findSyncedRoot(ctx.cwd);\n if (!repoRoot) return;\n // The state file first, so nothing is left pointing at a path that is\n // about to disappear, then the directory it lived in.\n disposeHarnessState();\n await cleanupRunDirectory(repoRoot);\n });\n } catch (error) {\n // Pi discards a failed factory, including the session_start handler that\n // would normally release ownership. Leave a retry or reload possible.\n releaseClaim();\n throw error;\n }\n}\n\nexport default doomExtension;\n"],"mappings":"gVAcA,MAAM,EAAU,UAUhB,eAAsB,EAAc,EAAiC,CACnE,IAAM,EAAe,GAAyB,CACzC,KAEL,GAAI,CACF,EAAkB,EAAG,CACrB,IAAM,EAA0B,MAAM,EAAmB,EAAG,CAI5D,EAAG,GAAG,iBAAkB,EAAQ,IAAQ,CAGtC,GAAc,CACd,IAAK,IAAM,KAAW,EAAQ,SAAU,EAAI,GAAG,OAAO,EAAS,EAAQ,CACnE,EAAQ,OAAO,EAAI,GAAG,OAAO,8DAAe,EAAQ,EACxD,CAEF,EAAG,GAAG,mBAAoB,MAAO,EAAQ,IAAQ,CAC/C,IAAM,EAAW,EAAe,EAAI,IAAI,CACnC,IAGL,GAAqB,CACrB,MAAM,EAAoB,EAAS,GACnC,OACK,EAAO,CAId,MADA,GAAc,CACR"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);let e=require(`@earendil-works/pi-coding-agent`);const t=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];function n(e){let[n]=e.trim().toLowerCase().split(/\s+/).filter(Boolean);return t.find(e=>e===n)}function r(){return`Usage: /effort <${t.join(`|`)}>`}function i(i){i.registerCommand(`effort`,{description:`Set thinking effort and persist it as the default for future sessions`,getArgumentCompletions:e=>{let n=e.trim().toLowerCase();return t.filter(e=>e.startsWith(n)).map(e=>({value:e,label:e}))},handler:async(t,a)=>{let o=n(t);if(!o){a.ui.notify(`${r()}\nCurrent effort: ${i.getThinkingLevel()}`,`warning`);return}i.setThinkingLevel(o);let s=i.getThinkingLevel(),c=e.SettingsManager.create(a.cwd);c.setDefaultThinkingLevel(o),await c.flush();let l=s===o?``:` Current model clamps it to ${s}.`;a.ui.notify(`Effort set to ${o} and saved for future sessions.${l}`,`info`)}})}exports.default=i,exports.effortUsage=r,exports.parseEffortLevel=n;
|
|
2
|
+
//# sourceMappingURL=effort.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.cjs","names":["SettingsManager"],"sources":["../../../src/extensions/entries/effort.ts"],"sourcesContent":["import { type ExtensionAPI, SettingsManager } from '@earendil-works/pi-coding-agent';\n\ntype ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];\n\nexport function parseEffortLevel(args: string): ThinkingLevel | undefined {\n const [level] = args.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n return THINKING_LEVELS.find((candidate) => candidate === level);\n}\n\nexport function effortUsage(): string {\n return `Usage: /effort <${THINKING_LEVELS.join('|')}>`;\n}\n\nexport default function effortExtension(pi: ExtensionAPI): void {\n pi.registerCommand('effort', {\n description: 'Set thinking effort and persist it as the default for future sessions',\n getArgumentCompletions: (prefix) => {\n const query = prefix.trim().toLowerCase();\n return THINKING_LEVELS.filter((level) => level.startsWith(query)).map((level) => ({\n value: level,\n label: level,\n }));\n },\n handler: async (args, ctx) => {\n const requestedLevel = parseEffortLevel(args);\n if (!requestedLevel) {\n ctx.ui.notify(`${effortUsage()}\\nCurrent effort: ${pi.getThinkingLevel()}`, 'warning');\n return;\n }\n\n pi.setThinkingLevel(requestedLevel);\n const effectiveLevel = pi.getThinkingLevel();\n\n const settings = SettingsManager.create(ctx.cwd);\n settings.setDefaultThinkingLevel(requestedLevel);\n await settings.flush();\n\n const suffix = effectiveLevel === requestedLevel ? '' : ` Current model clamps it to ${effectiveLevel}.`;\n ctx.ui.notify(`Effort set to ${requestedLevel} and saved for future sessions.${suffix}`, 'info');\n },\n });\n}\n"],"mappings":"iGAIA,MAAM,EAAmC,CAAC,MAAO,UAAW,MAAO,SAAU,OAAQ,QAAS,MAAM,CAEpG,SAAgB,EAAiB,EAAyC,CACxE,GAAM,CAAC,GAAS,EAAK,MAAM,CAAC,aAAa,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ,CACtE,OAAO,EAAgB,KAAM,GAAc,IAAc,EAAM,CAGjE,SAAgB,GAAsB,CACpC,MAAO,mBAAmB,EAAgB,KAAK,IAAI,CAAC,GAGtD,SAAwB,EAAgB,EAAwB,CAC9D,EAAG,gBAAgB,SAAU,CAC3B,YAAa,wEACb,uBAAyB,GAAW,CAClC,IAAM,EAAQ,EAAO,MAAM,CAAC,aAAa,CACzC,OAAO,EAAgB,OAAQ,GAAU,EAAM,WAAW,EAAM,CAAC,CAAC,IAAK,IAAW,CAChF,MAAO,EACP,MAAO,EACR,EAAE,EAEL,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAiB,EAAiB,EAAK,CAC7C,GAAI,CAAC,EAAgB,CACnB,EAAI,GAAG,OAAO,GAAG,GAAa,CAAC,oBAAoB,EAAG,kBAAkB,GAAI,UAAU,CACtF,OAGF,EAAG,iBAAiB,EAAe,CACnC,IAAM,EAAiB,EAAG,kBAAkB,CAEtC,EAAWA,EAAAA,gBAAgB,OAAO,EAAI,IAAI,CAChD,EAAS,wBAAwB,EAAe,CAChD,MAAM,EAAS,OAAO,CAEtB,IAAM,EAAS,IAAmB,EAAiB,GAAK,+BAA+B,EAAe,GACtG,EAAI,GAAG,OAAO,iBAAiB,EAAe,iCAAiC,IAAU,OAAO,EAEnG,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/effort.d.ts
|
|
4
|
+
type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
5
|
+
declare function parseEffortLevel(args: string): ThinkingLevel | undefined;
|
|
6
|
+
declare function effortUsage(): string;
|
|
7
|
+
declare function effortExtension(pi: ExtensionAPI): void;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { effortExtension, effortUsage, parseEffortLevel };
|
|
10
|
+
//# sourceMappingURL=effort.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.d.cts","names":[],"sources":["../../../src/extensions/entries/effort.ts"],"mappings":";;;KAEK,aAAA;AAAA,iBAIW,gBAAA,CAAiB,IAAA,WAAe,aAAA;AAAA,iBAKhC,WAAA,CAAA;AAAA,iBAIQ,eAAA,CAAgB,EAAA,EAAI,YAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/effort.d.ts
|
|
4
|
+
type ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
5
|
+
declare function parseEffortLevel(args: string): ThinkingLevel | undefined;
|
|
6
|
+
declare function effortUsage(): string;
|
|
7
|
+
declare function effortExtension(pi: ExtensionAPI): void;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { effortExtension, effortUsage, parseEffortLevel };
|
|
10
|
+
//# sourceMappingURL=effort.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.d.mts","names":[],"sources":["../../../src/extensions/entries/effort.ts"],"mappings":";;;KAEK,aAAA;AAAA,iBAIW,gBAAA,CAAiB,IAAA,WAAe,aAAA;AAAA,iBAKhC,WAAA,CAAA;AAAA,iBAIQ,eAAA,CAAgB,EAAA,EAAI,YAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{SettingsManager as e}from"@earendil-works/pi-coding-agent";const t=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];function n(e){let[n]=e.trim().toLowerCase().split(/\s+/).filter(Boolean);return t.find(e=>e===n)}function r(){return`Usage: /effort <${t.join(`|`)}>`}function i(i){i.registerCommand(`effort`,{description:`Set thinking effort and persist it as the default for future sessions`,getArgumentCompletions:e=>{let n=e.trim().toLowerCase();return t.filter(e=>e.startsWith(n)).map(e=>({value:e,label:e}))},handler:async(t,a)=>{let o=n(t);if(!o){a.ui.notify(`${r()}\nCurrent effort: ${i.getThinkingLevel()}`,`warning`);return}i.setThinkingLevel(o);let s=i.getThinkingLevel(),c=e.create(a.cwd);c.setDefaultThinkingLevel(o),await c.flush();let l=s===o?``:` Current model clamps it to ${s}.`;a.ui.notify(`Effort set to ${o} and saved for future sessions.${l}`,`info`)}})}export{i as default,r as effortUsage,n as parseEffortLevel};
|
|
2
|
+
//# sourceMappingURL=effort.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effort.mjs","names":[],"sources":["../../../src/extensions/entries/effort.ts"],"sourcesContent":["import { type ExtensionAPI, SettingsManager } from '@earendil-works/pi-coding-agent';\n\ntype ThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nconst THINKING_LEVELS: ThinkingLevel[] = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];\n\nexport function parseEffortLevel(args: string): ThinkingLevel | undefined {\n const [level] = args.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n return THINKING_LEVELS.find((candidate) => candidate === level);\n}\n\nexport function effortUsage(): string {\n return `Usage: /effort <${THINKING_LEVELS.join('|')}>`;\n}\n\nexport default function effortExtension(pi: ExtensionAPI): void {\n pi.registerCommand('effort', {\n description: 'Set thinking effort and persist it as the default for future sessions',\n getArgumentCompletions: (prefix) => {\n const query = prefix.trim().toLowerCase();\n return THINKING_LEVELS.filter((level) => level.startsWith(query)).map((level) => ({\n value: level,\n label: level,\n }));\n },\n handler: async (args, ctx) => {\n const requestedLevel = parseEffortLevel(args);\n if (!requestedLevel) {\n ctx.ui.notify(`${effortUsage()}\\nCurrent effort: ${pi.getThinkingLevel()}`, 'warning');\n return;\n }\n\n pi.setThinkingLevel(requestedLevel);\n const effectiveLevel = pi.getThinkingLevel();\n\n const settings = SettingsManager.create(ctx.cwd);\n settings.setDefaultThinkingLevel(requestedLevel);\n await settings.flush();\n\n const suffix = effectiveLevel === requestedLevel ? '' : ` Current model clamps it to ${effectiveLevel}.`;\n ctx.ui.notify(`Effort set to ${requestedLevel} and saved for future sessions.${suffix}`, 'info');\n },\n });\n}\n"],"mappings":"kEAIA,MAAM,EAAmC,CAAC,MAAO,UAAW,MAAO,SAAU,OAAQ,QAAS,MAAM,CAEpG,SAAgB,EAAiB,EAAyC,CACxE,GAAM,CAAC,GAAS,EAAK,MAAM,CAAC,aAAa,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ,CACtE,OAAO,EAAgB,KAAM,GAAc,IAAc,EAAM,CAGjE,SAAgB,GAAsB,CACpC,MAAO,mBAAmB,EAAgB,KAAK,IAAI,CAAC,GAGtD,SAAwB,EAAgB,EAAwB,CAC9D,EAAG,gBAAgB,SAAU,CAC3B,YAAa,wEACb,uBAAyB,GAAW,CAClC,IAAM,EAAQ,EAAO,MAAM,CAAC,aAAa,CACzC,OAAO,EAAgB,OAAQ,GAAU,EAAM,WAAW,EAAM,CAAC,CAAC,IAAK,IAAW,CAChF,MAAO,EACP,MAAO,EACR,EAAE,EAEL,QAAS,MAAO,EAAM,IAAQ,CAC5B,IAAM,EAAiB,EAAiB,EAAK,CAC7C,GAAI,CAAC,EAAgB,CACnB,EAAI,GAAG,OAAO,GAAG,GAAa,CAAC,oBAAoB,EAAG,kBAAkB,GAAI,UAAU,CACtF,OAGF,EAAG,iBAAiB,EAAe,CACnC,IAAM,EAAiB,EAAG,kBAAkB,CAEtC,EAAW,EAAgB,OAAO,EAAI,IAAI,CAChD,EAAS,wBAAwB,EAAe,CAChD,MAAM,EAAS,OAAO,CAEtB,IAAM,EAAS,IAAmB,EAAiB,GAAK,+BAA+B,EAAe,GACtG,EAAI,GAAG,OAAO,iBAAiB,EAAe,iCAAiC,IAAU,OAAO,EAEnG,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../adapters/telemetry/logSinkTelemetry.cjs`),t=require(`../../adapters/compositionState.cjs`),n=require(`../../schemas/majorModeVoiceTools.cjs`);let r=require(`@agimon-ai/doompi-config/piContext`),i=require(`@agimon-ai/doompi-extension-contracts/voice-tools`);const a=`doom-major-mode`,o=`mode`,s=/^\[[ x]\] /,c=`core only`,l=`--major-mode`,u=`major-mode-switch`,d=`--voice-switch-token=`;function f(e,t){return t.map(t=>({value:t,label:t,description:e.majorMode[t]?.description??c}))}function p(e,t,n){return`${e===n?`[x]`:`[ ]`} ${e}: ${t.join(`, `)||c}`}function m(e){return e.replace(s,``).split(`:`)[0]??e}function h(e,t,n){return[n?`*${n}*`:void 0,`[${e}]`,t.join(`,`)].filter(e=>!!e).join(`:`)}function g(e,t,n,r,i){return[r?e.fg(`success`,e.bold(`*${r}*`)):void 0,e.fg(i?`warning`:`accent`,`[${t}]`),n.length>0?e.fg(`muted`,n.join(`,`)):void 0].filter(e=>!!e).join(e.fg(`dim`,`:`))}function _(e,t,n,r=!1){let i=`Switched to ${e}: ${t.join(`, `)||c}`;return!n||r?[i,`Hooks reloaded.`].join(`
|
|
2
|
+
`):[i,`Hooks reloaded. Extensions are fixed at launch, so for those:`,` ./pi.sh ${l} ${e}`].join(`
|
|
3
|
+
`)}function v(e,t,n,r=!1){let i=`Major mode ${e}: ${t.join(`, `)||c}`;return e!==n&&!r?[i,`Relaunch with:\n ./pi.sh ${l} ${e}`].join(`
|
|
4
|
+
`):e===n?[i,`Already using this major mode.`].join(`
|
|
5
|
+
`):i}function y(e){let t=e.trim();if(!t.startsWith(d))return;let n=t.split(/\s+/u);if(n.length!==1)throw Error(`The voice major-mode switch token must be the only command argument.`);let r=n[0]?.slice(21).trim();if(!r)throw Error(`The voice major-mode switch token is missing.`);return r}function b(e){return e instanceof Error?e.message:String(e)}function x(e){return{status:`listed`,current:e.majorMode,modes:Object.entries(e.config.majorMode).map(([e,t])=>({name:e,description:t.description,layers:[...t.layers]}))}}function S(e,t){(0,i.registerVoiceToolContribution)(e,{descriptor:{source:`@agimon-ai/doompi`,id:n.MAJOR_MODE_VOICE_TOOL_NAME,name:n.MAJOR_MODE_VOICE_TOOL_NAME,label:`Major Mode`,description:`List configured Doom major modes with their purpose and layers, or queue a validated mode switch.`,order:10,inputSchema:n.MAJOR_MODE_VOICE_INPUT_SCHEMA,resultSchema:n.MAJOR_MODE_VOICE_RESULT_SCHEMA},async execute(n,r){let a=n,s=await t(r.context);if(a.action===`list`)return x(s);let c=a.majorMode.trim();if(!Object.hasOwn(s.config.majorMode,c))throw Error(`Unknown major mode: ${c}. Known major modes: ${Object.keys(s.config.majorMode).sort().join(`, `)}`);if(c===s.majorMode)return{status:`unchanged`,majorMode:c};let l=(0,i.prepareVoiceReloadHandoff)({sessionId:r.sessionId,hostGeneration:r.hostGeneration,operationId:r.operationId,kind:u,majorMode:c});try{e.sendUserMessage.bind(e)(`/${o} ${d}${l.token}`,{deliverAs:`followUp`,expandPromptTemplates:!0})}catch(e){throw l.discard(),e}return{status:`queued`,majorMode:c,stopBatch:`session-reload`}}})}function C(n,s=e.createHarnessTelemetry()){let c,l,d,h,x,C=()=>c??=Promise.resolve().then(()=>require(`../../services/extensionAssembler.cjs`)),w=()=>l??=import(`@agimon-ai/doompi-config/majorModes`),T=()=>d??=Promise.resolve().then(()=>require(`../../adapters/config/harnessState.cjs`)),E=()=>h??=Promise.resolve().then(()=>require(`../../adapters/matrixSwitcher.cjs`)),D=()=>x??=Promise.resolve().then(()=>require(`./components/matrixPicker.cjs`)),O=async e=>{let t=(0,r.requireDoomConfigContext)(e).harness,[{loadMajorModesConfig:n,resolveLayers:i},{requireHarnessRoot:a}]=await Promise.all([w(),T()]),o=n(a(t)),s=i(o,t.majorMode);return{config:o,majorMode:t.majorMode,active:t.layers.length===0?s:[...t.layers],domains:t.domains,profile:t.profile,hooks:t.hooks}};S(n,O),n.on(`session_start`,(t,n)=>{try{let{majorMode:e,domains:t,profile:i}=(0,r.requireDoomConfigContext)(n).harness;n.ui.setStatus(a,g(n.ui.theme,e,t,i,!1))}catch(t){s.recordWarning(e.HARNESS_EVENT.majorModeUnavailable,t),n.ui.setStatus(a,`major mode unavailable (${t instanceof Error?t.message:String(t)})`)}}),n.registerCommand(o,{description:`Pick a named major mode`,handler:async(c,l)=>{let d;try{d=y(c)}catch(e){l.ui.notify(b(e),`error`);return}if(c.trim()&&!d){l.ui.notify(`Usage: /${o}`,`warning`);return}let h={sessionId:l.sessionManager.getSessionId()},x;try{let{config:o,majorMode:c,active:y,domains:b,profile:S,hooks:k}=await O(l),{resolveLayers:A}=await w(),j=Object.keys(o.majorMode),M;if(d){if(x=(0,i.acceptVoiceReloadHandoff)(d,h),x?.kind!==u||!x.majorMode)throw Error(`The voice major-mode switch token is stale or belongs to another session.`);M=x.majorMode}else{let e=`Major mode (current: ${c})`;M=(l.mode===`tui`?await D().then(({MatrixPickerComponent:t})=>l.ui.custom((n,r,i,a)=>new t({title:e,items:f(o,j),selected:[c],multi:!1},r,i,a))):[m(await l.ui.select(e,j.map(e=>p(e,o.majorMode[e]?.layers??[],c)))??``)])?.[0]}if(!M)return;let N=t.alreadyComposed();if(M===c){d&&(0,i.discardVoiceReloadHandoff)(d,h),l.ui.notify(v(M,A(o,M),c,N),`info`);return}let[{filterHookDisabledLayers:P},{applyMajorMode:F,needsRelaunch:I},{persistHarnessSelection:L}]=await Promise.all([C(),E(),T()]),R=P(A(o,M),k),z=I(o,y,R);L(n,F(o,M,(0,r.requireDoomConfigContext)(l).harness)),s.recordEvent(e.HARNESS_EVENT.majorModeSwitched,{"harness.major_mode.previous":c,"harness.major_mode":M,"harness.layers":R.join(`,`),"harness.major_mode.stale":z}),l.ui.setStatus(a,g(l.ui.theme,M,b,S,z&&!N)),l.ui.notify(_(M,R,z,N),`info`),await l.waitForIdle(),await l.reload()}catch(e){if(!d)throw e;(0,i.discardVoiceReloadHandoff)(d,h),l.ui.notify(b(e),`error`)}}})}exports.applySummary=_,exports.colorStatus=g,exports.default=C,exports.majorModeItems=f,exports.majorModeOptionLabel=p,exports.majorModeSummary=v,exports.optionName=m,exports.statusText=h;
|
|
6
|
+
//# sourceMappingURL=majorMode.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"majorMode.cjs","names":["host","MAJOR_MODE_VOICE_TOOL_NAME","MAJOR_MODE_VOICE_INPUT_SCHEMA","MAJOR_MODE_VOICE_RESULT_SCHEMA","createHarnessTelemetry","HARNESS_EVENT","alreadyComposed"],"sources":["../../../src/extensions/entries/majorMode.ts"],"sourcesContent":["import type { MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { DoomExtensionHost } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n acceptVoiceReloadHandoff,\n discardVoiceReloadHandoff,\n prepareVoiceReloadHandoff,\n registerVoiceToolContribution,\n type VoiceReloadHandoff,\n} from '@agimon-ai/doompi-extension-contracts/voice-tools';\nimport type { ExtensionAPI, ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { alreadyComposed } from '../../adapters/compositionState.ts';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/logSinkTelemetry.ts';\nimport {\n MAJOR_MODE_VOICE_INPUT_SCHEMA,\n MAJOR_MODE_VOICE_RESULT_SCHEMA,\n MAJOR_MODE_VOICE_TOOL_NAME,\n type MajorModeVoiceInput,\n type MajorModeVoiceResult,\n} from '../../schemas/majorModeVoiceTools.ts';\n\nconst STATUS_KEY = 'doom-major-mode';\nconst MAJOR_MODE_COMMAND = 'mode';\nconst OPTION_PREFIX = /^\\[[ x]\\] /;\nconst CORE_ONLY = 'core only';\nconst MARK_ON = '[x]';\nconst MARK_OFF = '[ ]';\nconst RELAUNCH = 'Relaunch with:';\nconst MAJOR_MODE_OPTION = '--major-mode';\nconst MAJOR_MODE_SOURCE = '@agimon-ai/doompi';\nconst MAJOR_MODE_SWITCH_HANDOFF_KIND = 'major-mode-switch';\nconst VOICE_SWITCH_TOKEN_PREFIX = '--voice-switch-token=';\n\n/** Picker rows show the resolved layers while retaining bare major mode values. */\nexport function majorModeItems(config: MajorModesConfig, names: string[]): SelectItem[] {\n return names.map((name) => ({\n value: name,\n label: name,\n description: config.majorMode[name]?.description ?? CORE_ONLY,\n }));\n}\n\nexport function majorModeOptionLabel(name: string, layers: string[], current: string): string {\n return `${name === current ? MARK_ON : MARK_OFF} ${name}: ${layers.join(', ') || CORE_ONLY}`;\n}\n\nexport function optionName(option: string): string {\n return option.replace(OPTION_PREFIX, '').split(':')[0] ?? option;\n}\n\n/** Compact footer text for the selected major mode, domains, and profile. */\nexport function statusText(majorMode: string, domains: readonly string[], profile?: string): string {\n return [profile ? `*${profile}*` : undefined, `[${majorMode}]`, domains.join(',')]\n .filter((part) => Boolean(part))\n .join(':');\n}\n\nexport function colorStatus(\n theme: Theme,\n majorMode: string,\n domains: readonly string[],\n profile: string | undefined,\n pending: boolean,\n): string {\n const parts = [\n profile ? theme.fg('success', theme.bold(`*${profile}*`)) : undefined,\n theme.fg(pending ? 'warning' : 'accent', `[${majorMode}]`),\n domains.length > 0 ? theme.fg('muted', domains.join(',')) : undefined,\n ].filter((part): part is string => Boolean(part));\n return parts.join(theme.fg('dim', ':'));\n}\n\n/**\n * What a switch actually applied.\n *\n * A synced session composes its extension set on every load, so a reload picks\n * up the new layers outright. A launcher session cannot: Pi freezes the CLI\n * `--extension` list at construction, so a layer that contributes extensions\n * needs a relaunch there and only the hooks change in place.\n */\nexport function applySummary(picked: string, layers: string[], stale: boolean, composed = false): string {\n const head = `Switched to ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (!stale || composed) return [head, 'Hooks reloaded.'].join('\\n');\n return [\n head,\n 'Hooks reloaded. Extensions are fixed at launch, so for those:',\n ` ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`,\n ].join('\\n');\n}\n\nexport function majorModeSummary(picked: string, layers: string[], current: string, composed = false): string {\n const contents = `Major mode ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (picked !== current && !composed) {\n return [contents, `${RELAUNCH}\\n ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`].join('\\n');\n }\n if (picked !== current) return contents;\n return [contents, 'Already using this major mode.'].join('\\n');\n}\n\ninterface MajorModeView {\n config: MajorModesConfig;\n majorMode: string;\n active: string[];\n domains: readonly string[];\n profile?: string;\n hooks: boolean;\n}\n\ntype VoiceMessageSender = (\n content: string,\n options: { readonly deliverAs: 'followUp'; readonly expandPromptTemplates: true },\n) => void;\n\nfunction voiceSwitchToken(args: string): string | undefined {\n const trimmed = args.trim();\n if (!trimmed.startsWith(VOICE_SWITCH_TOKEN_PREFIX)) return undefined;\n const parts = trimmed.split(/\\s+/u);\n if (parts.length !== 1) throw new Error('The voice major-mode switch token must be the only command argument.');\n const token = parts[0]?.slice(VOICE_SWITCH_TOKEN_PREFIX.length).trim();\n if (!token) throw new Error('The voice major-mode switch token is missing.');\n return token;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction majorModeListing(view: MajorModeView): MajorModeVoiceResult {\n return {\n status: 'listed',\n current: view.majorMode,\n modes: Object.entries(view.config.majorMode).map(([name, definition]) => ({\n name,\n description: definition.description,\n layers: [...definition.layers],\n })),\n };\n}\n\nfunction registerMajorModeVoiceCapability(\n pi: ExtensionAPI,\n currentView: (ctx: ExtensionContext) => Promise<MajorModeView>,\n): void {\n const host = pi as unknown as DoomExtensionHost<ExtensionContext>;\n registerVoiceToolContribution(host, {\n descriptor: {\n source: MAJOR_MODE_SOURCE,\n id: MAJOR_MODE_VOICE_TOOL_NAME,\n name: MAJOR_MODE_VOICE_TOOL_NAME,\n label: 'Major Mode',\n description: 'List configured Doom major modes with their purpose and layers, or queue a validated mode switch.',\n order: 10,\n inputSchema: MAJOR_MODE_VOICE_INPUT_SCHEMA,\n resultSchema: MAJOR_MODE_VOICE_RESULT_SCHEMA,\n },\n async execute(input, execution) {\n const params = input as MajorModeVoiceInput;\n const view = await currentView(execution.context);\n if (params.action === 'list') return majorModeListing(view);\n\n const majorMode = params.majorMode.trim();\n if (!Object.hasOwn(view.config.majorMode, majorMode)) {\n throw new Error(\n `Unknown major mode: ${majorMode}. Known major modes: ${Object.keys(view.config.majorMode).sort().join(', ')}`,\n );\n }\n if (majorMode === view.majorMode) return { status: 'unchanged', majorMode };\n\n const reloadHandoff = prepareVoiceReloadHandoff({\n sessionId: execution.sessionId,\n hostGeneration: execution.hostGeneration,\n operationId: execution.operationId,\n kind: MAJOR_MODE_SWITCH_HANDOFF_KIND,\n majorMode,\n });\n try {\n const sendUserMessage = pi.sendUserMessage.bind(pi) as unknown as VoiceMessageSender;\n sendUserMessage(`/${MAJOR_MODE_COMMAND} ${VOICE_SWITCH_TOKEN_PREFIX}${reloadHandoff.token}`, {\n deliverAs: 'followUp',\n expandPromptTemplates: true,\n });\n } catch (error) {\n reloadHandoff.discard();\n throw error;\n }\n return { status: 'queued', majorMode, stopBatch: 'session-reload' };\n },\n });\n}\n\nexport default function majorModeExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n let assemblerPromise: Promise<typeof import('../../services/extensionAssembler.ts')> | undefined;\n let configPromise: Promise<typeof import('@agimon-ai/doompi-config/majorModes')> | undefined;\n let harnessStatePromise: Promise<typeof import('../../adapters/config/harnessState.ts')> | undefined;\n let matrixSwitcherPromise: Promise<typeof import('../../adapters/matrixSwitcher.ts')> | undefined;\n let pickerPromise: Promise<typeof import('./components/matrixPicker.ts')> | undefined;\n\n const loadAssembler = () => (assemblerPromise ??= import('../../services/extensionAssembler.ts'));\n const loadConfig = () => (configPromise ??= import('@agimon-ai/doompi-config/majorModes'));\n const loadHarnessState = () => (harnessStatePromise ??= import('../../adapters/config/harnessState.ts'));\n const loadMatrixSwitcher = () => (matrixSwitcherPromise ??= import('../../adapters/matrixSwitcher.ts'));\n const loadPicker = () => (pickerPromise ??= import('./components/matrixPicker.ts'));\n\n const currentView = async (ctx: ExtensionContext): Promise<MajorModeView> => {\n const state = requireDoomConfigContext(ctx).harness;\n const [{ loadMajorModesConfig, resolveLayers }, { requireHarnessRoot }] = await Promise.all([\n loadConfig(),\n loadHarnessState(),\n ]);\n const config = loadMajorModesConfig(requireHarnessRoot(state));\n const resolved = resolveLayers(config, state.majorMode);\n return {\n config,\n majorMode: state.majorMode,\n active: state.layers.length === 0 ? resolved : [...state.layers],\n domains: state.domains,\n profile: state.profile,\n hooks: state.hooks,\n };\n };\n\n registerMajorModeVoiceCapability(pi, currentView);\n\n pi.on('session_start', (_event, ctx) => {\n try {\n const { majorMode, domains, profile } = requireDoomConfigContext(ctx).harness;\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, majorMode, domains, profile, false));\n } catch (error) {\n // The status line degrades to a message nobody reads, while the run keeps\n // going with whatever layers the environment happened to carry.\n void telemetry.recordWarning(HARNESS_EVENT.majorModeUnavailable, error);\n ctx.ui.setStatus(\n STATUS_KEY,\n `major mode unavailable (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n });\n\n pi.registerCommand(MAJOR_MODE_COMMAND, {\n description: 'Pick a named major mode',\n handler: async (args, ctx) => {\n let token: string | undefined;\n try {\n token = voiceSwitchToken(args);\n } catch (error) {\n ctx.ui.notify(errorMessage(error), 'error');\n return;\n }\n if (args.trim() && !token) {\n ctx.ui.notify(`Usage: /${MAJOR_MODE_COMMAND}`, 'warning');\n return;\n }\n\n const sessionIdentity = { sessionId: ctx.sessionManager.getSessionId() };\n let handoff: VoiceReloadHandoff | undefined;\n try {\n const { config, majorMode, active, domains, profile, hooks } = await currentView(ctx);\n const { resolveLayers } = await loadConfig();\n const names = Object.keys(config.majorMode);\n let picked: string | undefined;\n\n if (token) {\n handoff = acceptVoiceReloadHandoff(token, sessionIdentity);\n if (handoff?.kind !== MAJOR_MODE_SWITCH_HANDOFF_KIND || !handoff.majorMode) {\n throw new Error('The voice major-mode switch token is stale or belongs to another session.');\n }\n picked = handoff.majorMode;\n } else {\n const title = `Major mode (current: ${majorMode})`;\n const chosen =\n ctx.mode === 'tui'\n ? await loadPicker().then(({ MatrixPickerComponent }) =>\n ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n { title, items: majorModeItems(config, names), selected: [majorMode], multi: false },\n theme,\n keybindings,\n done,\n ),\n ),\n )\n : [\n optionName(\n (await ctx.ui.select(\n title,\n names.map((name) => majorModeOptionLabel(name, config.majorMode[name]?.layers ?? [], majorMode)),\n )) ?? '',\n ),\n ];\n picked = chosen?.[0];\n }\n if (!picked) return;\n\n const composed = alreadyComposed();\n if (picked === majorMode) {\n if (token) discardVoiceReloadHandoff(token, sessionIdentity);\n ctx.ui.notify(majorModeSummary(picked, resolveLayers(config, picked), majorMode, composed), 'info');\n return;\n }\n\n const [{ filterHookDisabledLayers }, { applyMajorMode, needsRelaunch }, { persistHarnessSelection }] =\n await Promise.all([loadAssembler(), loadMatrixSwitcher(), loadHarnessState()]);\n const selected = filterHookDisabledLayers(resolveLayers(config, picked), hooks);\n const stale = needsRelaunch(config, active, selected);\n const updated = applyMajorMode(config, picked, requireDoomConfigContext(ctx).harness);\n persistHarnessSelection(pi, updated);\n void telemetry.recordEvent(HARNESS_EVENT.majorModeSwitched, {\n 'harness.major_mode.previous': majorMode,\n 'harness.major_mode': picked,\n 'harness.layers': selected.join(','),\n 'harness.major_mode.stale': stale,\n });\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, picked, domains, profile, stale && !composed));\n ctx.ui.notify(applySummary(picked, selected, stale, composed), 'info');\n await ctx.waitForIdle();\n await ctx.reload();\n } catch (error) {\n if (!token) throw error;\n discardVoiceReloadHandoff(token, sessionIdentity);\n ctx.ui.notify(errorMessage(error), 'error');\n }\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.cjs";
|
|
2
|
+
import { MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
|
|
3
|
+
import { ExtensionAPI, Theme } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { SelectItem } from "@earendil-works/pi-tui";
|
|
5
|
+
|
|
6
|
+
//#region src/extensions/entries/majorMode.d.ts
|
|
7
|
+
/** Picker rows show the resolved layers while retaining bare major mode values. */
|
|
8
|
+
declare function majorModeItems(config: MajorModesConfig, names: string[]): SelectItem[];
|
|
9
|
+
declare function majorModeOptionLabel(name: string, layers: string[], current: string): string;
|
|
10
|
+
declare function optionName(option: string): string;
|
|
11
|
+
/** Compact footer text for the selected major mode, domains, and profile. */
|
|
12
|
+
declare function statusText(majorMode: string, domains: readonly string[], profile?: string): string;
|
|
13
|
+
declare function colorStatus(theme: Theme, majorMode: string, domains: readonly string[], profile: string | undefined, pending: boolean): string;
|
|
14
|
+
/**
|
|
15
|
+
* What a switch actually applied.
|
|
16
|
+
*
|
|
17
|
+
* A synced session composes its extension set on every load, so a reload picks
|
|
18
|
+
* up the new layers outright. A launcher session cannot: Pi freezes the CLI
|
|
19
|
+
* `--extension` list at construction, so a layer that contributes extensions
|
|
20
|
+
* needs a relaunch there and only the hooks change in place.
|
|
21
|
+
*/
|
|
22
|
+
declare function applySummary(picked: string, layers: string[], stale: boolean, composed?: boolean): string;
|
|
23
|
+
declare function majorModeSummary(picked: string, layers: string[], current: string, composed?: boolean): string;
|
|
24
|
+
declare function majorModeExtension(pi: ExtensionAPI, telemetry?: HarnessTelemetry): void;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { applySummary, colorStatus, majorModeExtension, majorModeItems, majorModeOptionLabel, majorModeSummary, optionName, statusText };
|
|
27
|
+
//# sourceMappingURL=majorMode.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"majorMode.d.cts","names":[],"sources":["../../../src/extensions/entries/majorMode.ts"],"mappings":";;;;;;;iBAuCgB,cAAA,CAAe,MAAA,EAAQ,gBAAA,EAAkB,KAAA,aAAkB,UAAA;AAAA,iBAQ3D,oBAAA,CAAqB,IAAA,UAAc,MAAA,YAAkB,OAAA;AAAA,iBAIrD,UAAA,CAAW,MAAA;;iBAKX,UAAA,CAAW,SAAA,UAAmB,OAAA,qBAA4B,OAAA;AAAA,iBAM1D,WAAA,CACd,KAAA,EAAO,KAAA,EACP,SAAA,UACA,OAAA,qBACA,OAAA,sBACA,OAAA;;;;;;AApBF;;;iBAsCgB,YAAA,CAAa,MAAA,UAAgB,MAAA,YAAkB,KAAA,WAAgB,QAAA;AAAA,iBAU/D,gBAAA,CAAiB,MAAA,UAAgB,MAAA,YAAkB,OAAA,UAAiB,QAAA;AAAA,iBAoG5D,kBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HarnessTelemetry } from "../../adapters/telemetry/logSinkTelemetry.mjs";
|
|
2
|
+
import { MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
|
|
3
|
+
import { ExtensionAPI, Theme } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { SelectItem } from "@earendil-works/pi-tui";
|
|
5
|
+
|
|
6
|
+
//#region src/extensions/entries/majorMode.d.ts
|
|
7
|
+
/** Picker rows show the resolved layers while retaining bare major mode values. */
|
|
8
|
+
declare function majorModeItems(config: MajorModesConfig, names: string[]): SelectItem[];
|
|
9
|
+
declare function majorModeOptionLabel(name: string, layers: string[], current: string): string;
|
|
10
|
+
declare function optionName(option: string): string;
|
|
11
|
+
/** Compact footer text for the selected major mode, domains, and profile. */
|
|
12
|
+
declare function statusText(majorMode: string, domains: readonly string[], profile?: string): string;
|
|
13
|
+
declare function colorStatus(theme: Theme, majorMode: string, domains: readonly string[], profile: string | undefined, pending: boolean): string;
|
|
14
|
+
/**
|
|
15
|
+
* What a switch actually applied.
|
|
16
|
+
*
|
|
17
|
+
* A synced session composes its extension set on every load, so a reload picks
|
|
18
|
+
* up the new layers outright. A launcher session cannot: Pi freezes the CLI
|
|
19
|
+
* `--extension` list at construction, so a layer that contributes extensions
|
|
20
|
+
* needs a relaunch there and only the hooks change in place.
|
|
21
|
+
*/
|
|
22
|
+
declare function applySummary(picked: string, layers: string[], stale: boolean, composed?: boolean): string;
|
|
23
|
+
declare function majorModeSummary(picked: string, layers: string[], current: string, composed?: boolean): string;
|
|
24
|
+
declare function majorModeExtension(pi: ExtensionAPI, telemetry?: HarnessTelemetry): void;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { applySummary, colorStatus, majorModeExtension, majorModeItems, majorModeOptionLabel, majorModeSummary, optionName, statusText };
|
|
27
|
+
//# sourceMappingURL=majorMode.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"majorMode.d.mts","names":[],"sources":["../../../src/extensions/entries/majorMode.ts"],"mappings":";;;;;;;iBAuCgB,cAAA,CAAe,MAAA,EAAQ,gBAAA,EAAkB,KAAA,aAAkB,UAAA;AAAA,iBAQ3D,oBAAA,CAAqB,IAAA,UAAc,MAAA,YAAkB,OAAA;AAAA,iBAIrD,UAAA,CAAW,MAAA;;iBAKX,UAAA,CAAW,SAAA,UAAmB,OAAA,qBAA4B,OAAA;AAAA,iBAM1D,WAAA,CACd,KAAA,EAAO,KAAA,EACP,SAAA,UACA,OAAA,qBACA,OAAA,sBACA,OAAA;;;;;;AApBF;;;iBAsCgB,YAAA,CAAa,MAAA,UAAgB,MAAA,YAAkB,KAAA,WAAgB,QAAA;AAAA,iBAU/D,gBAAA,CAAiB,MAAA,UAAgB,MAAA,YAAkB,OAAA,UAAiB,QAAA;AAAA,iBAoG5D,kBAAA,CACtB,EAAA,EAAI,YAAA,EACJ,SAAA,GAAW,gBAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{HARNESS_EVENT as e,createHarnessTelemetry as t}from"../../adapters/telemetry/logSinkTelemetry.mjs";import{alreadyComposed as n}from"../../adapters/compositionState.mjs";import{MAJOR_MODE_VOICE_INPUT_SCHEMA as r,MAJOR_MODE_VOICE_RESULT_SCHEMA as i,MAJOR_MODE_VOICE_TOOL_NAME as a}from"../../schemas/majorModeVoiceTools.mjs";import{requireDoomConfigContext as o}from"@agimon-ai/doompi-config/piContext";import{acceptVoiceReloadHandoff as s,discardVoiceReloadHandoff as c,prepareVoiceReloadHandoff as l,registerVoiceToolContribution as u}from"@agimon-ai/doompi-extension-contracts/voice-tools";const d=`doom-major-mode`,f=`mode`,p=/^\[[ x]\] /,m=`core only`,h=`--major-mode`,g=`major-mode-switch`,_=`--voice-switch-token=`;function v(e,t){return t.map(t=>({value:t,label:t,description:e.majorMode[t]?.description??m}))}function y(e,t,n){return`${e===n?`[x]`:`[ ]`} ${e}: ${t.join(`, `)||m}`}function b(e){return e.replace(p,``).split(`:`)[0]??e}function x(e,t,n){return[n?`*${n}*`:void 0,`[${e}]`,t.join(`,`)].filter(e=>!!e).join(`:`)}function S(e,t,n,r,i){return[r?e.fg(`success`,e.bold(`*${r}*`)):void 0,e.fg(i?`warning`:`accent`,`[${t}]`),n.length>0?e.fg(`muted`,n.join(`,`)):void 0].filter(e=>!!e).join(e.fg(`dim`,`:`))}function C(e,t,n,r=!1){let i=`Switched to ${e}: ${t.join(`, `)||m}`;return!n||r?[i,`Hooks reloaded.`].join(`
|
|
2
|
+
`):[i,`Hooks reloaded. Extensions are fixed at launch, so for those:`,` ./pi.sh ${h} ${e}`].join(`
|
|
3
|
+
`)}function w(e,t,n,r=!1){let i=`Major mode ${e}: ${t.join(`, `)||m}`;return e!==n&&!r?[i,`Relaunch with:\n ./pi.sh ${h} ${e}`].join(`
|
|
4
|
+
`):e===n?[i,`Already using this major mode.`].join(`
|
|
5
|
+
`):i}function T(e){let t=e.trim();if(!t.startsWith(_))return;let n=t.split(/\s+/u);if(n.length!==1)throw Error(`The voice major-mode switch token must be the only command argument.`);let r=n[0]?.slice(21).trim();if(!r)throw Error(`The voice major-mode switch token is missing.`);return r}function E(e){return e instanceof Error?e.message:String(e)}function D(e){return{status:`listed`,current:e.majorMode,modes:Object.entries(e.config.majorMode).map(([e,t])=>({name:e,description:t.description,layers:[...t.layers]}))}}function O(e,t){u(e,{descriptor:{source:`@agimon-ai/doompi`,id:a,name:a,label:`Major Mode`,description:`List configured Doom major modes with their purpose and layers, or queue a validated mode switch.`,order:10,inputSchema:r,resultSchema:i},async execute(n,r){let i=n,a=await t(r.context);if(i.action===`list`)return D(a);let o=i.majorMode.trim();if(!Object.hasOwn(a.config.majorMode,o))throw Error(`Unknown major mode: ${o}. Known major modes: ${Object.keys(a.config.majorMode).sort().join(`, `)}`);if(o===a.majorMode)return{status:`unchanged`,majorMode:o};let s=l({sessionId:r.sessionId,hostGeneration:r.hostGeneration,operationId:r.operationId,kind:g,majorMode:o});try{e.sendUserMessage.bind(e)(`/${f} ${_}${s.token}`,{deliverAs:`followUp`,expandPromptTemplates:!0})}catch(e){throw s.discard(),e}return{status:`queued`,majorMode:o,stopBatch:`session-reload`}}})}function k(r,i=t()){let a,l,u,p,m,h=()=>a??=import(`../../services/extensionAssembler.mjs`),_=()=>l??=import(`@agimon-ai/doompi-config/majorModes`),x=()=>u??=import(`../../adapters/config/harnessState.mjs`),D=()=>p??=import(`../../adapters/matrixSwitcher.mjs`),k=()=>m??=import(`./components/matrixPicker.mjs`),A=async e=>{let t=o(e).harness,[{loadMajorModesConfig:n,resolveLayers:r},{requireHarnessRoot:i}]=await Promise.all([_(),x()]),a=n(i(t)),s=r(a,t.majorMode);return{config:a,majorMode:t.majorMode,active:t.layers.length===0?s:[...t.layers],domains:t.domains,profile:t.profile,hooks:t.hooks}};O(r,A),r.on(`session_start`,(t,n)=>{try{let{majorMode:e,domains:t,profile:r}=o(n).harness;n.ui.setStatus(d,S(n.ui.theme,e,t,r,!1))}catch(t){i.recordWarning(e.majorModeUnavailable,t),n.ui.setStatus(d,`major mode unavailable (${t instanceof Error?t.message:String(t)})`)}}),r.registerCommand(f,{description:`Pick a named major mode`,handler:async(t,a)=>{let l;try{l=T(t)}catch(e){a.ui.notify(E(e),`error`);return}if(t.trim()&&!l){a.ui.notify(`Usage: /${f}`,`warning`);return}let u={sessionId:a.sessionManager.getSessionId()},p;try{let{config:t,majorMode:f,active:m,domains:T,profile:E,hooks:O}=await A(a),{resolveLayers:j}=await _(),M=Object.keys(t.majorMode),N;if(l){if(p=s(l,u),p?.kind!==g||!p.majorMode)throw Error(`The voice major-mode switch token is stale or belongs to another session.`);N=p.majorMode}else{let e=`Major mode (current: ${f})`;N=(a.mode===`tui`?await k().then(({MatrixPickerComponent:n})=>a.ui.custom((r,i,a,o)=>new n({title:e,items:v(t,M),selected:[f],multi:!1},i,a,o))):[b(await a.ui.select(e,M.map(e=>y(e,t.majorMode[e]?.layers??[],f)))??``)])?.[0]}if(!N)return;let P=n();if(N===f){l&&c(l,u),a.ui.notify(w(N,j(t,N),f,P),`info`);return}let[{filterHookDisabledLayers:F},{applyMajorMode:I,needsRelaunch:L},{persistHarnessSelection:R}]=await Promise.all([h(),D(),x()]),z=F(j(t,N),O),B=L(t,m,z);R(r,I(t,N,o(a).harness)),i.recordEvent(e.majorModeSwitched,{"harness.major_mode.previous":f,"harness.major_mode":N,"harness.layers":z.join(`,`),"harness.major_mode.stale":B}),a.ui.setStatus(d,S(a.ui.theme,N,T,E,B&&!P)),a.ui.notify(C(N,z,B,P),`info`),await a.waitForIdle(),await a.reload()}catch(e){if(!l)throw e;c(l,u),a.ui.notify(E(e),`error`)}}})}export{C as applySummary,S as colorStatus,k as default,v as majorModeItems,y as majorModeOptionLabel,w as majorModeSummary,b as optionName,x as statusText};
|
|
6
|
+
//# sourceMappingURL=majorMode.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"majorMode.mjs","names":["host"],"sources":["../../../src/extensions/entries/majorMode.ts"],"sourcesContent":["import type { MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport type { DoomExtensionHost } from '@agimon-ai/doompi-extension-contracts/config';\nimport {\n acceptVoiceReloadHandoff,\n discardVoiceReloadHandoff,\n prepareVoiceReloadHandoff,\n registerVoiceToolContribution,\n type VoiceReloadHandoff,\n} from '@agimon-ai/doompi-extension-contracts/voice-tools';\nimport type { ExtensionAPI, ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { SelectItem } from '@earendil-works/pi-tui';\nimport { alreadyComposed } from '../../adapters/compositionState.ts';\nimport {\n createHarnessTelemetry,\n HARNESS_EVENT,\n type HarnessTelemetry,\n} from '../../adapters/telemetry/logSinkTelemetry.ts';\nimport {\n MAJOR_MODE_VOICE_INPUT_SCHEMA,\n MAJOR_MODE_VOICE_RESULT_SCHEMA,\n MAJOR_MODE_VOICE_TOOL_NAME,\n type MajorModeVoiceInput,\n type MajorModeVoiceResult,\n} from '../../schemas/majorModeVoiceTools.ts';\n\nconst STATUS_KEY = 'doom-major-mode';\nconst MAJOR_MODE_COMMAND = 'mode';\nconst OPTION_PREFIX = /^\\[[ x]\\] /;\nconst CORE_ONLY = 'core only';\nconst MARK_ON = '[x]';\nconst MARK_OFF = '[ ]';\nconst RELAUNCH = 'Relaunch with:';\nconst MAJOR_MODE_OPTION = '--major-mode';\nconst MAJOR_MODE_SOURCE = '@agimon-ai/doompi';\nconst MAJOR_MODE_SWITCH_HANDOFF_KIND = 'major-mode-switch';\nconst VOICE_SWITCH_TOKEN_PREFIX = '--voice-switch-token=';\n\n/** Picker rows show the resolved layers while retaining bare major mode values. */\nexport function majorModeItems(config: MajorModesConfig, names: string[]): SelectItem[] {\n return names.map((name) => ({\n value: name,\n label: name,\n description: config.majorMode[name]?.description ?? CORE_ONLY,\n }));\n}\n\nexport function majorModeOptionLabel(name: string, layers: string[], current: string): string {\n return `${name === current ? MARK_ON : MARK_OFF} ${name}: ${layers.join(', ') || CORE_ONLY}`;\n}\n\nexport function optionName(option: string): string {\n return option.replace(OPTION_PREFIX, '').split(':')[0] ?? option;\n}\n\n/** Compact footer text for the selected major mode, domains, and profile. */\nexport function statusText(majorMode: string, domains: readonly string[], profile?: string): string {\n return [profile ? `*${profile}*` : undefined, `[${majorMode}]`, domains.join(',')]\n .filter((part) => Boolean(part))\n .join(':');\n}\n\nexport function colorStatus(\n theme: Theme,\n majorMode: string,\n domains: readonly string[],\n profile: string | undefined,\n pending: boolean,\n): string {\n const parts = [\n profile ? theme.fg('success', theme.bold(`*${profile}*`)) : undefined,\n theme.fg(pending ? 'warning' : 'accent', `[${majorMode}]`),\n domains.length > 0 ? theme.fg('muted', domains.join(',')) : undefined,\n ].filter((part): part is string => Boolean(part));\n return parts.join(theme.fg('dim', ':'));\n}\n\n/**\n * What a switch actually applied.\n *\n * A synced session composes its extension set on every load, so a reload picks\n * up the new layers outright. A launcher session cannot: Pi freezes the CLI\n * `--extension` list at construction, so a layer that contributes extensions\n * needs a relaunch there and only the hooks change in place.\n */\nexport function applySummary(picked: string, layers: string[], stale: boolean, composed = false): string {\n const head = `Switched to ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (!stale || composed) return [head, 'Hooks reloaded.'].join('\\n');\n return [\n head,\n 'Hooks reloaded. Extensions are fixed at launch, so for those:',\n ` ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`,\n ].join('\\n');\n}\n\nexport function majorModeSummary(picked: string, layers: string[], current: string, composed = false): string {\n const contents = `Major mode ${picked}: ${layers.join(', ') || CORE_ONLY}`;\n if (picked !== current && !composed) {\n return [contents, `${RELAUNCH}\\n ./pi.sh ${MAJOR_MODE_OPTION} ${picked}`].join('\\n');\n }\n if (picked !== current) return contents;\n return [contents, 'Already using this major mode.'].join('\\n');\n}\n\ninterface MajorModeView {\n config: MajorModesConfig;\n majorMode: string;\n active: string[];\n domains: readonly string[];\n profile?: string;\n hooks: boolean;\n}\n\ntype VoiceMessageSender = (\n content: string,\n options: { readonly deliverAs: 'followUp'; readonly expandPromptTemplates: true },\n) => void;\n\nfunction voiceSwitchToken(args: string): string | undefined {\n const trimmed = args.trim();\n if (!trimmed.startsWith(VOICE_SWITCH_TOKEN_PREFIX)) return undefined;\n const parts = trimmed.split(/\\s+/u);\n if (parts.length !== 1) throw new Error('The voice major-mode switch token must be the only command argument.');\n const token = parts[0]?.slice(VOICE_SWITCH_TOKEN_PREFIX.length).trim();\n if (!token) throw new Error('The voice major-mode switch token is missing.');\n return token;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction majorModeListing(view: MajorModeView): MajorModeVoiceResult {\n return {\n status: 'listed',\n current: view.majorMode,\n modes: Object.entries(view.config.majorMode).map(([name, definition]) => ({\n name,\n description: definition.description,\n layers: [...definition.layers],\n })),\n };\n}\n\nfunction registerMajorModeVoiceCapability(\n pi: ExtensionAPI,\n currentView: (ctx: ExtensionContext) => Promise<MajorModeView>,\n): void {\n const host = pi as unknown as DoomExtensionHost<ExtensionContext>;\n registerVoiceToolContribution(host, {\n descriptor: {\n source: MAJOR_MODE_SOURCE,\n id: MAJOR_MODE_VOICE_TOOL_NAME,\n name: MAJOR_MODE_VOICE_TOOL_NAME,\n label: 'Major Mode',\n description: 'List configured Doom major modes with their purpose and layers, or queue a validated mode switch.',\n order: 10,\n inputSchema: MAJOR_MODE_VOICE_INPUT_SCHEMA,\n resultSchema: MAJOR_MODE_VOICE_RESULT_SCHEMA,\n },\n async execute(input, execution) {\n const params = input as MajorModeVoiceInput;\n const view = await currentView(execution.context);\n if (params.action === 'list') return majorModeListing(view);\n\n const majorMode = params.majorMode.trim();\n if (!Object.hasOwn(view.config.majorMode, majorMode)) {\n throw new Error(\n `Unknown major mode: ${majorMode}. Known major modes: ${Object.keys(view.config.majorMode).sort().join(', ')}`,\n );\n }\n if (majorMode === view.majorMode) return { status: 'unchanged', majorMode };\n\n const reloadHandoff = prepareVoiceReloadHandoff({\n sessionId: execution.sessionId,\n hostGeneration: execution.hostGeneration,\n operationId: execution.operationId,\n kind: MAJOR_MODE_SWITCH_HANDOFF_KIND,\n majorMode,\n });\n try {\n const sendUserMessage = pi.sendUserMessage.bind(pi) as unknown as VoiceMessageSender;\n sendUserMessage(`/${MAJOR_MODE_COMMAND} ${VOICE_SWITCH_TOKEN_PREFIX}${reloadHandoff.token}`, {\n deliverAs: 'followUp',\n expandPromptTemplates: true,\n });\n } catch (error) {\n reloadHandoff.discard();\n throw error;\n }\n return { status: 'queued', majorMode, stopBatch: 'session-reload' };\n },\n });\n}\n\nexport default function majorModeExtension(\n pi: ExtensionAPI,\n telemetry: HarnessTelemetry = createHarnessTelemetry(),\n): void {\n let assemblerPromise: Promise<typeof import('../../services/extensionAssembler.ts')> | undefined;\n let configPromise: Promise<typeof import('@agimon-ai/doompi-config/majorModes')> | undefined;\n let harnessStatePromise: Promise<typeof import('../../adapters/config/harnessState.ts')> | undefined;\n let matrixSwitcherPromise: Promise<typeof import('../../adapters/matrixSwitcher.ts')> | undefined;\n let pickerPromise: Promise<typeof import('./components/matrixPicker.ts')> | undefined;\n\n const loadAssembler = () => (assemblerPromise ??= import('../../services/extensionAssembler.ts'));\n const loadConfig = () => (configPromise ??= import('@agimon-ai/doompi-config/majorModes'));\n const loadHarnessState = () => (harnessStatePromise ??= import('../../adapters/config/harnessState.ts'));\n const loadMatrixSwitcher = () => (matrixSwitcherPromise ??= import('../../adapters/matrixSwitcher.ts'));\n const loadPicker = () => (pickerPromise ??= import('./components/matrixPicker.ts'));\n\n const currentView = async (ctx: ExtensionContext): Promise<MajorModeView> => {\n const state = requireDoomConfigContext(ctx).harness;\n const [{ loadMajorModesConfig, resolveLayers }, { requireHarnessRoot }] = await Promise.all([\n loadConfig(),\n loadHarnessState(),\n ]);\n const config = loadMajorModesConfig(requireHarnessRoot(state));\n const resolved = resolveLayers(config, state.majorMode);\n return {\n config,\n majorMode: state.majorMode,\n active: state.layers.length === 0 ? resolved : [...state.layers],\n domains: state.domains,\n profile: state.profile,\n hooks: state.hooks,\n };\n };\n\n registerMajorModeVoiceCapability(pi, currentView);\n\n pi.on('session_start', (_event, ctx) => {\n try {\n const { majorMode, domains, profile } = requireDoomConfigContext(ctx).harness;\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, majorMode, domains, profile, false));\n } catch (error) {\n // The status line degrades to a message nobody reads, while the run keeps\n // going with whatever layers the environment happened to carry.\n void telemetry.recordWarning(HARNESS_EVENT.majorModeUnavailable, error);\n ctx.ui.setStatus(\n STATUS_KEY,\n `major mode unavailable (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n });\n\n pi.registerCommand(MAJOR_MODE_COMMAND, {\n description: 'Pick a named major mode',\n handler: async (args, ctx) => {\n let token: string | undefined;\n try {\n token = voiceSwitchToken(args);\n } catch (error) {\n ctx.ui.notify(errorMessage(error), 'error');\n return;\n }\n if (args.trim() && !token) {\n ctx.ui.notify(`Usage: /${MAJOR_MODE_COMMAND}`, 'warning');\n return;\n }\n\n const sessionIdentity = { sessionId: ctx.sessionManager.getSessionId() };\n let handoff: VoiceReloadHandoff | undefined;\n try {\n const { config, majorMode, active, domains, profile, hooks } = await currentView(ctx);\n const { resolveLayers } = await loadConfig();\n const names = Object.keys(config.majorMode);\n let picked: string | undefined;\n\n if (token) {\n handoff = acceptVoiceReloadHandoff(token, sessionIdentity);\n if (handoff?.kind !== MAJOR_MODE_SWITCH_HANDOFF_KIND || !handoff.majorMode) {\n throw new Error('The voice major-mode switch token is stale or belongs to another session.');\n }\n picked = handoff.majorMode;\n } else {\n const title = `Major mode (current: ${majorMode})`;\n const chosen =\n ctx.mode === 'tui'\n ? await loadPicker().then(({ MatrixPickerComponent }) =>\n ctx.ui.custom<string[] | undefined>(\n (_tui, theme, keybindings, done) =>\n new MatrixPickerComponent(\n { title, items: majorModeItems(config, names), selected: [majorMode], multi: false },\n theme,\n keybindings,\n done,\n ),\n ),\n )\n : [\n optionName(\n (await ctx.ui.select(\n title,\n names.map((name) => majorModeOptionLabel(name, config.majorMode[name]?.layers ?? [], majorMode)),\n )) ?? '',\n ),\n ];\n picked = chosen?.[0];\n }\n if (!picked) return;\n\n const composed = alreadyComposed();\n if (picked === majorMode) {\n if (token) discardVoiceReloadHandoff(token, sessionIdentity);\n ctx.ui.notify(majorModeSummary(picked, resolveLayers(config, picked), majorMode, composed), 'info');\n return;\n }\n\n const [{ filterHookDisabledLayers }, { applyMajorMode, needsRelaunch }, { persistHarnessSelection }] =\n await Promise.all([loadAssembler(), loadMatrixSwitcher(), loadHarnessState()]);\n const selected = filterHookDisabledLayers(resolveLayers(config, picked), hooks);\n const stale = needsRelaunch(config, active, selected);\n const updated = applyMajorMode(config, picked, requireDoomConfigContext(ctx).harness);\n persistHarnessSelection(pi, updated);\n void telemetry.recordEvent(HARNESS_EVENT.majorModeSwitched, {\n 'harness.major_mode.previous': majorMode,\n 'harness.major_mode': picked,\n 'harness.layers': selected.join(','),\n 'harness.major_mode.stale': stale,\n });\n ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, picked, domains, profile, stale && !composed));\n ctx.ui.notify(applySummary(picked, selected, stale, composed), 'info');\n await ctx.waitForIdle();\n await ctx.reload();\n } catch (error) {\n if (!token) throw error;\n discardVoiceReloadHandoff(token, sessionIdentity);\n ctx.ui.notify(errorMessage(error), 'error');\n }\n },\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../services/modeCatalog.cjs`);let t=require(`@agimon-ai/doompi-extension-contracts/mode`),n=require(`@agimon-ai/doompi-extension-contracts/protocol`);function r(r){let i;r.on(`session_start`,(a,o)=>{i?.dispose(),i=e.createMinorModeCatalogHost((0,n.createProtocolRuntime)({bus:r.events,source:t.MINOR_MODE_CATALOG_SOURCE,sessionId:o.sessionManager.getSessionId()}),{sessionKind:o.hasUI&&o.mode===`tui`?`tui`:`headless`})}),r.on(`session_shutdown`,()=>{i?.dispose(),i=void 0})}exports.default=r;
|
|
2
|
+
//# sourceMappingURL=modeCatalog.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeCatalog.cjs","names":["createMinorModeCatalogHost","MINOR_MODE_CATALOG_SOURCE"],"sources":["../../../src/extensions/entries/modeCatalog.ts"],"sourcesContent":["import { MINOR_MODE_CATALOG_SOURCE } from '@agimon-ai/doompi-extension-contracts/mode';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createMinorModeCatalogHost, type MinorModeCatalogHost } from '../../services/modeCatalog.ts';\n\nexport function modeCatalogExtension(pi: ExtensionAPI): void {\n let catalog: MinorModeCatalogHost | undefined;\n\n pi.on('session_start', (_event, context) => {\n catalog?.dispose();\n catalog = createMinorModeCatalogHost(\n createProtocolRuntime({\n bus: pi.events,\n source: MINOR_MODE_CATALOG_SOURCE,\n sessionId: context.sessionManager.getSessionId(),\n }),\n { sessionKind: context.hasUI && context.mode === 'tui' ? 'tui' : 'headless' },\n );\n });\n\n pi.on('session_shutdown', () => {\n catalog?.dispose();\n catalog = undefined;\n });\n}\n\nexport default modeCatalogExtension;\n"],"mappings":"0NAKA,SAAgB,EAAqB,EAAwB,CAC3D,IAAI,EAEJ,EAAG,GAAG,iBAAkB,EAAQ,IAAY,CAC1C,GAAS,SAAS,CAClB,EAAUA,EAAAA,4BAAAA,EAAAA,EAAAA,uBACc,CACpB,IAAK,EAAG,OACR,OAAQC,EAAAA,0BACR,UAAW,EAAQ,eAAe,cAAc,CACjD,CAAC,CACF,CAAE,YAAa,EAAQ,OAAS,EAAQ,OAAS,MAAQ,MAAQ,WAAY,CAC9E,EACD,CAEF,EAAG,GAAG,uBAA0B,CAC9B,GAAS,SAAS,CAClB,EAAU,IAAA,IACV"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/modeCatalog.d.ts
|
|
4
|
+
declare function modeCatalogExtension(pi: ExtensionAPI): void;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { modeCatalogExtension };
|
|
7
|
+
//# sourceMappingURL=modeCatalog.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeCatalog.d.cts","names":[],"sources":["../../../src/extensions/entries/modeCatalog.ts"],"mappings":";;;iBAKgB,oBAAA,CAAqB,EAAA,EAAI,YAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/modeCatalog.d.ts
|
|
4
|
+
declare function modeCatalogExtension(pi: ExtensionAPI): void;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { modeCatalogExtension };
|
|
7
|
+
//# sourceMappingURL=modeCatalog.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeCatalog.d.mts","names":[],"sources":["../../../src/extensions/entries/modeCatalog.ts"],"mappings":";;;iBAKgB,oBAAA,CAAqB,EAAA,EAAI,YAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createMinorModeCatalogHost as e}from"../../services/modeCatalog.mjs";import{MINOR_MODE_CATALOG_SOURCE as t}from"@agimon-ai/doompi-extension-contracts/mode";import{createProtocolRuntime as n}from"@agimon-ai/doompi-extension-contracts/protocol";function r(r){let i;r.on(`session_start`,(a,o)=>{i?.dispose(),i=e(n({bus:r.events,source:t,sessionId:o.sessionManager.getSessionId()}),{sessionKind:o.hasUI&&o.mode===`tui`?`tui`:`headless`})}),r.on(`session_shutdown`,()=>{i?.dispose(),i=void 0})}export{r as default};
|
|
2
|
+
//# sourceMappingURL=modeCatalog.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modeCatalog.mjs","names":[],"sources":["../../../src/extensions/entries/modeCatalog.ts"],"sourcesContent":["import { MINOR_MODE_CATALOG_SOURCE } from '@agimon-ai/doompi-extension-contracts/mode';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport { createMinorModeCatalogHost, type MinorModeCatalogHost } from '../../services/modeCatalog.ts';\n\nexport function modeCatalogExtension(pi: ExtensionAPI): void {\n let catalog: MinorModeCatalogHost | undefined;\n\n pi.on('session_start', (_event, context) => {\n catalog?.dispose();\n catalog = createMinorModeCatalogHost(\n createProtocolRuntime({\n bus: pi.events,\n source: MINOR_MODE_CATALOG_SOURCE,\n sessionId: context.sessionManager.getSessionId(),\n }),\n { sessionKind: context.hasUI && context.mode === 'tui' ? 'tui' : 'headless' },\n );\n });\n\n pi.on('session_shutdown', () => {\n catalog?.dispose();\n catalog = undefined;\n });\n}\n\nexport default modeCatalogExtension;\n"],"mappings":"0PAKA,SAAgB,EAAqB,EAAwB,CAC3D,IAAI,EAEJ,EAAG,GAAG,iBAAkB,EAAQ,IAAY,CAC1C,GAAS,SAAS,CAClB,EAAU,EACR,EAAsB,CACpB,IAAK,EAAG,OACR,OAAQ,EACR,UAAW,EAAQ,eAAe,cAAc,CACjD,CAAC,CACF,CAAE,YAAa,EAAQ,OAAS,EAAQ,OAAS,MAAQ,MAAQ,WAAY,CAC9E,EACD,CAEF,EAAG,GAAG,uBAA0B,CAC9B,GAAS,SAAS,CAClB,EAAU,IAAA,IACV"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`./shellTitleController.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`@agimon-ai/doompi-extension-contracts`);function i(e){let t=e.replace(/\s+/g,` `).trim();if(t)return t.length>36?`${t.slice(0,35)}…`:t}function a(e,t,r){let i=n.default.basename(t),a=e.getSessionName()??r;return a?`π - ${a} - ${i}`:`π - ${i}`}function o(e){let t=e.replace(/\s+/g,` `).trim();return t.length>240?`${t.slice(0,239)}…`:t}async function s(e,t,n){try{return(await e.exec(t,n,{timeout:3e3})).code===0}catch{return!1}}async function c(e,t,n=process.platform){let r=o(t.body);await s(e,`cmux`,[`notify`,`--title`,t.title,`--subtitle`,t.subtitle,`--body`,r])||n!==`darwin`||await s(e,`osascript`,[`-e`,`on run argv`,`-e`,`display notification (item 3 of argv) with title (item 1 of argv) subtitle (item 2 of argv)`,`-e`,`end run`,t.title,t.subtitle,r])}function l(e,t,n){let r=e.confirm.bind(e);e.confirm=(e,i,a)=>(t()&&n(`${e}: ${i}`),r(e,i,a));let i=e.select.bind(e);e.select=(e,r,a)=>(t()&&n(e),i(e,r,a));let a=e.input.bind(e);e.input=(e,r,i)=>(t()&&n(e),a(e,r,i));let o=e.editor.bind(e);e.editor=(e,r)=>(t()&&n(e),o(e,r))}function u(e,o){if(process.env.PI_SUBAGENT_CHILD)return;let s=o??t.createWorkerTitleController(),u=!1,d=!1,f,p=new WeakSet,m=e=>t=>e.ui.setTitle(t),h=e=>e.hasUI&&e.mode!==`rpc`,g=t=>{h(t)&&s.stop(a(e,t.cwd,f),m(t))},_=t=>{h(t)&&s.start(a(e,t.cwd,f),m(t))},v=t=>{c(e,{title:`Pi needs your input`,subtitle:`Approval or feedback required`,body:t})},y=(0,r.subscribeToAskUserEvents)(e.events,{onPrompt(e){v(e.questions[0]?.question??`The agent is waiting for your feedback.`)},onBlocked(e){d=e.active}});e.on(`input`,(t,n)=>{f||t.source===`extension`||(f=i(t.text),f&&h(n)&&s.set(a(e,n.cwd,f),m(n)))}),e.on(`session_start`,(e,t)=>{p.has(t.ui)||(p.add(t.ui),l(t.ui,()=>u&&!d,v))}),e.on(`agent_start`,(e,t)=>{u=!0,_(t)}),e.on(`agent_settled`,async(t,r)=>{u=!1,d=!1,g(r),!r.hasPendingMessages()&&await c(e,{title:`Pi finished`,subtitle:e.getSessionName()??n.default.basename(r.cwd),body:`The agent finished its work and is waiting for you.`})}),e.on(`session_shutdown`,(t,n)=>{u=!1,d=!1,y.dispose(),h(n)&&s.dispose(a(e,n.cwd,f),m(n))})}exports.default=u,exports.sendSystemNotification=c;
|
|
2
|
+
//# sourceMappingURL=notifications.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.cjs","names":["path","createWorkerTitleController"],"sources":["../../../src/extensions/entries/notifications.ts"],"sourcesContent":["import path from 'node:path';\nimport { subscribeToAskUserEvents } from '@agimon-ai/doompi-extension-contracts';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\nimport { createWorkerTitleController, type ShellTitleController } from './shellTitleController.ts';\n\ninterface Notification {\n title: string;\n subtitle: string;\n body: string;\n}\n\nconst COMMAND_TIMEOUT_MS = 3_000;\nconst EXTENSION_INPUT_SOURCE = 'extension';\nconst INPUT_EVENT = 'input';\nconst MAX_BODY_LENGTH = 240;\nconst MAX_PROMPT_TITLE_LENGTH = 36;\nconst OSASCRIPT_EXPRESSION_FLAG = '-e';\n\nfunction promptTitle(prompt: string): string | undefined {\n const normalized = prompt.replace(/\\s+/g, ' ').trim();\n if (!normalized) return undefined;\n return normalized.length > MAX_PROMPT_TITLE_LENGTH\n ? `${normalized.slice(0, MAX_PROMPT_TITLE_LENGTH - 1)}…`\n : normalized;\n}\n\nfunction shellTabTitle(pi: ExtensionAPI, cwd: string, prompt?: string): string {\n const repository = path.basename(cwd);\n const label = pi.getSessionName() ?? prompt;\n return label ? `π - ${label} - ${repository}` : `π - ${repository}`;\n}\n\nfunction notificationBody(body: string): string {\n const normalized = body.replace(/\\s+/g, ' ').trim();\n return normalized.length > MAX_BODY_LENGTH ? `${normalized.slice(0, MAX_BODY_LENGTH - 1)}…` : normalized;\n}\n\nasync function execute(pi: ExtensionAPI, command: string, args: string[]): Promise<boolean> {\n try {\n const result = await pi.exec(command, args, { timeout: COMMAND_TIMEOUT_MS });\n return result.code === 0;\n } catch {\n return false;\n }\n}\n\nexport async function sendSystemNotification(\n pi: ExtensionAPI,\n notification: Notification,\n platform = process.platform,\n): Promise<void> {\n const body = notificationBody(notification.body);\n const sentToCmux = await execute(pi, 'cmux', [\n 'notify',\n '--title',\n notification.title,\n '--subtitle',\n notification.subtitle,\n '--body',\n body,\n ]);\n if (sentToCmux || platform !== 'darwin') return;\n\n await execute(pi, 'osascript', [\n OSASCRIPT_EXPRESSION_FLAG,\n 'on run argv',\n OSASCRIPT_EXPRESSION_FLAG,\n 'display notification (item 3 of argv) with title (item 1 of argv) subtitle (item 2 of argv)',\n OSASCRIPT_EXPRESSION_FLAG,\n 'end run',\n notification.title,\n notification.subtitle,\n body,\n ]);\n}\n\nfunction wrapAttentionDialogs(\n ui: ExtensionUIContext,\n shouldNotify: () => boolean,\n notify: (title: string) => void,\n): void {\n const originalConfirm = ui.confirm.bind(ui);\n ui.confirm = (title, message, options) => {\n if (shouldNotify()) notify(`${title}: ${message}`);\n return originalConfirm(title, message, options);\n };\n\n const originalSelect = ui.select.bind(ui);\n ui.select = (title, options, dialogOptions) => {\n if (shouldNotify()) notify(title);\n return originalSelect(title, options, dialogOptions);\n };\n\n const originalInput = ui.input.bind(ui);\n ui.input = (title, placeholder, options) => {\n if (shouldNotify()) notify(title);\n return originalInput(title, placeholder, options);\n };\n\n const originalEditor = ui.editor.bind(ui);\n ui.editor = (title, prefill) => {\n if (shouldNotify()) notify(title);\n return originalEditor(title, prefill);\n };\n}\n\nexport function notifications(pi: ExtensionAPI, titleController?: ShellTitleController): void {\n if (process.env.PI_SUBAGENT_CHILD) return;\n\n const titles = titleController ?? createWorkerTitleController();\n let agentRunning = false;\n let askUserBlocked = false;\n let firstPromptTitle: string | undefined;\n const wrappedUis = new WeakSet<ExtensionUIContext>();\n const writeTitle = (context: ExtensionContext) => (title: string) => context.ui.setTitle(title);\n const supportsShellTitle = (context: ExtensionContext): boolean => context.hasUI && context.mode !== 'rpc';\n const stopTitleAnimation = (context: ExtensionContext) => {\n if (!supportsShellTitle(context)) return;\n titles.stop(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n };\n const startTitleAnimation = (context: ExtensionContext) => {\n if (!supportsShellTitle(context)) return;\n titles.start(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n };\n const notifyAttention = (body: string) => {\n void sendSystemNotification(pi, {\n title: 'Pi needs your input',\n subtitle: 'Approval or feedback required',\n body,\n });\n };\n\n const askUserSubscriptions = subscribeToAskUserEvents(pi.events, {\n onPrompt(prompt) {\n const firstQuestion = prompt.questions[0]?.question ?? 'The agent is waiting for your feedback.';\n notifyAttention(firstQuestion);\n },\n onBlocked(payload) {\n askUserBlocked = payload.active;\n },\n });\n\n pi.on(INPUT_EVENT, (event, context) => {\n if (firstPromptTitle || event.source === EXTENSION_INPUT_SOURCE) return;\n\n firstPromptTitle = promptTitle(event.text);\n if (firstPromptTitle && supportsShellTitle(context)) {\n titles.set(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n }\n });\n\n pi.on('session_start', (_event, context) => {\n if (wrappedUis.has(context.ui)) return;\n wrappedUis.add(context.ui);\n wrapAttentionDialogs(context.ui, () => agentRunning && !askUserBlocked, notifyAttention);\n });\n\n pi.on('agent_start', (_event, context) => {\n agentRunning = true;\n startTitleAnimation(context);\n });\n\n pi.on('agent_settled', async (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n stopTitleAnimation(context);\n if (context.hasPendingMessages()) return;\n\n await sendSystemNotification(pi, {\n title: 'Pi finished',\n subtitle: pi.getSessionName() ?? path.basename(context.cwd),\n body: 'The agent finished its work and is waiting for you.',\n });\n });\n\n pi.on('session_shutdown', (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n askUserSubscriptions.dispose();\n if (supportsShellTitle(context)) {\n titles.dispose(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n }\n });\n}\n\nexport default notifications;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ShellTitleController } from "./shellTitleController.cjs";
|
|
2
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
|
|
4
|
+
//#region src/extensions/entries/notifications.d.ts
|
|
5
|
+
interface Notification {
|
|
6
|
+
title: string;
|
|
7
|
+
subtitle: string;
|
|
8
|
+
body: string;
|
|
9
|
+
}
|
|
10
|
+
declare function sendSystemNotification(pi: ExtensionAPI, notification: Notification, platform?: NodeJS.Platform): Promise<void>;
|
|
11
|
+
declare function notifications(pi: ExtensionAPI, titleController?: ShellTitleController): void;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { notifications, sendSystemNotification };
|
|
14
|
+
//# sourceMappingURL=notifications.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.cts","names":[],"sources":["../../../src/extensions/entries/notifications.ts"],"mappings":";;;;UAKU,YAAA;EACR,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,iBAsCoB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,YAAA,EAAc,YAAA,EACd,QAAA,GAAQ,MAAA,CAAA,QAAA,GACP,OAAA;AAAA,iBAwDa,aAAA,CAAc,EAAA,EAAI,YAAA,EAAc,eAAA,GAAkB,oBAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ShellTitleController } from "./shellTitleController.mjs";
|
|
2
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
|
|
4
|
+
//#region src/extensions/entries/notifications.d.ts
|
|
5
|
+
interface Notification {
|
|
6
|
+
title: string;
|
|
7
|
+
subtitle: string;
|
|
8
|
+
body: string;
|
|
9
|
+
}
|
|
10
|
+
declare function sendSystemNotification(pi: ExtensionAPI, notification: Notification, platform?: NodeJS.Platform): Promise<void>;
|
|
11
|
+
declare function notifications(pi: ExtensionAPI, titleController?: ShellTitleController): void;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { notifications, sendSystemNotification };
|
|
14
|
+
//# sourceMappingURL=notifications.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.mts","names":[],"sources":["../../../src/extensions/entries/notifications.ts"],"mappings":";;;;UAKU,YAAA;EACR,KAAA;EACA,QAAA;EACA,IAAA;AAAA;AAAA,iBAsCoB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,YAAA,EAAc,YAAA,EACd,QAAA,GAAQ,MAAA,CAAA,QAAA,GACP,OAAA;AAAA,iBAwDa,aAAA,CAAc,EAAA,EAAI,YAAA,EAAc,eAAA,GAAkB,oBAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createWorkerTitleController as e}from"./shellTitleController.mjs";import t from"node:path";import{subscribeToAskUserEvents as n}from"@agimon-ai/doompi-extension-contracts";function r(e){let t=e.replace(/\s+/g,` `).trim();if(t)return t.length>36?`${t.slice(0,35)}…`:t}function i(e,n,r){let i=t.basename(n),a=e.getSessionName()??r;return a?`π - ${a} - ${i}`:`π - ${i}`}function a(e){let t=e.replace(/\s+/g,` `).trim();return t.length>240?`${t.slice(0,239)}…`:t}async function o(e,t,n){try{return(await e.exec(t,n,{timeout:3e3})).code===0}catch{return!1}}async function s(e,t,n=process.platform){let r=a(t.body);await o(e,`cmux`,[`notify`,`--title`,t.title,`--subtitle`,t.subtitle,`--body`,r])||n!==`darwin`||await o(e,`osascript`,[`-e`,`on run argv`,`-e`,`display notification (item 3 of argv) with title (item 1 of argv) subtitle (item 2 of argv)`,`-e`,`end run`,t.title,t.subtitle,r])}function c(e,t,n){let r=e.confirm.bind(e);e.confirm=(e,i,a)=>(t()&&n(`${e}: ${i}`),r(e,i,a));let i=e.select.bind(e);e.select=(e,r,a)=>(t()&&n(e),i(e,r,a));let a=e.input.bind(e);e.input=(e,r,i)=>(t()&&n(e),a(e,r,i));let o=e.editor.bind(e);e.editor=(e,r)=>(t()&&n(e),o(e,r))}function l(a,o){if(process.env.PI_SUBAGENT_CHILD)return;let l=o??e(),u=!1,d=!1,f,p=new WeakSet,m=e=>t=>e.ui.setTitle(t),h=e=>e.hasUI&&e.mode!==`rpc`,g=e=>{h(e)&&l.stop(i(a,e.cwd,f),m(e))},_=e=>{h(e)&&l.start(i(a,e.cwd,f),m(e))},v=e=>{s(a,{title:`Pi needs your input`,subtitle:`Approval or feedback required`,body:e})},y=n(a.events,{onPrompt(e){v(e.questions[0]?.question??`The agent is waiting for your feedback.`)},onBlocked(e){d=e.active}});a.on(`input`,(e,t)=>{f||e.source===`extension`||(f=r(e.text),f&&h(t)&&l.set(i(a,t.cwd,f),m(t)))}),a.on(`session_start`,(e,t)=>{p.has(t.ui)||(p.add(t.ui),c(t.ui,()=>u&&!d,v))}),a.on(`agent_start`,(e,t)=>{u=!0,_(t)}),a.on(`agent_settled`,async(e,n)=>{u=!1,d=!1,g(n),!n.hasPendingMessages()&&await s(a,{title:`Pi finished`,subtitle:a.getSessionName()??t.basename(n.cwd),body:`The agent finished its work and is waiting for you.`})}),a.on(`session_shutdown`,(e,t)=>{u=!1,d=!1,y.dispose(),h(t)&&l.dispose(i(a,t.cwd,f),m(t))})}export{l as default,s as sendSystemNotification};
|
|
2
|
+
//# sourceMappingURL=notifications.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.mjs","names":[],"sources":["../../../src/extensions/entries/notifications.ts"],"sourcesContent":["import path from 'node:path';\nimport { subscribeToAskUserEvents } from '@agimon-ai/doompi-extension-contracts';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext } from '@earendil-works/pi-coding-agent';\nimport { createWorkerTitleController, type ShellTitleController } from './shellTitleController.ts';\n\ninterface Notification {\n title: string;\n subtitle: string;\n body: string;\n}\n\nconst COMMAND_TIMEOUT_MS = 3_000;\nconst EXTENSION_INPUT_SOURCE = 'extension';\nconst INPUT_EVENT = 'input';\nconst MAX_BODY_LENGTH = 240;\nconst MAX_PROMPT_TITLE_LENGTH = 36;\nconst OSASCRIPT_EXPRESSION_FLAG = '-e';\n\nfunction promptTitle(prompt: string): string | undefined {\n const normalized = prompt.replace(/\\s+/g, ' ').trim();\n if (!normalized) return undefined;\n return normalized.length > MAX_PROMPT_TITLE_LENGTH\n ? `${normalized.slice(0, MAX_PROMPT_TITLE_LENGTH - 1)}…`\n : normalized;\n}\n\nfunction shellTabTitle(pi: ExtensionAPI, cwd: string, prompt?: string): string {\n const repository = path.basename(cwd);\n const label = pi.getSessionName() ?? prompt;\n return label ? `π - ${label} - ${repository}` : `π - ${repository}`;\n}\n\nfunction notificationBody(body: string): string {\n const normalized = body.replace(/\\s+/g, ' ').trim();\n return normalized.length > MAX_BODY_LENGTH ? `${normalized.slice(0, MAX_BODY_LENGTH - 1)}…` : normalized;\n}\n\nasync function execute(pi: ExtensionAPI, command: string, args: string[]): Promise<boolean> {\n try {\n const result = await pi.exec(command, args, { timeout: COMMAND_TIMEOUT_MS });\n return result.code === 0;\n } catch {\n return false;\n }\n}\n\nexport async function sendSystemNotification(\n pi: ExtensionAPI,\n notification: Notification,\n platform = process.platform,\n): Promise<void> {\n const body = notificationBody(notification.body);\n const sentToCmux = await execute(pi, 'cmux', [\n 'notify',\n '--title',\n notification.title,\n '--subtitle',\n notification.subtitle,\n '--body',\n body,\n ]);\n if (sentToCmux || platform !== 'darwin') return;\n\n await execute(pi, 'osascript', [\n OSASCRIPT_EXPRESSION_FLAG,\n 'on run argv',\n OSASCRIPT_EXPRESSION_FLAG,\n 'display notification (item 3 of argv) with title (item 1 of argv) subtitle (item 2 of argv)',\n OSASCRIPT_EXPRESSION_FLAG,\n 'end run',\n notification.title,\n notification.subtitle,\n body,\n ]);\n}\n\nfunction wrapAttentionDialogs(\n ui: ExtensionUIContext,\n shouldNotify: () => boolean,\n notify: (title: string) => void,\n): void {\n const originalConfirm = ui.confirm.bind(ui);\n ui.confirm = (title, message, options) => {\n if (shouldNotify()) notify(`${title}: ${message}`);\n return originalConfirm(title, message, options);\n };\n\n const originalSelect = ui.select.bind(ui);\n ui.select = (title, options, dialogOptions) => {\n if (shouldNotify()) notify(title);\n return originalSelect(title, options, dialogOptions);\n };\n\n const originalInput = ui.input.bind(ui);\n ui.input = (title, placeholder, options) => {\n if (shouldNotify()) notify(title);\n return originalInput(title, placeholder, options);\n };\n\n const originalEditor = ui.editor.bind(ui);\n ui.editor = (title, prefill) => {\n if (shouldNotify()) notify(title);\n return originalEditor(title, prefill);\n };\n}\n\nexport function notifications(pi: ExtensionAPI, titleController?: ShellTitleController): void {\n if (process.env.PI_SUBAGENT_CHILD) return;\n\n const titles = titleController ?? createWorkerTitleController();\n let agentRunning = false;\n let askUserBlocked = false;\n let firstPromptTitle: string | undefined;\n const wrappedUis = new WeakSet<ExtensionUIContext>();\n const writeTitle = (context: ExtensionContext) => (title: string) => context.ui.setTitle(title);\n const supportsShellTitle = (context: ExtensionContext): boolean => context.hasUI && context.mode !== 'rpc';\n const stopTitleAnimation = (context: ExtensionContext) => {\n if (!supportsShellTitle(context)) return;\n titles.stop(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n };\n const startTitleAnimation = (context: ExtensionContext) => {\n if (!supportsShellTitle(context)) return;\n titles.start(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n };\n const notifyAttention = (body: string) => {\n void sendSystemNotification(pi, {\n title: 'Pi needs your input',\n subtitle: 'Approval or feedback required',\n body,\n });\n };\n\n const askUserSubscriptions = subscribeToAskUserEvents(pi.events, {\n onPrompt(prompt) {\n const firstQuestion = prompt.questions[0]?.question ?? 'The agent is waiting for your feedback.';\n notifyAttention(firstQuestion);\n },\n onBlocked(payload) {\n askUserBlocked = payload.active;\n },\n });\n\n pi.on(INPUT_EVENT, (event, context) => {\n if (firstPromptTitle || event.source === EXTENSION_INPUT_SOURCE) return;\n\n firstPromptTitle = promptTitle(event.text);\n if (firstPromptTitle && supportsShellTitle(context)) {\n titles.set(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n }\n });\n\n pi.on('session_start', (_event, context) => {\n if (wrappedUis.has(context.ui)) return;\n wrappedUis.add(context.ui);\n wrapAttentionDialogs(context.ui, () => agentRunning && !askUserBlocked, notifyAttention);\n });\n\n pi.on('agent_start', (_event, context) => {\n agentRunning = true;\n startTitleAnimation(context);\n });\n\n pi.on('agent_settled', async (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n stopTitleAnimation(context);\n if (context.hasPendingMessages()) return;\n\n await sendSystemNotification(pi, {\n title: 'Pi finished',\n subtitle: pi.getSessionName() ?? path.basename(context.cwd),\n body: 'The agent finished its work and is waiting for you.',\n });\n });\n\n pi.on('session_shutdown', (_event, context) => {\n agentRunning = false;\n askUserBlocked = false;\n askUserSubscriptions.dispose();\n if (supportsShellTitle(context)) {\n titles.dispose(shellTabTitle(pi, context.cwd, firstPromptTitle), writeTitle(context));\n }\n });\n}\n\nexport default notifications;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){let t=process.argv.find(e=>e.startsWith(`ollama/`))?.slice(7)??`kimi-k2.6:cloud`;e.registerProvider(`ollama`,{name:`Ollama`,baseUrl:process.env.DOOMPI_OLLAMA_BASE_URL??`http://localhost:11434/v1`,apiKey:`$OLLAMA_API_KEY`,api:`openai-completions`,models:[{id:t,name:t,reasoning:!1,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:262144,maxTokens:32768,compat:{supportsDeveloperRole:!1,supportsReasoningEffort:!1}}]})}exports.default=e;
|
|
2
|
+
//# sourceMappingURL=ollamaProvider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollamaProvider.cjs","names":[],"sources":["../../../src/extensions/entries/ollamaProvider.ts"],"sourcesContent":["import type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nexport default function registerOllama(pi: ExtensionAPI): void {\n const modelArgument = process.argv.find((argument) => argument.startsWith('ollama/'));\n const model = modelArgument?.slice('ollama/'.length) ?? 'kimi-k2.6:cloud';\n pi.registerProvider('ollama', {\n name: 'Ollama',\n baseUrl: process.env.DOOMPI_OLLAMA_BASE_URL ?? 'http://localhost:11434/v1',\n apiKey: '$OLLAMA_API_KEY',\n api: 'openai-completions',\n models: [\n {\n id: model,\n name: model,\n reasoning: false,\n input: ['text', 'image'],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 262_144,\n maxTokens: 32_768,\n compat: {\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n },\n },\n ],\n });\n}\n"],"mappings":"AAEA,SAAwB,EAAe,EAAwB,CAE7D,IAAM,EADgB,QAAQ,KAAK,KAAM,GAAa,EAAS,WAAW,UAAU,CACzD,EAAE,MAAM,EAAiB,EAAI,kBACxD,EAAG,iBAAiB,SAAU,CAC5B,KAAM,SACN,QAAS,QAAQ,IAAI,wBAA0B,4BAC/C,OAAQ,kBACR,IAAK,qBACL,OAAQ,CACN,CACE,GAAI,EACJ,KAAM,EACN,UAAW,GACX,MAAO,CAAC,OAAQ,QAAQ,CACxB,KAAM,CAAE,MAAO,EAAG,OAAQ,EAAG,UAAW,EAAG,WAAY,EAAG,CAC1D,cAAe,OACf,UAAW,MACX,OAAQ,CACN,sBAAuB,GACvB,wBAAyB,GAC1B,CACF,CACF,CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
//#region src/extensions/entries/ollamaProvider.d.ts
|
|
4
|
+
declare function registerOllama(pi: ExtensionAPI): void;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { registerOllama };
|
|
7
|
+
//# sourceMappingURL=ollamaProvider.d.cts.map
|