@agimon-ai/doompi 0.0.1-alpha.0
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/LICENSE +21 -0
- package/README.md +546 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/bin/cli.cjs +3 -0
- package/dist/bin/cli.cjs.map +1 -0
- package/dist/bin/cli.d.cts +1 -0
- package/dist/bin/cli.d.mts +1 -0
- package/dist/bin/cli.mjs +3 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/bin/doomRunner.cjs +3 -0
- package/dist/bin/doomRunner.cjs.map +1 -0
- package/dist/bin/doomRunner.d.cts +1 -0
- package/dist/bin/doomRunner.d.mts +1 -0
- package/dist/bin/doomRunner.mjs +3 -0
- package/dist/bin/doomRunner.mjs.map +1 -0
- package/dist/cli/cliApp.cjs +2 -0
- package/dist/cli/cliApp.cjs.map +1 -0
- package/dist/cli/cliApp.d.cts +50 -0
- package/dist/cli/cliApp.d.cts.map +1 -0
- package/dist/cli/cliApp.d.mts +50 -0
- package/dist/cli/cliApp.d.mts.map +1 -0
- package/dist/cli/cliApp.mjs +2 -0
- package/dist/cli/cliApp.mjs.map +1 -0
- package/dist/cli/compatibilityOptions.cjs +2 -0
- package/dist/cli/compatibilityOptions.cjs.map +1 -0
- package/dist/cli/compatibilityOptions.d.cts +15 -0
- package/dist/cli/compatibilityOptions.d.cts.map +1 -0
- package/dist/cli/compatibilityOptions.d.mts +15 -0
- package/dist/cli/compatibilityOptions.d.mts.map +1 -0
- package/dist/cli/compatibilityOptions.mjs +2 -0
- package/dist/cli/compatibilityOptions.mjs.map +1 -0
- package/dist/cli/help.cjs +61 -0
- package/dist/cli/help.cjs.map +1 -0
- package/dist/cli/help.d.cts +6 -0
- package/dist/cli/help.d.cts.map +1 -0
- package/dist/cli/help.d.mts +6 -0
- package/dist/cli/help.d.mts.map +1 -0
- package/dist/cli/help.mjs +61 -0
- package/dist/cli/help.mjs.map +1 -0
- package/dist/cli/index.cjs +1 -0
- package/dist/cli/index.d.cts +5 -0
- package/dist/cli/index.d.mts +5 -0
- package/dist/cli/index.mjs +1 -0
- package/dist/cli/matrixOptions.cjs +2 -0
- package/dist/cli/matrixOptions.cjs.map +1 -0
- package/dist/cli/matrixOptions.d.cts +99 -0
- package/dist/cli/matrixOptions.d.cts.map +1 -0
- package/dist/cli/matrixOptions.d.mts +99 -0
- package/dist/cli/matrixOptions.d.mts.map +1 -0
- package/dist/cli/matrixOptions.mjs +2 -0
- package/dist/cli/matrixOptions.mjs.map +1 -0
- package/dist/cli/options.cjs +2 -0
- package/dist/cli/options.cjs.map +1 -0
- package/dist/cli/options.d.cts +7 -0
- package/dist/cli/options.d.cts.map +1 -0
- package/dist/cli/options.d.mts +7 -0
- package/dist/cli/options.d.mts.map +1 -0
- package/dist/cli/options.mjs +2 -0
- package/dist/cli/options.mjs.map +1 -0
- package/dist/commands/baseCommand.cjs +2 -0
- package/dist/commands/baseCommand.cjs.map +1 -0
- package/dist/commands/baseCommand.d.cts +36 -0
- package/dist/commands/baseCommand.d.cts.map +1 -0
- package/dist/commands/baseCommand.d.mts +36 -0
- package/dist/commands/baseCommand.d.mts.map +1 -0
- package/dist/commands/baseCommand.mjs +2 -0
- package/dist/commands/baseCommand.mjs.map +1 -0
- package/dist/commands/compatibilityCommand.cjs +2 -0
- package/dist/commands/compatibilityCommand.cjs.map +1 -0
- package/dist/commands/compatibilityCommand.d.cts +14 -0
- package/dist/commands/compatibilityCommand.d.cts.map +1 -0
- package/dist/commands/compatibilityCommand.d.mts +14 -0
- package/dist/commands/compatibilityCommand.d.mts.map +1 -0
- package/dist/commands/compatibilityCommand.mjs +2 -0
- package/dist/commands/compatibilityCommand.mjs.map +1 -0
- package/dist/commands/emitMcpCommand.cjs +2 -0
- package/dist/commands/emitMcpCommand.cjs.map +1 -0
- package/dist/commands/emitMcpCommand.d.cts +19 -0
- package/dist/commands/emitMcpCommand.d.cts.map +1 -0
- package/dist/commands/emitMcpCommand.d.mts +19 -0
- package/dist/commands/emitMcpCommand.d.mts.map +1 -0
- package/dist/commands/emitMcpCommand.mjs +2 -0
- package/dist/commands/emitMcpCommand.mjs.map +1 -0
- package/dist/commands/explainCommand.cjs +21 -0
- package/dist/commands/explainCommand.cjs.map +1 -0
- package/dist/commands/explainCommand.d.cts +63 -0
- package/dist/commands/explainCommand.d.cts.map +1 -0
- package/dist/commands/explainCommand.d.mts +63 -0
- package/dist/commands/explainCommand.d.mts.map +1 -0
- package/dist/commands/explainCommand.mjs +21 -0
- package/dist/commands/explainCommand.mjs.map +1 -0
- package/dist/commands/index.cjs +1 -0
- package/dist/commands/index.d.cts +8 -0
- package/dist/commands/index.d.mts +8 -0
- package/dist/commands/index.mjs +1 -0
- package/dist/commands/initCommand.cjs +3 -0
- package/dist/commands/initCommand.cjs.map +1 -0
- package/dist/commands/initCommand.d.cts +11 -0
- package/dist/commands/initCommand.d.cts.map +1 -0
- package/dist/commands/initCommand.d.mts +11 -0
- package/dist/commands/initCommand.d.mts.map +1 -0
- package/dist/commands/initCommand.mjs +3 -0
- package/dist/commands/initCommand.mjs.map +1 -0
- package/dist/commands/launchCommand.cjs +2 -0
- package/dist/commands/launchCommand.cjs.map +1 -0
- package/dist/commands/launchCommand.d.cts +31 -0
- package/dist/commands/launchCommand.d.cts.map +1 -0
- package/dist/commands/launchCommand.d.mts +31 -0
- package/dist/commands/launchCommand.d.mts.map +1 -0
- package/dist/commands/launchCommand.mjs +2 -0
- package/dist/commands/launchCommand.mjs.map +1 -0
- package/dist/commands/syncCommand.cjs +6 -0
- package/dist/commands/syncCommand.cjs.map +1 -0
- package/dist/commands/syncCommand.d.cts +37 -0
- package/dist/commands/syncCommand.d.cts.map +1 -0
- package/dist/commands/syncCommand.d.mts +37 -0
- package/dist/commands/syncCommand.d.mts.map +1 -0
- package/dist/commands/syncCommand.mjs +6 -0
- package/dist/commands/syncCommand.mjs.map +1 -0
- package/dist/config/harnessState.cjs +2 -0
- package/dist/config/harnessState.cjs.map +1 -0
- package/dist/config/harnessState.d.cts +24 -0
- package/dist/config/harnessState.d.cts.map +1 -0
- package/dist/config/harnessState.d.mts +24 -0
- package/dist/config/harnessState.d.mts.map +1 -0
- package/dist/config/harnessState.mjs +2 -0
- package/dist/config/harnessState.mjs.map +1 -0
- package/dist/config/index.cjs +1 -0
- package/dist/config/index.d.cts +7 -0
- package/dist/config/index.d.mts +7 -0
- package/dist/config/index.mjs +1 -0
- package/dist/config/projectTrust.cjs +2 -0
- package/dist/config/projectTrust.cjs.map +1 -0
- package/dist/config/projectTrust.d.cts +14 -0
- package/dist/config/projectTrust.d.cts.map +1 -0
- package/dist/config/projectTrust.d.mts +14 -0
- package/dist/config/projectTrust.d.mts.map +1 -0
- package/dist/config/projectTrust.mjs +2 -0
- package/dist/config/projectTrust.mjs.map +1 -0
- package/dist/entries/autoStop.cjs +2 -0
- package/dist/entries/autoStop.cjs.map +1 -0
- package/dist/entries/autoStop.d.cts +6 -0
- package/dist/entries/autoStop.d.cts.map +1 -0
- package/dist/entries/autoStop.d.mts +7 -0
- package/dist/entries/autoStop.d.mts.map +1 -0
- package/dist/entries/autoStop.mjs +2 -0
- package/dist/entries/autoStop.mjs.map +1 -0
- package/dist/entries/components/matrixPicker.cjs +2 -0
- package/dist/entries/components/matrixPicker.cjs.map +1 -0
- package/dist/entries/components/matrixPicker.d.cts +55 -0
- package/dist/entries/components/matrixPicker.d.cts.map +1 -0
- package/dist/entries/components/matrixPicker.d.mts +55 -0
- package/dist/entries/components/matrixPicker.d.mts.map +1 -0
- package/dist/entries/components/matrixPicker.mjs +2 -0
- package/dist/entries/components/matrixPicker.mjs.map +1 -0
- package/dist/entries/components/skillsOverlay.cjs +4 -0
- package/dist/entries/components/skillsOverlay.cjs.map +1 -0
- package/dist/entries/components/skillsOverlay.d.cts +58 -0
- package/dist/entries/components/skillsOverlay.d.cts.map +1 -0
- package/dist/entries/components/skillsOverlay.d.mts +58 -0
- package/dist/entries/components/skillsOverlay.d.mts.map +1 -0
- package/dist/entries/components/skillsOverlay.mjs +4 -0
- package/dist/entries/components/skillsOverlay.mjs.map +1 -0
- package/dist/entries/domains.cjs +2 -0
- package/dist/entries/domains.cjs.map +1 -0
- package/dist/entries/domains.d.cts +10 -0
- package/dist/entries/domains.d.cts.map +1 -0
- package/dist/entries/domains.d.mts +10 -0
- package/dist/entries/domains.d.mts.map +1 -0
- package/dist/entries/domains.mjs +2 -0
- package/dist/entries/domains.mjs.map +1 -0
- package/dist/entries/doom.cjs +2 -0
- package/dist/entries/doom.cjs.map +1 -0
- package/dist/entries/doom.d.cts +13 -0
- package/dist/entries/doom.d.cts.map +1 -0
- package/dist/entries/doom.d.mts +14 -0
- package/dist/entries/doom.d.mts.map +1 -0
- package/dist/entries/doom.mjs +2 -0
- package/dist/entries/doom.mjs.map +1 -0
- package/dist/entries/effort.cjs +2 -0
- package/dist/entries/effort.cjs.map +1 -0
- package/dist/entries/effort.d.cts +10 -0
- package/dist/entries/effort.d.cts.map +1 -0
- package/dist/entries/effort.d.mts +10 -0
- package/dist/entries/effort.d.mts.map +1 -0
- package/dist/entries/effort.mjs +2 -0
- package/dist/entries/effort.mjs.map +1 -0
- package/dist/entries/majorMode.cjs +6 -0
- package/dist/entries/majorMode.cjs.map +1 -0
- package/dist/entries/majorMode.d.cts +29 -0
- package/dist/entries/majorMode.d.cts.map +1 -0
- package/dist/entries/majorMode.d.mts +29 -0
- package/dist/entries/majorMode.d.mts.map +1 -0
- package/dist/entries/majorMode.mjs +6 -0
- package/dist/entries/majorMode.mjs.map +1 -0
- package/dist/entries/notifications.cjs +2 -0
- package/dist/entries/notifications.cjs.map +1 -0
- package/dist/entries/notifications.d.cts +13 -0
- package/dist/entries/notifications.d.cts.map +1 -0
- package/dist/entries/notifications.d.mts +13 -0
- package/dist/entries/notifications.d.mts.map +1 -0
- package/dist/entries/notifications.mjs +2 -0
- package/dist/entries/notifications.mjs.map +1 -0
- package/dist/entries/ollamaProvider.cjs +2 -0
- package/dist/entries/ollamaProvider.cjs.map +1 -0
- package/dist/entries/ollamaProvider.d.cts +6 -0
- package/dist/entries/ollamaProvider.d.cts.map +1 -0
- package/dist/entries/ollamaProvider.d.mts +7 -0
- package/dist/entries/ollamaProvider.d.mts.map +1 -0
- package/dist/entries/ollamaProvider.mjs +2 -0
- package/dist/entries/ollamaProvider.mjs.map +1 -0
- package/dist/entries/persona.cjs +2 -0
- package/dist/entries/persona.cjs.map +1 -0
- package/dist/entries/persona.d.cts +14 -0
- package/dist/entries/persona.d.cts.map +1 -0
- package/dist/entries/persona.d.mts +15 -0
- package/dist/entries/persona.d.mts.map +1 -0
- package/dist/entries/persona.mjs +2 -0
- package/dist/entries/persona.mjs.map +1 -0
- package/dist/entries/profile.cjs +3 -0
- package/dist/entries/profile.cjs.map +1 -0
- package/dist/entries/profile.d.cts +16 -0
- package/dist/entries/profile.d.cts.map +1 -0
- package/dist/entries/profile.d.mts +16 -0
- package/dist/entries/profile.d.mts.map +1 -0
- package/dist/entries/profile.mjs +3 -0
- package/dist/entries/profile.mjs.map +1 -0
- package/dist/entries/repositoryHooks.cjs +9 -0
- package/dist/entries/repositoryHooks.cjs.map +1 -0
- package/dist/entries/repositoryHooks.d.cts +7 -0
- package/dist/entries/repositoryHooks.d.cts.map +1 -0
- package/dist/entries/repositoryHooks.d.mts +8 -0
- package/dist/entries/repositoryHooks.d.mts.map +1 -0
- package/dist/entries/repositoryHooks.mjs +9 -0
- package/dist/entries/repositoryHooks.mjs.map +1 -0
- package/dist/entries/skills.cjs +2 -0
- package/dist/entries/skills.cjs.map +1 -0
- package/dist/entries/skills.d.cts +34 -0
- package/dist/entries/skills.d.cts.map +1 -0
- package/dist/entries/skills.d.mts +34 -0
- package/dist/entries/skills.d.mts.map +1 -0
- package/dist/entries/skills.mjs +2 -0
- package/dist/entries/skills.mjs.map +1 -0
- package/dist/entries/styleSystem.cjs +4 -0
- package/dist/entries/styleSystem.cjs.map +1 -0
- package/dist/entries/styleSystem.d.cts +32 -0
- package/dist/entries/styleSystem.d.cts.map +1 -0
- package/dist/entries/styleSystem.d.mts +32 -0
- package/dist/entries/styleSystem.d.mts.map +1 -0
- package/dist/entries/styleSystem.mjs +4 -0
- package/dist/entries/styleSystem.mjs.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +34 -0
- package/dist/index.d.mts +34 -0
- package/dist/index.mjs +1 -0
- package/dist/interfaces/compatibility.d.cts +23 -0
- package/dist/interfaces/compatibility.d.cts.map +1 -0
- package/dist/interfaces/compatibility.d.mts +23 -0
- package/dist/interfaces/compatibility.d.mts.map +1 -0
- package/dist/interfaces/harness.d.cts +83 -0
- package/dist/interfaces/harness.d.cts.map +1 -0
- package/dist/interfaces/harness.d.mts +83 -0
- package/dist/interfaces/harness.d.mts.map +1 -0
- package/dist/logSinkTelemetry.cjs +2 -0
- package/dist/logSinkTelemetry.cjs.map +1 -0
- package/dist/logSinkTelemetry.d.cts +49 -0
- package/dist/logSinkTelemetry.d.cts.map +1 -0
- package/dist/logSinkTelemetry.d.mts +49 -0
- package/dist/logSinkTelemetry.d.mts.map +1 -0
- package/dist/logSinkTelemetry.mjs +2 -0
- package/dist/logSinkTelemetry.mjs.map +1 -0
- 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 +2 -0
- 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 +1 -0
- 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 +2 -0
- 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 +1 -0
- package/dist/services/compatibility/antigravity.cjs +2 -0
- package/dist/services/compatibility/antigravity.cjs.map +1 -0
- package/dist/services/compatibility/antigravity.d.cts +11 -0
- package/dist/services/compatibility/antigravity.d.cts.map +1 -0
- package/dist/services/compatibility/antigravity.d.mts +11 -0
- package/dist/services/compatibility/antigravity.d.mts.map +1 -0
- package/dist/services/compatibility/antigravity.mjs +2 -0
- package/dist/services/compatibility/antigravity.mjs.map +1 -0
- package/dist/services/compatibility/codex.cjs +2 -0
- package/dist/services/compatibility/codex.cjs.map +1 -0
- package/dist/services/compatibility/codex.d.cts +19 -0
- package/dist/services/compatibility/codex.d.cts.map +1 -0
- package/dist/services/compatibility/codex.d.mts +19 -0
- package/dist/services/compatibility/codex.d.mts.map +1 -0
- package/dist/services/compatibility/codex.mjs +2 -0
- package/dist/services/compatibility/codex.mjs.map +1 -0
- package/dist/services/compatibility/index.cjs +2 -0
- package/dist/services/compatibility/index.cjs.map +1 -0
- package/dist/services/compatibility/index.d.cts +16 -0
- package/dist/services/compatibility/index.d.cts.map +1 -0
- package/dist/services/compatibility/index.d.mts +16 -0
- package/dist/services/compatibility/index.d.mts.map +1 -0
- package/dist/services/compatibility/index.mjs +2 -0
- package/dist/services/compatibility/index.mjs.map +1 -0
- package/dist/services/compatibility/process.cjs +2 -0
- package/dist/services/compatibility/process.cjs.map +1 -0
- package/dist/services/compatibility/process.d.cts +35 -0
- package/dist/services/compatibility/process.d.cts.map +1 -0
- package/dist/services/compatibility/process.d.mts +35 -0
- package/dist/services/compatibility/process.d.mts.map +1 -0
- package/dist/services/compatibility/process.mjs +2 -0
- package/dist/services/compatibility/process.mjs.map +1 -0
- package/dist/services/compatibility/shared.cjs +2 -0
- package/dist/services/compatibility/shared.cjs.map +1 -0
- package/dist/services/compatibility/shared.d.cts +33 -0
- package/dist/services/compatibility/shared.d.cts.map +1 -0
- package/dist/services/compatibility/shared.d.mts +33 -0
- package/dist/services/compatibility/shared.d.mts.map +1 -0
- package/dist/services/compatibility/shared.mjs +2 -0
- package/dist/services/compatibility/shared.mjs.map +1 -0
- package/dist/services/compatibilityContext.cjs +2 -0
- package/dist/services/compatibilityContext.cjs.map +1 -0
- package/dist/services/compatibilityContext.d.cts +23 -0
- package/dist/services/compatibilityContext.d.cts.map +1 -0
- package/dist/services/compatibilityContext.d.mts +23 -0
- package/dist/services/compatibilityContext.d.mts.map +1 -0
- package/dist/services/compatibilityContext.mjs +2 -0
- package/dist/services/compatibilityContext.mjs.map +1 -0
- package/dist/services/composer.cjs +2 -0
- package/dist/services/composer.cjs.map +1 -0
- package/dist/services/composer.d.cts +133 -0
- package/dist/services/composer.d.cts.map +1 -0
- package/dist/services/composer.d.mts +133 -0
- package/dist/services/composer.d.mts.map +1 -0
- package/dist/services/composer.mjs +2 -0
- package/dist/services/composer.mjs.map +1 -0
- package/dist/services/extensionAssembler.cjs +2 -0
- package/dist/services/extensionAssembler.cjs.map +1 -0
- package/dist/services/extensionAssembler.d.cts +72 -0
- package/dist/services/extensionAssembler.d.cts.map +1 -0
- package/dist/services/extensionAssembler.d.mts +72 -0
- package/dist/services/extensionAssembler.d.mts.map +1 -0
- package/dist/services/extensionAssembler.mjs +2 -0
- package/dist/services/extensionAssembler.mjs.map +1 -0
- package/dist/services/extensionCompiler.cjs +2 -0
- package/dist/services/extensionCompiler.cjs.map +1 -0
- package/dist/services/extensionCompiler.mjs +2 -0
- package/dist/services/extensionCompiler.mjs.map +1 -0
- package/dist/services/harnessContext.cjs +2 -0
- package/dist/services/harnessContext.cjs.map +1 -0
- package/dist/services/harnessContext.d.cts +61 -0
- package/dist/services/harnessContext.d.cts.map +1 -0
- package/dist/services/harnessContext.d.mts +61 -0
- package/dist/services/harnessContext.d.mts.map +1 -0
- package/dist/services/harnessContext.mjs +2 -0
- package/dist/services/harnessContext.mjs.map +1 -0
- package/dist/services/index.cjs +1 -0
- package/dist/services/index.d.cts +14 -0
- package/dist/services/index.d.mts +14 -0
- package/dist/services/index.mjs +1 -0
- package/dist/services/matrixSwitcher.cjs +2 -0
- package/dist/services/matrixSwitcher.cjs.map +1 -0
- package/dist/services/matrixSwitcher.d.cts +46 -0
- package/dist/services/matrixSwitcher.d.cts.map +1 -0
- package/dist/services/matrixSwitcher.d.mts +46 -0
- package/dist/services/matrixSwitcher.d.mts.map +1 -0
- package/dist/services/matrixSwitcher.mjs +2 -0
- package/dist/services/matrixSwitcher.mjs.map +1 -0
- package/dist/services/mcpFilter.cjs +3 -0
- package/dist/services/mcpFilter.cjs.map +1 -0
- package/dist/services/mcpFilter.d.cts +40 -0
- package/dist/services/mcpFilter.d.cts.map +1 -0
- package/dist/services/mcpFilter.d.mts +40 -0
- package/dist/services/mcpFilter.d.mts.map +1 -0
- package/dist/services/mcpFilter.mjs +3 -0
- package/dist/services/mcpFilter.mjs.map +1 -0
- package/dist/services/piSettings.cjs +2 -0
- package/dist/services/piSettings.cjs.map +1 -0
- package/dist/services/piSettings.d.cts +24 -0
- package/dist/services/piSettings.d.cts.map +1 -0
- package/dist/services/piSettings.d.mts +24 -0
- package/dist/services/piSettings.d.mts.map +1 -0
- package/dist/services/piSettings.mjs +2 -0
- package/dist/services/piSettings.mjs.map +1 -0
- package/dist/services/resourceCollector.cjs +3 -0
- package/dist/services/resourceCollector.cjs.map +1 -0
- package/dist/services/resourceCollector.d.cts +16 -0
- package/dist/services/resourceCollector.d.cts.map +1 -0
- package/dist/services/resourceCollector.d.mts +16 -0
- package/dist/services/resourceCollector.d.mts.map +1 -0
- package/dist/services/resourceCollector.mjs +3 -0
- package/dist/services/resourceCollector.mjs.map +1 -0
- package/dist/services/skillCatalog.cjs +2 -0
- package/dist/services/skillCatalog.cjs.map +1 -0
- package/dist/services/skillCatalog.d.cts +56 -0
- package/dist/services/skillCatalog.d.cts.map +1 -0
- package/dist/services/skillCatalog.d.mts +56 -0
- package/dist/services/skillCatalog.d.mts.map +1 -0
- package/dist/services/skillCatalog.mjs +2 -0
- package/dist/services/skillCatalog.mjs.map +1 -0
- package/dist/services/skillSources.cjs +2 -0
- package/dist/services/skillSources.cjs.map +1 -0
- package/dist/services/skillSources.d.cts +24 -0
- package/dist/services/skillSources.d.cts.map +1 -0
- package/dist/services/skillSources.d.mts +24 -0
- package/dist/services/skillSources.d.mts.map +1 -0
- package/dist/services/skillSources.mjs +2 -0
- package/dist/services/skillSources.mjs.map +1 -0
- package/dist/services/syncState.cjs +2 -0
- package/dist/services/syncState.cjs.map +1 -0
- package/dist/services/syncState.d.cts +130 -0
- package/dist/services/syncState.d.cts.map +1 -0
- package/dist/services/syncState.d.mts +130 -0
- package/dist/services/syncState.d.mts.map +1 -0
- package/dist/services/syncState.mjs +2 -0
- package/dist/services/syncState.mjs.map +1 -0
- package/dist/utils/index.cjs +1 -0
- package/dist/utils/index.d.cts +5 -0
- package/dist/utils/index.d.mts +5 -0
- package/dist/utils/index.mjs +1 -0
- package/dist/utils/json.cjs +2 -0
- package/dist/utils/json.cjs.map +1 -0
- package/dist/utils/json.d.cts +23 -0
- package/dist/utils/json.d.cts.map +1 -0
- package/dist/utils/json.d.mts +23 -0
- package/dist/utils/json.d.mts.map +1 -0
- package/dist/utils/json.mjs +2 -0
- package/dist/utils/json.mjs.map +1 -0
- package/dist/utils/moduleResolution.cjs +2 -0
- package/dist/utils/moduleResolution.cjs.map +1 -0
- package/dist/utils/moduleResolution.d.cts +56 -0
- package/dist/utils/moduleResolution.d.cts.map +1 -0
- package/dist/utils/moduleResolution.d.mts +56 -0
- package/dist/utils/moduleResolution.d.mts.map +1 -0
- package/dist/utils/moduleResolution.mjs +2 -0
- package/dist/utils/moduleResolution.mjs.map +1 -0
- package/dist/utils/repository.cjs +2 -0
- package/dist/utils/repository.cjs.map +1 -0
- package/dist/utils/repository.d.cts +21 -0
- package/dist/utils/repository.d.cts.map +1 -0
- package/dist/utils/repository.d.mts +21 -0
- package/dist/utils/repository.d.mts.map +1 -0
- package/dist/utils/repository.mjs +2 -0
- package/dist/utils/repository.mjs.map +1 -0
- package/dist/utils/toolNames.cjs +2 -0
- package/dist/utils/toolNames.cjs.map +1 -0
- package/dist/utils/toolNames.d.cts +25 -0
- package/dist/utils/toolNames.d.cts.map +1 -0
- package/dist/utils/toolNames.d.mts +25 -0
- package/dist/utils/toolNames.d.mts.map +1 -0
- package/dist/utils/toolNames.mjs +2 -0
- package/dist/utils/toolNames.mjs.map +1 -0
- package/package.json +369 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { HarnessState } from "../config/harnessState.cjs";
|
|
2
|
+
import { SyncState } from "./syncState.cjs";
|
|
3
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
|
|
5
|
+
|
|
6
|
+
//#region src/services/composer.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* The runtime half of `doom-pi sync`.
|
|
9
|
+
*
|
|
10
|
+
* Pi's own config carries a single entry, the doom-pi extension, and this is
|
|
11
|
+
* what that entry runs: hydrate the harness environment, apply the startup
|
|
12
|
+
* flags, then load the extension set the matrix selects. It runs again on every
|
|
13
|
+
* `/reload`, which is what lets `/major-mode` swap the set without a restart,
|
|
14
|
+
* since Pi rebuilds its extension runner from whatever a reload produced.
|
|
15
|
+
*/
|
|
16
|
+
/** Marks a process whose extensions this module composed. */
|
|
17
|
+
declare const COMPOSED_ENV = "DOOMPI_COMPOSED";
|
|
18
|
+
/** Survives reload, where argv is re-read but the startup flags must not be. */
|
|
19
|
+
declare const MUTE_ENV = "DOOMPI_MUTE";
|
|
20
|
+
declare const DOOM_FLAGS: {
|
|
21
|
+
readonly majorMode: "major-mode";
|
|
22
|
+
readonly domains: "domains";
|
|
23
|
+
readonly profile: "profile";
|
|
24
|
+
readonly mute: "mute";
|
|
25
|
+
};
|
|
26
|
+
/** Removed flag, reported rather than ignored when a synced session passes it. */
|
|
27
|
+
declare const REMOVED_LAYER_FLAG = "layer";
|
|
28
|
+
interface StartupFlags {
|
|
29
|
+
majorMode?: string;
|
|
30
|
+
domains?: string[];
|
|
31
|
+
profile?: string;
|
|
32
|
+
mute: boolean;
|
|
33
|
+
/** True when the caller passed the removed `--layer` flag. */
|
|
34
|
+
removedLayer: boolean;
|
|
35
|
+
}
|
|
36
|
+
interface ComposeOutcome {
|
|
37
|
+
/** Everything that went wrong, reported once the session can show messages. */
|
|
38
|
+
problems: string[];
|
|
39
|
+
/** Config changed since the last sync, which is a prompt to re-sync. */
|
|
40
|
+
stale: boolean;
|
|
41
|
+
loaded: string[];
|
|
42
|
+
}
|
|
43
|
+
/** True when this process already applied the command line, so a reload does not. */
|
|
44
|
+
declare function alreadyComposed(environment?: NodeJS.ProcessEnv): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* True when this process was handed the doom extension set on the command line.
|
|
47
|
+
*
|
|
48
|
+
* The launcher and detached Doom Team children both pass the composed list as
|
|
49
|
+
* `--extension` arguments, and Pi merges those with whatever project settings
|
|
50
|
+
* declare. Composing again here would load every extension twice, which Pi
|
|
51
|
+
* reports as each tool and flag conflicting with itself.
|
|
52
|
+
*
|
|
53
|
+
* Matching against the synced paths rather than the mere presence of
|
|
54
|
+
* `--extension` keeps an unrelated one-off, `pi -e ./debug.ts`, from silently
|
|
55
|
+
* costing the user their whole setup.
|
|
56
|
+
*/
|
|
57
|
+
declare function extensionsProvidedExternally(argv: string[], resolved: Record<string, string>): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Finds the repository whose synced state applies to this session.
|
|
60
|
+
*
|
|
61
|
+
* Pi only reads `.pi/settings.json` from its own working directory, so that is
|
|
62
|
+
* the first place to look; walking up covers a session started in a
|
|
63
|
+
* subdirectory with the extension configured globally.
|
|
64
|
+
*/
|
|
65
|
+
declare function findSyncedRoot(cwd: string): string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Opens this process's session from what sync pinned.
|
|
68
|
+
*
|
|
69
|
+
* The synced record is decoded underneath the live environment, so an inherited
|
|
70
|
+
* value still wins: a launcher run, a nested session, or a CI override is more
|
|
71
|
+
* specific than anything sync wrote. The result becomes the session's state
|
|
72
|
+
* file, which is the authority from here on; the environment it publishes is
|
|
73
|
+
* for the bash hooks and the packages that can only read one.
|
|
74
|
+
*/
|
|
75
|
+
declare function startSyncedSession(state: SyncState, repoRoot: string, environment?: NodeJS.ProcessEnv): Promise<HarnessState>;
|
|
76
|
+
/**
|
|
77
|
+
* Reads the doom flags off the command line.
|
|
78
|
+
*
|
|
79
|
+
* Pi collects unrecognized flags for extensions but hands their values back
|
|
80
|
+
* only after every extension has loaded, which is too late to decide what to
|
|
81
|
+
* load. Parsing argv with Pi's own parser keeps the value rules identical.
|
|
82
|
+
*/
|
|
83
|
+
declare function readStartupFlags(argv: string[]): StartupFlags;
|
|
84
|
+
/** Registers the flags so Pi accepts them and lists them in `pi --help`. */
|
|
85
|
+
declare function registerDoomFlags(pi: Pick<ExtensionAPI, 'registerFlag'>): void;
|
|
86
|
+
/**
|
|
87
|
+
* Applies the startup flags through the same switchers the slash commands use.
|
|
88
|
+
*
|
|
89
|
+
* A bad value is collected rather than thrown: a factory that throws takes the
|
|
90
|
+
* whole doom setup down with it, which is far worse than one unapplied flag.
|
|
91
|
+
*/
|
|
92
|
+
declare function applyStartupFlags(flags: StartupFlags, majorModesConfig: MajorModesConfig, repoRoot: string, problems: string[]): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Points harness state at a per-process directory before anything writes there.
|
|
95
|
+
*
|
|
96
|
+
* The synced directory is a baseline that every session reads; live switches
|
|
97
|
+
* materialize into this one instead, so a second session in the same repository
|
|
98
|
+
* cannot overwrite what the first is using.
|
|
99
|
+
*/
|
|
100
|
+
declare function prepareRunDirectory(repoRoot: string, environment?: NodeJS.ProcessEnv): Promise<string>;
|
|
101
|
+
/** Removes this session's scratch directory. */
|
|
102
|
+
declare function cleanupRunDirectory(repoRoot: string): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Builds the ordered list of extensions to load for the current state.
|
|
105
|
+
*
|
|
106
|
+
* Returns them in Pi load order. `assembleExtensions` produces the order the
|
|
107
|
+
* launcher passes to Pi, where the last element becomes the first `--extension`
|
|
108
|
+
* argument, so reversing here keeps that rule stated in exactly one place.
|
|
109
|
+
*/
|
|
110
|
+
declare function composeLoadOrder(state: SyncState, harness?: HarnessState, environment?: NodeJS.ProcessEnv): Promise<string[]>;
|
|
111
|
+
/**
|
|
112
|
+
* Imports each extension and hands it the same Pi API this module received.
|
|
113
|
+
*
|
|
114
|
+
* Every Pi extension entry is a factory of the same shape, so one extension can
|
|
115
|
+
* activate the rest. Failures are per entry: one unloadable module must not
|
|
116
|
+
* cost the session everything after it in the order.
|
|
117
|
+
*/
|
|
118
|
+
declare function loadComposedExtensions(pi: ExtensionAPI, entries: string[], problems: string[]): Promise<string[]>;
|
|
119
|
+
interface ComposeOptions {
|
|
120
|
+
cwd?: string;
|
|
121
|
+
argv?: string[];
|
|
122
|
+
environment?: NodeJS.ProcessEnv;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Runs the whole synced startup for one Pi session.
|
|
126
|
+
*
|
|
127
|
+
* Never throws: whatever fails is reported through the outcome so the session
|
|
128
|
+
* still starts and can say what is wrong.
|
|
129
|
+
*/
|
|
130
|
+
declare function composeDoomSession(pi: ExtensionAPI, options?: ComposeOptions): Promise<ComposeOutcome>;
|
|
131
|
+
//#endregion
|
|
132
|
+
export { COMPOSED_ENV, ComposeOptions, ComposeOutcome, DOOM_FLAGS, MUTE_ENV, REMOVED_LAYER_FLAG, StartupFlags, alreadyComposed, applyStartupFlags, cleanupRunDirectory, composeDoomSession, composeLoadOrder, extensionsProvidedExternally, findSyncedRoot, loadComposedExtensions, prepareRunDirectory, readStartupFlags, registerDoomFlags, startSyncedSession };
|
|
133
|
+
//# sourceMappingURL=composer.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer.d.cts","names":[],"sources":["../../src/services/composer.ts"],"mappings":";;;;;;;;AAwCA;;;;;AAEA;;;cAFa,YAAA;;cAEA,QAAA;AAAA,cAQA,UAAA;EAAA;;;;;;cAQA,kBAAA;AAAA,UAEI,YAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EAN6B;EAQ7B,YAAA;AAAA;AAAA,UAGe,cAAA;EATY;EAW3B,QAAA;EATA;EAWA,KAAA;EACA,MAAA;AAAA;;iBAQc,eAAA,CAAgB,WAAA,GAAa,MAAA,CAAO,UAAA;AAbpD;;;;;;;;;AAaA;;;AAbA,iBAqCgB,4BAAA,CAA6B,IAAA,YAAgB,QAAA,EAAU,MAAA;;;;;;AAAvE;;iBAcgB,cAAA,CAAe,GAAA;;;;;;;AAA/B;;;iBAmBsB,kBAAA,CACpB,KAAA,EAAO,SAAA,EACP,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA,CAAQ,YAAA;;AAJX;;;;;;iBA6BgB,gBAAA,CAAiB,IAAA,aAAiB,YAAA;;iBAoBlC,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,YAAA;;;;;;;iBAgBrB,iBAAA,CACpB,KAAA,EAAO,YAAA,EACP,gBAAA,EAAkB,gBAAA,EAClB,QAAA,UACA,QAAA,aACC,OAAA;;;;AAzCH;;;;iBA4EsB,mBAAA,CACpB,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;AA3DH;AAAA,iBAsEsB,mBAAA,CAAoB,QAAA,WAAmB,OAAA;;;;;;;;iBAWvC,gBAAA,CACpB,KAAA,EAAO,SAAA,EACP,OAAA,GAAS,YAAA,EACT,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;;;;;;;;iBA6CmB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,OAAA,YACA,QAAA,aACC,OAAA;AAAA,UAkBc,cAAA;EACf,GAAA;EACA,IAAA;EACA,WAAA,GAAc,MAAA,CAAO,UAAA;AAAA;;;;AAnGvB;;;iBA4GsB,kBAAA,CAAmB,EAAA,EAAI,YAAA,EAAc,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,cAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { HarnessState } from "../config/harnessState.mjs";
|
|
2
|
+
import { SyncState } from "./syncState.mjs";
|
|
3
|
+
import { MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
|
|
4
|
+
import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
5
|
+
|
|
6
|
+
//#region src/services/composer.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* The runtime half of `doom-pi sync`.
|
|
9
|
+
*
|
|
10
|
+
* Pi's own config carries a single entry, the doom-pi extension, and this is
|
|
11
|
+
* what that entry runs: hydrate the harness environment, apply the startup
|
|
12
|
+
* flags, then load the extension set the matrix selects. It runs again on every
|
|
13
|
+
* `/reload`, which is what lets `/major-mode` swap the set without a restart,
|
|
14
|
+
* since Pi rebuilds its extension runner from whatever a reload produced.
|
|
15
|
+
*/
|
|
16
|
+
/** Marks a process whose extensions this module composed. */
|
|
17
|
+
declare const COMPOSED_ENV = "DOOMPI_COMPOSED";
|
|
18
|
+
/** Survives reload, where argv is re-read but the startup flags must not be. */
|
|
19
|
+
declare const MUTE_ENV = "DOOMPI_MUTE";
|
|
20
|
+
declare const DOOM_FLAGS: {
|
|
21
|
+
readonly majorMode: "major-mode";
|
|
22
|
+
readonly domains: "domains";
|
|
23
|
+
readonly profile: "profile";
|
|
24
|
+
readonly mute: "mute";
|
|
25
|
+
};
|
|
26
|
+
/** Removed flag, reported rather than ignored when a synced session passes it. */
|
|
27
|
+
declare const REMOVED_LAYER_FLAG = "layer";
|
|
28
|
+
interface StartupFlags {
|
|
29
|
+
majorMode?: string;
|
|
30
|
+
domains?: string[];
|
|
31
|
+
profile?: string;
|
|
32
|
+
mute: boolean;
|
|
33
|
+
/** True when the caller passed the removed `--layer` flag. */
|
|
34
|
+
removedLayer: boolean;
|
|
35
|
+
}
|
|
36
|
+
interface ComposeOutcome {
|
|
37
|
+
/** Everything that went wrong, reported once the session can show messages. */
|
|
38
|
+
problems: string[];
|
|
39
|
+
/** Config changed since the last sync, which is a prompt to re-sync. */
|
|
40
|
+
stale: boolean;
|
|
41
|
+
loaded: string[];
|
|
42
|
+
}
|
|
43
|
+
/** True when this process already applied the command line, so a reload does not. */
|
|
44
|
+
declare function alreadyComposed(environment?: NodeJS.ProcessEnv): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* True when this process was handed the doom extension set on the command line.
|
|
47
|
+
*
|
|
48
|
+
* The launcher and detached Doom Team children both pass the composed list as
|
|
49
|
+
* `--extension` arguments, and Pi merges those with whatever project settings
|
|
50
|
+
* declare. Composing again here would load every extension twice, which Pi
|
|
51
|
+
* reports as each tool and flag conflicting with itself.
|
|
52
|
+
*
|
|
53
|
+
* Matching against the synced paths rather than the mere presence of
|
|
54
|
+
* `--extension` keeps an unrelated one-off, `pi -e ./debug.ts`, from silently
|
|
55
|
+
* costing the user their whole setup.
|
|
56
|
+
*/
|
|
57
|
+
declare function extensionsProvidedExternally(argv: string[], resolved: Record<string, string>): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Finds the repository whose synced state applies to this session.
|
|
60
|
+
*
|
|
61
|
+
* Pi only reads `.pi/settings.json` from its own working directory, so that is
|
|
62
|
+
* the first place to look; walking up covers a session started in a
|
|
63
|
+
* subdirectory with the extension configured globally.
|
|
64
|
+
*/
|
|
65
|
+
declare function findSyncedRoot(cwd: string): string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Opens this process's session from what sync pinned.
|
|
68
|
+
*
|
|
69
|
+
* The synced record is decoded underneath the live environment, so an inherited
|
|
70
|
+
* value still wins: a launcher run, a nested session, or a CI override is more
|
|
71
|
+
* specific than anything sync wrote. The result becomes the session's state
|
|
72
|
+
* file, which is the authority from here on; the environment it publishes is
|
|
73
|
+
* for the bash hooks and the packages that can only read one.
|
|
74
|
+
*/
|
|
75
|
+
declare function startSyncedSession(state: SyncState, repoRoot: string, environment?: NodeJS.ProcessEnv): Promise<HarnessState>;
|
|
76
|
+
/**
|
|
77
|
+
* Reads the doom flags off the command line.
|
|
78
|
+
*
|
|
79
|
+
* Pi collects unrecognized flags for extensions but hands their values back
|
|
80
|
+
* only after every extension has loaded, which is too late to decide what to
|
|
81
|
+
* load. Parsing argv with Pi's own parser keeps the value rules identical.
|
|
82
|
+
*/
|
|
83
|
+
declare function readStartupFlags(argv: string[]): StartupFlags;
|
|
84
|
+
/** Registers the flags so Pi accepts them and lists them in `pi --help`. */
|
|
85
|
+
declare function registerDoomFlags(pi: Pick<ExtensionAPI, 'registerFlag'>): void;
|
|
86
|
+
/**
|
|
87
|
+
* Applies the startup flags through the same switchers the slash commands use.
|
|
88
|
+
*
|
|
89
|
+
* A bad value is collected rather than thrown: a factory that throws takes the
|
|
90
|
+
* whole doom setup down with it, which is far worse than one unapplied flag.
|
|
91
|
+
*/
|
|
92
|
+
declare function applyStartupFlags(flags: StartupFlags, majorModesConfig: MajorModesConfig, repoRoot: string, problems: string[]): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Points harness state at a per-process directory before anything writes there.
|
|
95
|
+
*
|
|
96
|
+
* The synced directory is a baseline that every session reads; live switches
|
|
97
|
+
* materialize into this one instead, so a second session in the same repository
|
|
98
|
+
* cannot overwrite what the first is using.
|
|
99
|
+
*/
|
|
100
|
+
declare function prepareRunDirectory(repoRoot: string, environment?: NodeJS.ProcessEnv): Promise<string>;
|
|
101
|
+
/** Removes this session's scratch directory. */
|
|
102
|
+
declare function cleanupRunDirectory(repoRoot: string): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Builds the ordered list of extensions to load for the current state.
|
|
105
|
+
*
|
|
106
|
+
* Returns them in Pi load order. `assembleExtensions` produces the order the
|
|
107
|
+
* launcher passes to Pi, where the last element becomes the first `--extension`
|
|
108
|
+
* argument, so reversing here keeps that rule stated in exactly one place.
|
|
109
|
+
*/
|
|
110
|
+
declare function composeLoadOrder(state: SyncState, harness?: HarnessState, environment?: NodeJS.ProcessEnv): Promise<string[]>;
|
|
111
|
+
/**
|
|
112
|
+
* Imports each extension and hands it the same Pi API this module received.
|
|
113
|
+
*
|
|
114
|
+
* Every Pi extension entry is a factory of the same shape, so one extension can
|
|
115
|
+
* activate the rest. Failures are per entry: one unloadable module must not
|
|
116
|
+
* cost the session everything after it in the order.
|
|
117
|
+
*/
|
|
118
|
+
declare function loadComposedExtensions(pi: ExtensionAPI, entries: string[], problems: string[]): Promise<string[]>;
|
|
119
|
+
interface ComposeOptions {
|
|
120
|
+
cwd?: string;
|
|
121
|
+
argv?: string[];
|
|
122
|
+
environment?: NodeJS.ProcessEnv;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Runs the whole synced startup for one Pi session.
|
|
126
|
+
*
|
|
127
|
+
* Never throws: whatever fails is reported through the outcome so the session
|
|
128
|
+
* still starts and can say what is wrong.
|
|
129
|
+
*/
|
|
130
|
+
declare function composeDoomSession(pi: ExtensionAPI, options?: ComposeOptions): Promise<ComposeOutcome>;
|
|
131
|
+
//#endregion
|
|
132
|
+
export { COMPOSED_ENV, ComposeOptions, ComposeOutcome, DOOM_FLAGS, MUTE_ENV, REMOVED_LAYER_FLAG, StartupFlags, alreadyComposed, applyStartupFlags, cleanupRunDirectory, composeDoomSession, composeLoadOrder, extensionsProvidedExternally, findSyncedRoot, loadComposedExtensions, prepareRunDirectory, readStartupFlags, registerDoomFlags, startSyncedSession };
|
|
133
|
+
//# sourceMappingURL=composer.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer.d.mts","names":[],"sources":["../../src/services/composer.ts"],"mappings":";;;;;;;;AAwCA;;;;;AAEA;;;cAFa,YAAA;;cAEA,QAAA;AAAA,cAQA,UAAA;EAAA;;;;;;cAQA,kBAAA;AAAA,UAEI,YAAA;EACf,SAAA;EACA,OAAA;EACA,OAAA;EACA,IAAA;EAN6B;EAQ7B,YAAA;AAAA;AAAA,UAGe,cAAA;EATY;EAW3B,QAAA;EATA;EAWA,KAAA;EACA,MAAA;AAAA;;iBAQc,eAAA,CAAgB,WAAA,GAAa,MAAA,CAAO,UAAA;AAbpD;;;;;;;;;AAaA;;;AAbA,iBAqCgB,4BAAA,CAA6B,IAAA,YAAgB,QAAA,EAAU,MAAA;;;;;;AAAvE;;iBAcgB,cAAA,CAAe,GAAA;;;;;;;AAA/B;;;iBAmBsB,kBAAA,CACpB,KAAA,EAAO,SAAA,EACP,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA,CAAQ,YAAA;;AAJX;;;;;;iBA6BgB,gBAAA,CAAiB,IAAA,aAAiB,YAAA;;iBAoBlC,iBAAA,CAAkB,EAAA,EAAI,IAAA,CAAK,YAAA;;;;;;;iBAgBrB,iBAAA,CACpB,KAAA,EAAO,YAAA,EACP,gBAAA,EAAkB,gBAAA,EAClB,QAAA,UACA,QAAA,aACC,OAAA;;;;AAzCH;;;;iBA4EsB,mBAAA,CACpB,QAAA,UACA,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;AA3DH;AAAA,iBAsEsB,mBAAA,CAAoB,QAAA,WAAmB,OAAA;;;;;;;;iBAWvC,gBAAA,CACpB,KAAA,EAAO,SAAA,EACP,OAAA,GAAS,YAAA,EACT,WAAA,GAAa,MAAA,CAAO,UAAA,GACnB,OAAA;;;;;;;;iBA6CmB,sBAAA,CACpB,EAAA,EAAI,YAAA,EACJ,OAAA,YACA,QAAA,aACC,OAAA;AAAA,UAkBc,cAAA;EACf,GAAA;EACA,IAAA;EACA,WAAA,GAAc,MAAA,CAAO,UAAA;AAAA;;;;AAnGvB;;;iBA4GsB,kBAAA,CAAmB,EAAA,EAAI,YAAA,EAAc,OAAA,GAAS,cAAA,GAAsB,OAAA,CAAQ,cAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createHarnessSession as e,getHarnessState as t,loadHarnessState as n,readHarnessState as r,updateHarnessState as i}from"../config/harnessState.mjs";import{findRepositoryRoot as a}from"../utils/repository.mjs";import"../utils/index.mjs";import{selectWorkflowExtensionForProcess as o}from"./resourceCollector.mjs";import{CONTEXT_PACKAGES as s,PERSONA_ENTRY as c,assembleChildExtensions as l,assembleExtensions as u}from"./extensionAssembler.mjs";import{configurePreset as d}from"./harnessContext.mjs";import{applyDomains as f,applyMajorMode as p,applyProfile as m}from"./matrixSwitcher.mjs";import{computeInputsHash as h,createMapResolvers as g,readSyncState as _,runDirectory as v,syncStatePath as y}from"./syncState.mjs";import b from"node:path";import x from"node:fs";import{resolveProfile as S}from"@agimon-ai/doompi-config/profiles";import{loadMajorModesConfig as C}from"@agimon-ai/doompi-config/majorModes";import{pathToFileURL as w}from"node:url";import{parseArgs as T}from"@earendil-works/pi-coding-agent";const E=`DOOMPI_COMPOSED`,D=`DOOMPI_MUTE`,O=`doompi is configured for Pi but this repository was never synced. Run doompi sync.`,k={majorMode:`major-mode`,domains:`domains`,profile:`profile`,mute:`mute`},A=`layer`;function j(e){return e instanceof Error?e.message:String(e)}function M(e=process.env){return e[E]===`1`}function N(e){try{return x.realpathSync(e)}catch{return b.resolve(e)}}function P(e,t){let{extensions:n}=T(e);if(!n||n.length===0)return!1;let r=new Set(Object.values(t).map(N));return n.some(e=>r.has(N(e)))}function F(e){if(x.existsSync(y(e)))return e;try{let t=a(e);return x.existsSync(y(t))?t:void 0}catch{return}}async function I(t,n,i=process.env){let a=await B(n),o={...r({...t.env,...i}),...t.fileState,temporaryDirectory:a};e(o,{directory:a,environment:i});for(let[e,t]of Object.entries(o.profileEnvironment))i[e]===void 0&&(i[e]=t);return o}function L(e){let{unknownFlags:t}=T(e),n=e=>{let n=t.get(e);return typeof n==`string`&&n.trim()?n.trim():void 0},r=n(k.domains);return{majorMode:n(k.majorMode),domains:r?.split(`,`).map(e=>e.trim()).filter(Boolean),profile:n(k.profile),mute:t.get(k.mute)!==void 0,removedLayer:t.get(A)!==void 0}}function R(e){e.registerFlag(k.majorMode,{type:`string`,description:`Named major mode from .doom/modes.yaml`}),e.registerFlag(k.domains,{type:`string`,description:`Comma-separated content domains`}),e.registerFlag(k.profile,{type:`string`,description:`Persona and env from .doom/profiles.yaml`}),e.registerFlag(k.mute,{type:`boolean`,description:`Disable the notification extension`})}async function z(e,n,r,i){if(e.removedLayer&&i.push(`--${A} was replaced by --${k.majorMode}`),e.majorMode)try{p(n,e.majorMode,t())}catch(t){i.push(`--${k.majorMode} ${e.majorMode}: ${j(t)}`)}if(e.domains&&e.domains.length>0)try{await f(e.domains,t())}catch(t){i.push(`--domains ${e.domains.join(`,`)}: ${j(t)}`)}if(e.profile)try{await m(S(r,e.profile),t())}catch(t){i.push(`--profile ${e.profile}: ${j(t)}`)}}async function B(e,t=process.env){let n=v(e);return await x.promises.mkdir(n,{mode:448,recursive:!0}),i({temporaryDirectory:n},t),n}async function V(e){await x.promises.rm(v(e),{recursive:!0,force:!0})}async function H(e,n=t(),r=process.env){let a=n.root??e.root,d=g(e.resolved,e.compiled),f=n.mcp?d.optionalPackageEntry(s.mcp):void 0,p={agents:n.agents,autoStop:!1,preset:e.selection.preset,mcpEntry:f,personaEntry:d.ownEntry(c),workflowExtension:o(d.optionalPackageEntry(s.workflow),d.optionalPackageEntry(s.dispatcherWorkflow),r),layers:[...n.layers],majorModesConfig:C(a),resolvers:d};return i({childExtensions:l({...p,agents:!1,mute:!0})},r),n.agents&&(r.PI_SUBAGENT_EXTRA_AGENT_DIRS=n.agentDirectories.join(b.delimiter),r.PI_SUBAGENT_EXTRA_SKILL_DIRS=n.skillDirectories.join(b.delimiter)),[...u({...p,mute:r[D]===`1`})].reverse()}async function U(e,t,n){let r=[];for(let i of t)try{let t=await import(w(i).href);if(typeof t.default!=`function`){n.push(`${i}: does not export an extension factory`);continue}await t.default(e),r.push(i)}catch(e){n.push(`${i}: ${j(e)}`)}return r}async function W(e,t={}){let r=t.environment??process.env,i=[],a=F(t.cwd??process.cwd());if(!a)return{problems:[O],stale:!1,loaded:[]};let o;try{o=_(a)}catch(e){return{problems:[j(e)],stale:!1,loaded:[]}}if(!o)return{problems:[O],stale:!1,loaded:[]};let s=t.argv??process.argv.slice(2);if(P(s,o.resolved))return{problems:[],stale:!1,loaded:[]};if(d({preset:o.selection.preset,piArgs:[]},r),!M(r)){r[E]=`1`,await I(o,a,r);let e=L(s);e.mute&&(r[D]=`1`),await z(e,C(a),a,i)}let c;try{c=await H(o,n(r).state,r)}catch(e){return{problems:[...i,j(e)],stale:!1,loaded:[]}}let l=await U(e,c,i);return{problems:i,stale:h(a,o.selection)!==o.inputsHash,loaded:l}}export{E as COMPOSED_ENV,k as DOOM_FLAGS,D as MUTE_ENV,A as REMOVED_LAYER_FLAG,M as alreadyComposed,z as applyStartupFlags,V as cleanupRunDirectory,W as composeDoomSession,H as composeLoadOrder,P as extensionsProvidedExternally,F as findSyncedRoot,U as loadComposedExtensions,B as prepareRunDirectory,L as readStartupFlags,R as registerDoomFlags,I as startSyncedSession};
|
|
2
|
+
//# sourceMappingURL=composer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer.mjs","names":[],"sources":["../../src/services/composer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { loadMajorModesConfig, type MajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { resolveProfile } from '@agimon-ai/doompi-config/profiles';\nimport { parseArgs, type ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport {\n createHarnessSession,\n getHarnessState,\n loadHarnessState,\n readHarnessState,\n updateHarnessState,\n type HarnessState,\n} from '../config/harnessState.ts';\nimport type { HarnessPreset } from '../interfaces/index.ts';\nimport { findRepositoryRoot } from '../utils/index.ts';\nimport { CONTEXT_PACKAGES, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions } from './extensionAssembler.ts';\nimport { configurePreset } from './harnessContext.ts';\nimport { applyDomains, applyMajorMode, applyProfile } from './matrixSwitcher.ts';\nimport { selectWorkflowExtensionForProcess } from './resourceCollector.ts';\nimport {\n computeInputsHash,\n createMapResolvers,\n readSyncState,\n runDirectory,\n syncStatePath,\n type SyncState,\n} from './syncState.ts';\n\n/**\n * The runtime half of `doom-pi sync`.\n *\n * Pi's own config carries a single entry, the doom-pi extension, and this is\n * what that entry runs: hydrate the harness environment, apply the startup\n * flags, then load the extension set the matrix selects. It runs again on every\n * `/reload`, which is what lets `/major-mode` swap the set without a restart,\n * since Pi rebuilds its extension runner from whatever a reload produced.\n */\n\n/** Marks a process whose extensions this module composed. */\nexport const COMPOSED_ENV = 'DOOMPI_COMPOSED';\n/** Survives reload, where argv is re-read but the startup flags must not be. */\nexport const MUTE_ENV = 'DOOMPI_MUTE';\nconst ENABLED_FLAG = '1';\nconst SUBAGENT_AGENT_DIRS_ENV = 'PI_SUBAGENT_EXTRA_AGENT_DIRS';\nconst SUBAGENT_SKILL_DIRS_ENV = 'PI_SUBAGENT_EXTRA_SKILL_DIRS';\nconst DOMAIN_SEPARATOR = ',';\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst NOT_SYNCED = 'doompi is configured for Pi but this repository was never synced. Run doompi sync.';\n\nexport const DOOM_FLAGS = {\n majorMode: 'major-mode',\n domains: 'domains',\n profile: 'profile',\n mute: 'mute',\n} as const;\n\n/** Removed flag, reported rather than ignored when a synced session passes it. */\nexport const REMOVED_LAYER_FLAG = 'layer';\n\nexport interface StartupFlags {\n majorMode?: string;\n domains?: string[];\n profile?: string;\n mute: boolean;\n /** True when the caller passed the removed `--layer` flag. */\n removedLayer: boolean;\n}\n\nexport interface ComposeOutcome {\n /** Everything that went wrong, reported once the session can show messages. */\n problems: string[];\n /** Config changed since the last sync, which is a prompt to re-sync. */\n stale: boolean;\n loaded: string[];\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** True when this process already applied the command line, so a reload does not. */\nexport function alreadyComposed(environment: NodeJS.ProcessEnv = process.env): boolean {\n return environment[COMPOSED_ENV] === ENABLED_FLAG;\n}\n\nfunction realPath(target: string): string {\n try {\n return fs.realpathSync(target);\n } catch {\n return path.resolve(target);\n }\n}\n\n/**\n * True when this process was handed the doom extension set on the command line.\n *\n * The launcher and detached Doom Team children both pass the composed list as\n * `--extension` arguments, and Pi merges those with whatever project settings\n * declare. Composing again here would load every extension twice, which Pi\n * reports as each tool and flag conflicting with itself.\n *\n * Matching against the synced paths rather than the mere presence of\n * `--extension` keeps an unrelated one-off, `pi -e ./debug.ts`, from silently\n * costing the user their whole setup.\n */\nexport function extensionsProvidedExternally(argv: string[], resolved: Record<string, string>): boolean {\n const { extensions } = parseArgs(argv);\n if (!extensions || extensions.length === 0) return false;\n const composed = new Set(Object.values(resolved).map(realPath));\n return extensions.some((entry) => composed.has(realPath(entry)));\n}\n\n/**\n * Finds the repository whose synced state applies to this session.\n *\n * Pi only reads `.pi/settings.json` from its own working directory, so that is\n * the first place to look; walking up covers a session started in a\n * subdirectory with the extension configured globally.\n */\nexport function findSyncedRoot(cwd: string): string | undefined {\n if (fs.existsSync(syncStatePath(cwd))) return cwd;\n try {\n const root = findRepositoryRoot(cwd);\n return fs.existsSync(syncStatePath(root)) ? root : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Opens this process's session from what sync pinned.\n *\n * The synced record is decoded underneath the live environment, so an inherited\n * value still wins: a launcher run, a nested session, or a CI override is more\n * specific than anything sync wrote. The result becomes the session's state\n * file, which is the authority from here on; the environment it publishes is\n * for the bash hooks and the packages that can only read one.\n */\nexport async function startSyncedSession(\n state: SyncState,\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<HarnessState> {\n const directory = await prepareRunDirectory(repoRoot);\n const harness: HarnessState = {\n ...readHarnessState({ ...state.env, ...environment }),\n // Recorded separately because no variable carries them.\n ...state.fileState,\n temporaryDirectory: directory,\n };\n createHarnessSession(harness, { directory, environment });\n // The profile's own defaults, which the launcher applies at spawn. They are\n // recorded as a map rather than as variables so /profile can tell which ones\n // it owns when it swaps them out later.\n for (const [key, value] of Object.entries(harness.profileEnvironment)) {\n if (environment[key] === undefined) environment[key] = value;\n }\n return harness;\n}\n\n/**\n * Reads the doom flags off the command line.\n *\n * Pi collects unrecognized flags for extensions but hands their values back\n * only after every extension has loaded, which is too late to decide what to\n * load. Parsing argv with Pi's own parser keeps the value rules identical.\n */\nexport function readStartupFlags(argv: string[]): StartupFlags {\n const { unknownFlags } = parseArgs(argv);\n const text = (name: string): string | undefined => {\n const value = unknownFlags.get(name);\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n };\n const domains = text(DOOM_FLAGS.domains);\n return {\n majorMode: text(DOOM_FLAGS.majorMode),\n domains: domains\n ?.split(DOMAIN_SEPARATOR)\n .map((name) => name.trim())\n .filter(Boolean),\n profile: text(DOOM_FLAGS.profile),\n mute: unknownFlags.get(DOOM_FLAGS.mute) !== undefined,\n removedLayer: unknownFlags.get(REMOVED_LAYER_FLAG) !== undefined,\n };\n}\n\n/** Registers the flags so Pi accepts them and lists them in `pi --help`. */\nexport function registerDoomFlags(pi: Pick<ExtensionAPI, 'registerFlag'>): void {\n pi.registerFlag(DOOM_FLAGS.majorMode, {\n type: 'string',\n description: 'Named major mode from .doom/modes.yaml',\n });\n pi.registerFlag(DOOM_FLAGS.domains, { type: 'string', description: 'Comma-separated content domains' });\n pi.registerFlag(DOOM_FLAGS.profile, { type: 'string', description: 'Persona and env from .doom/profiles.yaml' });\n pi.registerFlag(DOOM_FLAGS.mute, { type: 'boolean', description: 'Disable the notification extension' });\n}\n\n/**\n * Applies the startup flags through the same switchers the slash commands use.\n *\n * A bad value is collected rather than thrown: a factory that throws takes the\n * whole doom setup down with it, which is far worse than one unapplied flag.\n */\nexport async function applyStartupFlags(\n flags: StartupFlags,\n majorModesConfig: MajorModesConfig,\n repoRoot: string,\n problems: string[],\n): Promise<void> {\n // Reported rather than ignored: Pi hands unrecognized flags to extensions, so\n // a stale `--layer dev` would otherwise start a session on the wrong mode\n // without saying anything.\n if (flags.removedLayer) problems.push(`--${REMOVED_LAYER_FLAG} was replaced by --${DOOM_FLAGS.majorMode}`);\n if (flags.majorMode) {\n try {\n applyMajorMode(majorModesConfig, flags.majorMode, getHarnessState());\n } catch (error) {\n problems.push(`--${DOOM_FLAGS.majorMode} ${flags.majorMode}: ${message(error)}`);\n }\n }\n if (flags.domains && flags.domains.length > 0) {\n try {\n await applyDomains(flags.domains, getHarnessState());\n } catch (error) {\n problems.push(`--domains ${flags.domains.join(DOMAIN_SEPARATOR)}: ${message(error)}`);\n }\n }\n if (flags.profile) {\n try {\n await applyProfile(resolveProfile(repoRoot, flags.profile), getHarnessState());\n } catch (error) {\n problems.push(`--profile ${flags.profile}: ${message(error)}`);\n }\n }\n}\n\n/**\n * Points harness state at a per-process directory before anything writes there.\n *\n * The synced directory is a baseline that every session reads; live switches\n * materialize into this one instead, so a second session in the same repository\n * cannot overwrite what the first is using.\n */\nexport async function prepareRunDirectory(\n repoRoot: string,\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string> {\n const directory = runDirectory(repoRoot);\n await fs.promises.mkdir(directory, { mode: PRIVATE_DIRECTORY_MODE, recursive: true });\n // Through the store rather than the environment: the state file is the\n // authority, and a switcher reading a stale directory would write a live\n // session's resources into the wrong place.\n updateHarnessState({ temporaryDirectory: directory }, environment);\n return directory;\n}\n\n/** Removes this session's scratch directory. */\nexport async function cleanupRunDirectory(repoRoot: string): Promise<void> {\n await fs.promises.rm(runDirectory(repoRoot), { recursive: true, force: true });\n}\n\n/**\n * Builds the ordered list of extensions to load for the current state.\n *\n * Returns them in Pi load order. `assembleExtensions` produces the order the\n * launcher passes to Pi, where the last element becomes the first `--extension`\n * argument, so reversing here keeps that rule stated in exactly one place.\n */\nexport async function composeLoadOrder(\n state: SyncState,\n harness: HarnessState = getHarnessState(),\n environment: NodeJS.ProcessEnv = process.env,\n): Promise<string[]> {\n const repoRoot = harness.root ?? state.root;\n const resolvers = createMapResolvers(state.resolved, state.compiled);\n // Resolved from the sync map rather than generated: doom-mcp reads the\n // repository and plugin layers itself, and the environment the launcher wrote\n // already tells it which plugins and allowlist this session selected.\n const mcpEntry = harness.mcp ? resolvers.optionalPackageEntry(CONTEXT_PACKAGES.mcp) : undefined;\n const context = {\n agents: harness.agents,\n // Exiting when the agent settles is a launcher decision with no synced\n // equivalent: a session started by hand is meant to stay open.\n autoStop: false,\n preset: state.selection.preset,\n mcpEntry,\n personaEntry: resolvers.ownEntry(PERSONA_ENTRY),\n workflowExtension: selectWorkflowExtensionForProcess(\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.workflow),\n resolvers.optionalPackageEntry(CONTEXT_PACKAGES.dispatcherWorkflow),\n environment,\n ),\n layers: [...harness.layers],\n majorModesConfig: loadMajorModesConfig(repoRoot),\n resolvers,\n };\n\n // A state field, so it goes through the store: Doom Team reads it from the\n // environment the store publishes when it builds a child's spawn snapshot.\n updateHarnessState(\n { childExtensions: assembleChildExtensions({ ...context, agents: false, mute: true }) },\n environment,\n );\n if (harness.agents) {\n environment[SUBAGENT_AGENT_DIRS_ENV] = harness.agentDirectories.join(path.delimiter);\n environment[SUBAGENT_SKILL_DIRS_ENV] = harness.skillDirectories.join(path.delimiter);\n }\n return [...assembleExtensions({ ...context, mute: environment[MUTE_ENV] === ENABLED_FLAG })].reverse();\n}\n\n/**\n * Imports each extension and hands it the same Pi API this module received.\n *\n * Every Pi extension entry is a factory of the same shape, so one extension can\n * activate the rest. Failures are per entry: one unloadable module must not\n * cost the session everything after it in the order.\n */\nexport async function loadComposedExtensions(\n pi: ExtensionAPI,\n entries: string[],\n problems: string[],\n): Promise<string[]> {\n const loaded: string[] = [];\n for (const entry of entries) {\n try {\n const module = (await import(pathToFileURL(entry).href)) as { default?: unknown };\n if (typeof module.default !== 'function') {\n problems.push(`${entry}: does not export an extension factory`);\n continue;\n }\n await (module.default as (api: ExtensionAPI) => void | Promise<void>)(pi);\n loaded.push(entry);\n } catch (error) {\n problems.push(`${entry}: ${message(error)}`);\n }\n }\n return loaded;\n}\n\nexport interface ComposeOptions {\n cwd?: string;\n argv?: string[];\n environment?: NodeJS.ProcessEnv;\n}\n\n/**\n * Runs the whole synced startup for one Pi session.\n *\n * Never throws: whatever fails is reported through the outcome so the session\n * still starts and can say what is wrong.\n */\nexport async function composeDoomSession(pi: ExtensionAPI, options: ComposeOptions = {}): Promise<ComposeOutcome> {\n const environment = options.environment ?? process.env;\n const problems: string[] = [];\n const repoRoot = findSyncedRoot(options.cwd ?? process.cwd());\n if (!repoRoot) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n let state: SyncState | undefined;\n try {\n state = readSyncState(repoRoot);\n } catch (error) {\n return { problems: [message(error)], stale: false, loaded: [] };\n }\n if (!state) return { problems: [NOT_SYNCED], stale: false, loaded: [] };\n\n const argv = options.argv ?? process.argv.slice(2);\n // The launcher and Doom Team children compose the set themselves and pass it\n // in, so this entry has nothing left to do but stay out of the way.\n if (extensionsProvidedExternally(argv, state.resolved)) return { problems: [], stale: false, loaded: [] };\n\n configurePreset({ preset: state.selection.preset as HarnessPreset, piArgs: [] }, environment);\n\n // Only the first load opens a session. A reload finds the pointer this set\n // and reads the file back, which is what carries a live /domains or /profile\n // switch across the reload instead of resetting it to what sync pinned.\n if (!alreadyComposed(environment)) {\n environment[COMPOSED_ENV] = ENABLED_FLAG;\n await startSyncedSession(state, repoRoot, environment);\n const flags = readStartupFlags(argv);\n if (flags.mute) environment[MUTE_ENV] = ENABLED_FLAG;\n await applyStartupFlags(flags, loadMajorModesConfig(repoRoot), repoRoot, problems);\n }\n\n let entries: string[];\n try {\n // Read back through the store rather than from this process: the startup\n // flags may have switched the layer or the domains a moment ago, and the\n // environment being managed is not always this process's own.\n entries = await composeLoadOrder(state, loadHarnessState(environment).state, environment);\n } catch (error) {\n return { problems: [...problems, message(error)], stale: false, loaded: [] };\n }\n\n const loaded = await loadComposedExtensions(pi, entries, problems);\n return { problems, stale: computeInputsHash(repoRoot, state.selection) !== state.inputsHash, loaded };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../utils/moduleResolution.cjs`);require(`../utils/index.cjs`);let t=require(`@agimon-ai/doompi-config/majorModes`);const n={ownEntry:e.ownEntry,packageEntry:e.packageEntry,optionalPackageEntry:e.optionalPackageEntry,localEntry:e.localEntry};function r(t){return t?{ownEntry:e.ownEntry,packageEntry:n=>e.consumerPackageEntry(n,t)??e.packageEntry(n),optionalPackageEntry:n=>e.consumerPackageEntry(n,t)??e.optionalPackageEntry(n),localEntry:e.localEntry}:n}const i=`guardrails`,a=`vibe-lint`,o=`code-intel`,s=`plan-mode`,c=`runner`,l=`ask-user`,u=`style-system`,d=`goal`,f={autoStop:`autoStop`,domains:`domains`,effort:`effort`,majorMode:`majorMode`,notifications:`notifications`,ollamaProvider:`ollamaProvider`,profile:`profile`,skills:`skills`},p={autocompact:`@agimon-ai/doompi-autocompact/extensions/pi`,doomConfig:`@agimon-ai/doompi-config/pi`,addDir:`pi-add-dir/extensions/pi-add-dir/index.ts`,cacheOptimizer:`pi-cache-optimizer/index.ts`,doomUi:`@agimon-ai/doompi-ui/extensions/pi`,fileEdit:`@agimon-ai/doompi-file-edit/extensions/doom`,logSinkTelemetry:`@agimon-ai/doompi-log/extensions/pi`,loop:`@agimon-ai/doompi-loop/extensions/pi`,task:`@agimon-ai/doompi-task/extensions/pi`,voice:`@agimon-ai/doompi-voice/extensions/doom`},m=new Set([i,a,o]),h={mcp:`@agimon-ai/doompi-mcp/extensions/pi`,workflow:`@agimon-ai/doompi-workflow/extensions/pi`,dispatcherWorkflow:`@agimon-ai/doompi-workflow/extensions/dispatcher`};function g(e){let r=e.majorModesConfig,m=e.resolvers??n,h=e=>m.ownEntry(e),g=e=>m.packageEntry(e),_=new Set(e.layers),v=e=>_.has(e)?(0,t.layerEntries)(r,e,m):[],y=[];return e.mcpEntry&&y.push(e.mcpEntry),y.push(g(p.logSinkTelemetry)),e.personaEntry&&y.push(e.personaEntry),e.workflowExtension&&y.push(e.workflowExtension),y.push(...v(`agiflow`),...v(i),...v(a),...v(o)),e.preset===`ollama`&&y.push(h(f.ollamaProvider)),y.push(h(f.effort)),y.push(...v(s)),y.push(g(p.task)),y.push(g(p.loop)),y.push(g(p.autocompact)),y.push(g(p.fileEdit)),y.push(...v(c)),y.push(...v(l),...v(u)),y.push(g(p.voice)),y.push(h(f.domains)),y.push(h(f.skills)),y.push(h(f.majorMode)),y.push(h(f.profile)),y.push(...v(d)),y.push(g(p.addDir)),y.push(g(p.cacheOptimizer)),e.mute||y.push(h(f.notifications)),e.agents&&y.push(...v(`team`)),y.push(g(p.doomUi)),y.push(g(p.doomConfig)),e.autoStop&&y.unshift(h(f.autoStop)),y}function _(e){let r=e.resolvers??n,m=e=>r.packageEntry(e),h=new Set(e.layers),g=n=>h.has(n)?(0,t.layerEntries)(e.majorModesConfig,n,r):[],_=[];return e.mcpEntry&&_.push(e.mcpEntry),_.push(m(p.logSinkTelemetry)),e.personaEntry&&_.push(e.personaEntry),e.preset===`ollama`&&_.push(r.ownEntry(f.ollamaProvider)),_.push(...g(i),...g(a),...g(o),...g(s),...g(c),...g(l),...g(u),...g(d)),_.push(m(p.autocompact)),_.push(m(p.doomConfig)),[...new Set(_)]}function v(e,t){return t?[...e]:e.filter(e=>!m.has(e))}exports.CONTEXT_PACKAGES=h,exports.LAYER_RESOLVERS=n,exports.OLLAMA_PRESET=`ollama`,exports.PERSONA_ENTRY=`persona`,exports.assembleChildExtensions=_,exports.assembleExtensions=g,exports.createLayerResolvers=r,exports.filterHookDisabledLayers=v;
|
|
2
|
+
//# sourceMappingURL=extensionAssembler.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionAssembler.cjs","names":["consumerPackageEntry","packageEntry","optionalPackageEntry"],"sources":["../../src/services/extensionAssembler.ts"],"sourcesContent":["import { type LayerResolvers, type MajorModesConfig, layerEntries } from '@agimon-ai/doompi-config/majorModes';\nimport { consumerPackageEntry, localEntry, optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\n\nexport interface ExtensionContext {\n agents: boolean;\n autoStop: boolean;\n mute?: boolean;\n preset?: string;\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n /** Resolved layer names from the selected major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /**\n * How entry names become absolute paths. Defaults to resolving them here.\n *\n * The synced Pi path composes inside a Pi session, where module resolution\n * cannot be relied on, so it substitutes resolvers backed by the map\n * `doom-pi sync` recorded. Both paths therefore run this same function.\n */\n resolvers?: LayerResolvers;\n}\n\nexport const LAYER_RESOLVERS: LayerResolvers = { ownEntry, packageEntry, optionalPackageEntry, localEntry };\n\n/**\n * Resolvers that answer for the consumer repository before the meta-package.\n *\n * A repository declares its own layer packages in `.doom/modes.yaml`, and it is\n * the repository that installs them. Doom Pi owns only the Doom closure, so a\n * consumer specifier has to resolve from the consumer root and everything else\n * falls back to what ships with the installed meta-package.\n *\n * Path-style packages skip all of that: they are already anchored to the config\n * that declared them, so there is no chain to search.\n */\nexport function createLayerResolvers(consumerRoot?: string): LayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n return {\n ownEntry,\n packageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? packageEntry(name),\n optionalPackageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? optionalPackageEntry(name),\n localEntry,\n };\n}\n\nconst LAYER_AGIFLOW = 'agiflow';\nconst LAYER_GUARDRAILS = 'guardrails';\nconst LAYER_VIBE_LINT = 'vibe-lint';\nconst LAYER_CODE_INTEL = 'code-intel';\nconst LAYER_TEAM = 'team';\nconst LAYER_PLAN_MODE = 'plan-mode';\nconst LAYER_RUNNER = 'runner';\nconst LAYER_ASK_USER = 'ask-user';\nconst LAYER_STYLE_SYSTEM = 'style-system';\nconst LAYER_GOAL = 'goal';\nexport const OLLAMA_PRESET = 'ollama';\nconst OWN_ENTRIES = {\n autoStop: 'autoStop',\n domains: 'domains',\n effort: 'effort',\n majorMode: 'majorMode',\n notifications: 'notifications',\n ollamaProvider: 'ollamaProvider',\n profile: 'profile',\n skills: 'skills',\n} as const;\nconst PACKAGE_ENTRIES = {\n autocompact: '@agimon-ai/doompi-autocompact/extensions/pi',\n doomConfig: '@agimon-ai/doompi-config/pi',\n addDir: 'pi-add-dir/extensions/pi-add-dir/index.ts',\n cacheOptimizer: 'pi-cache-optimizer/index.ts',\n doomUi: '@agimon-ai/doompi-ui/extensions/pi',\n // Doom entries, not the bare Pi ones: they wrap the same extension and add the\n // leader (and, for voice, config) contributions that only exist under Doom.\n fileEdit: '@agimon-ai/doompi-file-edit/extensions/doom',\n logSinkTelemetry: '@agimon-ai/doompi-log/extensions/pi',\n loop: '@agimon-ai/doompi-loop/extensions/pi',\n task: '@agimon-ai/doompi-task/extensions/pi',\n voice: '@agimon-ai/doompi-voice/extensions/doom',\n} as const;\nconst HOOK_DISABLED_LAYERS = new Set([LAYER_GUARDRAILS, LAYER_VIBE_LINT, LAYER_CODE_INTEL]);\n\n/**\n * Optional packages passed in as context rather than resolved from a layer.\n *\n * Named here so the launcher and the synced Pi path ask for the same three\n * specifiers; the synced path also needs them in its recorded resolution map.\n */\nexport const CONTEXT_PACKAGES = {\n mcp: '@agimon-ai/doompi-mcp/extensions/pi',\n workflow: '@agimon-ai/doompi-workflow/extensions/pi',\n dispatcherWorkflow: '@agimon-ai/doompi-workflow/extensions/dispatcher',\n} as const;\n\n/** Own entry that is always loaded so /profile can pick a persona later. */\nexport const PERSONA_ENTRY = 'persona';\n\n/**\n * Assembles the ordered Pi --extension list.\n *\n * Order is load-bearing: the workflow extension must register its launch tool\n * before the Agiflow dispatcher can steer toward it, and auto-stop must end up\n * first because Pi applies extension arguments in reverse. That is why this\n * function, not modes.yaml, owns the sequence. Layers declare WHAT they\n * contribute; each one is spliced in at its slot below. Kept pure so a snapshot\n * test can pin the result.\n */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n const config = context.majorModesConfig;\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const own = (name: string): string => resolve.ownEntry(name);\n const pkg = (name: string): string => resolve.packageEntry(name);\n const selected = new Set(context.layers);\n const layer = (name: string): string[] => (selected.has(name) ? layerEntries(config, name, resolve) : []);\n const extensions: string[] = [];\n\n if (context.mcpEntry) extensions.push(context.mcpEntry);\n extensions.push(pkg(PACKAGE_ENTRIES.logSinkTelemetry));\n // Loaded when a profile supplies a persona, and kept available for /profile.\n if (context.personaEntry) extensions.push(context.personaEntry);\n if (context.workflowExtension) extensions.push(context.workflowExtension);\n extensions.push(\n ...layer(LAYER_AGIFLOW),\n ...layer(LAYER_GUARDRAILS),\n ...layer(LAYER_VIBE_LINT),\n ...layer(LAYER_CODE_INTEL),\n );\n if (context.preset === OLLAMA_PRESET) extensions.push(own(OWN_ENTRIES.ollamaProvider));\n extensions.push(own(OWN_ENTRIES.effort));\n extensions.push(...layer(LAYER_PLAN_MODE));\n extensions.push(pkg(PACKAGE_ENTRIES.task));\n extensions.push(pkg(PACKAGE_ENTRIES.loop));\n extensions.push(pkg(PACKAGE_ENTRIES.autocompact));\n extensions.push(pkg(PACKAGE_ENTRIES.fileEdit));\n // Next to task: both own long-lived work, and the runner's bash replacement\n // has to be registered before any layer that renders tool results.\n extensions.push(...layer(LAYER_RUNNER));\n extensions.push(...layer(LAYER_ASK_USER), ...layer(LAYER_STYLE_SYSTEM));\n extensions.push(pkg(PACKAGE_ENTRIES.voice));\n extensions.push(own(OWN_ENTRIES.domains));\n // Next to domains, which owns the same resolution: both read the harness's\n // skill directories, and this one loads early enough (Pi applies these in\n // reverse) to host the registry before any contributor registers into it.\n extensions.push(own(OWN_ENTRIES.skills));\n extensions.push(own(OWN_ENTRIES.majorMode));\n extensions.push(own(OWN_ENTRIES.profile));\n extensions.push(...layer(LAYER_GOAL));\n extensions.push(pkg(PACKAGE_ENTRIES.addDir));\n extensions.push(pkg(PACKAGE_ENTRIES.cacheOptimizer));\n if (!context.mute) extensions.push(own(OWN_ENTRIES.notifications));\n if (context.agents) extensions.push(...layer(LAYER_TEAM));\n // Pi loads explicit extension arguments in reverse. Keep context providers\n // last so Doom Config registers first, followed by Leader, before consumers.\n extensions.push(pkg(PACKAGE_ENTRIES.doomUi));\n extensions.push(pkg(PACKAGE_ENTRIES.doomConfig));\n if (context.autoStop) extensions.unshift(own(OWN_ENTRIES.autoStop));\n\n return extensions;\n}\n\n/**\n * Builds the explicit extension set inherited by detached Doom Team children.\n * UI, launch, notification, and orchestration extensions remain parent-only.\n * Domain skills and profile environment values travel through harness state.\n */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const pkg = (name: string): string => resolve.packageEntry(name);\n const selected = new Set(context.layers);\n const layer = (name: string): string[] =>\n selected.has(name) ? layerEntries(context.majorModesConfig, name, resolve) : [];\n const extensions: string[] = [];\n\n if (context.mcpEntry) extensions.push(context.mcpEntry);\n extensions.push(pkg(PACKAGE_ENTRIES.logSinkTelemetry));\n if (context.personaEntry) extensions.push(context.personaEntry);\n if (context.preset === OLLAMA_PRESET) extensions.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n extensions.push(\n ...layer(LAYER_GUARDRAILS),\n ...layer(LAYER_VIBE_LINT),\n ...layer(LAYER_CODE_INTEL),\n ...layer(LAYER_PLAN_MODE),\n ...layer(LAYER_RUNNER),\n ...layer(LAYER_ASK_USER),\n ...layer(LAYER_STYLE_SYSTEM),\n ...layer(LAYER_GOAL),\n );\n extensions.push(pkg(PACKAGE_ENTRIES.autocompact));\n // Pi reverses explicit extension arguments, so the provider belongs last.\n extensions.push(pkg(PACKAGE_ENTRIES.doomConfig));\n\n return [...new Set(extensions)];\n}\n\n/** Preserves the historical --no-hooks behavior by filtering the resolved base. */\nexport function filterHookDisabledLayers(layers: string[], hooks: boolean): string[] {\n return hooks ? [...layers] : layers.filter((name) => !HOOK_DISABLED_LAYERS.has(name));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { LayerResolvers, MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
|
|
2
|
+
|
|
3
|
+
//#region src/services/extensionAssembler.d.ts
|
|
4
|
+
interface ExtensionContext {
|
|
5
|
+
agents: boolean;
|
|
6
|
+
autoStop: boolean;
|
|
7
|
+
mute?: boolean;
|
|
8
|
+
preset?: string;
|
|
9
|
+
mcpEntry?: string;
|
|
10
|
+
personaEntry?: string;
|
|
11
|
+
workflowExtension?: string;
|
|
12
|
+
/** Resolved layer names from the selected major mode. */
|
|
13
|
+
layers: string[];
|
|
14
|
+
majorModesConfig: MajorModesConfig;
|
|
15
|
+
/**
|
|
16
|
+
* How entry names become absolute paths. Defaults to resolving them here.
|
|
17
|
+
*
|
|
18
|
+
* The synced Pi path composes inside a Pi session, where module resolution
|
|
19
|
+
* cannot be relied on, so it substitutes resolvers backed by the map
|
|
20
|
+
* `doom-pi sync` recorded. Both paths therefore run this same function.
|
|
21
|
+
*/
|
|
22
|
+
resolvers?: LayerResolvers;
|
|
23
|
+
}
|
|
24
|
+
declare const LAYER_RESOLVERS: LayerResolvers;
|
|
25
|
+
/**
|
|
26
|
+
* Resolvers that answer for the consumer repository before the meta-package.
|
|
27
|
+
*
|
|
28
|
+
* A repository declares its own layer packages in `.doom/modes.yaml`, and it is
|
|
29
|
+
* the repository that installs them. Doom Pi owns only the Doom closure, so a
|
|
30
|
+
* consumer specifier has to resolve from the consumer root and everything else
|
|
31
|
+
* falls back to what ships with the installed meta-package.
|
|
32
|
+
*
|
|
33
|
+
* Path-style packages skip all of that: they are already anchored to the config
|
|
34
|
+
* that declared them, so there is no chain to search.
|
|
35
|
+
*/
|
|
36
|
+
declare function createLayerResolvers(consumerRoot?: string): LayerResolvers;
|
|
37
|
+
declare const OLLAMA_PRESET = "ollama";
|
|
38
|
+
/**
|
|
39
|
+
* Optional packages passed in as context rather than resolved from a layer.
|
|
40
|
+
*
|
|
41
|
+
* Named here so the launcher and the synced Pi path ask for the same three
|
|
42
|
+
* specifiers; the synced path also needs them in its recorded resolution map.
|
|
43
|
+
*/
|
|
44
|
+
declare const CONTEXT_PACKAGES: {
|
|
45
|
+
readonly mcp: "@agimon-ai/doompi-mcp/extensions/pi";
|
|
46
|
+
readonly workflow: "@agimon-ai/doompi-workflow/extensions/pi";
|
|
47
|
+
readonly dispatcherWorkflow: "@agimon-ai/doompi-workflow/extensions/dispatcher";
|
|
48
|
+
};
|
|
49
|
+
/** Own entry that is always loaded so /profile can pick a persona later. */
|
|
50
|
+
declare const PERSONA_ENTRY = "persona";
|
|
51
|
+
/**
|
|
52
|
+
* Assembles the ordered Pi --extension list.
|
|
53
|
+
*
|
|
54
|
+
* Order is load-bearing: the workflow extension must register its launch tool
|
|
55
|
+
* before the Agiflow dispatcher can steer toward it, and auto-stop must end up
|
|
56
|
+
* first because Pi applies extension arguments in reverse. That is why this
|
|
57
|
+
* function, not modes.yaml, owns the sequence. Layers declare WHAT they
|
|
58
|
+
* contribute; each one is spliced in at its slot below. Kept pure so a snapshot
|
|
59
|
+
* test can pin the result.
|
|
60
|
+
*/
|
|
61
|
+
declare function assembleExtensions(context: ExtensionContext): string[];
|
|
62
|
+
/**
|
|
63
|
+
* Builds the explicit extension set inherited by detached Doom Team children.
|
|
64
|
+
* UI, launch, notification, and orchestration extensions remain parent-only.
|
|
65
|
+
* Domain skills and profile environment values travel through harness state.
|
|
66
|
+
*/
|
|
67
|
+
declare function assembleChildExtensions(context: ExtensionContext): string[];
|
|
68
|
+
/** Preserves the historical --no-hooks behavior by filtering the resolved base. */
|
|
69
|
+
declare function filterHookDisabledLayers(layers: string[], hooks: boolean): string[];
|
|
70
|
+
//#endregion
|
|
71
|
+
export { CONTEXT_PACKAGES, ExtensionContext, LAYER_RESOLVERS, OLLAMA_PRESET, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions, createLayerResolvers, filterHookDisabledLayers };
|
|
72
|
+
//# sourceMappingURL=extensionAssembler.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionAssembler.d.cts","names":[],"sources":["../../src/services/extensionAssembler.ts"],"mappings":";;;UAGiB,gBAAA;EACf,MAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,YAAA;EACA,iBAAA;EAJA;EAMA,MAAA;EACA,gBAAA,EAAkB,gBAAA;EAJlB;;;;;;;EAYA,SAAA,GAAY,cAAA;AAAA;AAAA,cAGD,eAAA,EAAiB,cAAA;;;;;AAa9B;;;;;AAoBA;;iBApBgB,oBAAA,CAAqB,YAAA,YAAwB,cAAA;AAAA,cAoBhD,aAAA;;AAiCb;;;;;cAAa,gBAAA;EAAA;;;;;cAOA,aAAA;;;AAYb;;;;;AA0DA;;;iBA1DgB,kBAAA,CAAmB,OAAA,EAAS,gBAAA;;AAwF5C;;;;iBA9BgB,uBAAA,CAAwB,OAAA,EAAS,gBAAA;;iBA8BjC,wBAAA,CAAyB,MAAA,YAAkB,KAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { LayerResolvers, MajorModesConfig } from "@agimon-ai/doompi-config/majorModes";
|
|
2
|
+
|
|
3
|
+
//#region src/services/extensionAssembler.d.ts
|
|
4
|
+
interface ExtensionContext {
|
|
5
|
+
agents: boolean;
|
|
6
|
+
autoStop: boolean;
|
|
7
|
+
mute?: boolean;
|
|
8
|
+
preset?: string;
|
|
9
|
+
mcpEntry?: string;
|
|
10
|
+
personaEntry?: string;
|
|
11
|
+
workflowExtension?: string;
|
|
12
|
+
/** Resolved layer names from the selected major mode. */
|
|
13
|
+
layers: string[];
|
|
14
|
+
majorModesConfig: MajorModesConfig;
|
|
15
|
+
/**
|
|
16
|
+
* How entry names become absolute paths. Defaults to resolving them here.
|
|
17
|
+
*
|
|
18
|
+
* The synced Pi path composes inside a Pi session, where module resolution
|
|
19
|
+
* cannot be relied on, so it substitutes resolvers backed by the map
|
|
20
|
+
* `doom-pi sync` recorded. Both paths therefore run this same function.
|
|
21
|
+
*/
|
|
22
|
+
resolvers?: LayerResolvers;
|
|
23
|
+
}
|
|
24
|
+
declare const LAYER_RESOLVERS: LayerResolvers;
|
|
25
|
+
/**
|
|
26
|
+
* Resolvers that answer for the consumer repository before the meta-package.
|
|
27
|
+
*
|
|
28
|
+
* A repository declares its own layer packages in `.doom/modes.yaml`, and it is
|
|
29
|
+
* the repository that installs them. Doom Pi owns only the Doom closure, so a
|
|
30
|
+
* consumer specifier has to resolve from the consumer root and everything else
|
|
31
|
+
* falls back to what ships with the installed meta-package.
|
|
32
|
+
*
|
|
33
|
+
* Path-style packages skip all of that: they are already anchored to the config
|
|
34
|
+
* that declared them, so there is no chain to search.
|
|
35
|
+
*/
|
|
36
|
+
declare function createLayerResolvers(consumerRoot?: string): LayerResolvers;
|
|
37
|
+
declare const OLLAMA_PRESET = "ollama";
|
|
38
|
+
/**
|
|
39
|
+
* Optional packages passed in as context rather than resolved from a layer.
|
|
40
|
+
*
|
|
41
|
+
* Named here so the launcher and the synced Pi path ask for the same three
|
|
42
|
+
* specifiers; the synced path also needs them in its recorded resolution map.
|
|
43
|
+
*/
|
|
44
|
+
declare const CONTEXT_PACKAGES: {
|
|
45
|
+
readonly mcp: "@agimon-ai/doompi-mcp/extensions/pi";
|
|
46
|
+
readonly workflow: "@agimon-ai/doompi-workflow/extensions/pi";
|
|
47
|
+
readonly dispatcherWorkflow: "@agimon-ai/doompi-workflow/extensions/dispatcher";
|
|
48
|
+
};
|
|
49
|
+
/** Own entry that is always loaded so /profile can pick a persona later. */
|
|
50
|
+
declare const PERSONA_ENTRY = "persona";
|
|
51
|
+
/**
|
|
52
|
+
* Assembles the ordered Pi --extension list.
|
|
53
|
+
*
|
|
54
|
+
* Order is load-bearing: the workflow extension must register its launch tool
|
|
55
|
+
* before the Agiflow dispatcher can steer toward it, and auto-stop must end up
|
|
56
|
+
* first because Pi applies extension arguments in reverse. That is why this
|
|
57
|
+
* function, not modes.yaml, owns the sequence. Layers declare WHAT they
|
|
58
|
+
* contribute; each one is spliced in at its slot below. Kept pure so a snapshot
|
|
59
|
+
* test can pin the result.
|
|
60
|
+
*/
|
|
61
|
+
declare function assembleExtensions(context: ExtensionContext): string[];
|
|
62
|
+
/**
|
|
63
|
+
* Builds the explicit extension set inherited by detached Doom Team children.
|
|
64
|
+
* UI, launch, notification, and orchestration extensions remain parent-only.
|
|
65
|
+
* Domain skills and profile environment values travel through harness state.
|
|
66
|
+
*/
|
|
67
|
+
declare function assembleChildExtensions(context: ExtensionContext): string[];
|
|
68
|
+
/** Preserves the historical --no-hooks behavior by filtering the resolved base. */
|
|
69
|
+
declare function filterHookDisabledLayers(layers: string[], hooks: boolean): string[];
|
|
70
|
+
//#endregion
|
|
71
|
+
export { CONTEXT_PACKAGES, ExtensionContext, LAYER_RESOLVERS, OLLAMA_PRESET, PERSONA_ENTRY, assembleChildExtensions, assembleExtensions, createLayerResolvers, filterHookDisabledLayers };
|
|
72
|
+
//# sourceMappingURL=extensionAssembler.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionAssembler.d.mts","names":[],"sources":["../../src/services/extensionAssembler.ts"],"mappings":";;;UAGiB,gBAAA;EACf,MAAA;EACA,QAAA;EACA,IAAA;EACA,MAAA;EACA,QAAA;EACA,YAAA;EACA,iBAAA;EAJA;EAMA,MAAA;EACA,gBAAA,EAAkB,gBAAA;EAJlB;;;;;;;EAYA,SAAA,GAAY,cAAA;AAAA;AAAA,cAGD,eAAA,EAAiB,cAAA;;;;;AAa9B;;;;;AAoBA;;iBApBgB,oBAAA,CAAqB,YAAA,YAAwB,cAAA;AAAA,cAoBhD,aAAA;;AAiCb;;;;;cAAa,gBAAA;EAAA;;;;;cAOA,aAAA;;;AAYb;;;;;AA0DA;;;iBA1DgB,kBAAA,CAAmB,OAAA,EAAS,gBAAA;;AAwF5C;;;;iBA9BgB,uBAAA,CAAwB,OAAA,EAAS,gBAAA;;iBA8BjC,wBAAA,CAAyB,MAAA,YAAkB,KAAA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{consumerPackageEntry as e,localEntry as t,optionalPackageEntry as n,ownEntry as r,packageEntry as i}from"../utils/moduleResolution.mjs";import"../utils/index.mjs";import{layerEntries as a}from"@agimon-ai/doompi-config/majorModes";const o={ownEntry:r,packageEntry:i,optionalPackageEntry:n,localEntry:t};function s(a){return a?{ownEntry:r,packageEntry:t=>e(t,a)??i(t),optionalPackageEntry:t=>e(t,a)??n(t),localEntry:t}:o}const c=`guardrails`,l=`vibe-lint`,u=`code-intel`,d=`plan-mode`,f=`runner`,p=`ask-user`,m=`style-system`,h=`goal`,g=`ollama`,_={autoStop:`autoStop`,domains:`domains`,effort:`effort`,majorMode:`majorMode`,notifications:`notifications`,ollamaProvider:`ollamaProvider`,profile:`profile`,skills:`skills`},v={autocompact:`@agimon-ai/doompi-autocompact/extensions/pi`,doomConfig:`@agimon-ai/doompi-config/pi`,addDir:`pi-add-dir/extensions/pi-add-dir/index.ts`,cacheOptimizer:`pi-cache-optimizer/index.ts`,doomUi:`@agimon-ai/doompi-ui/extensions/pi`,fileEdit:`@agimon-ai/doompi-file-edit/extensions/doom`,logSinkTelemetry:`@agimon-ai/doompi-log/extensions/pi`,loop:`@agimon-ai/doompi-loop/extensions/pi`,task:`@agimon-ai/doompi-task/extensions/pi`,voice:`@agimon-ai/doompi-voice/extensions/doom`},y=new Set([c,l,u]),b={mcp:`@agimon-ai/doompi-mcp/extensions/pi`,workflow:`@agimon-ai/doompi-workflow/extensions/pi`,dispatcherWorkflow:`@agimon-ai/doompi-workflow/extensions/dispatcher`},x=`persona`;function S(e){let t=e.majorModesConfig,n=e.resolvers??o,r=e=>n.ownEntry(e),i=e=>n.packageEntry(e),s=new Set(e.layers),g=e=>s.has(e)?a(t,e,n):[],y=[];return e.mcpEntry&&y.push(e.mcpEntry),y.push(i(v.logSinkTelemetry)),e.personaEntry&&y.push(e.personaEntry),e.workflowExtension&&y.push(e.workflowExtension),y.push(...g(`agiflow`),...g(c),...g(l),...g(u)),e.preset===`ollama`&&y.push(r(_.ollamaProvider)),y.push(r(_.effort)),y.push(...g(d)),y.push(i(v.task)),y.push(i(v.loop)),y.push(i(v.autocompact)),y.push(i(v.fileEdit)),y.push(...g(f)),y.push(...g(p),...g(m)),y.push(i(v.voice)),y.push(r(_.domains)),y.push(r(_.skills)),y.push(r(_.majorMode)),y.push(r(_.profile)),y.push(...g(h)),y.push(i(v.addDir)),y.push(i(v.cacheOptimizer)),e.mute||y.push(r(_.notifications)),e.agents&&y.push(...g(`team`)),y.push(i(v.doomUi)),y.push(i(v.doomConfig)),e.autoStop&&y.unshift(r(_.autoStop)),y}function C(e){let t=e.resolvers??o,n=e=>t.packageEntry(e),r=new Set(e.layers),i=n=>r.has(n)?a(e.majorModesConfig,n,t):[],s=[];return e.mcpEntry&&s.push(e.mcpEntry),s.push(n(v.logSinkTelemetry)),e.personaEntry&&s.push(e.personaEntry),e.preset===`ollama`&&s.push(t.ownEntry(_.ollamaProvider)),s.push(...i(c),...i(l),...i(u),...i(d),...i(f),...i(p),...i(m),...i(h)),s.push(n(v.autocompact)),s.push(n(v.doomConfig)),[...new Set(s)]}function w(e,t){return t?[...e]:e.filter(e=>!y.has(e))}export{b as CONTEXT_PACKAGES,o as LAYER_RESOLVERS,g as OLLAMA_PRESET,x as PERSONA_ENTRY,C as assembleChildExtensions,S as assembleExtensions,s as createLayerResolvers,w as filterHookDisabledLayers};
|
|
2
|
+
//# sourceMappingURL=extensionAssembler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionAssembler.mjs","names":[],"sources":["../../src/services/extensionAssembler.ts"],"sourcesContent":["import { type LayerResolvers, type MajorModesConfig, layerEntries } from '@agimon-ai/doompi-config/majorModes';\nimport { consumerPackageEntry, localEntry, optionalPackageEntry, ownEntry, packageEntry } from '../utils/index.ts';\n\nexport interface ExtensionContext {\n agents: boolean;\n autoStop: boolean;\n mute?: boolean;\n preset?: string;\n mcpEntry?: string;\n personaEntry?: string;\n workflowExtension?: string;\n /** Resolved layer names from the selected major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /**\n * How entry names become absolute paths. Defaults to resolving them here.\n *\n * The synced Pi path composes inside a Pi session, where module resolution\n * cannot be relied on, so it substitutes resolvers backed by the map\n * `doom-pi sync` recorded. Both paths therefore run this same function.\n */\n resolvers?: LayerResolvers;\n}\n\nexport const LAYER_RESOLVERS: LayerResolvers = { ownEntry, packageEntry, optionalPackageEntry, localEntry };\n\n/**\n * Resolvers that answer for the consumer repository before the meta-package.\n *\n * A repository declares its own layer packages in `.doom/modes.yaml`, and it is\n * the repository that installs them. Doom Pi owns only the Doom closure, so a\n * consumer specifier has to resolve from the consumer root and everything else\n * falls back to what ships with the installed meta-package.\n *\n * Path-style packages skip all of that: they are already anchored to the config\n * that declared them, so there is no chain to search.\n */\nexport function createLayerResolvers(consumerRoot?: string): LayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n return {\n ownEntry,\n packageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? packageEntry(name),\n optionalPackageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? optionalPackageEntry(name),\n localEntry,\n };\n}\n\nconst LAYER_AGIFLOW = 'agiflow';\nconst LAYER_GUARDRAILS = 'guardrails';\nconst LAYER_VIBE_LINT = 'vibe-lint';\nconst LAYER_CODE_INTEL = 'code-intel';\nconst LAYER_TEAM = 'team';\nconst LAYER_PLAN_MODE = 'plan-mode';\nconst LAYER_RUNNER = 'runner';\nconst LAYER_ASK_USER = 'ask-user';\nconst LAYER_STYLE_SYSTEM = 'style-system';\nconst LAYER_GOAL = 'goal';\nexport const OLLAMA_PRESET = 'ollama';\nconst OWN_ENTRIES = {\n autoStop: 'autoStop',\n domains: 'domains',\n effort: 'effort',\n majorMode: 'majorMode',\n notifications: 'notifications',\n ollamaProvider: 'ollamaProvider',\n profile: 'profile',\n skills: 'skills',\n} as const;\nconst PACKAGE_ENTRIES = {\n autocompact: '@agimon-ai/doompi-autocompact/extensions/pi',\n doomConfig: '@agimon-ai/doompi-config/pi',\n addDir: 'pi-add-dir/extensions/pi-add-dir/index.ts',\n cacheOptimizer: 'pi-cache-optimizer/index.ts',\n doomUi: '@agimon-ai/doompi-ui/extensions/pi',\n // Doom entries, not the bare Pi ones: they wrap the same extension and add the\n // leader (and, for voice, config) contributions that only exist under Doom.\n fileEdit: '@agimon-ai/doompi-file-edit/extensions/doom',\n logSinkTelemetry: '@agimon-ai/doompi-log/extensions/pi',\n loop: '@agimon-ai/doompi-loop/extensions/pi',\n task: '@agimon-ai/doompi-task/extensions/pi',\n voice: '@agimon-ai/doompi-voice/extensions/doom',\n} as const;\nconst HOOK_DISABLED_LAYERS = new Set([LAYER_GUARDRAILS, LAYER_VIBE_LINT, LAYER_CODE_INTEL]);\n\n/**\n * Optional packages passed in as context rather than resolved from a layer.\n *\n * Named here so the launcher and the synced Pi path ask for the same three\n * specifiers; the synced path also needs them in its recorded resolution map.\n */\nexport const CONTEXT_PACKAGES = {\n mcp: '@agimon-ai/doompi-mcp/extensions/pi',\n workflow: '@agimon-ai/doompi-workflow/extensions/pi',\n dispatcherWorkflow: '@agimon-ai/doompi-workflow/extensions/dispatcher',\n} as const;\n\n/** Own entry that is always loaded so /profile can pick a persona later. */\nexport const PERSONA_ENTRY = 'persona';\n\n/**\n * Assembles the ordered Pi --extension list.\n *\n * Order is load-bearing: the workflow extension must register its launch tool\n * before the Agiflow dispatcher can steer toward it, and auto-stop must end up\n * first because Pi applies extension arguments in reverse. That is why this\n * function, not modes.yaml, owns the sequence. Layers declare WHAT they\n * contribute; each one is spliced in at its slot below. Kept pure so a snapshot\n * test can pin the result.\n */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n const config = context.majorModesConfig;\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const own = (name: string): string => resolve.ownEntry(name);\n const pkg = (name: string): string => resolve.packageEntry(name);\n const selected = new Set(context.layers);\n const layer = (name: string): string[] => (selected.has(name) ? layerEntries(config, name, resolve) : []);\n const extensions: string[] = [];\n\n if (context.mcpEntry) extensions.push(context.mcpEntry);\n extensions.push(pkg(PACKAGE_ENTRIES.logSinkTelemetry));\n // Loaded when a profile supplies a persona, and kept available for /profile.\n if (context.personaEntry) extensions.push(context.personaEntry);\n if (context.workflowExtension) extensions.push(context.workflowExtension);\n extensions.push(\n ...layer(LAYER_AGIFLOW),\n ...layer(LAYER_GUARDRAILS),\n ...layer(LAYER_VIBE_LINT),\n ...layer(LAYER_CODE_INTEL),\n );\n if (context.preset === OLLAMA_PRESET) extensions.push(own(OWN_ENTRIES.ollamaProvider));\n extensions.push(own(OWN_ENTRIES.effort));\n extensions.push(...layer(LAYER_PLAN_MODE));\n extensions.push(pkg(PACKAGE_ENTRIES.task));\n extensions.push(pkg(PACKAGE_ENTRIES.loop));\n extensions.push(pkg(PACKAGE_ENTRIES.autocompact));\n extensions.push(pkg(PACKAGE_ENTRIES.fileEdit));\n // Next to task: both own long-lived work, and the runner's bash replacement\n // has to be registered before any layer that renders tool results.\n extensions.push(...layer(LAYER_RUNNER));\n extensions.push(...layer(LAYER_ASK_USER), ...layer(LAYER_STYLE_SYSTEM));\n extensions.push(pkg(PACKAGE_ENTRIES.voice));\n extensions.push(own(OWN_ENTRIES.domains));\n // Next to domains, which owns the same resolution: both read the harness's\n // skill directories, and this one loads early enough (Pi applies these in\n // reverse) to host the registry before any contributor registers into it.\n extensions.push(own(OWN_ENTRIES.skills));\n extensions.push(own(OWN_ENTRIES.majorMode));\n extensions.push(own(OWN_ENTRIES.profile));\n extensions.push(...layer(LAYER_GOAL));\n extensions.push(pkg(PACKAGE_ENTRIES.addDir));\n extensions.push(pkg(PACKAGE_ENTRIES.cacheOptimizer));\n if (!context.mute) extensions.push(own(OWN_ENTRIES.notifications));\n if (context.agents) extensions.push(...layer(LAYER_TEAM));\n // Pi loads explicit extension arguments in reverse. Keep context providers\n // last so Doom Config registers first, followed by Leader, before consumers.\n extensions.push(pkg(PACKAGE_ENTRIES.doomUi));\n extensions.push(pkg(PACKAGE_ENTRIES.doomConfig));\n if (context.autoStop) extensions.unshift(own(OWN_ENTRIES.autoStop));\n\n return extensions;\n}\n\n/**\n * Builds the explicit extension set inherited by detached Doom Team children.\n * UI, launch, notification, and orchestration extensions remain parent-only.\n * Domain skills and profile environment values travel through harness state.\n */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const pkg = (name: string): string => resolve.packageEntry(name);\n const selected = new Set(context.layers);\n const layer = (name: string): string[] =>\n selected.has(name) ? layerEntries(context.majorModesConfig, name, resolve) : [];\n const extensions: string[] = [];\n\n if (context.mcpEntry) extensions.push(context.mcpEntry);\n extensions.push(pkg(PACKAGE_ENTRIES.logSinkTelemetry));\n if (context.personaEntry) extensions.push(context.personaEntry);\n if (context.preset === OLLAMA_PRESET) extensions.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n extensions.push(\n ...layer(LAYER_GUARDRAILS),\n ...layer(LAYER_VIBE_LINT),\n ...layer(LAYER_CODE_INTEL),\n ...layer(LAYER_PLAN_MODE),\n ...layer(LAYER_RUNNER),\n ...layer(LAYER_ASK_USER),\n ...layer(LAYER_STYLE_SYSTEM),\n ...layer(LAYER_GOAL),\n );\n extensions.push(pkg(PACKAGE_ENTRIES.autocompact));\n // Pi reverses explicit extension arguments, so the provider belongs last.\n extensions.push(pkg(PACKAGE_ENTRIES.doomConfig));\n\n return [...new Set(extensions)];\n}\n\n/** Preserves the historical --no-hooks behavior by filtering the resolved base. */\nexport function filterHookDisabledLayers(layers: string[], hooks: boolean): string[] {\n return hooks ? [...layers] : layers.filter((name) => !HOOK_DISABLED_LAYERS.has(name));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../utils/moduleResolution.cjs`);require(`../utils/index.cjs`);let n=require(`node:path`);n=e.__toESM(n,1);let r=require(`node:fs`);r=e.__toESM(r,1);let i=require(`node:crypto`),a=require(`rolldown`);const o=[`.ts`,`.mts`,`.cts`],s={"@mariozechner/pi-coding-agent":`@earendil-works/pi-coding-agent`,"@mariozechner/pi-tui":`@earendil-works/pi-tui`,"@mariozechner/pi-ai":`@earendil-works/pi-ai`,"@sinclair/typebox":`typebox`};function c(e){return o.some(t=>e.endsWith(t))}function l(e){for(let[t,n]of Object.entries(s)){if(e===t)return n;if(e.startsWith(`${t}/`))return`${n}${e.slice(t.length)}`}return e}function u(e){let t=r.default.readFileSync(e);return(0,i.createHash)(`sha256`).update(`v1`).update(e).update(t).digest(`hex`).slice(0,16)}function d(e,t){let r=n.default.basename(e).replace(/\.[cm]?ts$/,``);return`${n.default.basename(n.default.dirname(e))}-${r}.${t}.mjs`}const f=new Set([`@earendil-works/pi-coding-agent`,`@earendil-works/pi-tui`,`@earendil-works/pi-ai`,`typebox`]);function p(e){let t=e.startsWith(`@`)?e.indexOf(`/`,e.indexOf(`/`)+1):e.indexOf(`/`);return t===-1?e:e.slice(0,t)}function m(){return{name:`doom-external-absolute`,async resolveId(e,r,i){if(e.startsWith(`.`)||n.default.isAbsolute(e)||e.startsWith(`node:`))return null;let a=l(e),o=p(a);if(o&&f.has(o)){let e=t.optionalPackageEntry(a);if(e)return{id:e,external:!0}}let s=await this.resolve(a,r,i);return!s||c(s.id)?null:{id:s.id,external:!0}}}}async function h(e,t){if(!c(e))return e;let i=n.default.join(t,d(e,u(e)));if(r.default.existsSync(i))return i;let o=await(0,a.rolldown)({input:e,platform:`node`,plugins:[m()],logLevel:`silent`});try{await o.write({file:i,format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!1})}finally{await o.close()}return i}async function g(e,t){r.default.mkdirSync(t,{recursive:!0});let n={};for(let[r,i]of Object.entries(e))try{n[r]=await h(i,t)}catch{n[r]=i}return n}exports.compileResolvedEntries=g;
|
|
2
|
+
//# sourceMappingURL=extensionCompiler.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionCompiler.cjs","names":["fs","path","optionalPackageEntry"],"sources":["../../src/services/extensionCompiler.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { rolldown } from 'rolldown';\nimport { optionalPackageEntry } from '../utils/index.ts';\n\n/**\n * Compiles TypeScript extensions into plain ESM ahead of the session.\n *\n * Pi loads extensions through jiti, which transpiles TypeScript at import time.\n * That works, but it costs a transform per module on a cold cache and makes Node\n * complain about type stripping under node_modules on every launch. Resolution\n * already knows the full extension list, so each TypeScript entry is bundled to\n * a single `.mjs` here and Pi imports it natively.\n *\n * Only the extension's own sources are bundled. Every bare specifier stays\n * external and is rewritten to the absolute file the entry itself resolves to,\n * which keeps one copy of Pi's runtime and survives being imported from a cache\n * directory that has no node_modules of its own.\n */\n\nconst TYPESCRIPT_SUFFIXES = ['.ts', '.mts', '.cts'] as const;\nconst COMPILED_SUFFIX = '.mjs';\nconst CACHE_VERSION = 'v1';\nconst HASH_LENGTH = 16;\n\n/** Pi's former npm scope. The packages are the same, published under a new name. */\nconst PI_SCOPE_RENAMES: Readonly<Record<string, string>> = {\n '@mariozechner/pi-coding-agent': '@earendil-works/pi-coding-agent',\n '@mariozechner/pi-tui': '@earendil-works/pi-tui',\n '@mariozechner/pi-ai': '@earendil-works/pi-ai',\n '@sinclair/typebox': 'typebox',\n};\n\nexport function isTypeScriptEntry(entry: string): boolean {\n return TYPESCRIPT_SUFFIXES.some((suffix) => entry.endsWith(suffix));\n}\n\nfunction renameScope(specifier: string): string {\n for (const [before, after] of Object.entries(PI_SCOPE_RENAMES)) {\n if (specifier === before) return after;\n if (specifier.startsWith(`${before}/`)) return `${after}${specifier.slice(before.length)}`;\n }\n return specifier;\n}\n\n/**\n * Cache key for a compiled entry.\n *\n * The entry's own bytes are the only cheap signal that the extension changed; a\n * dependency edit is not visible without walking the graph, so an upgrade that\n * leaves the entry byte-identical is served from cache until the version below\n * is raised.\n */\nfunction cacheKey(entry: string): string {\n const source = fs.readFileSync(entry);\n return createHash('sha256').update(CACHE_VERSION).update(entry).update(source).digest('hex').slice(0, HASH_LENGTH);\n}\n\nfunction compiledName(entry: string, key: string): string {\n const base = path.basename(entry).replace(/\\.[cm]?ts$/, '');\n const parent = path.basename(path.dirname(entry));\n return `${parent}-${base}.${key}${COMPILED_SUFFIX}`;\n}\n\n/**\n * Packages that must resolve to the copy this harness runs, never to a second\n * one bundled into an extension. Pi owns the TUI and the session state, so a\n * duplicate renders into a different screen and mutates a different store.\n */\nconst HOSTED_PACKAGES = new Set([\n '@earendil-works/pi-coding-agent',\n '@earendil-works/pi-tui',\n '@earendil-works/pi-ai',\n 'typebox',\n]);\n\nfunction packageRootOf(specifier: string): string | undefined {\n const slash = specifier.startsWith('@') ? specifier.indexOf('/', specifier.indexOf('/') + 1) : specifier.indexOf('/');\n return slash === -1 ? specifier : specifier.slice(0, slash);\n}\n\nfunction externalResolver() {\n return {\n name: 'doom-external-absolute',\n async resolveId(\n this: { resolve: (id: string, importer?: string, options?: unknown) => Promise<{ id: string } | null> },\n specifier: string,\n importer: string | undefined,\n options: unknown,\n ): Promise<{ id: string; external: boolean } | null> {\n if (specifier.startsWith('.') || path.isAbsolute(specifier) || specifier.startsWith('node:')) return null;\n const renamed = renameScope(specifier);\n\n // Host packages are resolved from this module, the way the rest of the\n // harness resolves them, because an extension written against Pi's former\n // scope does not have the current one in its own dependency tree.\n const root = packageRootOf(renamed);\n if (root && HOSTED_PACKAGES.has(root)) {\n const hosted = optionalPackageEntry(renamed);\n if (hosted) return { id: hosted, external: true };\n }\n\n // Rolldown's resolver rather than `createRequire`, which cannot see an\n // ESM-only package that publishes no `require` condition and would send\n // Pi's own core into the bundle.\n const resolved = await this.resolve(renamed, importer, options);\n if (!resolved) return null;\n // A dependency that is itself TypeScript cannot be handed to Node either,\n // so it is bundled rather than externalised.\n if (isTypeScriptEntry(resolved.id)) return null;\n return { id: resolved.id, external: true };\n },\n };\n}\n\n/**\n * Bundles `entry` into `cacheDirectory` and returns the compiled path.\n *\n * Non-TypeScript entries are returned untouched. A cache hit skips the build.\n */\nexport async function compileExtension(entry: string, cacheDirectory: string): Promise<string> {\n if (!isTypeScriptEntry(entry)) return entry;\n\n const output = path.join(cacheDirectory, compiledName(entry, cacheKey(entry)));\n if (fs.existsSync(output)) return output;\n\n const build = await rolldown({\n input: entry,\n platform: 'node',\n plugins: [externalResolver()],\n logLevel: 'silent',\n });\n try {\n // One file per extension. Several of them import lazily, and code splitting\n // would emit sibling chunks that a single output path cannot describe.\n await build.write({ file: output, format: 'esm', sourcemap: false, minify: true, codeSplitting: false });\n } finally {\n await build.close();\n }\n return output;\n}\n\n/**\n * Compiles every TypeScript entry in a resolution map, leaving the rest as-is.\n *\n * A failure is not fatal: the original path is kept so Pi falls back to loading\n * the TypeScript through jiti, which is what it did before this existed.\n */\nexport async function compileResolvedEntries(\n resolved: Record<string, string>,\n cacheDirectory: string,\n): Promise<Record<string, string>> {\n fs.mkdirSync(cacheDirectory, { recursive: true });\n const compiled: Record<string, string> = {};\n for (const [key, target] of Object.entries(resolved)) {\n try {\n compiled[key] = await compileExtension(target, cacheDirectory);\n } catch {\n compiled[key] = target;\n }\n }\n return compiled;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{optionalPackageEntry as e}from"../utils/moduleResolution.mjs";import"../utils/index.mjs";import t from"node:path";import n from"node:fs";import{createHash as r}from"node:crypto";import{rolldown as i}from"rolldown";const a=[`.ts`,`.mts`,`.cts`],o={"@mariozechner/pi-coding-agent":`@earendil-works/pi-coding-agent`,"@mariozechner/pi-tui":`@earendil-works/pi-tui`,"@mariozechner/pi-ai":`@earendil-works/pi-ai`,"@sinclair/typebox":`typebox`};function s(e){return a.some(t=>e.endsWith(t))}function c(e){for(let[t,n]of Object.entries(o)){if(e===t)return n;if(e.startsWith(`${t}/`))return`${n}${e.slice(t.length)}`}return e}function l(e){let t=n.readFileSync(e);return r(`sha256`).update(`v1`).update(e).update(t).digest(`hex`).slice(0,16)}function u(e,n){let r=t.basename(e).replace(/\.[cm]?ts$/,``);return`${t.basename(t.dirname(e))}-${r}.${n}.mjs`}const d=new Set([`@earendil-works/pi-coding-agent`,`@earendil-works/pi-tui`,`@earendil-works/pi-ai`,`typebox`]);function f(e){let t=e.startsWith(`@`)?e.indexOf(`/`,e.indexOf(`/`)+1):e.indexOf(`/`);return t===-1?e:e.slice(0,t)}function p(){return{name:`doom-external-absolute`,async resolveId(n,r,i){if(n.startsWith(`.`)||t.isAbsolute(n)||n.startsWith(`node:`))return null;let a=c(n),o=f(a);if(o&&d.has(o)){let t=e(a);if(t)return{id:t,external:!0}}let l=await this.resolve(a,r,i);return!l||s(l.id)?null:{id:l.id,external:!0}}}}async function m(e,r){if(!s(e))return e;let a=t.join(r,u(e,l(e)));if(n.existsSync(a))return a;let o=await i({input:e,platform:`node`,plugins:[p()],logLevel:`silent`});try{await o.write({file:a,format:`esm`,sourcemap:!1,minify:!0,codeSplitting:!1})}finally{await o.close()}return a}async function h(e,t){n.mkdirSync(t,{recursive:!0});let r={};for(let[n,i]of Object.entries(e))try{r[n]=await m(i,t)}catch{r[n]=i}return r}export{h as compileResolvedEntries};
|
|
2
|
+
//# sourceMappingURL=extensionCompiler.mjs.map
|