@agimon-ai/doompi 0.0.1-alpha.2 → 0.0.1-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -452
- package/assets/doompi-tui.png +0 -0
- package/dist/adapters/bootstrapClaim.cjs +2 -0
- package/dist/adapters/bootstrapClaim.cjs.map +1 -0
- package/dist/adapters/bootstrapClaim.mjs +2 -0
- package/dist/adapters/bootstrapClaim.mjs.map +1 -0
- package/dist/adapters/bootstrapLocator.cjs +2 -0
- package/dist/adapters/bootstrapLocator.cjs.map +1 -0
- package/dist/adapters/bootstrapLocator.d.cts +6 -0
- package/dist/adapters/bootstrapLocator.d.cts.map +1 -0
- package/dist/adapters/bootstrapLocator.d.mts +6 -0
- package/dist/adapters/bootstrapLocator.d.mts.map +1 -0
- package/dist/adapters/bootstrapLocator.mjs +2 -0
- package/dist/adapters/bootstrapLocator.mjs.map +1 -0
- package/dist/adapters/compatibility/antigravity.cjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.cjs.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.cts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.cts.map +1 -1
- package/dist/adapters/compatibility/antigravity.d.mts +11 -0
- package/dist/{services → adapters}/compatibility/antigravity.d.mts.map +1 -1
- package/dist/adapters/compatibility/antigravity.mjs +2 -0
- package/dist/{services → adapters}/compatibility/antigravity.mjs.map +1 -1
- package/dist/adapters/compatibility/codex.cjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.cjs.map +1 -1
- package/dist/adapters/compatibility/codex.d.cts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.cts.map +1 -1
- package/dist/adapters/compatibility/codex.d.mts +19 -0
- package/dist/{services → adapters}/compatibility/codex.d.mts.map +1 -1
- package/dist/adapters/compatibility/codex.mjs +2 -0
- package/dist/{services → adapters}/compatibility/codex.mjs.map +1 -1
- package/dist/adapters/compatibility/index.cjs +2 -0
- package/dist/adapters/compatibility/index.cjs.map +1 -0
- package/dist/adapters/compatibility/index.d.cts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.cts.map +1 -1
- package/dist/adapters/compatibility/index.d.mts +16 -0
- package/dist/{services → adapters}/compatibility/index.d.mts.map +1 -1
- package/dist/adapters/compatibility/index.mjs +2 -0
- package/dist/adapters/compatibility/index.mjs.map +1 -0
- package/dist/adapters/compatibility/process.cjs +2 -0
- package/dist/{services → adapters}/compatibility/process.cjs.map +1 -1
- package/dist/adapters/compatibility/process.d.cts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.cts.map +1 -1
- package/dist/adapters/compatibility/process.d.mts +35 -0
- package/dist/{services → adapters}/compatibility/process.d.mts.map +1 -1
- package/dist/adapters/compatibility/process.mjs +2 -0
- package/dist/{services → adapters}/compatibility/process.mjs.map +1 -1
- package/dist/adapters/compatibility/shared.cjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.cjs.map +1 -1
- package/dist/adapters/compatibility/shared.d.cts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.cts.map +1 -1
- package/dist/adapters/compatibility/shared.d.mts +33 -0
- package/dist/{services → adapters}/compatibility/shared.d.mts.map +1 -1
- package/dist/adapters/compatibility/shared.mjs +2 -0
- package/dist/{services → adapters}/compatibility/shared.mjs.map +1 -1
- package/dist/adapters/compatibilityContext.cjs +2 -0
- package/dist/adapters/compatibilityContext.cjs.map +1 -0
- package/dist/adapters/compatibilityContext.d.cts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.cts.map +1 -1
- package/dist/adapters/compatibilityContext.d.mts +23 -0
- package/dist/{services → adapters}/compatibilityContext.d.mts.map +1 -1
- package/dist/adapters/compatibilityContext.mjs +2 -0
- package/dist/adapters/compatibilityContext.mjs.map +1 -0
- package/dist/adapters/composer.cjs +2 -0
- package/dist/adapters/composer.cjs.map +1 -0
- package/dist/adapters/composer.d.cts +113 -0
- package/dist/adapters/composer.d.cts.map +1 -0
- package/dist/adapters/composer.d.mts +113 -0
- package/dist/adapters/composer.d.mts.map +1 -0
- package/dist/adapters/composer.mjs +2 -0
- package/dist/adapters/composer.mjs.map +1 -0
- package/dist/adapters/compositionState.cjs +2 -0
- package/dist/adapters/compositionState.cjs.map +1 -0
- package/dist/adapters/compositionState.d.cts +12 -0
- package/dist/adapters/compositionState.d.cts.map +1 -0
- package/dist/adapters/compositionState.d.mts +12 -0
- package/dist/adapters/compositionState.d.mts.map +1 -0
- package/dist/adapters/compositionState.mjs +2 -0
- package/dist/adapters/compositionState.mjs.map +1 -0
- package/dist/adapters/config/harnessState.cjs +2 -0
- package/dist/adapters/config/harnessState.cjs.map +1 -0
- package/dist/adapters/config/harnessState.d.cts +26 -0
- package/dist/adapters/config/harnessState.d.cts.map +1 -0
- package/dist/adapters/config/harnessState.d.mts +26 -0
- package/dist/adapters/config/harnessState.d.mts.map +1 -0
- package/dist/adapters/config/harnessState.mjs +2 -0
- package/dist/adapters/config/harnessState.mjs.map +1 -0
- package/dist/adapters/deferredSkills.cjs +12 -0
- package/dist/adapters/deferredSkills.cjs.map +1 -0
- package/dist/adapters/deferredSkills.mjs +12 -0
- package/dist/adapters/deferredSkills.mjs.map +1 -0
- package/dist/adapters/doomPackage.cjs +2 -0
- package/dist/adapters/doomPackage.cjs.map +1 -0
- package/dist/adapters/doomPackage.mjs +2 -0
- package/dist/adapters/doomPackage.mjs.map +1 -0
- package/dist/adapters/dpiRunner.cjs +3 -0
- package/dist/adapters/dpiRunner.cjs.map +1 -0
- package/dist/adapters/dpiRunner.mjs +3 -0
- package/dist/adapters/dpiRunner.mjs.map +1 -0
- package/dist/adapters/dpiSettings.cjs +2 -0
- package/dist/adapters/dpiSettings.cjs.map +1 -0
- package/dist/adapters/dpiSettings.mjs +2 -0
- package/dist/adapters/dpiSettings.mjs.map +1 -0
- package/dist/adapters/extensionCompiler.cjs +3 -0
- package/dist/adapters/extensionCompiler.cjs.map +1 -0
- package/dist/adapters/extensionCompiler.mjs +3 -0
- package/dist/adapters/extensionCompiler.mjs.map +1 -0
- package/dist/adapters/harnessContext.cjs +2 -0
- package/dist/adapters/harnessContext.cjs.map +1 -0
- package/dist/adapters/harnessContext.d.cts +61 -0
- package/dist/{services → adapters}/harnessContext.d.cts.map +1 -1
- package/dist/adapters/harnessContext.d.mts +61 -0
- package/dist/{services → adapters}/harnessContext.d.mts.map +1 -1
- package/dist/adapters/harnessContext.mjs +2 -0
- package/dist/adapters/harnessContext.mjs.map +1 -0
- package/dist/adapters/helpSkills.cjs +2 -0
- package/dist/adapters/helpSkills.cjs.map +1 -0
- package/dist/adapters/helpSkills.mjs +2 -0
- package/dist/adapters/helpSkills.mjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.cjs +2 -0
- package/dist/adapters/layerPackageInstaller.cjs.map +1 -0
- package/dist/adapters/layerPackageInstaller.mjs +2 -0
- package/dist/adapters/layerPackageInstaller.mjs.map +1 -0
- package/dist/adapters/matrixSwitcher.cjs +2 -0
- package/dist/adapters/matrixSwitcher.cjs.map +1 -0
- package/dist/adapters/matrixSwitcher.d.cts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.cts.map +1 -1
- package/dist/adapters/matrixSwitcher.d.mts +46 -0
- package/dist/{services → adapters}/matrixSwitcher.d.mts.map +1 -1
- package/dist/adapters/matrixSwitcher.mjs +2 -0
- package/dist/adapters/matrixSwitcher.mjs.map +1 -0
- package/dist/adapters/mcpFilter.cjs +3 -0
- package/dist/adapters/mcpFilter.cjs.map +1 -0
- package/dist/adapters/mcpFilter.d.cts +40 -0
- package/dist/adapters/mcpFilter.d.cts.map +1 -0
- package/dist/adapters/mcpFilter.d.mts +40 -0
- package/dist/adapters/mcpFilter.d.mts.map +1 -0
- package/dist/adapters/mcpFilter.mjs +3 -0
- package/dist/adapters/mcpFilter.mjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.cjs +2 -0
- package/dist/adapters/modules/moduleResolution.cjs.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.cts +69 -0
- package/dist/adapters/modules/moduleResolution.d.cts.map +1 -0
- package/dist/adapters/modules/moduleResolution.d.mts +69 -0
- package/dist/adapters/modules/moduleResolution.d.mts.map +1 -0
- package/dist/adapters/modules/moduleResolution.mjs +2 -0
- package/dist/adapters/modules/moduleResolution.mjs.map +1 -0
- package/dist/adapters/packageBootstrap.cjs +2 -0
- package/dist/adapters/packageBootstrap.cjs.map +1 -0
- package/dist/adapters/packageBootstrap.d.cts +8 -0
- package/dist/adapters/packageBootstrap.d.cts.map +1 -0
- package/dist/adapters/packageBootstrap.d.mts +8 -0
- package/dist/adapters/packageBootstrap.d.mts.map +1 -0
- package/dist/adapters/packageBootstrap.mjs +2 -0
- package/dist/adapters/packageBootstrap.mjs.map +1 -0
- package/dist/adapters/piExtensionAlias.cjs +2 -0
- package/dist/adapters/piExtensionAlias.cjs.map +1 -0
- package/dist/adapters/piExtensionAlias.mjs +2 -0
- package/dist/adapters/piExtensionAlias.mjs.map +1 -0
- package/dist/adapters/piSettings.cjs +2 -0
- package/dist/adapters/piSettings.cjs.map +1 -0
- package/dist/adapters/piSettings.d.cts +25 -0
- package/dist/adapters/piSettings.d.cts.map +1 -0
- package/dist/adapters/piSettings.d.mts +25 -0
- package/dist/adapters/piSettings.d.mts.map +1 -0
- package/dist/adapters/piSettings.mjs +2 -0
- package/dist/adapters/piSettings.mjs.map +1 -0
- package/dist/adapters/pluginMaterializer.cjs +2 -0
- package/dist/adapters/pluginMaterializer.cjs.map +1 -0
- package/dist/adapters/pluginMaterializer.mjs +2 -0
- package/dist/adapters/pluginMaterializer.mjs.map +1 -0
- package/dist/adapters/projectPiSettings.cjs +2 -0
- package/dist/adapters/projectPiSettings.cjs.map +1 -0
- package/dist/adapters/projectPiSettings.d.cts +29 -0
- package/dist/adapters/projectPiSettings.d.cts.map +1 -0
- package/dist/adapters/projectPiSettings.d.mts +29 -0
- package/dist/adapters/projectPiSettings.d.mts.map +1 -0
- package/dist/adapters/projectPiSettings.mjs +2 -0
- package/dist/adapters/projectPiSettings.mjs.map +1 -0
- package/dist/adapters/repository/repository.cjs +2 -0
- package/dist/adapters/repository/repository.cjs.map +1 -0
- package/dist/adapters/repository/repository.d.cts +21 -0
- package/dist/adapters/repository/repository.d.cts.map +1 -0
- package/dist/adapters/repository/repository.d.mts +21 -0
- package/dist/adapters/repository/repository.d.mts.map +1 -0
- package/dist/adapters/repository/repository.mjs +2 -0
- package/dist/adapters/repository/repository.mjs.map +1 -0
- package/dist/adapters/resourceCollector.cjs +3 -0
- package/dist/adapters/resourceCollector.cjs.map +1 -0
- package/dist/adapters/resourceCollector.d.cts +25 -0
- package/dist/adapters/resourceCollector.d.cts.map +1 -0
- package/dist/adapters/resourceCollector.d.mts +25 -0
- package/dist/adapters/resourceCollector.d.mts.map +1 -0
- package/dist/adapters/resourceCollector.mjs +3 -0
- package/dist/adapters/resourceCollector.mjs.map +1 -0
- package/dist/adapters/runtimeBundle.cjs +2 -0
- package/dist/adapters/runtimeBundle.cjs.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.cts +4 -2
- package/dist/adapters/runtimeBundle.d.cts.map +1 -0
- package/dist/{services → adapters}/runtimeBundle.d.mts +4 -2
- package/dist/adapters/runtimeBundle.d.mts.map +1 -0
- package/dist/adapters/runtimeBundle.mjs +2 -0
- package/dist/adapters/runtimeBundle.mjs.map +1 -0
- package/dist/adapters/serialization/json.cjs +2 -0
- package/dist/adapters/serialization/json.cjs.map +1 -0
- package/dist/adapters/serialization/json.d.cts +23 -0
- package/dist/adapters/serialization/json.d.cts.map +1 -0
- package/dist/adapters/serialization/json.d.mts +23 -0
- package/dist/adapters/serialization/json.d.mts.map +1 -0
- package/dist/adapters/serialization/json.mjs +2 -0
- package/dist/adapters/serialization/json.mjs.map +1 -0
- package/dist/adapters/sharedBuildCache.cjs +2 -0
- package/dist/adapters/sharedBuildCache.cjs.map +1 -0
- package/dist/adapters/sharedBuildCache.mjs +2 -0
- package/dist/adapters/sharedBuildCache.mjs.map +1 -0
- package/dist/adapters/skillCatalog.cjs +2 -0
- package/dist/adapters/skillCatalog.cjs.map +1 -0
- package/dist/adapters/skillCatalog.d.cts +61 -0
- package/dist/adapters/skillCatalog.d.cts.map +1 -0
- package/dist/adapters/skillCatalog.d.mts +61 -0
- package/dist/adapters/skillCatalog.d.mts.map +1 -0
- package/dist/adapters/skillCatalog.mjs +2 -0
- package/dist/adapters/skillCatalog.mjs.map +1 -0
- package/dist/adapters/skillSources.cjs +2 -0
- package/dist/{services → adapters}/skillSources.cjs.map +1 -1
- package/dist/adapters/skillSources.d.cts +24 -0
- package/dist/{services → adapters}/skillSources.d.cts.map +1 -1
- package/dist/adapters/skillSources.d.mts +24 -0
- package/dist/{services → adapters}/skillSources.d.mts.map +1 -1
- package/dist/adapters/skillSources.mjs +2 -0
- package/dist/{services → adapters}/skillSources.mjs.map +1 -1
- package/dist/adapters/startupPrecompiler.cjs +2 -0
- package/dist/adapters/startupPrecompiler.cjs.map +1 -0
- package/dist/adapters/startupPrecompiler.d.cts +13 -0
- package/dist/adapters/startupPrecompiler.d.cts.map +1 -0
- package/dist/adapters/startupPrecompiler.d.mts +13 -0
- package/dist/adapters/startupPrecompiler.d.mts.map +1 -0
- package/dist/adapters/startupPrecompiler.mjs +2 -0
- package/dist/adapters/startupPrecompiler.mjs.map +1 -0
- package/dist/adapters/syncLocation.cjs +2 -0
- package/dist/adapters/syncLocation.cjs.map +1 -0
- package/dist/adapters/syncLocation.d.cts +19 -0
- package/dist/adapters/syncLocation.d.cts.map +1 -0
- package/dist/adapters/syncLocation.d.mts +19 -0
- package/dist/adapters/syncLocation.d.mts.map +1 -0
- package/dist/adapters/syncLocation.mjs +2 -0
- package/dist/adapters/syncLocation.mjs.map +1 -0
- package/dist/adapters/syncState.cjs +2 -0
- package/dist/adapters/syncState.cjs.map +1 -0
- package/dist/adapters/syncState.d.cts +153 -0
- package/dist/adapters/syncState.d.cts.map +1 -0
- package/dist/adapters/syncState.d.mts +153 -0
- package/dist/adapters/syncState.d.mts.map +1 -0
- package/dist/adapters/syncState.mjs +2 -0
- package/dist/adapters/syncState.mjs.map +1 -0
- package/dist/adapters/syncStateContract.cjs +2 -0
- package/dist/adapters/syncStateContract.cjs.map +1 -0
- package/dist/adapters/syncStateContract.d.cts +13 -0
- package/dist/adapters/syncStateContract.d.cts.map +1 -0
- package/dist/adapters/syncStateContract.d.mts +13 -0
- package/dist/adapters/syncStateContract.d.mts.map +1 -0
- package/dist/adapters/syncStateContract.mjs +2 -0
- package/dist/adapters/syncStateContract.mjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.cjs.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.cts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts +11 -0
- package/dist/adapters/syncedRuntimeBuilder.d.mts.map +1 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs +2 -0
- package/dist/adapters/syncedRuntimeBuilder.mjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +51 -0
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
- package/dist/bin/cli.cjs +1 -1
- package/dist/bin/cli.cjs.map +1 -1
- package/dist/bin/cli.mjs +1 -1
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/bin/dpi.cjs +3 -0
- package/dist/bin/dpi.cjs.map +1 -0
- package/dist/bin/dpi.d.cts +1 -0
- package/dist/bin/dpi.d.mts +1 -0
- package/dist/bin/dpi.mjs +3 -0
- package/dist/bin/dpi.mjs.map +1 -0
- package/dist/cli/cliApp.cjs +1 -2
- package/dist/cli/cliApp.d.cts +2 -45
- package/dist/cli/cliApp.d.mts +2 -45
- package/dist/cli/cliApp.mjs +1 -2
- package/dist/cli/compatibilityOptions.cjs +1 -2
- package/dist/cli/compatibilityOptions.d.cts +2 -15
- package/dist/cli/compatibilityOptions.d.mts +2 -15
- package/dist/cli/compatibilityOptions.mjs +1 -2
- package/dist/cli/help.cjs +1 -63
- package/dist/cli/help.d.cts +2 -6
- package/dist/cli/help.d.mts +2 -6
- package/dist/cli/help.mjs +1 -63
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.d.cts +4 -4
- package/dist/cli/index.d.mts +4 -4
- package/dist/cli/index.mjs +1 -1
- package/dist/cli/matrixOptions.cjs +1 -2
- package/dist/cli/matrixOptions.d.cts +2 -99
- package/dist/cli/matrixOptions.d.mts +2 -99
- package/dist/cli/matrixOptions.mjs +1 -2
- package/dist/cli/options.cjs +1 -2
- package/dist/cli/options.d.cts +2 -7
- package/dist/cli/options.d.mts +2 -7
- package/dist/cli/options.mjs +1 -2
- package/dist/commands/baseCommand.cjs.map +1 -1
- package/dist/commands/baseCommand.d.cts +3 -3
- package/dist/commands/baseCommand.d.mts +3 -3
- package/dist/commands/baseCommand.mjs.map +1 -1
- package/dist/commands/buildCommand.cjs +2 -2
- package/dist/commands/buildCommand.cjs.map +1 -1
- package/dist/commands/buildCommand.mjs +2 -2
- package/dist/commands/buildCommand.mjs.map +1 -1
- package/dist/commands/cli/cliApp.cjs +2 -0
- package/dist/commands/cli/cliApp.cjs.map +1 -0
- package/dist/commands/cli/cliApp.d.cts +45 -0
- package/dist/commands/cli/cliApp.d.cts.map +1 -0
- package/dist/commands/cli/cliApp.d.mts +45 -0
- package/dist/commands/cli/cliApp.d.mts.map +1 -0
- package/dist/commands/cli/cliApp.mjs +2 -0
- package/dist/commands/cli/cliApp.mjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.cjs +2 -0
- package/dist/commands/cli/compatibilityOptions.cjs.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.cts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.cts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.d.mts +15 -0
- package/dist/commands/cli/compatibilityOptions.d.mts.map +1 -0
- package/dist/commands/cli/compatibilityOptions.mjs +2 -0
- package/dist/commands/cli/compatibilityOptions.mjs.map +1 -0
- package/dist/commands/cli/help.cjs +68 -0
- package/dist/{cli → commands/cli}/help.cjs.map +1 -1
- package/dist/commands/cli/help.d.cts +6 -0
- package/dist/commands/cli/help.d.cts.map +1 -0
- package/dist/commands/cli/help.d.mts +6 -0
- package/dist/commands/cli/help.d.mts.map +1 -0
- package/dist/commands/cli/help.mjs +68 -0
- package/dist/{cli → commands/cli}/help.mjs.map +1 -1
- package/dist/commands/cli/index.cjs +1 -0
- package/dist/commands/cli/index.d.cts +4 -0
- package/dist/commands/cli/index.d.mts +4 -0
- package/dist/commands/cli/index.mjs +1 -0
- package/dist/commands/cli/matrixOptions.cjs +2 -0
- package/dist/commands/cli/matrixOptions.cjs.map +1 -0
- package/dist/commands/cli/matrixOptions.d.cts +99 -0
- package/dist/commands/cli/matrixOptions.d.cts.map +1 -0
- package/dist/commands/cli/matrixOptions.d.mts +99 -0
- package/dist/commands/cli/matrixOptions.d.mts.map +1 -0
- package/dist/commands/cli/matrixOptions.mjs +2 -0
- package/dist/commands/cli/matrixOptions.mjs.map +1 -0
- package/dist/commands/cli/options.cjs +2 -0
- package/dist/commands/cli/options.cjs.map +1 -0
- package/dist/commands/cli/options.d.cts +7 -0
- package/dist/commands/cli/options.d.cts.map +1 -0
- package/dist/commands/cli/options.d.mts +7 -0
- package/dist/commands/cli/options.d.mts.map +1 -0
- package/dist/commands/cli/options.mjs +2 -0
- package/dist/commands/cli/options.mjs.map +1 -0
- package/dist/commands/compatibilityCommand.cjs +1 -1
- package/dist/commands/compatibilityCommand.cjs.map +1 -1
- package/dist/commands/compatibilityCommand.d.cts +1 -1
- package/dist/commands/compatibilityCommand.d.cts.map +1 -1
- package/dist/commands/compatibilityCommand.d.mts +1 -1
- package/dist/commands/compatibilityCommand.d.mts.map +1 -1
- package/dist/commands/compatibilityCommand.mjs +1 -1
- package/dist/commands/compatibilityCommand.mjs.map +1 -1
- package/dist/commands/emitMcpCommand.cjs +1 -1
- package/dist/commands/emitMcpCommand.cjs.map +1 -1
- package/dist/commands/emitMcpCommand.d.cts +2 -2
- package/dist/commands/emitMcpCommand.d.mts +2 -2
- package/dist/commands/emitMcpCommand.mjs +1 -1
- package/dist/commands/emitMcpCommand.mjs.map +1 -1
- package/dist/commands/explainCommand.cjs +2 -2
- package/dist/commands/explainCommand.cjs.map +1 -1
- package/dist/commands/explainCommand.d.cts +2 -2
- package/dist/commands/explainCommand.d.mts +2 -2
- package/dist/commands/explainCommand.mjs +2 -2
- package/dist/commands/explainCommand.mjs.map +1 -1
- package/dist/commands/index.cjs +1 -1
- package/dist/commands/index.d.cts +2 -3
- package/dist/commands/index.d.mts +2 -3
- package/dist/commands/index.mjs +1 -1
- package/dist/commands/initCommand.cjs +1 -2
- package/dist/commands/initCommand.cjs.map +1 -1
- package/dist/commands/initCommand.d.cts +4 -3
- package/dist/commands/initCommand.d.cts.map +1 -1
- package/dist/commands/initCommand.d.mts +4 -3
- package/dist/commands/initCommand.d.mts.map +1 -1
- package/dist/commands/initCommand.mjs +1 -2
- package/dist/commands/initCommand.mjs.map +1 -1
- package/dist/commands/initPresenter.cjs +3 -0
- package/dist/commands/initPresenter.cjs.map +1 -0
- package/dist/commands/initPresenter.d.cts +8 -0
- package/dist/commands/initPresenter.d.cts.map +1 -0
- package/dist/commands/initPresenter.d.mts +8 -0
- package/dist/commands/initPresenter.d.mts.map +1 -0
- package/dist/commands/initPresenter.mjs +3 -0
- package/dist/commands/initPresenter.mjs.map +1 -0
- package/dist/commands/launchCommand.cjs +1 -1
- package/dist/commands/launchCommand.cjs.map +1 -1
- package/dist/commands/launchCommand.d.cts +6 -4
- package/dist/commands/launchCommand.d.cts.map +1 -1
- package/dist/commands/launchCommand.d.mts +6 -4
- package/dist/commands/launchCommand.d.mts.map +1 -1
- package/dist/commands/launchCommand.mjs +1 -1
- package/dist/commands/launchCommand.mjs.map +1 -1
- package/dist/commands/syncCommand.cjs +5 -5
- package/dist/commands/syncCommand.cjs.map +1 -1
- package/dist/commands/syncCommand.d.cts +19 -7
- package/dist/commands/syncCommand.d.cts.map +1 -1
- package/dist/commands/syncCommand.d.mts +19 -7
- package/dist/commands/syncCommand.d.mts.map +1 -1
- package/dist/commands/syncCommand.mjs +5 -5
- package/dist/commands/syncCommand.mjs.map +1 -1
- package/dist/commands/syncPipeline.cjs +2 -0
- package/dist/commands/syncPipeline.cjs.map +1 -0
- package/dist/commands/syncPipeline.mjs +2 -0
- package/dist/commands/syncPipeline.mjs.map +1 -0
- package/dist/config/harnessState.cjs +1 -2
- package/dist/config/harnessState.d.cts +2 -24
- package/dist/config/harnessState.d.mts +2 -24
- package/dist/config/harnessState.mjs +1 -2
- package/dist/config/index.cjs +1 -1
- package/dist/config/index.d.cts +4 -7
- package/dist/config/index.d.mts +4 -7
- package/dist/config/index.mjs +1 -1
- package/dist/config/projectTrust.cjs +1 -2
- package/dist/config/projectTrust.d.cts +2 -14
- package/dist/config/projectTrust.d.mts +2 -14
- package/dist/config/projectTrust.mjs +1 -2
- package/dist/entries/autoStop.cjs +1 -2
- package/dist/entries/autoStop.d.cts +2 -6
- package/dist/entries/autoStop.d.mts +2 -7
- package/dist/entries/autoStop.mjs +1 -2
- package/dist/entries/components/matrixPicker.cjs +1 -2
- package/dist/entries/components/matrixPicker.d.cts +2 -55
- package/dist/entries/components/matrixPicker.d.mts +2 -55
- package/dist/entries/components/matrixPicker.mjs +1 -2
- package/dist/entries/components/skillsOverlay.cjs +1 -4
- package/dist/entries/components/skillsOverlay.d.cts +2 -58
- package/dist/entries/components/skillsOverlay.d.mts +2 -58
- package/dist/entries/components/skillsOverlay.mjs +1 -4
- package/dist/entries/domains.cjs +1 -2
- package/dist/entries/domains.d.cts +2 -10
- package/dist/entries/domains.d.mts +2 -10
- package/dist/entries/domains.mjs +1 -2
- package/dist/entries/doom.cjs +1 -2
- package/dist/entries/doom.d.cts +2 -13
- package/dist/entries/doom.d.mts +2 -14
- package/dist/entries/doom.mjs +1 -2
- package/dist/entries/effort.cjs +1 -2
- package/dist/entries/effort.d.cts +2 -10
- package/dist/entries/effort.d.mts +2 -10
- package/dist/entries/effort.mjs +1 -2
- package/dist/entries/majorMode.cjs +1 -6
- package/dist/entries/majorMode.d.cts +2 -29
- package/dist/entries/majorMode.d.mts +2 -29
- package/dist/entries/majorMode.mjs +1 -6
- package/dist/entries/modeCatalog.cjs +1 -0
- package/dist/entries/modeCatalog.d.cts +2 -0
- package/dist/entries/modeCatalog.d.mts +2 -0
- package/dist/entries/modeCatalog.mjs +1 -0
- package/dist/entries/notifications.cjs +1 -2
- package/dist/entries/notifications.d.cts +2 -13
- package/dist/entries/notifications.d.mts +2 -13
- package/dist/entries/notifications.mjs +1 -2
- package/dist/entries/ollamaProvider.cjs +1 -2
- package/dist/entries/ollamaProvider.d.cts +2 -6
- package/dist/entries/ollamaProvider.d.mts +2 -7
- package/dist/entries/ollamaProvider.mjs +1 -2
- package/dist/entries/persona.cjs +1 -2
- package/dist/entries/persona.d.cts +2 -14
- package/dist/entries/persona.d.mts +2 -15
- package/dist/entries/persona.mjs +1 -2
- package/dist/entries/profile.cjs +1 -3
- package/dist/entries/profile.d.cts +2 -16
- package/dist/entries/profile.d.mts +2 -16
- package/dist/entries/profile.mjs +1 -3
- package/dist/entries/repositoryHooks.cjs +1 -9
- package/dist/entries/repositoryHooks.d.cts +2 -7
- package/dist/entries/repositoryHooks.d.mts +2 -8
- package/dist/entries/repositoryHooks.mjs +1 -9
- package/dist/entries/skills.cjs +1 -2
- package/dist/entries/skills.d.cts +2 -34
- package/dist/entries/skills.d.mts +2 -34
- package/dist/entries/skills.mjs +1 -2
- package/dist/entries/styleSystem.cjs +1 -4
- package/dist/entries/styleSystem.d.cts +2 -32
- package/dist/entries/styleSystem.d.mts +2 -32
- package/dist/entries/styleSystem.mjs +1 -4
- package/dist/extensions/entries/autoStop.cjs +2 -0
- package/dist/extensions/entries/autoStop.cjs.map +1 -0
- package/dist/extensions/entries/autoStop.d.cts +7 -0
- package/dist/extensions/entries/autoStop.d.cts.map +1 -0
- package/dist/extensions/entries/autoStop.d.mts +7 -0
- package/dist/extensions/entries/autoStop.d.mts.map +1 -0
- package/dist/extensions/entries/autoStop.mjs +2 -0
- package/dist/extensions/entries/autoStop.mjs.map +1 -0
- package/dist/extensions/entries/cacheOptimizer.mjs +2 -0
- package/dist/extensions/entries/cacheOptimizer.mjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.cjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.cjs.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.cts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts +55 -0
- package/dist/extensions/entries/components/matrixPicker.d.mts.map +1 -0
- package/dist/extensions/entries/components/matrixPicker.mjs +2 -0
- package/dist/extensions/entries/components/matrixPicker.mjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.cjs.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.cts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts +58 -0
- package/dist/extensions/entries/components/skillsOverlay.d.mts.map +1 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs +4 -0
- package/dist/extensions/entries/components/skillsOverlay.mjs.map +1 -0
- package/dist/extensions/entries/domains.cjs +2 -0
- package/dist/extensions/entries/domains.cjs.map +1 -0
- package/dist/extensions/entries/domains.d.cts +18 -0
- package/dist/extensions/entries/domains.d.cts.map +1 -0
- package/dist/extensions/entries/domains.d.mts +18 -0
- package/dist/extensions/entries/domains.d.mts.map +1 -0
- package/dist/extensions/entries/domains.mjs +2 -0
- package/dist/extensions/entries/domains.mjs.map +1 -0
- package/dist/extensions/entries/doom.cjs +2 -0
- package/dist/extensions/entries/doom.cjs.map +1 -0
- package/dist/extensions/entries/doom.d.cts +14 -0
- package/dist/extensions/entries/doom.d.cts.map +1 -0
- package/dist/extensions/entries/doom.d.mts +14 -0
- package/dist/extensions/entries/doom.d.mts.map +1 -0
- package/dist/extensions/entries/doom.mjs +2 -0
- package/dist/extensions/entries/doom.mjs.map +1 -0
- package/dist/extensions/entries/effort.cjs +2 -0
- package/dist/extensions/entries/effort.cjs.map +1 -0
- package/dist/extensions/entries/effort.d.cts +10 -0
- package/dist/extensions/entries/effort.d.cts.map +1 -0
- package/dist/extensions/entries/effort.d.mts +10 -0
- package/dist/extensions/entries/effort.d.mts.map +1 -0
- package/dist/extensions/entries/effort.mjs +2 -0
- package/dist/extensions/entries/effort.mjs.map +1 -0
- package/dist/extensions/entries/majorMode.cjs +6 -0
- package/dist/extensions/entries/majorMode.cjs.map +1 -0
- package/dist/extensions/entries/majorMode.d.cts +27 -0
- package/dist/extensions/entries/majorMode.d.cts.map +1 -0
- package/dist/extensions/entries/majorMode.d.mts +27 -0
- package/dist/extensions/entries/majorMode.d.mts.map +1 -0
- package/dist/extensions/entries/majorMode.mjs +6 -0
- package/dist/extensions/entries/majorMode.mjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.cjs +2 -0
- package/dist/extensions/entries/modeCatalog.cjs.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.cts +7 -0
- package/dist/extensions/entries/modeCatalog.d.cts.map +1 -0
- package/dist/extensions/entries/modeCatalog.d.mts +7 -0
- package/dist/extensions/entries/modeCatalog.d.mts.map +1 -0
- package/dist/extensions/entries/modeCatalog.mjs +2 -0
- package/dist/extensions/entries/modeCatalog.mjs.map +1 -0
- package/dist/extensions/entries/notifications.cjs +2 -0
- package/dist/extensions/entries/notifications.cjs.map +1 -0
- package/dist/extensions/entries/notifications.d.cts +14 -0
- package/dist/extensions/entries/notifications.d.cts.map +1 -0
- package/dist/extensions/entries/notifications.d.mts +14 -0
- package/dist/extensions/entries/notifications.d.mts.map +1 -0
- package/dist/extensions/entries/notifications.mjs +2 -0
- package/dist/extensions/entries/notifications.mjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.cjs +2 -0
- package/dist/extensions/entries/ollamaProvider.cjs.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.cts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.cts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.d.mts +7 -0
- package/dist/extensions/entries/ollamaProvider.d.mts.map +1 -0
- package/dist/extensions/entries/ollamaProvider.mjs +2 -0
- package/dist/extensions/entries/ollamaProvider.mjs.map +1 -0
- package/dist/extensions/entries/persona.cjs +2 -0
- package/dist/extensions/entries/persona.cjs.map +1 -0
- package/dist/extensions/entries/persona.d.cts +15 -0
- package/dist/extensions/entries/persona.d.cts.map +1 -0
- package/dist/extensions/entries/persona.d.mts +15 -0
- package/dist/extensions/entries/persona.d.mts.map +1 -0
- package/dist/extensions/entries/persona.mjs +2 -0
- package/dist/extensions/entries/persona.mjs.map +1 -0
- package/dist/extensions/entries/profile.cjs +3 -0
- package/dist/extensions/entries/profile.cjs.map +1 -0
- package/dist/extensions/entries/profile.d.cts +18 -0
- package/dist/extensions/entries/profile.d.cts.map +1 -0
- package/dist/extensions/entries/profile.d.mts +18 -0
- package/dist/extensions/entries/profile.d.mts.map +1 -0
- package/dist/extensions/entries/profile.mjs +3 -0
- package/dist/extensions/entries/profile.mjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.cjs +9 -0
- package/dist/extensions/entries/repositoryHooks.cjs.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.cts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.cts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.d.mts +8 -0
- package/dist/extensions/entries/repositoryHooks.d.mts.map +1 -0
- package/dist/extensions/entries/repositoryHooks.mjs +9 -0
- package/dist/extensions/entries/repositoryHooks.mjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.cjs +27 -0
- package/dist/extensions/entries/shellTitleController.cjs.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.cts +11 -0
- package/dist/extensions/entries/shellTitleController.d.cts.map +1 -0
- package/dist/extensions/entries/shellTitleController.d.mts +11 -0
- package/dist/extensions/entries/shellTitleController.d.mts.map +1 -0
- package/dist/extensions/entries/shellTitleController.mjs +27 -0
- package/dist/extensions/entries/shellTitleController.mjs.map +1 -0
- package/dist/extensions/entries/skills.cjs +4 -0
- package/dist/extensions/entries/skills.cjs.map +1 -0
- package/dist/extensions/entries/skills.d.cts +34 -0
- package/dist/extensions/entries/skills.d.cts.map +1 -0
- package/dist/extensions/entries/skills.d.mts +34 -0
- package/dist/extensions/entries/skills.d.mts.map +1 -0
- package/dist/extensions/entries/skills.mjs +4 -0
- package/dist/extensions/entries/skills.mjs.map +1 -0
- package/dist/extensions/entries/styleSystem.cjs +4 -0
- package/dist/extensions/entries/styleSystem.cjs.map +1 -0
- package/dist/extensions/entries/styleSystem.d.cts +32 -0
- package/dist/extensions/entries/styleSystem.d.cts.map +1 -0
- package/dist/extensions/entries/styleSystem.d.mts +32 -0
- package/dist/extensions/entries/styleSystem.d.mts.map +1 -0
- package/dist/extensions/entries/styleSystem.mjs +4 -0
- package/dist/{entries/styleSystem.cjs.map → extensions/entries/styleSystem.mjs.map} +1 -1
- package/dist/extensions/pi.cjs +1 -0
- package/dist/extensions/pi.d.cts +2 -0
- package/dist/extensions/pi.d.mts +2 -0
- package/dist/extensions/pi.mjs +1 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.cjs.map +1 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs +2 -0
- package/dist/extensions/services/domainSwitchHandoff.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +33 -29
- package/dist/index.d.mts +33 -29
- package/dist/index.mjs +1 -1
- package/dist/logSinkTelemetry.cjs +1 -2
- package/dist/logSinkTelemetry.d.cts +2 -51
- package/dist/logSinkTelemetry.d.mts +2 -51
- package/dist/logSinkTelemetry.mjs +1 -2
- package/dist/pi-cache-optimizer-D9beVnnH.mjs +50 -0
- package/dist/pi-cache-optimizer-D9beVnnH.mjs.map +1 -0
- package/dist/schemas/domainVoiceTools.cjs +2 -0
- package/dist/schemas/domainVoiceTools.cjs.map +1 -0
- package/dist/schemas/domainVoiceTools.mjs +2 -0
- package/dist/schemas/domainVoiceTools.mjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.cjs +2 -0
- package/dist/schemas/majorModeVoiceTools.cjs.map +1 -0
- package/dist/schemas/majorModeVoiceTools.mjs +2 -0
- package/dist/schemas/majorModeVoiceTools.mjs.map +1 -0
- package/dist/services/compatibility/antigravity.cjs +1 -2
- package/dist/services/compatibility/antigravity.d.cts +2 -11
- package/dist/services/compatibility/antigravity.d.mts +2 -11
- package/dist/services/compatibility/antigravity.mjs +1 -2
- package/dist/services/compatibility/codex.cjs +1 -2
- package/dist/services/compatibility/codex.d.cts +2 -19
- package/dist/services/compatibility/codex.d.mts +2 -19
- package/dist/services/compatibility/codex.mjs +1 -2
- package/dist/services/compatibility/index.cjs +1 -2
- package/dist/services/compatibility/index.d.cts +6 -16
- package/dist/services/compatibility/index.d.mts +6 -16
- package/dist/services/compatibility/index.mjs +1 -2
- package/dist/services/compatibility/process.cjs +1 -2
- package/dist/services/compatibility/process.d.cts +2 -35
- package/dist/services/compatibility/process.d.mts +2 -35
- package/dist/services/compatibility/process.mjs +1 -2
- package/dist/services/compatibility/shared.cjs +1 -2
- package/dist/services/compatibility/shared.d.cts +2 -33
- package/dist/services/compatibility/shared.d.mts +2 -33
- package/dist/services/compatibility/shared.mjs +1 -2
- package/dist/services/compatibilityContext.cjs +1 -2
- package/dist/services/compatibilityContext.d.cts +2 -23
- package/dist/services/compatibilityContext.d.mts +2 -23
- package/dist/services/compatibilityContext.mjs +1 -2
- package/dist/services/composer.cjs +1 -2
- package/dist/services/composer.d.cts +4 -135
- package/dist/services/composer.d.mts +4 -135
- package/dist/services/composer.mjs +1 -2
- package/dist/services/config/index.cjs +1 -0
- package/dist/services/config/index.d.cts +7 -0
- package/dist/services/config/index.d.mts +7 -0
- package/dist/services/config/index.mjs +1 -0
- package/dist/services/config/projectTrust.cjs +2 -0
- package/dist/services/config/projectTrust.cjs.map +1 -0
- package/dist/services/config/projectTrust.d.cts +14 -0
- package/dist/services/config/projectTrust.d.cts.map +1 -0
- package/dist/services/config/projectTrust.d.mts +14 -0
- package/dist/services/config/projectTrust.d.mts.map +1 -0
- package/dist/services/config/projectTrust.mjs +2 -0
- package/dist/services/config/projectTrust.mjs.map +1 -0
- package/dist/services/extensionAssembler.cjs +1 -1
- package/dist/services/extensionAssembler.cjs.map +1 -1
- package/dist/services/extensionAssembler.d.cts +13 -6
- package/dist/services/extensionAssembler.d.cts.map +1 -1
- package/dist/services/extensionAssembler.d.mts +13 -6
- package/dist/services/extensionAssembler.d.mts.map +1 -1
- package/dist/services/extensionAssembler.mjs +1 -1
- package/dist/services/extensionAssembler.mjs.map +1 -1
- package/dist/services/harnessContext.cjs +1 -2
- package/dist/services/harnessContext.d.cts +2 -61
- package/dist/services/harnessContext.d.mts +2 -61
- package/dist/services/harnessContext.mjs +1 -2
- package/dist/services/index.cjs +1 -1
- package/dist/services/index.d.cts +18 -14
- package/dist/services/index.d.mts +18 -14
- package/dist/services/index.mjs +1 -1
- package/dist/services/matrixSwitcher.cjs +1 -2
- package/dist/services/matrixSwitcher.d.cts +2 -46
- package/dist/services/matrixSwitcher.d.mts +2 -46
- package/dist/services/matrixSwitcher.mjs +1 -2
- package/dist/services/mcpFilter.cjs +1 -3
- package/dist/services/mcpFilter.d.cts +2 -40
- package/dist/services/mcpFilter.d.mts +2 -40
- package/dist/services/mcpFilter.mjs +1 -3
- package/dist/services/modeCatalog.cjs +2 -0
- package/dist/services/modeCatalog.cjs.map +1 -0
- package/dist/services/modeCatalog.d.cts +18 -0
- package/dist/services/modeCatalog.d.cts.map +1 -0
- package/dist/services/modeCatalog.d.mts +18 -0
- package/dist/services/modeCatalog.d.mts.map +1 -0
- package/dist/services/modeCatalog.mjs +2 -0
- package/dist/services/modeCatalog.mjs.map +1 -0
- package/dist/services/piSettings.cjs +1 -2
- package/dist/services/piSettings.d.cts +2 -24
- package/dist/services/piSettings.d.mts +2 -24
- package/dist/services/piSettings.mjs +1 -2
- package/dist/services/resourceCollector.cjs +1 -3
- package/dist/services/resourceCollector.d.cts +2 -23
- package/dist/services/resourceCollector.d.mts +2 -23
- package/dist/services/resourceCollector.mjs +1 -3
- package/dist/services/skillCatalog.cjs +1 -2
- package/dist/services/skillCatalog.d.cts +2 -56
- package/dist/services/skillCatalog.d.mts +2 -56
- package/dist/services/skillCatalog.mjs +1 -2
- package/dist/services/skillSources.cjs +1 -2
- package/dist/services/skillSources.d.cts +2 -24
- package/dist/services/skillSources.d.mts +2 -24
- package/dist/services/skillSources.mjs +1 -2
- package/dist/services/syncState.cjs +1 -2
- package/dist/services/syncState.d.cts +3 -133
- package/dist/services/syncState.d.mts +3 -133
- package/dist/services/syncState.mjs +1 -2
- package/dist/services/tools/toolNames.cjs +2 -0
- package/dist/services/tools/toolNames.cjs.map +1 -0
- package/dist/services/tools/toolNames.d.cts +25 -0
- package/dist/services/tools/toolNames.d.cts.map +1 -0
- package/dist/services/tools/toolNames.d.mts +25 -0
- package/dist/services/tools/toolNames.d.mts.map +1 -0
- package/dist/services/tools/toolNames.mjs +2 -0
- package/dist/services/tools/toolNames.mjs.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.cts +1 -1
- package/dist/types/interfaces/compatibility.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/compatibility.d.mts +1 -1
- package/dist/types/interfaces/compatibility.d.mts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.cts +6 -2
- package/dist/types/interfaces/harness.d.cts.map +1 -0
- package/dist/{interfaces → types/interfaces}/harness.d.mts +6 -2
- package/dist/types/interfaces/harness.d.mts.map +1 -0
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.d.cts +5 -5
- package/dist/utils/index.d.mts +5 -5
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/json.cjs +1 -2
- package/dist/utils/json.d.cts +2 -23
- package/dist/utils/json.d.mts +2 -23
- package/dist/utils/json.mjs +1 -2
- package/dist/utils/moduleResolution.cjs +1 -2
- package/dist/utils/moduleResolution.d.cts +2 -56
- package/dist/utils/moduleResolution.d.mts +2 -56
- package/dist/utils/moduleResolution.mjs +1 -2
- package/dist/utils/repository.cjs +1 -2
- package/dist/utils/repository.d.cts +2 -21
- package/dist/utils/repository.d.mts +2 -21
- package/dist/utils/repository.mjs +1 -2
- package/dist/utils/toolNames.cjs +1 -2
- package/dist/utils/toolNames.d.cts +2 -25
- package/dist/utils/toolNames.d.mts +2 -25
- package/dist/utils/toolNames.mjs +1 -2
- package/package.json +59 -37
- package/dist/cli/cliApp.cjs.map +0 -1
- package/dist/cli/cliApp.d.cts.map +0 -1
- package/dist/cli/cliApp.d.mts.map +0 -1
- package/dist/cli/cliApp.mjs.map +0 -1
- package/dist/cli/compatibilityOptions.cjs.map +0 -1
- package/dist/cli/compatibilityOptions.d.cts.map +0 -1
- package/dist/cli/compatibilityOptions.d.mts.map +0 -1
- package/dist/cli/compatibilityOptions.mjs.map +0 -1
- package/dist/cli/help.d.cts.map +0 -1
- package/dist/cli/help.d.mts.map +0 -1
- package/dist/cli/matrixOptions.cjs.map +0 -1
- package/dist/cli/matrixOptions.d.cts.map +0 -1
- package/dist/cli/matrixOptions.d.mts.map +0 -1
- package/dist/cli/matrixOptions.mjs.map +0 -1
- package/dist/cli/options.cjs.map +0 -1
- package/dist/cli/options.d.cts.map +0 -1
- package/dist/cli/options.d.mts.map +0 -1
- package/dist/cli/options.mjs.map +0 -1
- package/dist/commands/buildCommand.d.cts +0 -23
- package/dist/commands/buildCommand.d.cts.map +0 -1
- package/dist/commands/buildCommand.d.mts +0 -23
- package/dist/commands/buildCommand.d.mts.map +0 -1
- package/dist/config/harnessState.cjs.map +0 -1
- package/dist/config/harnessState.d.cts.map +0 -1
- package/dist/config/harnessState.d.mts.map +0 -1
- package/dist/config/harnessState.mjs.map +0 -1
- package/dist/config/projectTrust.cjs.map +0 -1
- package/dist/config/projectTrust.d.cts.map +0 -1
- package/dist/config/projectTrust.d.mts.map +0 -1
- package/dist/config/projectTrust.mjs.map +0 -1
- package/dist/entries/addDirCompatibility.cjs +0 -2
- package/dist/entries/addDirCompatibility.cjs.map +0 -1
- package/dist/entries/addDirCompatibility.d.cts +0 -13
- package/dist/entries/addDirCompatibility.d.cts.map +0 -1
- package/dist/entries/addDirCompatibility.d.mts +0 -14
- package/dist/entries/addDirCompatibility.d.mts.map +0 -1
- package/dist/entries/addDirCompatibility.mjs +0 -2
- package/dist/entries/addDirCompatibility.mjs.map +0 -1
- package/dist/entries/autoStop.cjs.map +0 -1
- package/dist/entries/autoStop.d.cts.map +0 -1
- package/dist/entries/autoStop.d.mts.map +0 -1
- package/dist/entries/autoStop.mjs.map +0 -1
- package/dist/entries/components/matrixPicker.cjs.map +0 -1
- package/dist/entries/components/matrixPicker.d.cts.map +0 -1
- package/dist/entries/components/matrixPicker.d.mts.map +0 -1
- package/dist/entries/components/matrixPicker.mjs.map +0 -1
- package/dist/entries/components/skillsOverlay.cjs.map +0 -1
- package/dist/entries/components/skillsOverlay.d.cts.map +0 -1
- package/dist/entries/components/skillsOverlay.d.mts.map +0 -1
- package/dist/entries/components/skillsOverlay.mjs.map +0 -1
- package/dist/entries/domains.cjs.map +0 -1
- package/dist/entries/domains.d.cts.map +0 -1
- package/dist/entries/domains.d.mts.map +0 -1
- package/dist/entries/domains.mjs.map +0 -1
- package/dist/entries/doom.cjs.map +0 -1
- package/dist/entries/doom.d.cts.map +0 -1
- package/dist/entries/doom.d.mts.map +0 -1
- package/dist/entries/doom.mjs.map +0 -1
- package/dist/entries/effort.cjs.map +0 -1
- package/dist/entries/effort.d.cts.map +0 -1
- package/dist/entries/effort.d.mts.map +0 -1
- package/dist/entries/effort.mjs.map +0 -1
- package/dist/entries/majorMode.cjs.map +0 -1
- package/dist/entries/majorMode.d.cts.map +0 -1
- package/dist/entries/majorMode.d.mts.map +0 -1
- package/dist/entries/majorMode.mjs.map +0 -1
- package/dist/entries/notifications.cjs.map +0 -1
- package/dist/entries/notifications.d.cts.map +0 -1
- package/dist/entries/notifications.d.mts.map +0 -1
- package/dist/entries/notifications.mjs.map +0 -1
- package/dist/entries/ollamaProvider.cjs.map +0 -1
- package/dist/entries/ollamaProvider.d.cts.map +0 -1
- package/dist/entries/ollamaProvider.d.mts.map +0 -1
- package/dist/entries/ollamaProvider.mjs.map +0 -1
- package/dist/entries/persona.cjs.map +0 -1
- package/dist/entries/persona.d.cts.map +0 -1
- package/dist/entries/persona.d.mts.map +0 -1
- package/dist/entries/persona.mjs.map +0 -1
- package/dist/entries/profile.cjs.map +0 -1
- package/dist/entries/profile.d.cts.map +0 -1
- package/dist/entries/profile.d.mts.map +0 -1
- package/dist/entries/profile.mjs.map +0 -1
- package/dist/entries/repositoryHooks.cjs.map +0 -1
- package/dist/entries/repositoryHooks.d.cts.map +0 -1
- package/dist/entries/repositoryHooks.d.mts.map +0 -1
- package/dist/entries/repositoryHooks.mjs.map +0 -1
- package/dist/entries/skills.cjs.map +0 -1
- package/dist/entries/skills.d.cts.map +0 -1
- package/dist/entries/skills.d.mts.map +0 -1
- package/dist/entries/skills.mjs.map +0 -1
- package/dist/entries/styleSystem.d.cts.map +0 -1
- package/dist/entries/styleSystem.d.mts.map +0 -1
- package/dist/entries/styleSystem.mjs.map +0 -1
- package/dist/interfaces/compatibility.d.cts.map +0 -1
- package/dist/interfaces/compatibility.d.mts.map +0 -1
- package/dist/interfaces/harness.d.cts.map +0 -1
- package/dist/interfaces/harness.d.mts.map +0 -1
- package/dist/logSinkTelemetry.cjs.map +0 -1
- package/dist/logSinkTelemetry.d.cts.map +0 -1
- package/dist/logSinkTelemetry.d.mts.map +0 -1
- package/dist/logSinkTelemetry.mjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.cjs.map +0 -1
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs +0 -2
- package/dist/node_modules/.pnpm/@juicesharp_rpiv-ask-user-question@2.2.0_@earendil-works_pi-coding-agent@0.84.1_support_6ba1249e24a50b62791c1c91c9f324c6/node_modules/@juicesharp/rpiv-ask-user-question/events.mjs.map +0 -1
- package/dist/services/compatibility/index.cjs.map +0 -1
- package/dist/services/compatibility/index.mjs.map +0 -1
- package/dist/services/compatibilityContext.cjs.map +0 -1
- package/dist/services/compatibilityContext.mjs.map +0 -1
- package/dist/services/composer.cjs.map +0 -1
- package/dist/services/composer.d.cts.map +0 -1
- package/dist/services/composer.d.mts.map +0 -1
- package/dist/services/composer.mjs.map +0 -1
- package/dist/services/extensionCompiler.cjs +0 -3
- package/dist/services/extensionCompiler.cjs.map +0 -1
- package/dist/services/extensionCompiler.mjs +0 -3
- package/dist/services/extensionCompiler.mjs.map +0 -1
- package/dist/services/harnessContext.cjs.map +0 -1
- package/dist/services/harnessContext.mjs.map +0 -1
- package/dist/services/matrixSwitcher.cjs.map +0 -1
- package/dist/services/matrixSwitcher.mjs.map +0 -1
- package/dist/services/mcpFilter.cjs.map +0 -1
- package/dist/services/mcpFilter.d.cts.map +0 -1
- package/dist/services/mcpFilter.d.mts.map +0 -1
- package/dist/services/mcpFilter.mjs.map +0 -1
- package/dist/services/piSettings.cjs.map +0 -1
- package/dist/services/piSettings.d.cts.map +0 -1
- package/dist/services/piSettings.d.mts.map +0 -1
- package/dist/services/piSettings.mjs.map +0 -1
- package/dist/services/resourceCollector.cjs.map +0 -1
- package/dist/services/resourceCollector.d.cts.map +0 -1
- package/dist/services/resourceCollector.d.mts.map +0 -1
- package/dist/services/resourceCollector.mjs.map +0 -1
- package/dist/services/runtimeBundle.cjs +0 -2
- package/dist/services/runtimeBundle.cjs.map +0 -1
- package/dist/services/runtimeBundle.d.cts.map +0 -1
- package/dist/services/runtimeBundle.d.mts.map +0 -1
- package/dist/services/runtimeBundle.mjs +0 -2
- package/dist/services/runtimeBundle.mjs.map +0 -1
- package/dist/services/skillCatalog.cjs.map +0 -1
- package/dist/services/skillCatalog.d.cts.map +0 -1
- package/dist/services/skillCatalog.d.mts.map +0 -1
- package/dist/services/skillCatalog.mjs.map +0 -1
- package/dist/services/syncState.cjs.map +0 -1
- package/dist/services/syncState.d.cts.map +0 -1
- package/dist/services/syncState.d.mts.map +0 -1
- package/dist/services/syncState.mjs.map +0 -1
- package/dist/utils/json.cjs.map +0 -1
- package/dist/utils/json.d.cts.map +0 -1
- package/dist/utils/json.d.mts.map +0 -1
- package/dist/utils/json.mjs.map +0 -1
- package/dist/utils/moduleResolution.cjs.map +0 -1
- package/dist/utils/moduleResolution.d.cts.map +0 -1
- package/dist/utils/moduleResolution.d.mts.map +0 -1
- package/dist/utils/moduleResolution.mjs.map +0 -1
- package/dist/utils/repository.cjs.map +0 -1
- package/dist/utils/repository.d.cts.map +0 -1
- package/dist/utils/repository.d.mts.map +0 -1
- package/dist/utils/repository.mjs.map +0 -1
- package/dist/utils/toolNames.cjs.map +0 -1
- package/dist/utils/toolNames.d.cts.map +0 -1
- package/dist/utils/toolNames.d.mts.map +0 -1
- package/dist/utils/toolNames.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceCollector.mjs","names":[],"sources":["../../src/adapters/resourceCollector.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { PluginEntry, PluginSkillDiscovery } from '@agimon-ai/doompi-config/domains';\nimport { parse, stringify } from 'yaml';\nimport type { HarnessResourceOptions, HarnessResources, PluginHookSource } from '../types/interfaces/index.ts';\nimport { type JsonObject, toPiToolName } from '../utils/index.ts';\nimport { applyMcpAllowlist } from './mcpFilter.ts';\nimport { resolveSyncLocation } from './syncLocation.ts';\n\nexport const DISPATCHER_AGENT_NAME = 'agiflow-dispatcher';\nconst DISPATCHER_TOOLS = ['read', 'grep', 'find', 'ls', 'bash', 'launch_workflow', 'list_workflows'];\nconst SKILL_MANIFEST_VERSION = 2;\nconst SKILL_MANIFEST_HASH_LENGTH = 16;\nconst SKILL_MANIFEST_DIRECTORY = path.join('cache', 'skills');\n\ninterface NamedResource {\n name: string;\n path: string;\n digest?: string;\n}\n\ninterface SkillManifestFile {\n path: string;\n name: string;\n digest: string;\n size: number;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifestDirectory {\n path: string;\n mtimeMs: number;\n ctimeMs: number;\n}\n\ninterface SkillManifest {\n version: number;\n root: string;\n discovery: PluginSkillDiscovery;\n files: SkillManifestFile[];\n directories: SkillManifestDirectory[];\n}\n\nexport function selectWorkflowExtensionForProcess(\n workflowExtension: string | undefined,\n dispatcherWorkflowExtension: string | undefined,\n environment: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n const isDispatcherChild =\n environment.PI_SUBAGENT_CHILD_AGENT === DISPATCHER_AGENT_NAME && Boolean(environment.PI_SUBAGENT_PARENT_SESSION);\n return isDispatcherChild && dispatcherWorkflowExtension ? dispatcherWorkflowExtension : workflowExtension;\n}\n\nfunction splitFrontmatter(content: string): { attributes: JsonObject; body: string } {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) throw new Error('Resource is missing YAML frontmatter');\n return { attributes: parse(match[1]!) as JsonObject, body: match[2] ?? '' };\n}\n\nconst CLAUDE_MODEL_ALIASES: Record<string, string> = {\n sonnet: 'anthropic/claude-sonnet-4-6',\n opus: 'anthropic/claude-opus-4-6',\n haiku: 'anthropic/claude-haiku-4-5',\n};\n\nfunction assertSafeAgentName(name: string): string {\n const trimmed = name.trim();\n if (\n !trimmed ||\n trimmed !== name ||\n trimmed === '.' ||\n trimmed === '..' ||\n trimmed.includes('\\0') ||\n /[\\\\/]/.test(trimmed)\n ) {\n throw new Error(`Unsafe agent name: ${JSON.stringify(name)}`);\n }\n return trimmed;\n}\n\nfunction normalizeClaudeModel(value: unknown): unknown {\n if (typeof value === 'string') return CLAUDE_MODEL_ALIASES[value.toLowerCase()] ?? value;\n if (Array.isArray(value)) return value.map((entry) => normalizeClaudeModel(entry));\n return value;\n}\n\nexport function adaptAgentDefinition(content: string): { name: string; content: string } {\n const { attributes, body } = splitFrontmatter(content);\n const rawName = typeof attributes.name === 'string' ? attributes.name : undefined;\n if (!rawName) throw new Error('Agent definition requires a name');\n const name = assertSafeAgentName(rawName);\n const hasTools = Object.hasOwn(attributes, 'tools');\n const rawTools = Array.isArray(attributes.tools)\n ? attributes.tools.map(String)\n : typeof attributes.tools === 'string'\n ? attributes.tools\n .split(',')\n .map((tool) => tool.trim())\n .filter(Boolean)\n : [];\n const mappedTools = [...new Set(rawTools.map(toPiToolName).filter((tool): tool is string => Boolean(tool)))];\n const converted: JsonObject = {\n ...attributes,\n inheritProjectContext: true,\n inheritSkills: true,\n systemPromptMode: attributes.systemPromptMode ?? 'replace',\n };\n if (hasTools) converted.tools = Array.isArray(attributes.tools) ? mappedTools : mappedTools.join(', ');\n else delete converted.tools;\n if (converted.model !== undefined) converted.model = normalizeClaudeModel(converted.model);\n if (converted.fallbackModels !== undefined) converted.fallbackModels = normalizeClaudeModel(converted.fallbackModels);\n if (converted.memory === 'project' || converted.memory === 'user')\n converted.memory = { scope: converted.memory, path: name };\n else if (\n converted.memory !== undefined &&\n (typeof converted.memory !== 'object' || converted.memory === null || Array.isArray(converted.memory))\n )\n throw new Error('Unsupported memory declaration');\n delete converted.permissionMode;\n return { name, content: `---\\n${stringify(converted).trim()}\\n---\\n\\n${body.trimStart()}` };\n}\n\nfunction skillManifestPath(\n repoRoot: string,\n skillRoot: string,\n discovery: PluginSkillDiscovery,\n cacheDirectory?: string,\n): string {\n const key = createHash('sha256')\n .update(`${path.resolve(skillRoot)}\\0${discovery}`)\n .digest('hex')\n .slice(0, SKILL_MANIFEST_HASH_LENGTH);\n const directory = cacheDirectory ?? path.join(resolveSyncLocation(repoRoot).directory, SKILL_MANIFEST_DIRECTORY);\n return path.join(directory, `${key}.json`);\n}\n\nfunction fileMatches(previous: SkillManifestFile): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return (\n stat.isFile() &&\n stat.size === previous.size &&\n stat.mtimeMs === previous.mtimeMs &&\n stat.ctimeMs === previous.ctimeMs\n );\n } catch {\n return false;\n }\n}\n\nfunction directoryMatches(previous: SkillManifestDirectory): boolean {\n try {\n const stat = fs.statSync(previous.path);\n return stat.isDirectory() && stat.mtimeMs === previous.mtimeMs && stat.ctimeMs === previous.ctimeMs;\n } catch {\n return false;\n }\n}\n\nfunction readSkillManifest(\n manifestPath: string,\n root: string,\n discovery: PluginSkillDiscovery,\n): SkillManifest | undefined {\n try {\n const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as SkillManifest;\n if (\n manifest.version !== SKILL_MANIFEST_VERSION ||\n manifest.root !== path.resolve(root) ||\n manifest.discovery !== discovery ||\n !Array.isArray(manifest.files) ||\n !Array.isArray(manifest.directories) ||\n !manifest.files.every(fileMatches) ||\n !manifest.directories.every(directoryMatches)\n ) {\n return undefined;\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nfunction writeSkillManifest(manifestPath: string, manifest: SkillManifest): void {\n fs.mkdirSync(path.dirname(manifestPath), { recursive: true, mode: 0o700 });\n const temporary = `${manifestPath}.${process.pid}.${Date.now()}.tmp`;\n fs.writeFileSync(temporary, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n try {\n fs.renameSync(temporary, manifestPath);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n if (!fs.existsSync(manifestPath)) throw error;\n }\n}\n\nasync function pathExists(target: string): Promise<boolean> {\n try {\n await fs.promises.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readSkillManifestAsync(\n manifestPath: string,\n root: string,\n discovery: PluginSkillDiscovery,\n): Promise<SkillManifest | undefined> {\n try {\n const manifest = JSON.parse(await fs.promises.readFile(manifestPath, 'utf8')) as SkillManifest;\n if (\n manifest.version !== SKILL_MANIFEST_VERSION ||\n manifest.root !== path.resolve(root) ||\n manifest.discovery !== discovery ||\n !Array.isArray(manifest.files) ||\n !Array.isArray(manifest.directories)\n ) {\n return undefined;\n }\n for (const previous of manifest.files) {\n const stat = await fs.promises.stat(previous.path);\n if (\n !stat.isFile() ||\n stat.size !== previous.size ||\n stat.mtimeMs !== previous.mtimeMs ||\n stat.ctimeMs !== previous.ctimeMs\n ) {\n return undefined;\n }\n }\n for (const previous of manifest.directories) {\n const stat = await fs.promises.stat(previous.path);\n if (!stat.isDirectory() || stat.mtimeMs !== previous.mtimeMs || stat.ctimeMs !== previous.ctimeMs) {\n return undefined;\n }\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nasync function writeSkillManifestAsync(manifestPath: string, manifest: SkillManifest): Promise<void> {\n await fs.promises.mkdir(path.dirname(manifestPath), { recursive: true, mode: 0o700 });\n const temporary = `${manifestPath}.${process.pid}.${Date.now()}.tmp`;\n await fs.promises.writeFile(temporary, `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n try {\n await fs.promises.rename(temporary, manifestPath);\n } catch (error) {\n await fs.promises.rm(temporary, { force: true });\n if (!(await pathExists(manifestPath))) throw error;\n }\n}\n\nfunction scanSkillManifest(root: string, discovery: PluginSkillDiscovery): SkillManifest {\n const directories: SkillManifestDirectory[] = [];\n const files: SkillManifestFile[] = [];\n const walk = (directory: string, depth: number): void => {\n if (!fs.existsSync(directory)) return;\n const directoryStat = fs.statSync(directory);\n directories.push({ path: directory, mtimeMs: directoryStat.mtimeMs, ctimeMs: directoryStat.ctimeMs });\n for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (discovery === 'recursive' || depth === 0) walk(candidate, depth + 1);\n continue;\n }\n if (!entry.isFile() || entry.name !== 'SKILL.md' || (discovery === 'direct-children' && depth !== 1)) {\n continue;\n }\n const content = fs.readFileSync(candidate, 'utf8');\n const { attributes } = splitFrontmatter(content);\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${candidate}`);\n const stat = fs.statSync(candidate);\n files.push({\n path: candidate,\n name: attributes.name,\n digest: createHash('sha256').update(content).digest('hex'),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n });\n }\n };\n const resolvedRoot = path.resolve(root);\n walk(resolvedRoot, 0);\n files.sort((left, right) => left.path.localeCompare(right.path));\n directories.sort((left, right) => left.path.localeCompare(right.path));\n return { version: SKILL_MANIFEST_VERSION, root: resolvedRoot, discovery, files, directories };\n}\n\n/** Cached skill metadata and exact files, ready for Pi without a second tree walk. */\nexport function discoverSkills(\n repoRoot: string,\n root: string,\n discovery: PluginSkillDiscovery = 'recursive',\n cacheDirectory?: string,\n): NamedResource[] {\n if (!fs.existsSync(root)) return [];\n const manifestPath = skillManifestPath(repoRoot, root, discovery, cacheDirectory);\n const cached = readSkillManifest(manifestPath, root, discovery);\n const manifest = cached ?? scanSkillManifest(root, discovery);\n if (!cached) writeSkillManifest(manifestPath, manifest);\n return manifest.files.map(({ name, path: filePath, digest }) => ({ name, path: filePath, digest }));\n}\n\nasync function scanSkillManifestAsync(root: string, discovery: PluginSkillDiscovery): Promise<SkillManifest> {\n const directories: SkillManifestDirectory[] = [];\n const files: SkillManifestFile[] = [];\n const walk = async (directory: string, depth: number): Promise<void> => {\n let entries: fs.Dirent[];\n try {\n const directoryStat = await fs.promises.stat(directory);\n directories.push({ path: directory, mtimeMs: directoryStat.mtimeMs, ctimeMs: directoryStat.ctimeMs });\n entries = await fs.promises.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return;\n throw error;\n }\n for (const entry of entries) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (discovery === 'recursive' || depth === 0) await walk(candidate, depth + 1);\n continue;\n }\n if (!entry.isFile() || entry.name !== 'SKILL.md' || (discovery === 'direct-children' && depth !== 1)) {\n continue;\n }\n const content = await fs.promises.readFile(candidate, 'utf8');\n const { attributes } = splitFrontmatter(content);\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${candidate}`);\n const stat = await fs.promises.stat(candidate);\n files.push({\n path: candidate,\n name: attributes.name,\n digest: createHash('sha256').update(content).digest('hex'),\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n });\n }\n };\n const resolvedRoot = path.resolve(root);\n await walk(resolvedRoot, 0);\n files.sort((left, right) => left.path.localeCompare(right.path));\n directories.sort((left, right) => left.path.localeCompare(right.path));\n return { version: SKILL_MANIFEST_VERSION, root: resolvedRoot, discovery, files, directories };\n}\n\nexport async function discoverSkillsAsync(\n repoRoot: string,\n root: string,\n discovery: PluginSkillDiscovery = 'recursive',\n cacheDirectory?: string,\n): Promise<NamedResource[]> {\n if (!(await pathExists(root))) return [];\n const manifestPath = skillManifestPath(repoRoot, root, discovery, cacheDirectory);\n const cached = await readSkillManifestAsync(manifestPath, root, discovery);\n const manifest = cached ?? (await scanSkillManifestAsync(root, discovery));\n if (!cached) await writeSkillManifestAsync(manifestPath, manifest);\n return manifest.files.map(({ name, path: filePath, digest }) => ({ name, path: filePath, digest }));\n}\n\nasync function markdownFilesAsync(directory: string): Promise<string[]> {\n let entries: fs.Dirent[];\n try {\n entries = await fs.promises.readdir(directory, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw error;\n }\n const results: string[] = [];\n for (const entry of entries) {\n const candidate = path.join(directory, entry.name);\n if (entry.isDirectory()) results.push(...(await markdownFilesAsync(candidate)));\n if (entry.isFile() && entry.name.endsWith('.md')) results.push(candidate);\n }\n return results;\n}\n\nasync function frontmatterNameAsync(filePath: string): Promise<string> {\n const { attributes } = splitFrontmatter(await fs.promises.readFile(filePath, 'utf8'));\n if (typeof attributes.name !== 'string') throw new Error(`Resource requires a name: ${filePath}`);\n return attributes.name;\n}\n\nasync function assertUniqueAsync(resources: NamedResource[], kind: string): Promise<void> {\n const seen = new Map<string, string>();\n const digestByName = new Map<string, string>();\n for (const resource of resources) {\n const previous = seen.get(resource.name);\n const digest =\n resource.digest ??\n createHash('sha256')\n .update(await fs.promises.readFile(resource.path))\n .digest('hex');\n if (previous && digestByName.get(resource.name) !== digest) {\n throw new Error(`Conflicting ${kind} \"${resource.name}\": ${previous} and ${resource.path}`);\n }\n seen.set(resource.name, resource.path);\n digestByName.set(resource.name, digest);\n }\n}\n\nfunction dispatcherAgentSource(dispatcherWorkflowExtension: string): string {\n const attributes: JsonObject = {\n name: DISPATCHER_AGENT_NAME,\n description: 'Selects and launches Agiflow workflows for one loop pass without implementing the work.',\n thinking: 'high',\n systemPromptMode: 'replace',\n inheritProjectContext: true,\n inheritSkills: true,\n tools: DISPATCHER_TOOLS.join(', '),\n extensions: [dispatcherWorkflowExtension],\n defaultContext: 'fresh',\n defaultProgress: false,\n };\n const body = [\n 'You are the Agiflow workflow dispatcher.',\n 'Reason about the supplied dispatch context and launch eligible workflows.',\n 'Launch workflows without monitoring them. After dispatching, report and exit.',\n 'Follow the task restrictions exactly. Do not implement jobs or edit repository files.',\n ].join('\\n');\n return `---\\n${stringify(attributes).trim()}\\n---\\n\\n${body}\\n`;\n}\n\nexport function mergeMcpConfigs(configPaths: string[]): JsonObject {\n const merged: JsonObject = { mcpServers: {} };\n const servers = merged.mcpServers as Record<string, unknown>;\n const sources = new Map<string, string>();\n for (const configPath of configPaths) {\n if (!fs.existsSync(configPath)) continue;\n const config = JSON.parse(fs.readFileSync(configPath, 'utf8')) as JsonObject;\n const incoming = (config.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, definition] of Object.entries(incoming)) {\n const previous = servers[name];\n if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) {\n throw new Error(`Conflicting MCP server \"${name}\": ${sources.get(name)} and ${configPath}`);\n }\n servers[name] = definition;\n sources.set(name, configPath);\n }\n }\n return merged;\n}\n\nexport async function mergeMcpConfigsAsync(configPaths: string[]): Promise<JsonObject> {\n const merged: JsonObject = { mcpServers: {} };\n const servers = merged.mcpServers as Record<string, unknown>;\n const sources = new Map<string, string>();\n for (const configPath of configPaths) {\n let content: string;\n try {\n content = await fs.promises.readFile(configPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') continue;\n throw error;\n }\n const config = JSON.parse(content) as JsonObject;\n const incoming = (config.mcpServers ?? {}) as Record<string, unknown>;\n for (const [name, definition] of Object.entries(incoming)) {\n const previous = servers[name];\n if (previous && JSON.stringify(previous) !== JSON.stringify(definition)) {\n throw new Error(`Conflicting MCP server \"${name}\": ${sources.get(name)} and ${configPath}`);\n }\n servers[name] = definition;\n sources.set(name, configPath);\n }\n }\n return merged;\n}\n\n/** Matches a resource name against a subset filter. Undefined keeps everything. */\nfunction keepsName(allowed: string[] | undefined, name: string): boolean {\n if (!allowed) return true;\n return allowed.some((pattern) =>\n pattern.includes('*')\n ? new RegExp(`^${pattern.split('*').map(escapeRegExp).join('.*')}$`).test(name)\n : pattern === name,\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport async function collectResources(\n repoRoot: string,\n plugins: Array<string | PluginEntry>,\n options: HarnessResourceOptions,\n): Promise<HarnessResources> {\n const pluginEntries: PluginEntry[] = plugins.map((plugin) =>\n typeof plugin === 'string' ? { directory: plugin } : plugin,\n );\n // A caller-supplied directory is owned by the caller: it is either a live\n // session's directory or the synced one, and removing it here would delete\n // resources that outlive this collection.\n const ownsDirectory = options.temporaryDirectory === undefined;\n const temporaryDirectory =\n options.temporaryDirectory ?? (await fs.promises.mkdtemp(path.join(os.tmpdir(), 'doom-pi-')));\n await fs.promises.mkdir(temporaryDirectory, { mode: 0o700, recursive: true });\n await fs.promises.chmod(temporaryDirectory, 0o700);\n const sharedSkills = path.join(repoRoot, '.claude', 'skills');\n // A domain can opt out of the always-on shared skills to keep its context small.\n const sharedSkillSources =\n options.sharedSkills === false\n ? []\n : await discoverSkillsAsync(repoRoot, sharedSkills, 'recursive', options.skillCacheDirectory);\n const skillDirectories: string[] = [];\n const skillSources: NamedResource[] = [];\n const agentSources: Array<{ name: string; path: string }> = [];\n const pluginHooks: PluginHookSource[] = [];\n const pluginMcpConfigPaths: string[] = [];\n const mcpPaths = [path.join(repoRoot, '.mcp.json')];\n\n for (const entry of pluginEntries) {\n const pluginDirectory = entry.directory;\n const skills = path.join(pluginDirectory, 'skills');\n if (await pathExists(skills)) {\n const found = (\n await discoverSkillsAsync(repoRoot, skills, entry.skillDiscovery ?? 'recursive', options.skillCacheDirectory)\n ).filter((skill) => keepsName(entry.skills, skill.name));\n // Exact files let Pi skip another recursive traversal and make a plugin\n // subset unambiguous without staging copies of the skill bodies.\n skillDirectories.push(...found.map((skill) => skill.path));\n skillSources.push(...found);\n }\n const agents = path.join(pluginDirectory, 'agents');\n const agentFiles = await markdownFilesAsync(agents);\n const agentNames = await Promise.all(agentFiles.map((filePath) => frontmatterNameAsync(filePath)));\n agentSources.push(\n ...agentFiles\n .map((filePath, index) => ({ name: agentNames[index] ?? '', path: filePath }))\n .filter((agent) => keepsName(entry.agents, agent.name)),\n );\n const hookConfig = path.join(pluginDirectory, 'hooks', 'hooks.json');\n if (entry.hooks !== false && (await pathExists(hookConfig))) {\n pluginHooks.push({ pluginRoot: pluginDirectory, configPath: hookConfig });\n }\n const mcpConfig = path.join(pluginDirectory, '.mcp.json');\n if (entry.mcp !== false && (await pathExists(mcpConfig))) {\n mcpPaths.push(mcpConfig);\n pluginMcpConfigPaths.push(mcpConfig);\n }\n }\n\n await assertUniqueAsync(skillSources, 'skill');\n await assertUniqueAsync(sharedSkillSources, 'skill');\n // Pi keeps the first skill for a duplicated name. Selected domain plugins are\n // authoritative; shared Claude skills remain fallbacks for names no plugin owns.\n const pluginSkillNames = new Set(skillSources.map((skill) => skill.name));\n const fallbackSharedSkills = sharedSkillSources.filter((skill) => !pluginSkillNames.has(skill.name));\n skillDirectories.push(...fallbackSharedSkills.map((skill) => skill.path));\n skillSources.push(...fallbackSharedSkills);\n\n await assertUniqueAsync(agentSources, 'agent');\n if (agentSources.some((source) => source.name === DISPATCHER_AGENT_NAME)) {\n throw new Error(`Conflicting agent \"${DISPATCHER_AGENT_NAME}\": reserved by the agent harness`);\n }\n\n const agentDirectories: string[] = [];\n let dispatcherWorkflowExtensionPath: string | undefined;\n const outputDirectory = path.join(temporaryDirectory, 'agents');\n await fs.promises.rm(outputDirectory, { recursive: true, force: true });\n if (options.agents && (agentSources.length > 0 || options.dispatcherWorkflowExtension)) {\n await fs.promises.mkdir(outputDirectory, { mode: 0o700 });\n for (const source of agentSources) {\n const adapted = adaptAgentDefinition(await fs.promises.readFile(source.path, 'utf8'));\n await fs.promises.writeFile(\n path.join(outputDirectory, `${assertSafeAgentName(adapted.name)}.md`),\n adapted.content,\n { mode: 0o600 },\n );\n }\n if (options.dispatcherWorkflowExtension) {\n dispatcherWorkflowExtensionPath = options.dispatcherWorkflowExtension;\n await fs.promises.writeFile(\n path.join(outputDirectory, `${DISPATCHER_AGENT_NAME}.md`),\n dispatcherAgentSource(options.dispatcherWorkflowExtension),\n { mode: 0o600 },\n );\n }\n agentDirectories.push(outputDirectory);\n }\n\n let mcpConfigPath: string | undefined;\n if (options.mcp) {\n mcpConfigPath = path.join(temporaryDirectory, 'mcp.json');\n // Domains without an mcp allowlist resolve to undefined here, which leaves\n // the merged config untouched.\n const merged = await applyMcpAllowlist(\n await mergeMcpConfigsAsync(mcpPaths),\n options.mcpAllowlist,\n repoRoot,\n temporaryDirectory,\n );\n await fs.promises.writeFile(mcpConfigPath, `${JSON.stringify(merged, null, 2)}\\n`, {\n mode: 0o600,\n });\n }\n\n return {\n temporaryDirectory,\n skillDirectories,\n skillCount: skillSources.length,\n agentCount: agentSources.length,\n agentDirectories,\n pluginHooks,\n dispatcherWorkflowExtensionPath,\n mcpConfigPath,\n pluginMcpConfigPaths,\n cleanup: () =>\n ownsDirectory ? fs.promises.rm(temporaryDirectory, { recursive: true, force: true }) : Promise.resolve(),\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./syncLocation.cjs`),n=require(`./serialization/json.cjs`);require(`../utils/index.cjs`);const r=require(`../services/extensionAssembler.cjs`),i=require(`./extensionCompiler.cjs`);let a=require(`node:path`);a=e.__toESM(a,1);const o=`cache`,s=`dist`;function c(e){let t={agents:e.options.agents,preset:e.options.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig,resolvers:r.createLayerResolvers(e.options.repoRoot)};return{extensions:r.assembleExtensions({...t,autoStop:e.options.autoStop,mute:e.options.mute,workflowExtension:e.workflowExtension}),childExtensions:r.assembleChildExtensions({...t,agents:!1,autoStop:!1,mute:!0})}}function l(e){return{majorMode:e.majorMode,domains:[...e.domains],profile:e.profile,preset:e.preset,mute:e.mute,autoStop:e.autoStop,agents:e.agents,mcp:e.mcp}}function u(e){return[e.majorMode,e.mute?`mute`:void 0,e.autoStop?`auto-stop`:void 0].filter(e=>!!e).join(`.`)}function d(e){return e.replace(/\.mjs$/,`.manifest.json`)}async function f(e){let r=e.extensionPaths.map(e=>a.default.resolve(e)),c={...e.selection,domains:[...e.selection.domains]},l=t.resolveSyncLocation(e.repoRoot),f=await i.compileExtensionSet(r,e.cacheDirectory??a.default.join(l.directory,o),{outputDirectory:e.outputDirectory??a.default.join(l.directory,s),outputName:e.outputName??u(c),repositoryRoot:e.repoRoot,sharedCacheDirectory:e.sharedCacheDirectory??l.sharedCacheDirectory}),p=d(f),m={version:1,artifact:f,selection:c,extensionPaths:r,childExtensionPaths:(e.childExtensionPaths??[]).map(e=>a.default.resolve(e)),resources:{skillPaths:(e.skillPaths??[]).map(e=>a.default.resolve(e)),pluginRoots:(e.pluginRoots??[]).map(e=>a.default.resolve(e))}};return n.writeFileAtomic(p,`${JSON.stringify(m,null,2)}\n`),{bundle:f,manifest:p}}async function p(e,n=c(e),r=t.resolveSyncLocation(e.options.repoRoot)){let i=await f({repoRoot:e.options.repoRoot,cacheDirectory:a.default.join(r.directory,o),outputDirectory:a.default.join(r.directory,s),sharedCacheDirectory:r.sharedCacheDirectory,selection:l(e.options),extensionPaths:[...n.extensions].reverse(),childExtensionPaths:n.childExtensions,skillPaths:e.resources.skillDirectories,pluginRoots:e.plugins.map(e=>e.directory)});return{...n,...i}}exports.buildRuntimeBundle=p,exports.compileModeExtension=f,exports.createRuntimeExtensionPlan=c;
|
|
2
|
+
//# sourceMappingURL=runtimeBundle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeBundle.cjs","names":["createLayerResolvers","assembleExtensions","assembleChildExtensions","path","resolveSyncLocation","compileExtensionSet"],"sources":["../../src/adapters/runtimeBundle.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessOptions } from '../types/interfaces/index.ts';\nimport { writeFileAtomic } from '../utils/index.ts';\nimport { assembleChildExtensions, assembleExtensions, createLayerResolvers } from '../services/extensionAssembler.ts';\nimport { compileExtensionSet } from './extensionCompiler.ts';\nimport type { HarnessContext } from './harnessContext.ts';\nimport { resolveSyncLocation } from './syncLocation.ts';\n\nconst EXTENSION_CACHE_DIRECTORY = 'cache';\nconst MODE_DIST_DIRECTORY = 'dist';\nconst MODE_MANIFEST_VERSION = 1;\n\nexport interface RuntimeExtensionPlan {\n /** Pi CLI order. Pi evaluates explicit extension arguments in reverse. */\n extensions: string[];\n childExtensions: string[];\n}\n\nexport interface RuntimeBundleBuild extends RuntimeExtensionPlan {\n bundle: string;\n manifest: string;\n}\n\nexport interface ModeBuildSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n mute: boolean;\n autoStop: boolean;\n agents: boolean;\n mcp: boolean;\n}\n\nexport interface ModeBuildManifest {\n version: number;\n artifact: string;\n selection: ModeBuildSelection;\n /** Original source entries in the order their factories activate. */\n extensionPaths: string[];\n /** Original source entries inherited by detached child agents. */\n childExtensionPaths: string[];\n resources: {\n /** Exact SKILL.md paths; never derived from the bundled artifact path. */\n skillPaths: string[];\n pluginRoots: string[];\n };\n}\n\nexport interface ModeExtensionBuildOptions {\n repoRoot: string;\n selection: ModeBuildSelection;\n extensionPaths: readonly string[];\n childExtensionPaths?: readonly string[];\n skillPaths?: readonly string[];\n pluginRoots?: readonly string[];\n outputName?: string;\n cacheDirectory?: string;\n outputDirectory?: string;\n sharedCacheDirectory?: string;\n}\n\n/** Resolves the parent and detached-child extension lists for one launch. */\nexport function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan {\n const common = {\n agents: context.options.agents,\n preset: context.options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n resolvers: createLayerResolvers(context.options.repoRoot),\n };\n return {\n extensions: assembleExtensions({\n ...common,\n autoStop: context.options.autoStop,\n mute: context.options.mute,\n workflowExtension: context.workflowExtension,\n }),\n childExtensions: assembleChildExtensions({\n ...common,\n agents: false,\n autoStop: false,\n mute: true,\n }),\n };\n}\n\nfunction modeSelection(options: HarnessOptions): ModeBuildSelection {\n return {\n majorMode: options.majorMode,\n domains: [...options.domains],\n profile: options.profile,\n preset: options.preset,\n mute: options.mute,\n autoStop: options.autoStop,\n agents: options.agents,\n mcp: options.mcp,\n };\n}\n\nfunction modeOutputName(selection: ModeBuildSelection): string {\n return [selection.majorMode, selection.mute ? 'mute' : undefined, selection.autoStop ? 'auto-stop' : undefined]\n .filter((value): value is string => Boolean(value))\n .join('.');\n}\n\nfunction manifestPathFor(bundle: string): string {\n return bundle.replace(/\\.mjs$/, '.manifest.json');\n}\n\n/**\n * Emits one named mode extension and its original-path resource manifest.\n *\n * Extension code lives in dist while graph fingerprints remain in cache. Skill\n * loading never follows the bundle's import.meta.url: Pi receives the exact\n * original SKILL.md paths recorded here and in harness state.\n */\nexport async function compileModeExtension(options: ModeExtensionBuildOptions): Promise<{\n bundle: string;\n manifest: string;\n}> {\n const extensionPaths = options.extensionPaths.map((entry) => path.resolve(entry));\n const selection = { ...options.selection, domains: [...options.selection.domains] };\n const location = resolveSyncLocation(options.repoRoot);\n const bundle = await compileExtensionSet(\n extensionPaths,\n options.cacheDirectory ?? path.join(location.directory, EXTENSION_CACHE_DIRECTORY),\n {\n outputDirectory: options.outputDirectory ?? path.join(location.directory, MODE_DIST_DIRECTORY),\n outputName: options.outputName ?? modeOutputName(selection),\n repositoryRoot: options.repoRoot,\n sharedCacheDirectory: options.sharedCacheDirectory ?? location.sharedCacheDirectory,\n },\n );\n const manifest = manifestPathFor(bundle);\n const contents: ModeBuildManifest = {\n version: MODE_MANIFEST_VERSION,\n artifact: bundle,\n selection,\n extensionPaths,\n childExtensionPaths: (options.childExtensionPaths ?? []).map((entry) => path.resolve(entry)),\n resources: {\n skillPaths: (options.skillPaths ?? []).map((entry) => path.resolve(entry)),\n pluginRoots: (options.pluginRoots ?? []).map((entry) => path.resolve(entry)),\n },\n };\n writeFileAtomic(manifest, `${JSON.stringify(contents, null, 2)}\\n`);\n return { bundle, manifest };\n}\n\n/** Compiles the exact Pi load order used by the selected launch matrix. */\nexport async function buildRuntimeBundle(\n context: HarnessContext,\n plan: RuntimeExtensionPlan = createRuntimeExtensionPlan(context),\n location = resolveSyncLocation(context.options.repoRoot),\n): Promise<RuntimeBundleBuild> {\n const built = await compileModeExtension({\n repoRoot: context.options.repoRoot,\n cacheDirectory: path.join(location.directory, EXTENSION_CACHE_DIRECTORY),\n outputDirectory: path.join(location.directory, MODE_DIST_DIRECTORY),\n sharedCacheDirectory: location.sharedCacheDirectory,\n selection: modeSelection(context.options),\n extensionPaths: [...plan.extensions].reverse(),\n childExtensionPaths: plan.childExtensions,\n skillPaths: context.resources.skillDirectories,\n pluginRoots: context.plugins.map((plugin) => plugin.directory),\n });\n return { ...plan, ...built };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { SyncLocation } from "./syncLocation.cjs";
|
|
1
2
|
import { HarnessContext } from "./harnessContext.cjs";
|
|
2
3
|
|
|
3
|
-
//#region src/
|
|
4
|
+
//#region src/adapters/runtimeBundle.d.ts
|
|
4
5
|
interface RuntimeExtensionPlan {
|
|
5
6
|
/** Pi CLI order. Pi evaluates explicit extension arguments in reverse. */
|
|
6
7
|
extensions: string[];
|
|
@@ -43,6 +44,7 @@ interface ModeExtensionBuildOptions {
|
|
|
43
44
|
outputName?: string;
|
|
44
45
|
cacheDirectory?: string;
|
|
45
46
|
outputDirectory?: string;
|
|
47
|
+
sharedCacheDirectory?: string;
|
|
46
48
|
}
|
|
47
49
|
/** Resolves the parent and detached-child extension lists for one launch. */
|
|
48
50
|
declare function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan;
|
|
@@ -58,7 +60,7 @@ declare function compileModeExtension(options: ModeExtensionBuildOptions): Promi
|
|
|
58
60
|
manifest: string;
|
|
59
61
|
}>;
|
|
60
62
|
/** Compiles the exact Pi load order used by the selected launch matrix. */
|
|
61
|
-
declare function buildRuntimeBundle(context: HarnessContext, plan?: RuntimeExtensionPlan): Promise<RuntimeBundleBuild>;
|
|
63
|
+
declare function buildRuntimeBundle(context: HarnessContext, plan?: RuntimeExtensionPlan, location?: SyncLocation): Promise<RuntimeBundleBuild>;
|
|
62
64
|
//#endregion
|
|
63
65
|
export { ModeBuildManifest, ModeBuildSelection, ModeExtensionBuildOptions, RuntimeBundleBuild, RuntimeExtensionPlan, buildRuntimeBundle, compileModeExtension, createRuntimeExtensionPlan };
|
|
64
66
|
//# sourceMappingURL=runtimeBundle.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeBundle.d.cts","names":[],"sources":["../../src/adapters/runtimeBundle.ts"],"mappings":";;;;UAYiB,oBAAA;;EAEf,UAAA;EACA,eAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,oBAAA;EAC1C,MAAA;EACA,QAAA;AAAA;AAAA,UAGe,kBAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA,GAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA;EACA,QAAA;EACA,SAAA,EAAW,kBAAA;EAXX;EAaA,cAAA;EAXA;EAaA,mBAAA;EACA,SAAA;IAXA,0EAaE,UAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,yBAAA;EACf,QAAA;EACA,SAAA,EAAW,kBAAA;EACX,cAAA;EACA,mBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;AAAA;;iBAIc,0BAAA,CAA2B,OAAA,EAAS,cAAA,GAAiB,oBAAA;;;;;;;;iBAwD/C,oBAAA,CAAqB,OAAA,EAAS,yBAAA,GAA4B,OAAA;EAC9E,MAAA;EACA,QAAA;AAAA;;iBAgCoB,kBAAA,CACpB,OAAA,EAAS,cAAA,EACT,IAAA,GAAM,oBAAA,EACN,QAAA,GADgE,YAAA,GAE/D,OAAA,CAAQ,kBAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { SyncLocation } from "./syncLocation.mjs";
|
|
1
2
|
import { HarnessContext } from "./harnessContext.mjs";
|
|
2
3
|
|
|
3
|
-
//#region src/
|
|
4
|
+
//#region src/adapters/runtimeBundle.d.ts
|
|
4
5
|
interface RuntimeExtensionPlan {
|
|
5
6
|
/** Pi CLI order. Pi evaluates explicit extension arguments in reverse. */
|
|
6
7
|
extensions: string[];
|
|
@@ -43,6 +44,7 @@ interface ModeExtensionBuildOptions {
|
|
|
43
44
|
outputName?: string;
|
|
44
45
|
cacheDirectory?: string;
|
|
45
46
|
outputDirectory?: string;
|
|
47
|
+
sharedCacheDirectory?: string;
|
|
46
48
|
}
|
|
47
49
|
/** Resolves the parent and detached-child extension lists for one launch. */
|
|
48
50
|
declare function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan;
|
|
@@ -58,7 +60,7 @@ declare function compileModeExtension(options: ModeExtensionBuildOptions): Promi
|
|
|
58
60
|
manifest: string;
|
|
59
61
|
}>;
|
|
60
62
|
/** Compiles the exact Pi load order used by the selected launch matrix. */
|
|
61
|
-
declare function buildRuntimeBundle(context: HarnessContext, plan?: RuntimeExtensionPlan): Promise<RuntimeBundleBuild>;
|
|
63
|
+
declare function buildRuntimeBundle(context: HarnessContext, plan?: RuntimeExtensionPlan, location?: SyncLocation): Promise<RuntimeBundleBuild>;
|
|
62
64
|
//#endregion
|
|
63
65
|
export { ModeBuildManifest, ModeBuildSelection, ModeExtensionBuildOptions, RuntimeBundleBuild, RuntimeExtensionPlan, buildRuntimeBundle, compileModeExtension, createRuntimeExtensionPlan };
|
|
64
66
|
//# sourceMappingURL=runtimeBundle.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeBundle.d.mts","names":[],"sources":["../../src/adapters/runtimeBundle.ts"],"mappings":";;;;UAYiB,oBAAA;;EAEf,UAAA;EACA,eAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,oBAAA;EAC1C,MAAA;EACA,QAAA;AAAA;AAAA,UAGe,kBAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,MAAA;EACA,IAAA;EACA,QAAA;EACA,MAAA;EACA,GAAA;AAAA;AAAA,UAGe,iBAAA;EACf,OAAA;EACA,QAAA;EACA,SAAA,EAAW,kBAAA;EAXX;EAaA,cAAA;EAXA;EAaA,mBAAA;EACA,SAAA;IAXA,0EAaE,UAAA;IACA,WAAA;EAAA;AAAA;AAAA,UAIa,yBAAA;EACf,QAAA;EACA,SAAA,EAAW,kBAAA;EACX,cAAA;EACA,mBAAA;EACA,UAAA;EACA,WAAA;EACA,UAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;AAAA;;iBAIc,0BAAA,CAA2B,OAAA,EAAS,cAAA,GAAiB,oBAAA;;;;;;;;iBAwD/C,oBAAA,CAAqB,OAAA,EAAS,yBAAA,GAA4B,OAAA;EAC9E,MAAA;EACA,QAAA;AAAA;;iBAgCoB,kBAAA,CACpB,OAAA,EAAS,cAAA,EACT,IAAA,GAAM,oBAAA,EACN,QAAA,GADgE,YAAA,GAE/D,OAAA,CAAQ,kBAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{resolveSyncLocation as e}from"./syncLocation.mjs";import{writeFileAtomic as t}from"./serialization/json.mjs";import"../utils/index.mjs";import{assembleChildExtensions as n,assembleExtensions as r,createLayerResolvers as i}from"../services/extensionAssembler.mjs";import{compileExtensionSet as a}from"./extensionCompiler.mjs";import o from"node:path";const s=`cache`,c=`dist`;function l(e){let t={agents:e.options.agents,preset:e.options.preset,mcpEntry:e.mcpEntry,personaEntry:e.personaEntry,layers:e.selectedLayers,majorModesConfig:e.majorModesConfig,resolvers:i(e.options.repoRoot)};return{extensions:r({...t,autoStop:e.options.autoStop,mute:e.options.mute,workflowExtension:e.workflowExtension}),childExtensions:n({...t,agents:!1,autoStop:!1,mute:!0})}}function u(e){return{majorMode:e.majorMode,domains:[...e.domains],profile:e.profile,preset:e.preset,mute:e.mute,autoStop:e.autoStop,agents:e.agents,mcp:e.mcp}}function d(e){return[e.majorMode,e.mute?`mute`:void 0,e.autoStop?`auto-stop`:void 0].filter(e=>!!e).join(`.`)}function f(e){return e.replace(/\.mjs$/,`.manifest.json`)}async function p(n){let r=n.extensionPaths.map(e=>o.resolve(e)),i={...n.selection,domains:[...n.selection.domains]},l=e(n.repoRoot),u=await a(r,n.cacheDirectory??o.join(l.directory,s),{outputDirectory:n.outputDirectory??o.join(l.directory,c),outputName:n.outputName??d(i),repositoryRoot:n.repoRoot,sharedCacheDirectory:n.sharedCacheDirectory??l.sharedCacheDirectory}),p=f(u),m={version:1,artifact:u,selection:i,extensionPaths:r,childExtensionPaths:(n.childExtensionPaths??[]).map(e=>o.resolve(e)),resources:{skillPaths:(n.skillPaths??[]).map(e=>o.resolve(e)),pluginRoots:(n.pluginRoots??[]).map(e=>o.resolve(e))}};return t(p,`${JSON.stringify(m,null,2)}\n`),{bundle:u,manifest:p}}async function m(t,n=l(t),r=e(t.options.repoRoot)){let i=await p({repoRoot:t.options.repoRoot,cacheDirectory:o.join(r.directory,s),outputDirectory:o.join(r.directory,c),sharedCacheDirectory:r.sharedCacheDirectory,selection:u(t.options),extensionPaths:[...n.extensions].reverse(),childExtensionPaths:n.childExtensions,skillPaths:t.resources.skillDirectories,pluginRoots:t.plugins.map(e=>e.directory)});return{...n,...i}}export{m as buildRuntimeBundle,p as compileModeExtension,l as createRuntimeExtensionPlan};
|
|
2
|
+
//# sourceMappingURL=runtimeBundle.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeBundle.mjs","names":[],"sources":["../../src/adapters/runtimeBundle.ts"],"sourcesContent":["import path from 'node:path';\nimport type { HarnessOptions } from '../types/interfaces/index.ts';\nimport { writeFileAtomic } from '../utils/index.ts';\nimport { assembleChildExtensions, assembleExtensions, createLayerResolvers } from '../services/extensionAssembler.ts';\nimport { compileExtensionSet } from './extensionCompiler.ts';\nimport type { HarnessContext } from './harnessContext.ts';\nimport { resolveSyncLocation } from './syncLocation.ts';\n\nconst EXTENSION_CACHE_DIRECTORY = 'cache';\nconst MODE_DIST_DIRECTORY = 'dist';\nconst MODE_MANIFEST_VERSION = 1;\n\nexport interface RuntimeExtensionPlan {\n /** Pi CLI order. Pi evaluates explicit extension arguments in reverse. */\n extensions: string[];\n childExtensions: string[];\n}\n\nexport interface RuntimeBundleBuild extends RuntimeExtensionPlan {\n bundle: string;\n manifest: string;\n}\n\nexport interface ModeBuildSelection {\n majorMode: string;\n domains: string[];\n profile?: string;\n preset: string;\n mute: boolean;\n autoStop: boolean;\n agents: boolean;\n mcp: boolean;\n}\n\nexport interface ModeBuildManifest {\n version: number;\n artifact: string;\n selection: ModeBuildSelection;\n /** Original source entries in the order their factories activate. */\n extensionPaths: string[];\n /** Original source entries inherited by detached child agents. */\n childExtensionPaths: string[];\n resources: {\n /** Exact SKILL.md paths; never derived from the bundled artifact path. */\n skillPaths: string[];\n pluginRoots: string[];\n };\n}\n\nexport interface ModeExtensionBuildOptions {\n repoRoot: string;\n selection: ModeBuildSelection;\n extensionPaths: readonly string[];\n childExtensionPaths?: readonly string[];\n skillPaths?: readonly string[];\n pluginRoots?: readonly string[];\n outputName?: string;\n cacheDirectory?: string;\n outputDirectory?: string;\n sharedCacheDirectory?: string;\n}\n\n/** Resolves the parent and detached-child extension lists for one launch. */\nexport function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan {\n const common = {\n agents: context.options.agents,\n preset: context.options.preset,\n mcpEntry: context.mcpEntry,\n personaEntry: context.personaEntry,\n layers: context.selectedLayers,\n majorModesConfig: context.majorModesConfig,\n resolvers: createLayerResolvers(context.options.repoRoot),\n };\n return {\n extensions: assembleExtensions({\n ...common,\n autoStop: context.options.autoStop,\n mute: context.options.mute,\n workflowExtension: context.workflowExtension,\n }),\n childExtensions: assembleChildExtensions({\n ...common,\n agents: false,\n autoStop: false,\n mute: true,\n }),\n };\n}\n\nfunction modeSelection(options: HarnessOptions): ModeBuildSelection {\n return {\n majorMode: options.majorMode,\n domains: [...options.domains],\n profile: options.profile,\n preset: options.preset,\n mute: options.mute,\n autoStop: options.autoStop,\n agents: options.agents,\n mcp: options.mcp,\n };\n}\n\nfunction modeOutputName(selection: ModeBuildSelection): string {\n return [selection.majorMode, selection.mute ? 'mute' : undefined, selection.autoStop ? 'auto-stop' : undefined]\n .filter((value): value is string => Boolean(value))\n .join('.');\n}\n\nfunction manifestPathFor(bundle: string): string {\n return bundle.replace(/\\.mjs$/, '.manifest.json');\n}\n\n/**\n * Emits one named mode extension and its original-path resource manifest.\n *\n * Extension code lives in dist while graph fingerprints remain in cache. Skill\n * loading never follows the bundle's import.meta.url: Pi receives the exact\n * original SKILL.md paths recorded here and in harness state.\n */\nexport async function compileModeExtension(options: ModeExtensionBuildOptions): Promise<{\n bundle: string;\n manifest: string;\n}> {\n const extensionPaths = options.extensionPaths.map((entry) => path.resolve(entry));\n const selection = { ...options.selection, domains: [...options.selection.domains] };\n const location = resolveSyncLocation(options.repoRoot);\n const bundle = await compileExtensionSet(\n extensionPaths,\n options.cacheDirectory ?? path.join(location.directory, EXTENSION_CACHE_DIRECTORY),\n {\n outputDirectory: options.outputDirectory ?? path.join(location.directory, MODE_DIST_DIRECTORY),\n outputName: options.outputName ?? modeOutputName(selection),\n repositoryRoot: options.repoRoot,\n sharedCacheDirectory: options.sharedCacheDirectory ?? location.sharedCacheDirectory,\n },\n );\n const manifest = manifestPathFor(bundle);\n const contents: ModeBuildManifest = {\n version: MODE_MANIFEST_VERSION,\n artifact: bundle,\n selection,\n extensionPaths,\n childExtensionPaths: (options.childExtensionPaths ?? []).map((entry) => path.resolve(entry)),\n resources: {\n skillPaths: (options.skillPaths ?? []).map((entry) => path.resolve(entry)),\n pluginRoots: (options.pluginRoots ?? []).map((entry) => path.resolve(entry)),\n },\n };\n writeFileAtomic(manifest, `${JSON.stringify(contents, null, 2)}\\n`);\n return { bundle, manifest };\n}\n\n/** Compiles the exact Pi load order used by the selected launch matrix. */\nexport async function buildRuntimeBundle(\n context: HarnessContext,\n plan: RuntimeExtensionPlan = createRuntimeExtensionPlan(context),\n location = resolveSyncLocation(context.options.repoRoot),\n): Promise<RuntimeBundleBuild> {\n const built = await compileModeExtension({\n repoRoot: context.options.repoRoot,\n cacheDirectory: path.join(location.directory, EXTENSION_CACHE_DIRECTORY),\n outputDirectory: path.join(location.directory, MODE_DIST_DIRECTORY),\n sharedCacheDirectory: location.sharedCacheDirectory,\n selection: modeSelection(context.options),\n extensionPaths: [...plan.extensions].reverse(),\n childExtensionPaths: plan.childExtensions,\n skillPaths: context.resources.skillDirectories,\n pluginRoots: context.plugins.map((plugin) => plugin.directory),\n });\n return { ...plan, ...built };\n}\n"],"mappings":"qWAQA,MAAM,EAA4B,QAC5B,EAAsB,OAsD5B,SAAgB,EAA2B,EAA+C,CACxF,IAAM,EAAS,CACb,OAAQ,EAAQ,QAAQ,OACxB,OAAQ,EAAQ,QAAQ,OACxB,SAAU,EAAQ,SAClB,aAAc,EAAQ,aACtB,OAAQ,EAAQ,eAChB,iBAAkB,EAAQ,iBAC1B,UAAW,EAAqB,EAAQ,QAAQ,SAAS,CAC1D,CACD,MAAO,CACL,WAAY,EAAmB,CAC7B,GAAG,EACH,SAAU,EAAQ,QAAQ,SAC1B,KAAM,EAAQ,QAAQ,KACtB,kBAAmB,EAAQ,kBAC5B,CAAC,CACF,gBAAiB,EAAwB,CACvC,GAAG,EACH,OAAQ,GACR,SAAU,GACV,KAAM,GACP,CAAC,CACH,CAGH,SAAS,EAAc,EAA6C,CAClE,MAAO,CACL,UAAW,EAAQ,UACnB,QAAS,CAAC,GAAG,EAAQ,QAAQ,CAC7B,QAAS,EAAQ,QACjB,OAAQ,EAAQ,OAChB,KAAM,EAAQ,KACd,SAAU,EAAQ,SAClB,OAAQ,EAAQ,OAChB,IAAK,EAAQ,IACd,CAGH,SAAS,EAAe,EAAuC,CAC7D,MAAO,CAAC,EAAU,UAAW,EAAU,KAAO,OAAS,IAAA,GAAW,EAAU,SAAW,YAAc,IAAA,GAAU,CAC5G,OAAQ,GAA2B,EAAQ,EAAO,CAClD,KAAK,IAAI,CAGd,SAAS,EAAgB,EAAwB,CAC/C,OAAO,EAAO,QAAQ,SAAU,iBAAiB,CAUnD,eAAsB,EAAqB,EAGxC,CACD,IAAM,EAAiB,EAAQ,eAAe,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC3E,EAAY,CAAE,GAAG,EAAQ,UAAW,QAAS,CAAC,GAAG,EAAQ,UAAU,QAAQ,CAAE,CAC7E,EAAW,EAAoB,EAAQ,SAAS,CAChD,EAAS,MAAM,EACnB,EACA,EAAQ,gBAAkB,EAAK,KAAK,EAAS,UAAW,EAA0B,CAClF,CACE,gBAAiB,EAAQ,iBAAmB,EAAK,KAAK,EAAS,UAAW,EAAoB,CAC9F,WAAY,EAAQ,YAAc,EAAe,EAAU,CAC3D,eAAgB,EAAQ,SACxB,qBAAsB,EAAQ,sBAAwB,EAAS,qBAChE,CACF,CACK,EAAW,EAAgB,EAAO,CAClC,EAA8B,CAClC,QAAS,EACT,SAAU,EACV,YACA,iBACA,qBAAsB,EAAQ,qBAAuB,EAAE,EAAE,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC5F,UAAW,CACT,YAAa,EAAQ,YAAc,EAAE,EAAE,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC1E,aAAc,EAAQ,aAAe,EAAE,EAAE,IAAK,GAAU,EAAK,QAAQ,EAAM,CAAC,CAC7E,CACF,CAED,OADA,EAAgB,EAAU,GAAG,KAAK,UAAU,EAAU,KAAM,EAAE,CAAC,IAAI,CAC5D,CAAE,SAAQ,WAAU,CAI7B,eAAsB,EACpB,EACA,EAA6B,EAA2B,EAAQ,CAChE,EAAW,EAAoB,EAAQ,QAAQ,SAAS,CAC3B,CAC7B,IAAM,EAAQ,MAAM,EAAqB,CACvC,SAAU,EAAQ,QAAQ,SAC1B,eAAgB,EAAK,KAAK,EAAS,UAAW,EAA0B,CACxE,gBAAiB,EAAK,KAAK,EAAS,UAAW,EAAoB,CACnE,qBAAsB,EAAS,qBAC/B,UAAW,EAAc,EAAQ,QAAQ,CACzC,eAAgB,CAAC,GAAG,EAAK,WAAW,CAAC,SAAS,CAC9C,oBAAqB,EAAK,gBAC1B,WAAY,EAAQ,UAAU,iBAC9B,YAAa,EAAQ,QAAQ,IAAK,GAAW,EAAO,UAAU,CAC/D,CAAC,CACF,MAAO,CAAE,GAAG,EAAM,GAAG,EAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../_virtual/_rolldown/runtime.cjs`);let t=require(`node:path`);t=e.__toESM(t,1);let n=require(`node:fs`);n=e.__toESM(n,1);let r=require(`node:crypto`);function i(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function a(e,t={}){if(!n.default.existsSync(e))return t;let r=n.default.readFileSync(e,`utf8`).trim();return r?JSON.parse(r):t}function o(e,i){n.default.mkdirSync(t.default.dirname(e),{recursive:!0});let a=`${e}.${process.pid}.${(0,r.randomUUID)()}.tmp`;try{n.default.writeFileSync(a,i),n.default.renameSync(a,e)}catch(e){throw n.default.rmSync(a,{force:!0}),e}}function s(e,t){o(e,`${JSON.stringify(t,null,2)}\n`)}exports.isRecord=i,exports.readJson=a,exports.writeFileAtomic=o,exports.writeJson=s;
|
|
2
|
+
//# sourceMappingURL=json.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.cjs","names":["fs","path"],"sources":["../../../src/adapters/serialization/json.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * JSON state helpers for files the harness owns on disk.\n *\n * Compatibility frontends read these files while another repository's harness\n * may be writing them, so writes go through a rename rather than a truncate.\n */\n\nexport type JsonObject = Record<string, unknown>;\n\nconst ATOMIC_FILE_SUFFIX = '.tmp';\n\nexport function isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON object, treating a missing or empty file as the fallback. */\nexport function readJson(filePath: string, fallback: JsonObject = {}): JsonObject {\n if (!fs.existsSync(filePath)) return fallback;\n const content = fs.readFileSync(filePath, 'utf8').trim();\n return content ? (JSON.parse(content) as JsonObject) : fallback;\n}\n\n/**\n * Writes through a uniquely named temporary file in the same directory.\n *\n * The pid and a UUID are both in the name so two harnesses writing the same\n * target cannot collide on the temporary path, and a failed write cleans up\n * after itself rather than leaving the fragment behind.\n */\nexport function writeFileAtomic(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}${ATOMIC_FILE_SUFFIX}`;\n try {\n fs.writeFileSync(temporaryPath, content);\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\nexport function writeJson(filePath: string, value: JsonObject): void {\n writeFileAtomic(filePath, `${JSON.stringify(value, null, 2)}\\n`);\n}\n"],"mappings":"2KAeA,SAAgB,EAAS,EAAqC,CAC5D,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAI7E,SAAgB,EAAS,EAAkB,EAAuB,EAAE,CAAc,CAChF,GAAI,CAACA,EAAAA,QAAG,WAAW,EAAS,CAAE,OAAO,EACrC,IAAM,EAAUA,EAAAA,QAAG,aAAa,EAAU,OAAO,CAAC,MAAM,CACxD,OAAO,EAAW,KAAK,MAAM,EAAQ,CAAkB,EAUzD,SAAgB,EAAgB,EAAkB,EAAuB,CACvE,EAAA,QAAG,UAAUC,EAAAA,QAAK,QAAQ,EAAS,CAAE,CAAE,UAAW,GAAM,CAAC,CACzD,IAAM,EAAgB,GAAG,EAAS,GAAG,QAAQ,IAAI,IAAA,EAAA,EAAA,aAAe,OAChE,GAAI,CACF,EAAA,QAAG,cAAc,EAAe,EAAQ,CACxC,EAAA,QAAG,WAAW,EAAe,EAAS,OAC/B,EAAO,CAEd,MADA,EAAA,QAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACnC,GAIV,SAAgB,EAAU,EAAkB,EAAyB,CACnE,EAAgB,EAAU,GAAG,KAAK,UAAU,EAAO,KAAM,EAAE,CAAC,IAAI"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/adapters/serialization/json.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* JSON state helpers for files the harness owns on disk.
|
|
4
|
+
*
|
|
5
|
+
* Compatibility frontends read these files while another repository's harness
|
|
6
|
+
* may be writing them, so writes go through a rename rather than a truncate.
|
|
7
|
+
*/
|
|
8
|
+
type JsonObject = Record<string, unknown>;
|
|
9
|
+
declare function isRecord(value: unknown): value is JsonObject;
|
|
10
|
+
/** Reads a JSON object, treating a missing or empty file as the fallback. */
|
|
11
|
+
declare function readJson(filePath: string, fallback?: JsonObject): JsonObject;
|
|
12
|
+
/**
|
|
13
|
+
* Writes through a uniquely named temporary file in the same directory.
|
|
14
|
+
*
|
|
15
|
+
* The pid and a UUID are both in the name so two harnesses writing the same
|
|
16
|
+
* target cannot collide on the temporary path, and a failed write cleans up
|
|
17
|
+
* after itself rather than leaving the fragment behind.
|
|
18
|
+
*/
|
|
19
|
+
declare function writeFileAtomic(filePath: string, content: string): void;
|
|
20
|
+
declare function writeJson(filePath: string, value: JsonObject): void;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { JsonObject, isRecord, readJson, writeFileAtomic, writeJson };
|
|
23
|
+
//# sourceMappingURL=json.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.cts","names":[],"sources":["../../../src/adapters/serialization/json.ts"],"mappings":";;AAWA;;;;;KAAY,UAAA,GAAa,MAAA;AAAA,iBAIT,QAAA,CAAS,KAAA,YAAiB,KAAA,IAAS,UAAA;;iBAKnC,QAAA,CAAS,QAAA,UAAkB,QAAA,GAAU,UAAA,GAAkB,UAAA;;;;;;AAAvE;;iBAagB,eAAA,CAAgB,QAAA,UAAkB,OAAA;AAAA,iBAYlC,SAAA,CAAU,QAAA,UAAkB,KAAA,EAAO,UAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/adapters/serialization/json.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* JSON state helpers for files the harness owns on disk.
|
|
4
|
+
*
|
|
5
|
+
* Compatibility frontends read these files while another repository's harness
|
|
6
|
+
* may be writing them, so writes go through a rename rather than a truncate.
|
|
7
|
+
*/
|
|
8
|
+
type JsonObject = Record<string, unknown>;
|
|
9
|
+
declare function isRecord(value: unknown): value is JsonObject;
|
|
10
|
+
/** Reads a JSON object, treating a missing or empty file as the fallback. */
|
|
11
|
+
declare function readJson(filePath: string, fallback?: JsonObject): JsonObject;
|
|
12
|
+
/**
|
|
13
|
+
* Writes through a uniquely named temporary file in the same directory.
|
|
14
|
+
*
|
|
15
|
+
* The pid and a UUID are both in the name so two harnesses writing the same
|
|
16
|
+
* target cannot collide on the temporary path, and a failed write cleans up
|
|
17
|
+
* after itself rather than leaving the fragment behind.
|
|
18
|
+
*/
|
|
19
|
+
declare function writeFileAtomic(filePath: string, content: string): void;
|
|
20
|
+
declare function writeJson(filePath: string, value: JsonObject): void;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { JsonObject, isRecord, readJson, writeFileAtomic, writeJson };
|
|
23
|
+
//# sourceMappingURL=json.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.mts","names":[],"sources":["../../../src/adapters/serialization/json.ts"],"mappings":";;AAWA;;;;;KAAY,UAAA,GAAa,MAAA;AAAA,iBAIT,QAAA,CAAS,KAAA,YAAiB,KAAA,IAAS,UAAA;;iBAKnC,QAAA,CAAS,QAAA,UAAkB,QAAA,GAAU,UAAA,GAAkB,UAAA;;;;;;AAAvE;;iBAagB,eAAA,CAAgB,QAAA,UAAkB,OAAA;AAAA,iBAYlC,SAAA,CAAU,QAAA,UAAkB,KAAA,EAAO,UAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"node:path";import t from"node:fs";import{randomUUID as n}from"node:crypto";function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e,n={}){if(!t.existsSync(e))return n;let r=t.readFileSync(e,`utf8`).trim();return r?JSON.parse(r):n}function a(r,i){t.mkdirSync(e.dirname(r),{recursive:!0});let a=`${r}.${process.pid}.${n()}.tmp`;try{t.writeFileSync(a,i),t.renameSync(a,r)}catch(e){throw t.rmSync(a,{force:!0}),e}}function o(e,t){a(e,`${JSON.stringify(t,null,2)}\n`)}export{r as isRecord,i as readJson,a as writeFileAtomic,o as writeJson};
|
|
2
|
+
//# sourceMappingURL=json.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.mjs","names":[],"sources":["../../../src/adapters/serialization/json.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * JSON state helpers for files the harness owns on disk.\n *\n * Compatibility frontends read these files while another repository's harness\n * may be writing them, so writes go through a rename rather than a truncate.\n */\n\nexport type JsonObject = Record<string, unknown>;\n\nconst ATOMIC_FILE_SUFFIX = '.tmp';\n\nexport function isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Reads a JSON object, treating a missing or empty file as the fallback. */\nexport function readJson(filePath: string, fallback: JsonObject = {}): JsonObject {\n if (!fs.existsSync(filePath)) return fallback;\n const content = fs.readFileSync(filePath, 'utf8').trim();\n return content ? (JSON.parse(content) as JsonObject) : fallback;\n}\n\n/**\n * Writes through a uniquely named temporary file in the same directory.\n *\n * The pid and a UUID are both in the name so two harnesses writing the same\n * target cannot collide on the temporary path, and a failed write cleans up\n * after itself rather than leaving the fragment behind.\n */\nexport function writeFileAtomic(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const temporaryPath = `${filePath}.${process.pid}.${randomUUID()}${ATOMIC_FILE_SUFFIX}`;\n try {\n fs.writeFileSync(temporaryPath, content);\n fs.renameSync(temporaryPath, filePath);\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true });\n throw error;\n }\n}\n\nexport function writeJson(filePath: string, value: JsonObject): void {\n writeFileAtomic(filePath, `${JSON.stringify(value, null, 2)}\\n`);\n}\n"],"mappings":"yFAeA,SAAgB,EAAS,EAAqC,CAC5D,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAI7E,SAAgB,EAAS,EAAkB,EAAuB,EAAE,CAAc,CAChF,GAAI,CAAC,EAAG,WAAW,EAAS,CAAE,OAAO,EACrC,IAAM,EAAU,EAAG,aAAa,EAAU,OAAO,CAAC,MAAM,CACxD,OAAO,EAAW,KAAK,MAAM,EAAQ,CAAkB,EAUzD,SAAgB,EAAgB,EAAkB,EAAuB,CACvE,EAAG,UAAU,EAAK,QAAQ,EAAS,CAAE,CAAE,UAAW,GAAM,CAAC,CACzD,IAAM,EAAgB,GAAG,EAAS,GAAG,QAAQ,IAAI,GAAG,GAAY,OAChE,GAAI,CACF,EAAG,cAAc,EAAe,EAAQ,CACxC,EAAG,WAAW,EAAe,EAAS,OAC/B,EAAO,CAEd,MADA,EAAG,OAAO,EAAe,CAAE,MAAO,GAAM,CAAC,CACnC,GAIV,SAAgB,EAAU,EAAkB,EAAyB,CACnE,EAAgB,EAAU,GAAG,KAAK,UAAU,EAAO,KAAM,EAAE,CAAC,IAAI"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`);let t=require(`node:url`),n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`node:crypto`);i=e.__toESM(i,1);const a=`manifest.json`,o=`owner.json`,s=/^[a-f0-9]{64}$/u;function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(e){return i.default.createHash(`sha256`).update(e).digest(`hex`)}function u(e){if(e===``||n.default.isAbsolute(e))return;let t=n.default.normalize(e);return t===`..`||t.startsWith(`..${n.default.sep}`)?void 0:t}function d(e){if(!c(e)||e.schema!==1||typeof e.key!=`string`||!s.test(e.key)||typeof e.lookupKey!=`string`||!s.test(e.lookupKey)||typeof e.entry!=`string`||!Array.isArray(e.inputs)||!Array.isArray(e.artifacts))return;let t=[];for(let r of e.inputs){if(!c(r)||typeof r.logicalPath!=`string`||typeof r.sha256!=`string`||r.sha256!==``&&!s.test(r.sha256)||typeof r.token!=`string`||r.sourcePath!==void 0&&(typeof r.sourcePath!=`string`||!n.default.isAbsolute(r.sourcePath)))return;t.push({logicalPath:r.logicalPath,sha256:r.sha256,token:r.token,...typeof r.sourcePath==`string`?{sourcePath:r.sourcePath}:{}})}let r=[];for(let t of e.artifacts){if(!c(t)||typeof t.path!=`string`||typeof t.sha256!=`string`||!s.test(t.sha256)||!u(t.path))return;r.push({path:t.path,sha256:t.sha256})}if(u(e.entry))return{schema:1,key:e.key,lookupKey:e.lookupKey,entry:e.entry,inputs:t,artifacts:r}}function f(e){try{return JSON.parse(r.default.readFileSync(e,`utf8`))}catch{return}}function p(e,t){r.default.mkdirSync(n.default.dirname(e),{recursive:!0,mode:448});let a=`${e}.${process.pid}.${i.default.randomUUID()}.tmp`;try{r.default.writeFileSync(a,t,{mode:384}),r.default.renameSync(a,e),r.default.chmodSync(e,384)}catch(e){throw r.default.rmSync(a,{force:!0}),e}}function m(e,t){return n.default.join(e,`index`,`${t}.json`)}function h(e,t){let n=f(m(e,t));return!c(n)||n.schema!==1||!Array.isArray(n.keys)?{schema:1,keys:[]}:{schema:1,keys:n.keys.filter(e=>typeof e==`string`)}}function g(e,t,n){let r=[n,...h(e,t).keys.filter(e=>e!==n)];p(m(e,t),`${JSON.stringify({schema:1,keys:r},null,2)}\n`)}function _(e,t){return n.default.join(e,`objects`,t)}function v(e,t){let i=u(t.path);if(i)try{if(r.default.lstatSync(e).isSymbolicLink())return;let a=n.default.join(e,i);if(r.default.lstatSync(a).isSymbolicLink())return;let o=r.default.realpathSync(e),s=r.default.realpathSync(a),c=n.default.relative(o,s);if(c.startsWith(`..`)||n.default.isAbsolute(c))return;let u=r.default.readFileSync(s);return l(u)===t.sha256?u:void 0}catch{return}}function y(e,t,i){if(s.test(t))for(let o of h(e,t).keys){if(!s.test(o))continue;let c=_(e,o),u=d(f(n.default.join(c,a)));if(!u||u.key!==o||u.lookupKey!==t||!x(u)||u.artifacts.some(e=>v(c,e)===void 0))continue;let p=new Map,m=!0;for(let e of u.inputs){let t=i(e);if(!t){m=!1;break}if(e.sha256!==``)try{if(l(r.default.readFileSync(t))!==e.sha256){m=!1;break}}catch{m=!1;break}p.set(e.token,t)}if(m)return{directory:c,manifest:u,replacements:p}}}function b(e,t){return l(JSON.stringify({schema:1,lookupKey:e.lookupKey,entry:e.entry,inputs:e.inputs,artifacts:t}))}function x(e){return e.key===b({lookupKey:e.lookupKey,entry:e.entry,inputs:e.inputs,artifacts:new Map},e.artifacts)}function S(e,t){let r=d(f(n.default.join(e,a)));return!r||r.key!==t.key||!x(r)?!1:t.artifacts.every(t=>v(e,t)!==void 0)}function C(e){if(!s.test(e.lookupKey))throw Error(`Shared build lookup key must be a full SHA-256 digest: ${e.lookupKey}`);if(e.inputs.some(e=>e.sourcePath!==void 0&&!n.default.isAbsolute(e.sourcePath)))throw Error(`Shared build external source paths must be absolute`);let t=[...e.artifacts.entries()].map(([e,t])=>{let n=u(e);if(!n)throw Error(`Shared build artifact escapes its object: ${e}`);return{path:n,sha256:l(t)}}).sort((e,t)=>e.path.localeCompare(t.path)),o=[...e.inputs].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)),c=b({...e,inputs:o},t),d={schema:1,key:c,lookupKey:e.lookupKey,entry:e.entry,inputs:o,artifacts:t},f=_(e.cacheDirectory,c);if(r.default.existsSync(f)&&!S(f,d)&&r.default.rmSync(f,{recursive:!0,force:!0}),!r.default.existsSync(f)){let t=`${f}.${process.pid}.${i.default.randomUUID()}.tmp`;try{r.default.mkdirSync(t,{recursive:!0,mode:448});for(let[i,a]of e.artifacts){let e=u(i);if(!e)throw Error(`Shared build artifact escapes its object: ${i}`);let o=n.default.join(t,e);r.default.mkdirSync(n.default.dirname(o),{recursive:!0,mode:448}),r.default.writeFileSync(o,a,{mode:384})}r.default.writeFileSync(n.default.join(t,a),`${JSON.stringify(d,null,2)}\n`,{mode:384}),r.default.mkdirSync(n.default.dirname(f),{recursive:!0,mode:448});try{r.default.renameSync(t,f)}catch(e){if(!r.default.existsSync(f))throw e}}finally{r.default.rmSync(t,{recursive:!0,force:!0})}}return g(e.cacheDirectory,e.lookupKey,c),d}function w(e,r){let i=[...e.replacements.entries()].sort(([e],[t])=>t.length-e.length);for(let a of e.manifest.artifacts){let o=v(e.directory,a);if(!o)throw Error(`Shared build artifact is corrupt: ${a.path}`);let s=o;if(a.path.endsWith(`.mjs`)){let e=o.toString(`utf8`);for(let[n,r]of i)e=e.replaceAll(`${n}:url`,(0,t.pathToFileURL)(r).href).replaceAll(n,r);if(e.includes(`__DOOMPI_PATH_`))throw Error(`Shared build left unresolved path tokens in ${a.path}`);s=e}p(n.default.join(r,a.path),s)}return n.default.join(r,e.manifest.entry)}function T(e){try{return process.kill(e,0),!0}catch{return!1}}function E(e){let t=f(n.default.join(e,o));return!c(t)||typeof t.pid!=`number`||typeof t.createdAt!=`number`?!0:Date.now()-t.createdAt>3e5&&!T(t.pid)}async function D(e){await new Promise(t=>setTimeout(t,e))}async function O(e,t,i){if(!s.test(t))throw Error(`Shared build lock key must be a full SHA-256 digest: ${t}`);let a=n.default.join(e,`locks`,`${t}.lock`);r.default.mkdirSync(n.default.dirname(a),{recursive:!0,mode:448});let c=Date.now();for(;;)try{r.default.mkdirSync(a,{mode:448}),r.default.writeFileSync(n.default.join(a,o),`${JSON.stringify({pid:process.pid,createdAt:Date.now()})}\n`,{mode:384});break}catch(e){if(!(e instanceof Error)||!(`code`in e)||e.code!==`EEXIST`)throw e;if(E(a)){r.default.rmSync(a,{recursive:!0,force:!0});continue}if(Date.now()-c>=6e4)throw Error(`Timed out waiting for shared build lock ${t}`);await D(25)}try{return await i()}finally{r.default.rmSync(a,{recursive:!0,force:!0})}}exports.contentSha256=l,exports.findSharedBuild=y,exports.materializeSharedBuild=w,exports.publishSharedBuild=C,exports.withSharedBuildLock=O;
|
|
2
|
+
//# sourceMappingURL=sharedBuildCache.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedBuildCache.cjs","names":["crypto","path","fs"],"sources":["../../src/adapters/sharedBuildCache.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nconst SHARED_BUILD_SCHEMA = 1;\nconst OBJECTS_DIRECTORY = 'objects';\nconst INDEX_DIRECTORY = 'index';\nconst LOCKS_DIRECTORY = 'locks';\nconst MANIFEST_FILE = 'manifest.json';\nconst OWNER_FILE = 'owner.json';\nconst LOCK_STALE_MS = 5 * 60_000;\nconst LOCK_TIMEOUT_MS = 60_000;\nconst LOCK_RETRY_MS = 25;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst PRIVATE_FILE_MODE = 0o600;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/u;\n\nexport interface SharedBuildInput {\n logicalPath: string;\n sha256: string;\n token: string;\n /** Canonical source path for inputs outside the synchronized repository. */\n sourcePath?: string;\n}\n\nexport interface SharedBuildArtifact {\n path: string;\n sha256: string;\n}\n\nexport interface SharedBuildManifest {\n schema: number;\n key: string;\n lookupKey: string;\n entry: string;\n inputs: SharedBuildInput[];\n artifacts: SharedBuildArtifact[];\n}\n\nexport interface ResolvedSharedBuild {\n directory: string;\n manifest: SharedBuildManifest;\n replacements: ReadonlyMap<string, string>;\n}\n\ninterface SharedBuildIndex {\n schema: number;\n keys: string[];\n}\n\nexport interface PublishSharedBuildOptions {\n cacheDirectory: string;\n lookupKey: string;\n entry: string;\n inputs: SharedBuildInput[];\n artifacts: ReadonlyMap<string, string | Uint8Array>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function contentSha256(contents: string | Uint8Array): string {\n return crypto.createHash('sha256').update(contents).digest('hex');\n}\n\nfunction safeRelativePath(value: string): string | undefined {\n if (value === '' || path.isAbsolute(value)) return undefined;\n const normalized = path.normalize(value);\n return normalized === '..' || normalized.startsWith(`..${path.sep}`) ? undefined : normalized;\n}\n\nfunction parseManifest(value: unknown): SharedBuildManifest | undefined {\n if (\n !isRecord(value) ||\n value.schema !== SHARED_BUILD_SCHEMA ||\n typeof value.key !== 'string' ||\n !SHA256_PATTERN.test(value.key) ||\n typeof value.lookupKey !== 'string' ||\n !SHA256_PATTERN.test(value.lookupKey) ||\n typeof value.entry !== 'string' ||\n !Array.isArray(value.inputs) ||\n !Array.isArray(value.artifacts)\n ) {\n return undefined;\n }\n const inputs: SharedBuildInput[] = [];\n for (const input of value.inputs) {\n if (\n !isRecord(input) ||\n typeof input.logicalPath !== 'string' ||\n typeof input.sha256 !== 'string' ||\n (input.sha256 !== '' && !SHA256_PATTERN.test(input.sha256)) ||\n typeof input.token !== 'string' ||\n (input.sourcePath !== undefined && (typeof input.sourcePath !== 'string' || !path.isAbsolute(input.sourcePath)))\n ) {\n return undefined;\n }\n inputs.push({\n logicalPath: input.logicalPath,\n sha256: input.sha256,\n token: input.token,\n ...(typeof input.sourcePath === 'string' ? { sourcePath: input.sourcePath } : {}),\n });\n }\n const artifacts: SharedBuildArtifact[] = [];\n for (const artifact of value.artifacts) {\n if (\n !isRecord(artifact) ||\n typeof artifact.path !== 'string' ||\n typeof artifact.sha256 !== 'string' ||\n !SHA256_PATTERN.test(artifact.sha256)\n ) {\n return undefined;\n }\n if (!safeRelativePath(artifact.path)) return undefined;\n artifacts.push({ path: artifact.path, sha256: artifact.sha256 });\n }\n if (!safeRelativePath(value.entry)) return undefined;\n return {\n schema: SHARED_BUILD_SCHEMA,\n key: value.key,\n lookupKey: value.lookupKey,\n entry: value.entry,\n inputs,\n artifacts,\n };\n}\n\nfunction readJson(target: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(target, 'utf8')) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction writeAtomic(target: string, contents: string | Uint8Array): void {\n fs.mkdirSync(path.dirname(target), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n const temporary = `${target}.${process.pid}.${crypto.randomUUID()}.tmp`;\n try {\n fs.writeFileSync(temporary, contents, { mode: PRIVATE_FILE_MODE });\n fs.renameSync(temporary, target);\n fs.chmodSync(target, PRIVATE_FILE_MODE);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n throw error;\n }\n}\n\nfunction indexPath(cacheDirectory: string, lookupKey: string): string {\n return path.join(cacheDirectory, INDEX_DIRECTORY, `${lookupKey}.json`);\n}\n\nfunction readIndex(cacheDirectory: string, lookupKey: string): SharedBuildIndex {\n const parsed = readJson(indexPath(cacheDirectory, lookupKey));\n if (!isRecord(parsed) || parsed.schema !== SHARED_BUILD_SCHEMA || !Array.isArray(parsed.keys)) {\n return { schema: SHARED_BUILD_SCHEMA, keys: [] };\n }\n return {\n schema: SHARED_BUILD_SCHEMA,\n keys: parsed.keys.filter((key): key is string => typeof key === 'string'),\n };\n}\n\nfunction writeIndex(cacheDirectory: string, lookupKey: string, key: string): void {\n const current = readIndex(cacheDirectory, lookupKey);\n const keys = [key, ...current.keys.filter((candidate) => candidate !== key)];\n writeAtomic(\n indexPath(cacheDirectory, lookupKey),\n `${JSON.stringify({ schema: SHARED_BUILD_SCHEMA, keys }, null, 2)}\\n`,\n );\n}\n\nfunction objectDirectory(cacheDirectory: string, key: string): string {\n return path.join(cacheDirectory, OBJECTS_DIRECTORY, key);\n}\n\nfunction artifactBytes(directory: string, artifact: SharedBuildArtifact): Buffer | undefined {\n const relative = safeRelativePath(artifact.path);\n if (!relative) return undefined;\n try {\n if (fs.lstatSync(directory).isSymbolicLink()) return undefined;\n const target = path.join(directory, relative);\n if (fs.lstatSync(target).isSymbolicLink()) return undefined;\n const canonicalDirectory = fs.realpathSync(directory);\n const canonicalTarget = fs.realpathSync(target);\n const confined = path.relative(canonicalDirectory, canonicalTarget);\n if (confined.startsWith('..') || path.isAbsolute(confined)) return undefined;\n const bytes = fs.readFileSync(canonicalTarget);\n return contentSha256(bytes) === artifact.sha256 ? bytes : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function findSharedBuild(\n cacheDirectory: string,\n lookupKey: string,\n resolveInput: (input: SharedBuildInput) => string | undefined,\n): ResolvedSharedBuild | undefined {\n if (!SHA256_PATTERN.test(lookupKey)) return undefined;\n for (const key of readIndex(cacheDirectory, lookupKey).keys) {\n if (!SHA256_PATTERN.test(key)) continue;\n const directory = objectDirectory(cacheDirectory, key);\n const manifest = parseManifest(readJson(path.join(directory, MANIFEST_FILE)));\n if (!manifest || manifest.key !== key || manifest.lookupKey !== lookupKey || !manifestKeyMatches(manifest))\n continue;\n if (manifest.artifacts.some((artifact) => artifactBytes(directory, artifact) === undefined)) continue;\n const replacements = new Map<string, string>();\n let valid = true;\n for (const input of manifest.inputs) {\n const target = resolveInput(input);\n if (!target) {\n valid = false;\n break;\n }\n if (input.sha256 !== '') {\n try {\n if (contentSha256(fs.readFileSync(target)) !== input.sha256) {\n valid = false;\n break;\n }\n } catch {\n valid = false;\n break;\n }\n }\n replacements.set(input.token, target);\n }\n if (valid) return { directory, manifest, replacements };\n }\n return undefined;\n}\n\nfunction manifestKey(\n options: Omit<PublishSharedBuildOptions, 'cacheDirectory'>,\n artifacts: SharedBuildArtifact[],\n): string {\n return contentSha256(\n JSON.stringify({\n schema: SHARED_BUILD_SCHEMA,\n lookupKey: options.lookupKey,\n entry: options.entry,\n inputs: options.inputs,\n artifacts,\n }),\n );\n}\n\nfunction manifestKeyMatches(manifest: SharedBuildManifest): boolean {\n return (\n manifest.key ===\n manifestKey(\n {\n lookupKey: manifest.lookupKey,\n entry: manifest.entry,\n inputs: manifest.inputs,\n artifacts: new Map(),\n },\n manifest.artifacts,\n )\n );\n}\n\nfunction sharedObjectMatches(directory: string, expected: SharedBuildManifest): boolean {\n const current = parseManifest(readJson(path.join(directory, MANIFEST_FILE)));\n if (!current || current.key !== expected.key || !manifestKeyMatches(current)) return false;\n return expected.artifacts.every((artifact) => artifactBytes(directory, artifact) !== undefined);\n}\n\nexport function publishSharedBuild(options: PublishSharedBuildOptions): SharedBuildManifest {\n if (!SHA256_PATTERN.test(options.lookupKey)) {\n throw new Error(`Shared build lookup key must be a full SHA-256 digest: ${options.lookupKey}`);\n }\n if (options.inputs.some((input) => input.sourcePath !== undefined && !path.isAbsolute(input.sourcePath))) {\n throw new Error('Shared build external source paths must be absolute');\n }\n const artifacts = [...options.artifacts.entries()]\n .map(([artifactPath, contents]) => {\n const relative = safeRelativePath(artifactPath);\n if (!relative) throw new Error(`Shared build artifact escapes its object: ${artifactPath}`);\n return { path: relative, sha256: contentSha256(contents) };\n })\n .sort((left, right) => left.path.localeCompare(right.path));\n const inputs = [...options.inputs].sort((left, right) => left.logicalPath.localeCompare(right.logicalPath));\n const key = manifestKey({ ...options, inputs }, artifacts);\n const manifest: SharedBuildManifest = {\n schema: SHARED_BUILD_SCHEMA,\n key,\n lookupKey: options.lookupKey,\n entry: options.entry,\n inputs,\n artifacts,\n };\n const finalDirectory = objectDirectory(options.cacheDirectory, key);\n if (fs.existsSync(finalDirectory) && !sharedObjectMatches(finalDirectory, manifest)) {\n fs.rmSync(finalDirectory, { recursive: true, force: true });\n }\n if (!fs.existsSync(finalDirectory)) {\n const temporaryDirectory = `${finalDirectory}.${process.pid}.${crypto.randomUUID()}.tmp`;\n try {\n fs.mkdirSync(temporaryDirectory, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n for (const [artifactPath, contents] of options.artifacts) {\n const relative = safeRelativePath(artifactPath);\n if (!relative) throw new Error(`Shared build artifact escapes its object: ${artifactPath}`);\n const target = path.join(temporaryDirectory, relative);\n fs.mkdirSync(path.dirname(target), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n fs.writeFileSync(target, contents, { mode: PRIVATE_FILE_MODE });\n }\n fs.writeFileSync(path.join(temporaryDirectory, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\\n`, {\n mode: PRIVATE_FILE_MODE,\n });\n fs.mkdirSync(path.dirname(finalDirectory), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n try {\n fs.renameSync(temporaryDirectory, finalDirectory);\n } catch (error) {\n if (!fs.existsSync(finalDirectory)) throw error;\n }\n } finally {\n fs.rmSync(temporaryDirectory, { recursive: true, force: true });\n }\n }\n writeIndex(options.cacheDirectory, options.lookupKey, key);\n return manifest;\n}\n\nexport function materializeSharedBuild(build: ResolvedSharedBuild, outputDirectory: string): string {\n const replacements = [...build.replacements.entries()].sort(([left], [right]) => right.length - left.length);\n for (const artifact of build.manifest.artifacts) {\n const bytes = artifactBytes(build.directory, artifact);\n if (!bytes) throw new Error(`Shared build artifact is corrupt: ${artifact.path}`);\n let contents: string | Uint8Array = bytes;\n if (artifact.path.endsWith('.mjs')) {\n let source = bytes.toString('utf8');\n for (const [token, target] of replacements) {\n source = source.replaceAll(`${token}:url`, pathToFileURL(target).href).replaceAll(token, target);\n }\n if (source.includes('__DOOMPI_PATH_'))\n throw new Error(`Shared build left unresolved path tokens in ${artifact.path}`);\n contents = source;\n }\n writeAtomic(path.join(outputDirectory, artifact.path), contents);\n }\n return path.join(outputDirectory, build.manifest.entry);\n}\n\nfunction processAlive(processId: number): boolean {\n try {\n process.kill(processId, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction lockIsStale(lockDirectory: string): boolean {\n const owner = readJson(path.join(lockDirectory, OWNER_FILE));\n if (!isRecord(owner) || typeof owner.pid !== 'number' || typeof owner.createdAt !== 'number') return true;\n return Date.now() - owner.createdAt > LOCK_STALE_MS && !processAlive(owner.pid);\n}\n\nasync function sleep(milliseconds: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport async function withSharedBuildLock<T>(\n cacheDirectory: string,\n lookupKey: string,\n operation: () => Promise<T>,\n): Promise<T> {\n if (!SHA256_PATTERN.test(lookupKey)) {\n throw new Error(`Shared build lock key must be a full SHA-256 digest: ${lookupKey}`);\n }\n const lockDirectory = path.join(cacheDirectory, LOCKS_DIRECTORY, `${lookupKey}.lock`);\n fs.mkdirSync(path.dirname(lockDirectory), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n const startedAt = Date.now();\n while (true) {\n try {\n fs.mkdirSync(lockDirectory, { mode: PRIVATE_DIRECTORY_MODE });\n fs.writeFileSync(\n path.join(lockDirectory, OWNER_FILE),\n `${JSON.stringify({ pid: process.pid, createdAt: Date.now() })}\\n`,\n { mode: PRIVATE_FILE_MODE },\n );\n break;\n } catch (error) {\n if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST') throw error;\n if (lockIsStale(lockDirectory)) {\n fs.rmSync(lockDirectory, { recursive: true, force: true });\n continue;\n }\n if (Date.now() - startedAt >= LOCK_TIMEOUT_MS) {\n throw new Error(`Timed out waiting for shared build lock ${lookupKey}`);\n }\n await sleep(LOCK_RETRY_MS);\n }\n }\n try {\n return await operation();\n } finally {\n fs.rmSync(lockDirectory, { recursive: true, force: true });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{pathToFileURL as e}from"node:url";import t from"node:path";import n from"node:fs";import r from"node:crypto";const i=`manifest.json`,a=`owner.json`,o=/^[a-f0-9]{64}$/u;function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function c(e){return r.createHash(`sha256`).update(e).digest(`hex`)}function l(e){if(e===``||t.isAbsolute(e))return;let n=t.normalize(e);return n===`..`||n.startsWith(`..${t.sep}`)?void 0:n}function u(e){if(!s(e)||e.schema!==1||typeof e.key!=`string`||!o.test(e.key)||typeof e.lookupKey!=`string`||!o.test(e.lookupKey)||typeof e.entry!=`string`||!Array.isArray(e.inputs)||!Array.isArray(e.artifacts))return;let n=[];for(let r of e.inputs){if(!s(r)||typeof r.logicalPath!=`string`||typeof r.sha256!=`string`||r.sha256!==``&&!o.test(r.sha256)||typeof r.token!=`string`||r.sourcePath!==void 0&&(typeof r.sourcePath!=`string`||!t.isAbsolute(r.sourcePath)))return;n.push({logicalPath:r.logicalPath,sha256:r.sha256,token:r.token,...typeof r.sourcePath==`string`?{sourcePath:r.sourcePath}:{}})}let r=[];for(let t of e.artifacts){if(!s(t)||typeof t.path!=`string`||typeof t.sha256!=`string`||!o.test(t.sha256)||!l(t.path))return;r.push({path:t.path,sha256:t.sha256})}if(l(e.entry))return{schema:1,key:e.key,lookupKey:e.lookupKey,entry:e.entry,inputs:n,artifacts:r}}function d(e){try{return JSON.parse(n.readFileSync(e,`utf8`))}catch{return}}function f(e,i){n.mkdirSync(t.dirname(e),{recursive:!0,mode:448});let a=`${e}.${process.pid}.${r.randomUUID()}.tmp`;try{n.writeFileSync(a,i,{mode:384}),n.renameSync(a,e),n.chmodSync(e,384)}catch(e){throw n.rmSync(a,{force:!0}),e}}function p(e,n){return t.join(e,`index`,`${n}.json`)}function m(e,t){let n=d(p(e,t));return!s(n)||n.schema!==1||!Array.isArray(n.keys)?{schema:1,keys:[]}:{schema:1,keys:n.keys.filter(e=>typeof e==`string`)}}function h(e,t,n){let r=[n,...m(e,t).keys.filter(e=>e!==n)];f(p(e,t),`${JSON.stringify({schema:1,keys:r},null,2)}\n`)}function g(e,n){return t.join(e,`objects`,n)}function _(e,r){let i=l(r.path);if(i)try{if(n.lstatSync(e).isSymbolicLink())return;let a=t.join(e,i);if(n.lstatSync(a).isSymbolicLink())return;let o=n.realpathSync(e),s=n.realpathSync(a),l=t.relative(o,s);if(l.startsWith(`..`)||t.isAbsolute(l))return;let u=n.readFileSync(s);return c(u)===r.sha256?u:void 0}catch{return}}function v(e,r,a){if(o.test(r))for(let s of m(e,r).keys){if(!o.test(s))continue;let l=g(e,s),f=u(d(t.join(l,i)));if(!f||f.key!==s||f.lookupKey!==r||!b(f)||f.artifacts.some(e=>_(l,e)===void 0))continue;let p=new Map,m=!0;for(let e of f.inputs){let t=a(e);if(!t){m=!1;break}if(e.sha256!==``)try{if(c(n.readFileSync(t))!==e.sha256){m=!1;break}}catch{m=!1;break}p.set(e.token,t)}if(m)return{directory:l,manifest:f,replacements:p}}}function y(e,t){return c(JSON.stringify({schema:1,lookupKey:e.lookupKey,entry:e.entry,inputs:e.inputs,artifacts:t}))}function b(e){return e.key===y({lookupKey:e.lookupKey,entry:e.entry,inputs:e.inputs,artifacts:new Map},e.artifacts)}function x(e,n){let r=u(d(t.join(e,i)));return!r||r.key!==n.key||!b(r)?!1:n.artifacts.every(t=>_(e,t)!==void 0)}function S(e){if(!o.test(e.lookupKey))throw Error(`Shared build lookup key must be a full SHA-256 digest: ${e.lookupKey}`);if(e.inputs.some(e=>e.sourcePath!==void 0&&!t.isAbsolute(e.sourcePath)))throw Error(`Shared build external source paths must be absolute`);let a=[...e.artifacts.entries()].map(([e,t])=>{let n=l(e);if(!n)throw Error(`Shared build artifact escapes its object: ${e}`);return{path:n,sha256:c(t)}}).sort((e,t)=>e.path.localeCompare(t.path)),s=[...e.inputs].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)),u=y({...e,inputs:s},a),d={schema:1,key:u,lookupKey:e.lookupKey,entry:e.entry,inputs:s,artifacts:a},f=g(e.cacheDirectory,u);if(n.existsSync(f)&&!x(f,d)&&n.rmSync(f,{recursive:!0,force:!0}),!n.existsSync(f)){let a=`${f}.${process.pid}.${r.randomUUID()}.tmp`;try{n.mkdirSync(a,{recursive:!0,mode:448});for(let[r,i]of e.artifacts){let e=l(r);if(!e)throw Error(`Shared build artifact escapes its object: ${r}`);let o=t.join(a,e);n.mkdirSync(t.dirname(o),{recursive:!0,mode:448}),n.writeFileSync(o,i,{mode:384})}n.writeFileSync(t.join(a,i),`${JSON.stringify(d,null,2)}\n`,{mode:384}),n.mkdirSync(t.dirname(f),{recursive:!0,mode:448});try{n.renameSync(a,f)}catch(e){if(!n.existsSync(f))throw e}}finally{n.rmSync(a,{recursive:!0,force:!0})}}return h(e.cacheDirectory,e.lookupKey,u),d}function C(n,r){let i=[...n.replacements.entries()].sort(([e],[t])=>t.length-e.length);for(let a of n.manifest.artifacts){let o=_(n.directory,a);if(!o)throw Error(`Shared build artifact is corrupt: ${a.path}`);let s=o;if(a.path.endsWith(`.mjs`)){let t=o.toString(`utf8`);for(let[n,r]of i)t=t.replaceAll(`${n}:url`,e(r).href).replaceAll(n,r);if(t.includes(`__DOOMPI_PATH_`))throw Error(`Shared build left unresolved path tokens in ${a.path}`);s=t}f(t.join(r,a.path),s)}return t.join(r,n.manifest.entry)}function w(e){try{return process.kill(e,0),!0}catch{return!1}}function T(e){let n=d(t.join(e,a));return!s(n)||typeof n.pid!=`number`||typeof n.createdAt!=`number`?!0:Date.now()-n.createdAt>3e5&&!w(n.pid)}async function E(e){await new Promise(t=>setTimeout(t,e))}async function D(e,r,i){if(!o.test(r))throw Error(`Shared build lock key must be a full SHA-256 digest: ${r}`);let s=t.join(e,`locks`,`${r}.lock`);n.mkdirSync(t.dirname(s),{recursive:!0,mode:448});let c=Date.now();for(;;)try{n.mkdirSync(s,{mode:448}),n.writeFileSync(t.join(s,a),`${JSON.stringify({pid:process.pid,createdAt:Date.now()})}\n`,{mode:384});break}catch(e){if(!(e instanceof Error)||!(`code`in e)||e.code!==`EEXIST`)throw e;if(T(s)){n.rmSync(s,{recursive:!0,force:!0});continue}if(Date.now()-c>=6e4)throw Error(`Timed out waiting for shared build lock ${r}`);await E(25)}try{return await i()}finally{n.rmSync(s,{recursive:!0,force:!0})}}export{c as contentSha256,v as findSharedBuild,C as materializeSharedBuild,S as publishSharedBuild,D as withSharedBuildLock};
|
|
2
|
+
//# sourceMappingURL=sharedBuildCache.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharedBuildCache.mjs","names":[],"sources":["../../src/adapters/sharedBuildCache.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nconst SHARED_BUILD_SCHEMA = 1;\nconst OBJECTS_DIRECTORY = 'objects';\nconst INDEX_DIRECTORY = 'index';\nconst LOCKS_DIRECTORY = 'locks';\nconst MANIFEST_FILE = 'manifest.json';\nconst OWNER_FILE = 'owner.json';\nconst LOCK_STALE_MS = 5 * 60_000;\nconst LOCK_TIMEOUT_MS = 60_000;\nconst LOCK_RETRY_MS = 25;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst PRIVATE_FILE_MODE = 0o600;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/u;\n\nexport interface SharedBuildInput {\n logicalPath: string;\n sha256: string;\n token: string;\n /** Canonical source path for inputs outside the synchronized repository. */\n sourcePath?: string;\n}\n\nexport interface SharedBuildArtifact {\n path: string;\n sha256: string;\n}\n\nexport interface SharedBuildManifest {\n schema: number;\n key: string;\n lookupKey: string;\n entry: string;\n inputs: SharedBuildInput[];\n artifacts: SharedBuildArtifact[];\n}\n\nexport interface ResolvedSharedBuild {\n directory: string;\n manifest: SharedBuildManifest;\n replacements: ReadonlyMap<string, string>;\n}\n\ninterface SharedBuildIndex {\n schema: number;\n keys: string[];\n}\n\nexport interface PublishSharedBuildOptions {\n cacheDirectory: string;\n lookupKey: string;\n entry: string;\n inputs: SharedBuildInput[];\n artifacts: ReadonlyMap<string, string | Uint8Array>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function contentSha256(contents: string | Uint8Array): string {\n return crypto.createHash('sha256').update(contents).digest('hex');\n}\n\nfunction safeRelativePath(value: string): string | undefined {\n if (value === '' || path.isAbsolute(value)) return undefined;\n const normalized = path.normalize(value);\n return normalized === '..' || normalized.startsWith(`..${path.sep}`) ? undefined : normalized;\n}\n\nfunction parseManifest(value: unknown): SharedBuildManifest | undefined {\n if (\n !isRecord(value) ||\n value.schema !== SHARED_BUILD_SCHEMA ||\n typeof value.key !== 'string' ||\n !SHA256_PATTERN.test(value.key) ||\n typeof value.lookupKey !== 'string' ||\n !SHA256_PATTERN.test(value.lookupKey) ||\n typeof value.entry !== 'string' ||\n !Array.isArray(value.inputs) ||\n !Array.isArray(value.artifacts)\n ) {\n return undefined;\n }\n const inputs: SharedBuildInput[] = [];\n for (const input of value.inputs) {\n if (\n !isRecord(input) ||\n typeof input.logicalPath !== 'string' ||\n typeof input.sha256 !== 'string' ||\n (input.sha256 !== '' && !SHA256_PATTERN.test(input.sha256)) ||\n typeof input.token !== 'string' ||\n (input.sourcePath !== undefined && (typeof input.sourcePath !== 'string' || !path.isAbsolute(input.sourcePath)))\n ) {\n return undefined;\n }\n inputs.push({\n logicalPath: input.logicalPath,\n sha256: input.sha256,\n token: input.token,\n ...(typeof input.sourcePath === 'string' ? { sourcePath: input.sourcePath } : {}),\n });\n }\n const artifacts: SharedBuildArtifact[] = [];\n for (const artifact of value.artifacts) {\n if (\n !isRecord(artifact) ||\n typeof artifact.path !== 'string' ||\n typeof artifact.sha256 !== 'string' ||\n !SHA256_PATTERN.test(artifact.sha256)\n ) {\n return undefined;\n }\n if (!safeRelativePath(artifact.path)) return undefined;\n artifacts.push({ path: artifact.path, sha256: artifact.sha256 });\n }\n if (!safeRelativePath(value.entry)) return undefined;\n return {\n schema: SHARED_BUILD_SCHEMA,\n key: value.key,\n lookupKey: value.lookupKey,\n entry: value.entry,\n inputs,\n artifacts,\n };\n}\n\nfunction readJson(target: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(target, 'utf8')) as unknown;\n } catch {\n return undefined;\n }\n}\n\nfunction writeAtomic(target: string, contents: string | Uint8Array): void {\n fs.mkdirSync(path.dirname(target), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n const temporary = `${target}.${process.pid}.${crypto.randomUUID()}.tmp`;\n try {\n fs.writeFileSync(temporary, contents, { mode: PRIVATE_FILE_MODE });\n fs.renameSync(temporary, target);\n fs.chmodSync(target, PRIVATE_FILE_MODE);\n } catch (error) {\n fs.rmSync(temporary, { force: true });\n throw error;\n }\n}\n\nfunction indexPath(cacheDirectory: string, lookupKey: string): string {\n return path.join(cacheDirectory, INDEX_DIRECTORY, `${lookupKey}.json`);\n}\n\nfunction readIndex(cacheDirectory: string, lookupKey: string): SharedBuildIndex {\n const parsed = readJson(indexPath(cacheDirectory, lookupKey));\n if (!isRecord(parsed) || parsed.schema !== SHARED_BUILD_SCHEMA || !Array.isArray(parsed.keys)) {\n return { schema: SHARED_BUILD_SCHEMA, keys: [] };\n }\n return {\n schema: SHARED_BUILD_SCHEMA,\n keys: parsed.keys.filter((key): key is string => typeof key === 'string'),\n };\n}\n\nfunction writeIndex(cacheDirectory: string, lookupKey: string, key: string): void {\n const current = readIndex(cacheDirectory, lookupKey);\n const keys = [key, ...current.keys.filter((candidate) => candidate !== key)];\n writeAtomic(\n indexPath(cacheDirectory, lookupKey),\n `${JSON.stringify({ schema: SHARED_BUILD_SCHEMA, keys }, null, 2)}\\n`,\n );\n}\n\nfunction objectDirectory(cacheDirectory: string, key: string): string {\n return path.join(cacheDirectory, OBJECTS_DIRECTORY, key);\n}\n\nfunction artifactBytes(directory: string, artifact: SharedBuildArtifact): Buffer | undefined {\n const relative = safeRelativePath(artifact.path);\n if (!relative) return undefined;\n try {\n if (fs.lstatSync(directory).isSymbolicLink()) return undefined;\n const target = path.join(directory, relative);\n if (fs.lstatSync(target).isSymbolicLink()) return undefined;\n const canonicalDirectory = fs.realpathSync(directory);\n const canonicalTarget = fs.realpathSync(target);\n const confined = path.relative(canonicalDirectory, canonicalTarget);\n if (confined.startsWith('..') || path.isAbsolute(confined)) return undefined;\n const bytes = fs.readFileSync(canonicalTarget);\n return contentSha256(bytes) === artifact.sha256 ? bytes : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function findSharedBuild(\n cacheDirectory: string,\n lookupKey: string,\n resolveInput: (input: SharedBuildInput) => string | undefined,\n): ResolvedSharedBuild | undefined {\n if (!SHA256_PATTERN.test(lookupKey)) return undefined;\n for (const key of readIndex(cacheDirectory, lookupKey).keys) {\n if (!SHA256_PATTERN.test(key)) continue;\n const directory = objectDirectory(cacheDirectory, key);\n const manifest = parseManifest(readJson(path.join(directory, MANIFEST_FILE)));\n if (!manifest || manifest.key !== key || manifest.lookupKey !== lookupKey || !manifestKeyMatches(manifest))\n continue;\n if (manifest.artifacts.some((artifact) => artifactBytes(directory, artifact) === undefined)) continue;\n const replacements = new Map<string, string>();\n let valid = true;\n for (const input of manifest.inputs) {\n const target = resolveInput(input);\n if (!target) {\n valid = false;\n break;\n }\n if (input.sha256 !== '') {\n try {\n if (contentSha256(fs.readFileSync(target)) !== input.sha256) {\n valid = false;\n break;\n }\n } catch {\n valid = false;\n break;\n }\n }\n replacements.set(input.token, target);\n }\n if (valid) return { directory, manifest, replacements };\n }\n return undefined;\n}\n\nfunction manifestKey(\n options: Omit<PublishSharedBuildOptions, 'cacheDirectory'>,\n artifacts: SharedBuildArtifact[],\n): string {\n return contentSha256(\n JSON.stringify({\n schema: SHARED_BUILD_SCHEMA,\n lookupKey: options.lookupKey,\n entry: options.entry,\n inputs: options.inputs,\n artifacts,\n }),\n );\n}\n\nfunction manifestKeyMatches(manifest: SharedBuildManifest): boolean {\n return (\n manifest.key ===\n manifestKey(\n {\n lookupKey: manifest.lookupKey,\n entry: manifest.entry,\n inputs: manifest.inputs,\n artifacts: new Map(),\n },\n manifest.artifacts,\n )\n );\n}\n\nfunction sharedObjectMatches(directory: string, expected: SharedBuildManifest): boolean {\n const current = parseManifest(readJson(path.join(directory, MANIFEST_FILE)));\n if (!current || current.key !== expected.key || !manifestKeyMatches(current)) return false;\n return expected.artifacts.every((artifact) => artifactBytes(directory, artifact) !== undefined);\n}\n\nexport function publishSharedBuild(options: PublishSharedBuildOptions): SharedBuildManifest {\n if (!SHA256_PATTERN.test(options.lookupKey)) {\n throw new Error(`Shared build lookup key must be a full SHA-256 digest: ${options.lookupKey}`);\n }\n if (options.inputs.some((input) => input.sourcePath !== undefined && !path.isAbsolute(input.sourcePath))) {\n throw new Error('Shared build external source paths must be absolute');\n }\n const artifacts = [...options.artifacts.entries()]\n .map(([artifactPath, contents]) => {\n const relative = safeRelativePath(artifactPath);\n if (!relative) throw new Error(`Shared build artifact escapes its object: ${artifactPath}`);\n return { path: relative, sha256: contentSha256(contents) };\n })\n .sort((left, right) => left.path.localeCompare(right.path));\n const inputs = [...options.inputs].sort((left, right) => left.logicalPath.localeCompare(right.logicalPath));\n const key = manifestKey({ ...options, inputs }, artifacts);\n const manifest: SharedBuildManifest = {\n schema: SHARED_BUILD_SCHEMA,\n key,\n lookupKey: options.lookupKey,\n entry: options.entry,\n inputs,\n artifacts,\n };\n const finalDirectory = objectDirectory(options.cacheDirectory, key);\n if (fs.existsSync(finalDirectory) && !sharedObjectMatches(finalDirectory, manifest)) {\n fs.rmSync(finalDirectory, { recursive: true, force: true });\n }\n if (!fs.existsSync(finalDirectory)) {\n const temporaryDirectory = `${finalDirectory}.${process.pid}.${crypto.randomUUID()}.tmp`;\n try {\n fs.mkdirSync(temporaryDirectory, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n for (const [artifactPath, contents] of options.artifacts) {\n const relative = safeRelativePath(artifactPath);\n if (!relative) throw new Error(`Shared build artifact escapes its object: ${artifactPath}`);\n const target = path.join(temporaryDirectory, relative);\n fs.mkdirSync(path.dirname(target), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n fs.writeFileSync(target, contents, { mode: PRIVATE_FILE_MODE });\n }\n fs.writeFileSync(path.join(temporaryDirectory, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\\n`, {\n mode: PRIVATE_FILE_MODE,\n });\n fs.mkdirSync(path.dirname(finalDirectory), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n try {\n fs.renameSync(temporaryDirectory, finalDirectory);\n } catch (error) {\n if (!fs.existsSync(finalDirectory)) throw error;\n }\n } finally {\n fs.rmSync(temporaryDirectory, { recursive: true, force: true });\n }\n }\n writeIndex(options.cacheDirectory, options.lookupKey, key);\n return manifest;\n}\n\nexport function materializeSharedBuild(build: ResolvedSharedBuild, outputDirectory: string): string {\n const replacements = [...build.replacements.entries()].sort(([left], [right]) => right.length - left.length);\n for (const artifact of build.manifest.artifacts) {\n const bytes = artifactBytes(build.directory, artifact);\n if (!bytes) throw new Error(`Shared build artifact is corrupt: ${artifact.path}`);\n let contents: string | Uint8Array = bytes;\n if (artifact.path.endsWith('.mjs')) {\n let source = bytes.toString('utf8');\n for (const [token, target] of replacements) {\n source = source.replaceAll(`${token}:url`, pathToFileURL(target).href).replaceAll(token, target);\n }\n if (source.includes('__DOOMPI_PATH_'))\n throw new Error(`Shared build left unresolved path tokens in ${artifact.path}`);\n contents = source;\n }\n writeAtomic(path.join(outputDirectory, artifact.path), contents);\n }\n return path.join(outputDirectory, build.manifest.entry);\n}\n\nfunction processAlive(processId: number): boolean {\n try {\n process.kill(processId, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction lockIsStale(lockDirectory: string): boolean {\n const owner = readJson(path.join(lockDirectory, OWNER_FILE));\n if (!isRecord(owner) || typeof owner.pid !== 'number' || typeof owner.createdAt !== 'number') return true;\n return Date.now() - owner.createdAt > LOCK_STALE_MS && !processAlive(owner.pid);\n}\n\nasync function sleep(milliseconds: number): Promise<void> {\n await new Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n}\n\nexport async function withSharedBuildLock<T>(\n cacheDirectory: string,\n lookupKey: string,\n operation: () => Promise<T>,\n): Promise<T> {\n if (!SHA256_PATTERN.test(lookupKey)) {\n throw new Error(`Shared build lock key must be a full SHA-256 digest: ${lookupKey}`);\n }\n const lockDirectory = path.join(cacheDirectory, LOCKS_DIRECTORY, `${lookupKey}.lock`);\n fs.mkdirSync(path.dirname(lockDirectory), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n const startedAt = Date.now();\n while (true) {\n try {\n fs.mkdirSync(lockDirectory, { mode: PRIVATE_DIRECTORY_MODE });\n fs.writeFileSync(\n path.join(lockDirectory, OWNER_FILE),\n `${JSON.stringify({ pid: process.pid, createdAt: Date.now() })}\\n`,\n { mode: PRIVATE_FILE_MODE },\n );\n break;\n } catch (error) {\n if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST') throw error;\n if (lockIsStale(lockDirectory)) {\n fs.rmSync(lockDirectory, { recursive: true, force: true });\n continue;\n }\n if (Date.now() - startedAt >= LOCK_TIMEOUT_MS) {\n throw new Error(`Timed out waiting for shared build lock ${lookupKey}`);\n }\n await sleep(LOCK_RETRY_MS);\n }\n }\n try {\n return await operation();\n } finally {\n fs.rmSync(lockDirectory, { recursive: true, force: true });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`./pluginMaterializer.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`@agimon-ai/doompi-config/domains`),a=require(`@earendil-works/pi-coding-agent`);const o=`skills`,s=`.claude/skills`;let c;async function l(){return c??=import(`gpt-tokenizer`),(await c).countTokens}function u(e){let t=e.map(e=>n.default.resolve(e));return e=>{let r=n.default.resolve(e);return t.some(e=>e===r||e.startsWith(`${r}${n.default.sep}`)||r.startsWith(`${e}${n.default.sep}`))}}function d(e,t,r,i,o,s,c=`recursive`){let l=(0,a.loadSkillsFromDir)({dir:e,source:r});for(let t of l.diagnostics)s.push(`${t.path??e}: ${t.message}`);let u=n.default.resolve(e),d=l.skills.filter(e=>{let t=n.default.dirname(e.filePath);return c===`direct-children`&&n.default.dirname(t)!==u?!1:i(t)});return o.push(...d),d.map(e=>({name:e.name,description:e.description,filePath:e.filePath,baseDir:e.baseDir,group:t,owner:r,modelInvocable:!e.disableModelInvocation})).sort((e,t)=>e.name.localeCompare(t.name))}function f(e){return e.sort((e,t)=>e.owner.localeCompare(t.owner))}function p(e,t,n){let r=new Set(t.map(e=>e.name)),i=new Map,a=[...e].sort((e,t)=>e.sourceInfo.source.localeCompare(t.sourceInfo.source)||e.name.localeCompare(t.name)||e.filePath.localeCompare(t.filePath));for(let e of a){if(r.has(e.name)){n.push(`Help ${e.sourceInfo.source} [HELP_SKILL_COLLISION]: '${e.name}' was ignored because a normal skill wins.`);continue}r.add(e.name),t.push(e);let a=e.sourceInfo.source,o=i.get(a)??[];o.push({name:e.name,description:e.description,filePath:e.filePath,baseDir:e.baseDir,group:`help`,owner:a,modelInvocable:!e.disableModelInvocation}),i.set(a,o)}return f([...i.entries()].map(([e,t])=>({owner:e,skills:t.sort((e,t)=>e.name.localeCompare(t.name))})))}async function m(e){let{repoRoot:c}=e,m=u(e.activeSkillDirectories),h=[...e.helpDiagnostics??[]],g=[],_=[];for(let t of e.extensionSources){let e=t.directories.flatMap(e=>d(e,`extensions`,t.source,()=>!0,g,h));e.length>0&&_.push({owner:t.source,skills:e})}let v=[],y=await t.materializePluginEntries((0,i.resolvePluginEntries)(c,(0,i.listDomainNames)(c),[]));for(let e of y){let t=n.default.join(e.directory,o);if(!r.default.existsSync(t))continue;let i=n.default.basename(e.directory),a=d(t,`plugins`,i,m,g,h,e.skillDiscovery);a.length>0&&v.push({owner:i,skills:a})}let b=d(n.default.join(c,`.claude`,o),`default`,s,m,g,h),x=b.length>0?[{owner:s,skills:b}]:[],S=p(e.helpSkills??[],g,h),C=[{key:`extensions`,label:`extensions`,owners:f(_)},{key:`help`,label:`Help`,owners:S},{key:`plugins`,label:`plugins`,owners:f(v)},{key:`default`,label:`default`,owners:x}],w=await l(),T=(0,a.formatSkillsForPrompt)(g),E=0;for(let e of g)try{E+=w(r.default.readFileSync(e.filePath,`utf8`))}catch(t){h.push(`${e.filePath}: ${t instanceof Error?t.message:String(t)}`)}return{groups:C,skillCount:g.length,promptTokens:T?w(T):0,bodyTokens:E,diagnostics:h}}function h(e,t){for(let n of e.groups)for(let e of n.owners){let n=e.skills.find(e=>e.name===t);if(n)return n}}exports.buildSkillCatalog=m,exports.counter=l,exports.findSkill=h;
|
|
2
|
+
//# sourceMappingURL=skillCatalog.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillCatalog.cjs","names":["path","materializePluginEntries","fs"],"sources":["../../src/adapters/skillCatalog.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { listDomainNames, type PluginSkillDiscovery, resolvePluginEntries } from '@agimon-ai/doompi-config/domains';\nimport { formatSkillsForPrompt, loadSkillsFromDir, type Skill } from '@earendil-works/pi-coding-agent';\nimport { materializePluginEntries } from './pluginMaterializer.ts';\nimport type { SkillSourceEntry } from './skillSources.ts';\n\nconst SKILLS_DIRECTORY = 'skills';\nconst SHARED_SKILLS_OWNER = '.claude/skills';\n\nexport type SkillGroupKey = 'extensions' | 'help' | 'plugins' | 'default';\n\nexport interface SkillEntry {\n name: string;\n description: string;\n filePath: string;\n baseDir: string;\n group: SkillGroupKey;\n /** Package name for an extension, plugin directory name, or `.claude/skills`. */\n owner: string;\n modelInvocable: boolean;\n}\n\nexport interface SkillOwnerNode {\n owner: string;\n skills: SkillEntry[];\n}\n\nexport interface SkillGroup {\n key: SkillGroupKey;\n label: string;\n owners: SkillOwnerNode[];\n}\n\nexport interface SkillCatalog {\n groups: SkillGroup[];\n skillCount: number;\n /** Tokens the `<available_skills>` prompt block costs on every request. */\n promptTokens: number;\n /** Tokens every loaded SKILL.md costs in full, if all of them were read. */\n bodyTokens: number;\n /** Frontmatter and read failures, surfaced instead of thrown. */\n diagnostics: string[];\n}\n\nexport interface SkillCatalogOptions {\n repoRoot: string;\n /** Exact files the current selection resolved to, from `HarnessState.skillDirectories`. */\n activeSkillDirectories: readonly string[];\n extensionSources: readonly SkillSourceEntry[];\n /** Activation-gated wrappers already accepted by the merged active-skill view. */\n helpSkills?: readonly Skill[];\n /** Bounded Help activation and collision diagnostics. */\n helpDiagnostics?: readonly string[];\n}\n\n/**\n * The tokenizer, loaded on first use rather than at import.\n *\n * `gpt-tokenizer` carries its whole vocabulary and costs about a tenth of a\n * second to load. This module is reachable from the skills extension, which Pi\n * loads at session start, so a top-level import would charge every session for\n * a surface most of them never open.\n */\nlet tokenizer: Promise<typeof import('gpt-tokenizer')> | undefined;\n\nexport async function counter(): Promise<(text: string) => number> {\n tokenizer ??= import('gpt-tokenizer');\n return (await tokenizer).countTokens;\n}\n\n/**\n * Matches a directory against the active set.\n *\n * A domain that lists a plugin subset puts individual skill directories in the\n * set rather than the plugin's `skills` root, so containment has to be checked\n * both ways: the set may hold an ancestor of the directory, or a descendant of\n * it.\n */\nfunction createActiveMatcher(directories: readonly string[]): (directory: string) => boolean {\n const active = directories.map((directory) => path.resolve(directory));\n return (directory) => {\n const resolved = path.resolve(directory);\n return active.some(\n (entry) =>\n entry === resolved || entry.startsWith(`${resolved}${path.sep}`) || resolved.startsWith(`${entry}${path.sep}`),\n );\n };\n}\n\nfunction collect(\n directory: string,\n group: SkillGroupKey,\n owner: string,\n isActive: (directory: string) => boolean,\n loaded: Skill[],\n diagnostics: string[],\n discovery: PluginSkillDiscovery = 'recursive',\n): SkillEntry[] {\n const result = loadSkillsFromDir({ dir: directory, source: owner });\n for (const diagnostic of result.diagnostics) {\n diagnostics.push(`${diagnostic.path ?? directory}: ${diagnostic.message}`);\n }\n // Checked per skill, not per root: a subset domain selects some of a plugin's\n // skills and leaves the rest on disk, unloaded and therefore not listed.\n const root = path.resolve(directory);\n const kept = result.skills.filter((skill) => {\n const skillDirectory = path.dirname(skill.filePath);\n if (discovery === 'direct-children' && path.dirname(skillDirectory) !== root) return false;\n return isActive(skillDirectory);\n });\n // Kept in their loaded form as well, because the prompt-block cost is measured\n // by handing them back to Pi's own formatter.\n loaded.push(...kept);\n return kept\n .map((skill) => ({\n name: skill.name,\n description: skill.description,\n filePath: skill.filePath,\n baseDir: skill.baseDir,\n group,\n owner,\n modelInvocable: !skill.disableModelInvocation,\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction sortOwners(owners: SkillOwnerNode[]): SkillOwnerNode[] {\n return owners.sort((left, right) => left.owner.localeCompare(right.owner));\n}\n\nfunction collectHelpSkills(skills: readonly Skill[], loaded: Skill[], diagnostics: string[]): SkillOwnerNode[] {\n const occupiedNames = new Set(loaded.map((skill) => skill.name));\n const owners = new Map<string, SkillEntry[]>();\n const candidates = [...skills].sort(\n (left, right) =>\n left.sourceInfo.source.localeCompare(right.sourceInfo.source) ||\n left.name.localeCompare(right.name) ||\n left.filePath.localeCompare(right.filePath),\n );\n for (const skill of candidates) {\n if (occupiedNames.has(skill.name)) {\n diagnostics.push(\n `Help ${skill.sourceInfo.source} [HELP_SKILL_COLLISION]: '${skill.name}' was ignored because a normal skill wins.`,\n );\n continue;\n }\n occupiedNames.add(skill.name);\n loaded.push(skill);\n const owner = skill.sourceInfo.source;\n const entries = owners.get(owner) ?? [];\n entries.push({\n name: skill.name,\n description: skill.description,\n filePath: skill.filePath,\n baseDir: skill.baseDir,\n group: 'help',\n owner,\n modelInvocable: !skill.disableModelInvocation,\n });\n owners.set(owner, entries);\n }\n return sortOwners(\n [...owners.entries()].map(([owner, entries]) => ({\n owner,\n skills: entries.sort((left, right) => left.name.localeCompare(right.name)),\n })),\n );\n}\n\n/**\n * Every skill this session actually loaded, grouped by where it comes from,\n * priced in tokens.\n *\n * Discovery runs over `loadSkillsFromDir` from Pi rather than the harness's own\n * walker so the listing matches what Pi would load, including its ignore-file\n * handling; the same skills are then handed to Pi's `formatSkillsForPrompt` so\n * the always-on figure is the real prompt block rather than a reconstruction of\n * it.\n */\nexport async function buildSkillCatalog(options: SkillCatalogOptions): Promise<SkillCatalog> {\n const { repoRoot } = options;\n const isActive = createActiveMatcher(options.activeSkillDirectories);\n const diagnostics: string[] = [...(options.helpDiagnostics ?? [])];\n const loaded: Skill[] = [];\n\n const extensionOwners: SkillOwnerNode[] = [];\n for (const entry of options.extensionSources) {\n const skills = entry.directories.flatMap((directory) =>\n collect(directory, 'extensions', entry.source, () => true, loaded, diagnostics),\n );\n if (skills.length > 0) extensionOwners.push({ owner: entry.source, skills });\n }\n\n const pluginOwners: SkillOwnerNode[] = [];\n const domainPlugins = await materializePluginEntries(resolvePluginEntries(repoRoot, listDomainNames(repoRoot), []));\n for (const entry of domainPlugins) {\n const directory = path.join(entry.directory, SKILLS_DIRECTORY);\n if (!fs.existsSync(directory)) continue;\n const owner = path.basename(entry.directory);\n const skills = collect(directory, 'plugins', owner, isActive, loaded, diagnostics, entry.skillDiscovery);\n if (skills.length > 0) pluginOwners.push({ owner, skills });\n }\n\n const sharedDirectory = path.join(repoRoot, '.claude', SKILLS_DIRECTORY);\n const sharedSkills = collect(sharedDirectory, 'default', SHARED_SKILLS_OWNER, isActive, loaded, diagnostics);\n const defaultOwners = sharedSkills.length > 0 ? [{ owner: SHARED_SKILLS_OWNER, skills: sharedSkills }] : [];\n const helpOwners = collectHelpSkills(options.helpSkills ?? [], loaded, diagnostics);\n\n const groups: SkillGroup[] = [\n { key: 'extensions', label: 'extensions', owners: sortOwners(extensionOwners) },\n { key: 'help', label: 'Help', owners: helpOwners },\n { key: 'plugins', label: 'plugins', owners: sortOwners(pluginOwners) },\n { key: 'default', label: 'default', owners: defaultOwners },\n ];\n\n const countTokens = await counter();\n const prompt = formatSkillsForPrompt(loaded);\n let bodyTokens = 0;\n for (const skill of loaded) {\n try {\n bodyTokens += countTokens(fs.readFileSync(skill.filePath, 'utf8'));\n } catch (error) {\n diagnostics.push(`${skill.filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n return {\n groups,\n skillCount: loaded.length,\n promptTokens: prompt ? countTokens(prompt) : 0,\n bodyTokens,\n diagnostics,\n };\n}\n\n/** The skills a name resolves to, used to decide what `enter` can invoke. */\nexport function findSkill(catalog: SkillCatalog, name: string): SkillEntry | undefined {\n for (const group of catalog.groups) {\n for (const owner of group.owners) {\n const match = owner.skills.find((skill) => skill.name === name);\n if (match) return match;\n }\n }\n return undefined;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { SkillSourceEntry } from "./skillSources.cjs";
|
|
2
|
+
import { Skill } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/skillCatalog.d.ts
|
|
5
|
+
type SkillGroupKey = 'extensions' | 'help' | 'plugins' | 'default';
|
|
6
|
+
interface SkillEntry {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
filePath: string;
|
|
10
|
+
baseDir: string;
|
|
11
|
+
group: SkillGroupKey;
|
|
12
|
+
/** Package name for an extension, plugin directory name, or `.claude/skills`. */
|
|
13
|
+
owner: string;
|
|
14
|
+
modelInvocable: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface SkillOwnerNode {
|
|
17
|
+
owner: string;
|
|
18
|
+
skills: SkillEntry[];
|
|
19
|
+
}
|
|
20
|
+
interface SkillGroup {
|
|
21
|
+
key: SkillGroupKey;
|
|
22
|
+
label: string;
|
|
23
|
+
owners: SkillOwnerNode[];
|
|
24
|
+
}
|
|
25
|
+
interface SkillCatalog {
|
|
26
|
+
groups: SkillGroup[];
|
|
27
|
+
skillCount: number;
|
|
28
|
+
/** Tokens the `<available_skills>` prompt block costs on every request. */
|
|
29
|
+
promptTokens: number;
|
|
30
|
+
/** Tokens every loaded SKILL.md costs in full, if all of them were read. */
|
|
31
|
+
bodyTokens: number;
|
|
32
|
+
/** Frontmatter and read failures, surfaced instead of thrown. */
|
|
33
|
+
diagnostics: string[];
|
|
34
|
+
}
|
|
35
|
+
interface SkillCatalogOptions {
|
|
36
|
+
repoRoot: string;
|
|
37
|
+
/** Exact files the current selection resolved to, from `HarnessState.skillDirectories`. */
|
|
38
|
+
activeSkillDirectories: readonly string[];
|
|
39
|
+
extensionSources: readonly SkillSourceEntry[];
|
|
40
|
+
/** Activation-gated wrappers already accepted by the merged active-skill view. */
|
|
41
|
+
helpSkills?: readonly Skill[];
|
|
42
|
+
/** Bounded Help activation and collision diagnostics. */
|
|
43
|
+
helpDiagnostics?: readonly string[];
|
|
44
|
+
}
|
|
45
|
+
declare function counter(): Promise<(text: string) => number>;
|
|
46
|
+
/**
|
|
47
|
+
* Every skill this session actually loaded, grouped by where it comes from,
|
|
48
|
+
* priced in tokens.
|
|
49
|
+
*
|
|
50
|
+
* Discovery runs over `loadSkillsFromDir` from Pi rather than the harness's own
|
|
51
|
+
* walker so the listing matches what Pi would load, including its ignore-file
|
|
52
|
+
* handling; the same skills are then handed to Pi's `formatSkillsForPrompt` so
|
|
53
|
+
* the always-on figure is the real prompt block rather than a reconstruction of
|
|
54
|
+
* it.
|
|
55
|
+
*/
|
|
56
|
+
declare function buildSkillCatalog(options: SkillCatalogOptions): Promise<SkillCatalog>;
|
|
57
|
+
/** The skills a name resolves to, used to decide what `enter` can invoke. */
|
|
58
|
+
declare function findSkill(catalog: SkillCatalog, name: string): SkillEntry | undefined;
|
|
59
|
+
//#endregion
|
|
60
|
+
export { SkillCatalog, SkillCatalogOptions, SkillEntry, SkillGroup, SkillGroupKey, SkillOwnerNode, buildSkillCatalog, counter, findSkill };
|
|
61
|
+
//# sourceMappingURL=skillCatalog.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillCatalog.d.cts","names":[],"sources":["../../src/adapters/skillCatalog.ts"],"mappings":";;;;KAUY,aAAA;AAAA,UAEK,UAAA;EACf,IAAA;EACA,WAAA;EACA,QAAA;EACA,OAAA;EACA,KAAA,EAAO,aAAA;EALQ;EAOf,KAAA;EACA,cAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA;EACA,MAAA,EAAQ,UAAA;AAAA;AAAA,UAGO,UAAA;EACf,GAAA,EAAK,aAAA;EACL,KAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGO,YAAA;EACf,MAAA,EAAQ,UAAA;EACR,UAAA;;EAEA,YAAA;EAdA;EAgBA,UAAA;EAfQ;EAiBR,WAAA;AAAA;AAAA,UAGe,mBAAA;EACf,QAAA;;EAEA,sBAAA;EACA,gBAAA,WAA2B,gBAAA;EApBtB;EAsBL,UAAA,YAAsB,KAAA;EApBtB;EAsBA,eAAA;AAAA;AAAA,iBAaoB,OAAA,CAAA,GAAW,OAAA,EAAS,IAAA;AAhC1C;;;;;;;;;;AAAA,iBAkJsB,iBAAA,CAAkB,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,YAAA;;iBAyD/D,SAAA,CAAU,OAAA,EAAS,YAAA,EAAc,IAAA,WAAe,UAAA"}
|