@sammorrowdrums/mcpi 0.70.9 → 0.85.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/CHANGELOG.md +1623 -1
- package/LICENSE +21 -0
- package/README.md +196 -141
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js +4 -0
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/register-bedrock.js +1 -1
- package/dist/bun/register-bedrock.js.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts +17 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +36 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +116 -16
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts +19 -0
- package/dist/cli/auth-check.d.ts.map +1 -0
- package/dist/cli/auth-check.js +50 -0
- package/dist/cli/auth-check.js.map +1 -0
- package/dist/cli/auth-command.d.ts +24 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +103 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/config-selector.d.ts +6 -4
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +4 -4
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts +13 -0
- package/dist/cli/credential-print.d.ts.map +1 -0
- package/dist/cli/credential-print.js +76 -0
- package/dist/cli/credential-print.js.map +1 -0
- package/dist/cli/experimental/auth.d.ts +16 -0
- package/dist/cli/experimental/auth.d.ts.map +1 -0
- package/dist/cli/experimental/auth.js +13 -0
- package/dist/cli/experimental/auth.js.map +1 -0
- package/dist/cli/experimental/cli.d.ts +6 -0
- package/dist/cli/experimental/cli.d.ts.map +1 -0
- package/dist/cli/experimental/cli.js +5 -0
- package/dist/cli/experimental/cli.js.map +1 -0
- package/dist/cli/experimental/command-options.d.ts +17 -0
- package/dist/cli/experimental/command-options.d.ts.map +1 -0
- package/dist/cli/experimental/command-options.js +35 -0
- package/dist/cli/experimental/command-options.js.map +1 -0
- package/dist/cli/experimental/command.d.ts +63 -0
- package/dist/cli/experimental/command.d.ts.map +1 -0
- package/dist/cli/experimental/command.js +130 -0
- package/dist/cli/experimental/command.js.map +1 -0
- package/dist/cli/experimental/commands/client.d.ts +13 -0
- package/dist/cli/experimental/commands/client.d.ts.map +1 -0
- package/dist/cli/experimental/commands/client.js +25 -0
- package/dist/cli/experimental/commands/client.js.map +1 -0
- package/dist/cli/experimental/commands/mcpi.d.ts +15 -0
- package/dist/cli/experimental/commands/mcpi.d.ts.map +1 -0
- package/dist/cli/experimental/commands/mcpi.js +28 -0
- package/dist/cli/experimental/commands/mcpi.js.map +1 -0
- package/dist/cli/experimental/commands/server.d.ts +13 -0
- package/dist/cli/experimental/commands/server.d.ts.map +1 -0
- package/dist/cli/experimental/commands/server.js +25 -0
- package/dist/cli/experimental/commands/server.js.map +1 -0
- package/dist/cli/experimental/transport-address.d.ts +10 -0
- package/dist/cli/experimental/transport-address.d.ts.map +1 -0
- package/dist/cli/experimental/transport-address.js +38 -0
- package/dist/cli/experimental/transport-address.js.map +1 -0
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +13 -26
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts +2 -2
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +4 -4
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/project-trust.d.ts +10 -0
- package/dist/cli/project-trust.d.ts.map +1 -0
- package/dist/cli/project-trust.js +48 -0
- package/dist/cli/project-trust.js.map +1 -0
- package/dist/cli/session-picker.d.ts +3 -2
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +5 -4
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +20 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +184 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -3
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/remote-session.d.ts +53 -0
- package/dist/client/remote-session.d.ts.map +1 -0
- package/dist/client/remote-session.js +340 -0
- package/dist/client/remote-session.js.map +1 -0
- package/dist/client/transcript.d.ts +12 -0
- package/dist/client/transcript.d.ts.map +1 -0
- package/dist/client/transcript.js +98 -0
- package/dist/client/transcript.js.map +1 -0
- package/dist/config.d.ts +34 -12
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +312 -61
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +11 -9
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +16 -7
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts +13 -12
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +34 -14
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +110 -53
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +658 -488
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +35 -104
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +272 -286
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +11 -8
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/cache-stats.d.ts +49 -0
- package/dist/core/cache-stats.d.ts.map +1 -0
- package/dist/core/cache-stats.js +101 -0
- package/dist/core/cache-stats.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +16 -6
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +13 -10
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +25 -9
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +163 -133
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts +3 -3
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/index.js.map +1 -1
- package/dist/core/compaction/utils.d.ts +3 -3
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +7 -18
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/defaults.js.map +1 -1
- package/dist/core/env-overlay.d.ts +21 -0
- package/dist/core/env-overlay.d.ts.map +1 -0
- package/dist/core/env-overlay.js +25 -0
- package/dist/core/env-overlay.js.map +1 -0
- package/dist/core/exec.d.ts +8 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +7 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/experimental.d.ts +6 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +8 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts +2 -2
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +8 -6
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +53 -4
- package/dist/core/export-html/template.js +129 -35
- package/dist/core/export-html/tool-renderer.d.ts +2 -8
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +15 -2
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/export-html/vendor/marked.min.js +75 -3
- package/dist/core/extensions/index.d.ts +8 -8
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +5 -7
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +160 -87
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +32 -13
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +192 -4
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +217 -69
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +3 -3
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +22 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +12 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +30 -2
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +96 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +9 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +79 -10
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +11 -10
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +2 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +571 -0
- package/dist/core/model-config.d.ts.map +1 -0
- package/dist/core/model-config.js +254 -0
- package/dist/core/model-config.js.map +1 -0
- package/dist/core/model-registry.d.ts +23 -110
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +65 -616
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +20 -7
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +139 -43
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +100 -0
- package/dist/core/model-runtime.d.ts.map +1 -0
- package/dist/core/model-runtime.js +602 -0
- package/dist/core/model-runtime.js.map +1 -0
- package/dist/core/models-store.d.ts +22 -0
- package/dist/core/models-store.d.ts.map +1 -0
- package/dist/core/models-store.js +113 -0
- package/dist/core/models-store.js.map +1 -0
- package/dist/core/output-guard.d.ts +1 -0
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js +52 -22
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts +21 -4
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +428 -191
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts +8 -0
- package/dist/core/pi-manifest.d.ts.map +1 -0
- package/dist/core/pi-manifest.js +25 -0
- package/dist/core/pi-manifest.js.map +1 -0
- package/dist/core/project-trust.d.ts +15 -0
- package/dist/core/project-trust.d.ts.map +1 -0
- package/dist/core/project-trust.js +59 -0
- package/dist/core/project-trust.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +4 -2
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +36 -50
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-attribution.d.ts +4 -0
- package/dist/core/provider-attribution.d.ts.map +1 -0
- package/dist/core/provider-attribution.js +72 -0
- package/dist/core/provider-attribution.js.map +1 -0
- package/dist/core/provider-composer.d.ts +58 -0
- package/dist/core/provider-composer.d.ts.map +1 -0
- package/dist/core/provider-composer.js +396 -0
- package/dist/core/provider-composer.js.map +1 -0
- package/dist/core/radius.d.ts +2 -0
- package/dist/core/radius.d.ts.map +1 -0
- package/dist/core/radius.js +2 -0
- package/dist/core/radius.js.map +1 -0
- package/dist/core/remote-catalog-provider.d.ts +17 -0
- package/dist/core/remote-catalog-provider.d.ts.map +1 -0
- package/dist/core/remote-catalog-provider.js +137 -0
- package/dist/core/remote-catalog-provider.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +13 -6
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +143 -22
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +40 -12
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +236 -87
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +15 -0
- package/dist/core/runtime-credentials.d.ts.map +1 -0
- package/dist/core/runtime-credentials.js +39 -0
- package/dist/core/runtime-credentials.js.map +1 -0
- package/dist/core/sdk.d.ts +26 -25
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +56 -49
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +42 -19
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +454 -223
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +77 -8
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +255 -67
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +2 -2
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +12 -34
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +2 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +4 -3
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +15 -25
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts +7 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js +7 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts +5 -3
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +26 -16
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +11 -7
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +220 -188
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +26 -5
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +110 -23
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +11 -5
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +67 -100
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js +27 -12
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts +10 -3
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +41 -37
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +7 -3
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +12 -8
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +18 -18
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +7 -3
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +17 -15
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +2 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +39 -21
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts +7 -3
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +101 -51
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +5 -2
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +18 -2
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +2 -2
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +3 -3
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js +12 -2
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts +6 -2
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +35 -45
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts +36 -0
- package/dist/core/trust-manager.d.ts.map +1 -0
- package/dist/core/trust-manager.js +202 -0
- package/dist/core/trust-manager.js.map +1 -0
- package/dist/core/usage-totals.d.ts +19 -0
- package/dist/core/usage-totals.d.ts.map +1 -0
- package/dist/core/usage-totals.js +52 -0
- package/dist/core/usage-totals.js.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +3 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/llama/client.d.ts +61 -0
- package/dist/extensions/llama/client.d.ts.map +1 -0
- package/dist/extensions/llama/client.js +302 -0
- package/dist/extensions/llama/client.js.map +1 -0
- package/dist/extensions/llama/huggingface.d.ts +23 -0
- package/dist/extensions/llama/huggingface.d.ts.map +1 -0
- package/dist/extensions/llama/huggingface.js +141 -0
- package/dist/extensions/llama/huggingface.js.map +1 -0
- package/dist/extensions/llama/index.d.ts +3 -0
- package/dist/extensions/llama/index.d.ts.map +1 -0
- package/dist/extensions/llama/index.js +217 -0
- package/dist/extensions/llama/index.js.map +1 -0
- package/dist/extensions/llama/provider.d.ts +10 -0
- package/dist/extensions/llama/provider.d.ts.map +1 -0
- package/dist/extensions/llama/provider.js +121 -0
- package/dist/extensions/llama/provider.js.map +1 -0
- package/dist/extensions/llama/ui.d.ts +42 -0
- package/dist/extensions/llama/ui.d.ts.map +1 -0
- package/dist/extensions/llama/ui.js +416 -0
- package/dist/extensions/llama/ui.js.map +1 -0
- package/dist/index.d.ts +34 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -2
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +311 -101
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +5 -5
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +10 -10
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts +6 -5
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +8 -3
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +55 -26
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +2 -2
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -4
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts +2 -2
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -2
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -2
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +37 -6
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +318 -34
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts +3 -3
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +2 -2
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +2 -2
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +9 -2
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-entry.js +52 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +6 -4
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +11 -3
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts +5 -4
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +19 -32
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts +3 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +7 -2
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.js +103 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +9 -4
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +52 -31
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +33 -31
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +2 -0
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +6 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +20 -6
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +12 -6
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +46 -17
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +11 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +75 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +13 -6
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +92 -44
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +7 -4
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +32 -28
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +5 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +52 -14
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +4 -5
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +18 -16
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +23 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +322 -22
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -2
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
- package/dist/modes/interactive/components/status-indicator.js +60 -0
- package/dist/modes/interactive/components/status-indicator.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +2 -2
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +3 -2
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +2 -2
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +33 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +7 -2
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +179 -26
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/trust-selector.js +91 -0
- package/dist/modes/interactive/components/trust-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +9 -3
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +26 -6
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts +12 -0
- package/dist/modes/interactive/external-editor.d.ts.map +1 -0
- package/dist/modes/interactive/external-editor.js +37 -0
- package/dist/modes/interactive/external-editor.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +104 -26
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1565 -692
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +34 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/model-search.d.ts +12 -0
- package/dist/modes/interactive/model-search.d.ts.map +1 -0
- package/dist/modes/interactive/model-search.js +15 -0
- package/dist/modes/interactive/model-search.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +10 -5
- package/dist/modes/interactive/theme/light.json +10 -5
- package/dist/modes/interactive/theme/theme-controller.d.ts +40 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +125 -0
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.json +22 -5
- package/dist/modes/interactive/theme/theme.d.ts +48 -7
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +194 -76
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +31 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +15 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts +3 -3
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +16 -5
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +33 -10
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +89 -11
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +2 -2
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +69 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +43 -5
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts +6 -2
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +527 -25
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/path-migration.d.ts +13 -0
- package/dist/path-migration.d.ts.map +1 -0
- package/dist/path-migration.js +52 -0
- package/dist/path-migration.js.map +1 -0
- package/dist/rpc-entry.d.ts +3 -0
- package/dist/rpc-entry.d.ts.map +1 -0
- package/dist/rpc-entry.js +11 -0
- package/dist/rpc-entry.js.map +1 -0
- package/dist/server/create-harness.d.ts +26 -0
- package/dist/server/create-harness.d.ts.map +1 -0
- package/dist/server/create-harness.js +106 -0
- package/dist/server/create-harness.js.map +1 -0
- package/dist/utils/abort.d.ts +5 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +48 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +52 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +2 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js +85 -0
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts +12 -5
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js +33 -5
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +4 -4
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +4 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js +14 -8
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +129 -46
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +54 -22
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +1 -0
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +21 -15
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-process.d.ts +18 -0
- package/dist/utils/image-process.d.ts.map +1 -0
- package/dist/utils/image-process.js +83 -0
- package/dist/utils/image-process.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +124 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +7 -27
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +75 -115
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/management-http.d.ts +23 -0
- package/dist/utils/management-http.d.ts.map +1 -0
- package/dist/utils/management-http.js +50 -0
- package/dist/utils/management-http.js.map +1 -0
- package/dist/utils/mime.d.ts +1 -0
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js +100 -16
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts +29 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +102 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +5 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/shell.d.ts +1 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +18 -6
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +118 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tool-result-images.d.ts +19 -0
- package/dist/utils/tool-result-images.d.ts.map +1 -0
- package/dist/utils/tool-result-images.js +45 -0
- package/dist/utils/tool-result-images.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +10 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +105 -36
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +19 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +85 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/docs/compaction.md +39 -32
- package/docs/containerization.md +113 -0
- package/docs/custom-provider.md +212 -75
- package/docs/development.md +9 -9
- package/docs/docs.json +156 -0
- package/docs/environment-variables.md +186 -0
- package/docs/extensions.md +652 -140
- package/docs/index.md +81 -0
- package/docs/json.md +26 -15
- package/docs/keybindings.md +60 -21
- package/docs/llama-cpp.md +99 -0
- package/docs/models.md +168 -34
- package/docs/packages.md +46 -36
- package/docs/prompt-templates.md +13 -5
- package/docs/providers.md +147 -26
- package/docs/quickstart.md +167 -0
- package/docs/rpc.md +218 -36
- package/docs/sdk.md +190 -125
- package/docs/security.md +59 -0
- package/docs/{session.md → session-format.md} +48 -22
- package/docs/sessions.md +145 -0
- package/docs/settings.md +130 -25
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +13 -14
- package/docs/terminal-setup.md +73 -16
- package/docs/termux.md +10 -10
- package/docs/themes.md +41 -16
- package/docs/tmux.md +6 -4
- package/docs/tui.md +85 -61
- package/docs/usage.md +302 -0
- package/docs/windows.md +2 -2
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +12 -9
- package/examples/extensions/bash-spawn-hook.ts +2 -2
- package/examples/extensions/border-status-editor.ts +145 -0
- package/examples/extensions/built-in-tool-renderer.ts +2 -2
- package/examples/extensions/claude-rules.ts +1 -1
- package/examples/extensions/commands.ts +1 -1
- package/examples/extensions/custom-compaction.ts +6 -16
- package/examples/extensions/custom-footer.ts +1 -1
- package/examples/extensions/custom-header.ts +7 -7
- package/examples/extensions/custom-provider-anthropic/index.ts +15 -8
- package/examples/extensions/custom-provider-anthropic/package-lock.json +4 -4
- package/examples/extensions/custom-provider-anthropic/package.json +3 -3
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +65 -9
- package/examples/extensions/custom-provider-gitlab-duo/package.json +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +2 -2
- package/examples/extensions/doom-overlay/README.md +1 -1
- package/examples/extensions/doom-overlay/doom-component.ts +4 -4
- package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
- package/examples/extensions/doom-overlay/index.ts +5 -5
- package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
- package/examples/extensions/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/entry-renderer.ts +41 -0
- package/examples/extensions/git-merge-and-resolve.ts +115 -0
- package/examples/extensions/github-issue-autocomplete.ts +2 -2
- package/examples/extensions/gondolin/index.ts +531 -0
- package/examples/extensions/gondolin/package-lock.json +185 -0
- package/examples/extensions/gondolin/package.json +19 -0
- package/examples/extensions/handoff.ts +50 -14
- package/examples/extensions/hidden-thinking-label.ts +1 -1
- package/examples/extensions/inline-bash.ts +2 -2
- package/examples/extensions/input-transform-streaming.ts +39 -0
- package/examples/extensions/input-transform.ts +2 -2
- package/examples/extensions/interactive-shell.ts +2 -2
- package/examples/extensions/kimi-deferred-tools.ts +61 -0
- package/examples/extensions/mac-system-theme.ts +2 -2
- package/examples/extensions/message-renderer.ts +3 -3
- package/examples/extensions/minimal-mode.ts +2 -2
- package/examples/extensions/modal-editor.ts +2 -2
- package/examples/extensions/model-status.ts +1 -1
- package/examples/extensions/notify.ts +3 -3
- package/examples/extensions/overlay-qa-tests.ts +242 -140
- package/examples/extensions/overlay-test.ts +9 -6
- package/examples/extensions/pirate.ts +1 -1
- package/examples/extensions/plan-mode/README.md +3 -2
- package/examples/extensions/plan-mode/index.ts +90 -40
- package/examples/extensions/preset.ts +16 -10
- package/examples/extensions/project-trust.ts +64 -0
- package/examples/extensions/prompt-customizer.ts +1 -1
- package/examples/extensions/provider-payload.ts +5 -5
- package/examples/extensions/qna.ts +4 -8
- package/examples/extensions/question.ts +41 -19
- package/examples/extensions/questionnaire.ts +50 -29
- package/examples/extensions/rainbow-editor.ts +1 -1
- package/examples/extensions/reload-runtime.ts +2 -2
- package/examples/extensions/rpc-demo.ts +1 -1
- package/examples/extensions/sandbox/index.ts +9 -9
- package/examples/extensions/sandbox/package-lock.json +7 -7
- package/examples/extensions/sandbox/package.json +3 -3
- package/examples/extensions/shutdown-command.ts +5 -5
- package/examples/extensions/snake.ts +2 -2
- package/examples/extensions/space-invaders.ts +2 -2
- package/examples/extensions/ssh.ts +2 -2
- package/examples/extensions/structured-output.ts +1 -1
- package/examples/extensions/subagent/README.md +18 -13
- package/examples/extensions/subagent/agents.ts +42 -11
- package/examples/extensions/subagent/index.ts +76 -30
- package/examples/extensions/summarize.ts +12 -19
- package/examples/extensions/tic-tac-toe.ts +2 -2
- package/examples/extensions/titlebar-spinner.ts +3 -3
- package/examples/extensions/todo.ts +2 -2
- package/examples/extensions/tool-override.ts +1 -1
- package/examples/extensions/tools.ts +7 -2
- package/examples/extensions/truncated-tool.ts +2 -2
- package/examples/extensions/with-deps/package-lock.json +4 -4
- package/examples/extensions/with-deps/package.json +4 -4
- package/examples/extensions/working-indicator.ts +4 -4
- package/examples/extensions/working-message-test.ts +1 -1
- package/examples/rpc-extension-ui.ts +11 -2
- package/examples/sdk/01-minimal.ts +15 -11
- package/examples/sdk/02-custom-model.ts +18 -18
- package/examples/sdk/03-custom-prompt.ts +25 -17
- package/examples/sdk/04-skills.ts +3 -3
- package/examples/sdk/05-tools.ts +8 -4
- package/examples/sdk/06-extensions.ts +13 -9
- package/examples/sdk/07-context-files.ts +2 -2
- package/examples/sdk/08-prompt-templates.ts +3 -3
- package/examples/sdk/09-api-keys-and-oauth.ts +19 -33
- package/examples/sdk/10-settings.ts +4 -4
- package/examples/sdk/11-sessions.ts +4 -0
- package/examples/sdk/12-full-control.ts +22 -21
- package/examples/sdk/README.md +23 -30
- package/npm-shrinkwrap.json +1818 -0
- package/package.json +117 -99
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/auth-selector-status.d.ts +0 -20
- package/dist/modes/interactive/components/auth-selector-status.d.ts.map +0 -1
- package/dist/modes/interactive/components/auth-selector-status.js +0 -23
- package/dist/modes/interactive/components/auth-selector-status.js.map +0 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +0 -1
- package/dist/modes/interactive/components/earendil-announcement.js +0 -40
- package/dist/modes/interactive/components/earendil-announcement.js.map +0 -1
- package/docs/images/exy.png +0 -0
- package/docs/tree.md +0 -233
- package/examples/extensions/antigravity-image-gen.ts +0 -418
- package/examples/extensions/custom-provider-qwen-cli/index.ts +0 -345
- package/examples/extensions/custom-provider-qwen-cli/package.json +0 -16
|
@@ -1,24 +1,51 @@
|
|
|
1
|
-
import { spawn, spawnSync } from "node:child_process";
|
|
2
1
|
import { createHash } from "node:crypto";
|
|
3
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync,
|
|
4
|
-
import { homedir
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
function getEnv() {
|
|
5
|
+
if (process.platform !== "linux" || Object.keys(process.env).length > 0) {
|
|
6
|
+
return process.env;
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const data = readFileSync("/proc/self/environ", "utf-8");
|
|
10
|
+
const env = {};
|
|
11
|
+
for (const entry of data.split("\0")) {
|
|
12
|
+
const idx = entry.indexOf("=");
|
|
13
|
+
if (idx > 0) {
|
|
14
|
+
env[entry.slice(0, idx)] = entry.slice(idx + 1);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return env;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return process.env;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
5
23
|
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
6
24
|
import { globSync } from "glob";
|
|
7
25
|
import ignore from "ignore";
|
|
8
26
|
import { minimatch } from "minimatch";
|
|
9
|
-
import {
|
|
27
|
+
import { maxSatisfying, rcompare, satisfies, valid, validRange } from "semver";
|
|
28
|
+
import { CONFIG_DIR_NAME, getAgentDir, getCacheDir } from "../config.js";
|
|
29
|
+
import { spawnProcess, spawnProcessSync } from "../utils/child-process.js";
|
|
10
30
|
import { parseGitUrl } from "../utils/git.js";
|
|
11
|
-
import { isLocalPath } from "../utils/paths.js";
|
|
31
|
+
import { canonicalizePath, isLocalPath, markPathIgnoredByCloudSync, resolvePath } from "../utils/paths.js";
|
|
12
32
|
import { isStdoutTakenOver } from "./output-guard.js";
|
|
33
|
+
import { readPiManifest } from "./pi-manifest.js";
|
|
13
34
|
const NETWORK_TIMEOUT_MS = 10000;
|
|
14
35
|
const UPDATE_CHECK_CONCURRENCY = 4;
|
|
15
36
|
const GIT_UPDATE_CONCURRENCY = 4;
|
|
16
37
|
function isOfflineModeEnabled() {
|
|
17
|
-
const value = process.env.
|
|
38
|
+
const value = process.env.MCPI_OFFLINE;
|
|
18
39
|
if (!value)
|
|
19
40
|
return false;
|
|
20
41
|
return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
|
|
21
42
|
}
|
|
43
|
+
function isExactNpmVersion(version) {
|
|
44
|
+
return valid(version ?? "") !== null;
|
|
45
|
+
}
|
|
46
|
+
function getNpmVersionRange(version) {
|
|
47
|
+
return version ? (validRange(version) ?? undefined) : undefined;
|
|
48
|
+
}
|
|
22
49
|
/**
|
|
23
50
|
* Compute a numeric precedence rank for a resource based on its metadata.
|
|
24
51
|
* Lower rank = higher precedence. Used to sort resolved resources so that
|
|
@@ -51,6 +78,12 @@ function toPosixPath(p) {
|
|
|
51
78
|
function getHomeDir() {
|
|
52
79
|
return process.env.HOME || homedir();
|
|
53
80
|
}
|
|
81
|
+
export function getExtensionTempFolder(agentDir) {
|
|
82
|
+
const tempFolder = join(agentDir, "tmp", "extensions");
|
|
83
|
+
mkdirSync(tempFolder, { recursive: true, mode: 0o700 });
|
|
84
|
+
chmodSync(tempFolder, 0o700);
|
|
85
|
+
return tempFolder;
|
|
86
|
+
}
|
|
54
87
|
function prefixIgnorePattern(line, prefix) {
|
|
55
88
|
const trimmed = line.trim();
|
|
56
89
|
if (!trimmed)
|
|
@@ -206,7 +239,7 @@ function collectSkillEntries(dir, mode, ignoreMatcher, rootDir) {
|
|
|
206
239
|
}
|
|
207
240
|
}
|
|
208
241
|
const relPath = toPosixPath(relative(root, fullPath));
|
|
209
|
-
if (mode === "
|
|
242
|
+
if (mode === "mcpi" && dir === root && isFile && entry.name.endsWith(".md") && !ig.ignores(relPath)) {
|
|
210
243
|
entries.push(fullPath);
|
|
211
244
|
continue;
|
|
212
245
|
}
|
|
@@ -328,20 +361,10 @@ function collectAutoThemeEntries(dir) {
|
|
|
328
361
|
}
|
|
329
362
|
return entries;
|
|
330
363
|
}
|
|
331
|
-
function readPiManifestFile(packageJsonPath) {
|
|
332
|
-
try {
|
|
333
|
-
const content = readFileSync(packageJsonPath, "utf-8");
|
|
334
|
-
const pkg = JSON.parse(content);
|
|
335
|
-
return pkg.pi ?? null;
|
|
336
|
-
}
|
|
337
|
-
catch {
|
|
338
|
-
return null;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
364
|
function resolveExtensionEntries(dir) {
|
|
342
365
|
const packageJsonPath = join(dir, "package.json");
|
|
343
366
|
if (existsSync(packageJsonPath)) {
|
|
344
|
-
const manifest =
|
|
367
|
+
const manifest = readPiManifest(packageJsonPath);
|
|
345
368
|
if (manifest?.extensions?.length) {
|
|
346
369
|
const entries = [];
|
|
347
370
|
for (const extPath of manifest.extensions) {
|
|
@@ -423,7 +446,7 @@ function collectAutoExtensionEntries(dir) {
|
|
|
423
446
|
*/
|
|
424
447
|
function collectResourceFiles(dir, resourceType) {
|
|
425
448
|
if (resourceType === "skills") {
|
|
426
|
-
return collectSkillEntries(dir, "
|
|
449
|
+
return collectSkillEntries(dir, "mcpi");
|
|
427
450
|
}
|
|
428
451
|
if (resourceType === "extensions") {
|
|
429
452
|
return collectAutoExtensionEntries(dir);
|
|
@@ -550,16 +573,37 @@ function applyPatterns(allPaths, patterns, baseDir) {
|
|
|
550
573
|
}
|
|
551
574
|
return new Set(result);
|
|
552
575
|
}
|
|
576
|
+
function applyAutoloadDisabledPatterns(allPaths, patterns, baseDir) {
|
|
577
|
+
const result = new Map();
|
|
578
|
+
for (const pattern of patterns) {
|
|
579
|
+
const target = pattern.slice(pattern.startsWith("+") || pattern.startsWith("-") || pattern.startsWith("!") ? 1 : 0);
|
|
580
|
+
const enabled = !pattern.startsWith("-") && !pattern.startsWith("!");
|
|
581
|
+
const exact = pattern.startsWith("+") || pattern.startsWith("-");
|
|
582
|
+
for (const filePath of allPaths) {
|
|
583
|
+
if (exact ? matchesAnyExactPattern(filePath, [target], baseDir) : matchesAnyPattern(filePath, [target], baseDir)) {
|
|
584
|
+
result.set(filePath, enabled);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
return result;
|
|
589
|
+
}
|
|
553
590
|
export class DefaultPackageManager {
|
|
554
591
|
cwd;
|
|
555
592
|
agentDir;
|
|
593
|
+
cacheDir;
|
|
556
594
|
settingsManager;
|
|
557
595
|
globalNpmRoot;
|
|
558
596
|
globalNpmRootCommandKey;
|
|
559
597
|
progressCallback;
|
|
560
598
|
constructor(options) {
|
|
561
|
-
this.cwd = options.cwd;
|
|
562
|
-
this.agentDir = options.agentDir;
|
|
599
|
+
this.cwd = resolvePath(options.cwd);
|
|
600
|
+
this.agentDir = resolvePath(options.agentDir);
|
|
601
|
+
this.cacheDir =
|
|
602
|
+
options.cacheDir !== undefined
|
|
603
|
+
? resolvePath(options.cacheDir)
|
|
604
|
+
: this.agentDir === resolvePath(getAgentDir())
|
|
605
|
+
? getCacheDir()
|
|
606
|
+
: this.agentDir;
|
|
563
607
|
this.settingsManager = options.settingsManager;
|
|
564
608
|
}
|
|
565
609
|
setProgressCallback(callback) {
|
|
@@ -570,9 +614,22 @@ export class DefaultPackageManager {
|
|
|
570
614
|
const currentSettings = scope === "project" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();
|
|
571
615
|
const currentPackages = currentSettings.packages ?? [];
|
|
572
616
|
const normalizedSource = this.normalizePackageSourceForSettings(source, scope);
|
|
573
|
-
const
|
|
574
|
-
if (
|
|
575
|
-
|
|
617
|
+
const matchIndex = currentPackages.findIndex((existing) => this.packageSourcesMatch(existing, source, scope));
|
|
618
|
+
if (matchIndex !== -1) {
|
|
619
|
+
const existing = currentPackages[matchIndex];
|
|
620
|
+
if (this.getPackageSourceString(existing) === normalizedSource) {
|
|
621
|
+
return false;
|
|
622
|
+
}
|
|
623
|
+
const nextPackages = [...currentPackages];
|
|
624
|
+
nextPackages[matchIndex] =
|
|
625
|
+
typeof existing === "string" ? normalizedSource : { ...existing, source: normalizedSource };
|
|
626
|
+
if (scope === "project") {
|
|
627
|
+
this.settingsManager.setProjectPackages(nextPackages);
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
this.settingsManager.setPackages(nextPackages);
|
|
631
|
+
}
|
|
632
|
+
return true;
|
|
576
633
|
}
|
|
577
634
|
const nextPackages = [...currentPackages, normalizedSource];
|
|
578
635
|
if (scope === "project") {
|
|
@@ -701,6 +758,7 @@ export class DefaultPackageManager {
|
|
|
701
758
|
async install(source, options) {
|
|
702
759
|
const parsed = this.parseSource(source);
|
|
703
760
|
const scope = options?.local ? "project" : "user";
|
|
761
|
+
this.assertProjectTrustedForScope(scope);
|
|
704
762
|
await this.withProgress("install", source, `Installing ${source}...`, async () => {
|
|
705
763
|
if (parsed.type === "npm") {
|
|
706
764
|
await this.installNpm(parsed, scope, false);
|
|
@@ -727,6 +785,7 @@ export class DefaultPackageManager {
|
|
|
727
785
|
async remove(source, options) {
|
|
728
786
|
const parsed = this.parseSource(source);
|
|
729
787
|
const scope = options?.local ? "project" : "user";
|
|
788
|
+
this.assertProjectTrustedForScope(scope);
|
|
730
789
|
await this.withProgress("remove", source, `Removing ${source}...`, async () => {
|
|
731
790
|
if (parsed.type === "npm") {
|
|
732
791
|
await this.uninstallNpm(parsed, scope);
|
|
@@ -782,14 +841,16 @@ export class DefaultPackageManager {
|
|
|
782
841
|
const gitCandidates = [];
|
|
783
842
|
for (const entry of sources) {
|
|
784
843
|
const parsed = this.parseSource(entry.source);
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
}
|
|
844
|
+
// Pinned npm versions are fixed. Pinned git refs are configured checkout targets,
|
|
845
|
+
// so include them to reconcile an existing clone when the configured ref changes.
|
|
788
846
|
if (parsed.type === "npm") {
|
|
789
|
-
|
|
790
|
-
|
|
847
|
+
if (!parsed.pinned) {
|
|
848
|
+
npmCandidates.push({ ...entry, parsed });
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
else if (parsed.type === "git") {
|
|
852
|
+
gitCandidates.push({ ...entry, parsed });
|
|
791
853
|
}
|
|
792
|
-
gitCandidates.push({ ...entry, parsed });
|
|
793
854
|
}
|
|
794
855
|
const npmCheckTasks = npmCandidates.map((entry) => async () => ({
|
|
795
856
|
entry,
|
|
@@ -825,14 +886,14 @@ export class DefaultPackageManager {
|
|
|
825
886
|
await Promise.all(tasks);
|
|
826
887
|
}
|
|
827
888
|
async shouldUpdateNpmSource(source, scope) {
|
|
828
|
-
const installedPath = this.
|
|
889
|
+
const installedPath = this.getManagedNpmInstallPath(source, scope);
|
|
829
890
|
const installedVersion = existsSync(installedPath) ? this.getInstalledNpmVersion(installedPath) : undefined;
|
|
830
891
|
if (!installedVersion) {
|
|
831
892
|
return true;
|
|
832
893
|
}
|
|
833
894
|
try {
|
|
834
|
-
const
|
|
835
|
-
return
|
|
895
|
+
const targetVersion = await this.getLatestNpmVersion(source.version ? source.spec : source.name, source.range);
|
|
896
|
+
return targetVersion !== installedVersion;
|
|
836
897
|
}
|
|
837
898
|
catch {
|
|
838
899
|
// Preserve existing update behavior when version lookup fails.
|
|
@@ -845,19 +906,15 @@ export class DefaultPackageManager {
|
|
|
845
906
|
}
|
|
846
907
|
const sourceLabel = sources.length === 1 ? sources[0].source : `${scope} npm packages`;
|
|
847
908
|
const message = sources.length === 1 ? `Updating ${sources[0].source}...` : `Updating ${scope} npm packages...`;
|
|
848
|
-
const specs = sources.map((entry) => `${entry.parsed.name}@latest`);
|
|
909
|
+
const specs = sources.map((entry) => (entry.parsed.version ? entry.parsed.spec : `${entry.parsed.name}@latest`));
|
|
849
910
|
await this.withProgress("update", sourceLabel, message, async () => {
|
|
850
911
|
await this.installNpmBatch(specs, scope);
|
|
851
912
|
});
|
|
852
913
|
}
|
|
853
914
|
async installNpmBatch(specs, scope) {
|
|
854
|
-
if (scope === "user") {
|
|
855
|
-
await this.runNpmCommand(["install", "-g", ...specs]);
|
|
856
|
-
return;
|
|
857
|
-
}
|
|
858
915
|
const installRoot = this.getNpmInstallRoot(scope, false);
|
|
859
916
|
this.ensureNpmProject(installRoot);
|
|
860
|
-
await this.runNpmCommand(
|
|
917
|
+
await this.runNpmCommand(this.getNpmInstallArgs(specs, installRoot));
|
|
861
918
|
}
|
|
862
919
|
async checkForAvailableUpdates() {
|
|
863
920
|
if (isOfflineModeEnabled()) {
|
|
@@ -919,57 +976,67 @@ export class DefaultPackageManager {
|
|
|
919
976
|
for (const { pkg, scope } of sources) {
|
|
920
977
|
const sourceStr = typeof pkg === "string" ? pkg : pkg.source;
|
|
921
978
|
const filter = typeof pkg === "object" ? pkg : undefined;
|
|
922
|
-
const
|
|
979
|
+
const deltaBase = this.findAutoloadDeltaBase(pkg, scope, sources);
|
|
980
|
+
const resolvedSource = deltaBase?.source ?? sourceStr;
|
|
981
|
+
const resolvedScope = deltaBase?.scope ?? scope;
|
|
982
|
+
const parsed = this.parseSource(resolvedSource);
|
|
923
983
|
const metadata = { source: sourceStr, scope, origin: "package" };
|
|
924
984
|
if (parsed.type === "local") {
|
|
925
|
-
const baseDir = this.getBaseDirForScope(
|
|
985
|
+
const baseDir = this.getBaseDirForScope(resolvedScope);
|
|
926
986
|
this.resolveLocalExtensionSource(parsed, accumulator, filter, metadata, baseDir);
|
|
927
987
|
continue;
|
|
928
988
|
}
|
|
929
989
|
const installMissing = async () => {
|
|
930
|
-
if (isOfflineModeEnabled())
|
|
990
|
+
if (isOfflineModeEnabled())
|
|
931
991
|
return false;
|
|
932
|
-
}
|
|
933
992
|
if (!onMissing) {
|
|
934
|
-
await this.installParsedSource(parsed,
|
|
993
|
+
await this.installParsedSource(parsed, resolvedScope);
|
|
935
994
|
return true;
|
|
936
995
|
}
|
|
937
|
-
const action = await onMissing(
|
|
996
|
+
const action = await onMissing(resolvedSource);
|
|
938
997
|
if (action === "skip")
|
|
939
998
|
return false;
|
|
940
999
|
if (action === "error")
|
|
941
|
-
throw new Error(`Missing source: ${
|
|
942
|
-
await this.installParsedSource(parsed,
|
|
1000
|
+
throw new Error(`Missing source: ${resolvedSource}`);
|
|
1001
|
+
await this.installParsedSource(parsed, resolvedScope);
|
|
943
1002
|
return true;
|
|
944
1003
|
};
|
|
945
1004
|
if (parsed.type === "npm") {
|
|
946
|
-
|
|
947
|
-
const needsInstall = !existsSync(installedPath) ||
|
|
948
|
-
(parsed.pinned && !(await this.installedNpmMatchesPinnedVersion(parsed, installedPath)));
|
|
1005
|
+
let installedPath = this.getNpmInstallPath(parsed, resolvedScope);
|
|
1006
|
+
const needsInstall = !existsSync(installedPath) || !(await this.installedNpmMatchesConfiguredVersion(parsed, installedPath));
|
|
949
1007
|
if (needsInstall) {
|
|
950
1008
|
const installed = await installMissing();
|
|
951
1009
|
if (!installed)
|
|
952
1010
|
continue;
|
|
1011
|
+
installedPath = this.getNpmInstallPath(parsed, resolvedScope);
|
|
953
1012
|
}
|
|
954
1013
|
metadata.baseDir = installedPath;
|
|
955
1014
|
this.collectPackageResources(installedPath, accumulator, filter, metadata);
|
|
956
1015
|
continue;
|
|
957
1016
|
}
|
|
958
1017
|
if (parsed.type === "git") {
|
|
959
|
-
const installedPath = this.getGitInstallPath(parsed,
|
|
1018
|
+
const installedPath = this.getGitInstallPath(parsed, resolvedScope);
|
|
960
1019
|
if (!existsSync(installedPath)) {
|
|
961
1020
|
const installed = await installMissing();
|
|
962
1021
|
if (!installed)
|
|
963
1022
|
continue;
|
|
964
1023
|
}
|
|
965
|
-
else if (
|
|
966
|
-
await this.refreshTemporaryGitSource(parsed,
|
|
1024
|
+
else if (resolvedScope === "temporary" && !parsed.pinned && !isOfflineModeEnabled()) {
|
|
1025
|
+
await this.refreshTemporaryGitSource(parsed, resolvedSource);
|
|
967
1026
|
}
|
|
968
1027
|
metadata.baseDir = installedPath;
|
|
969
1028
|
this.collectPackageResources(installedPath, accumulator, filter, metadata);
|
|
970
1029
|
}
|
|
971
1030
|
}
|
|
972
1031
|
}
|
|
1032
|
+
findAutoloadDeltaBase(pkg, scope, sources) {
|
|
1033
|
+
if (scope !== "project" || typeof pkg !== "object" || pkg.autoload !== false)
|
|
1034
|
+
return undefined;
|
|
1035
|
+
const identity = this.getPackageIdentity(pkg.source, scope);
|
|
1036
|
+
const userEntry = sources.find((entry) => entry.scope === "user" &&
|
|
1037
|
+
this.getPackageIdentity(this.getPackageSourceString(entry.pkg), "user") === identity);
|
|
1038
|
+
return userEntry ? { source: this.getPackageSourceString(userEntry.pkg), scope: "user" } : undefined;
|
|
1039
|
+
}
|
|
973
1040
|
resolveLocalExtensionSource(source, accumulator, filter, metadata, baseDir) {
|
|
974
1041
|
const resolved = this.resolvePathFromBase(source.path, baseDir);
|
|
975
1042
|
if (!existsSync(resolved)) {
|
|
@@ -1080,7 +1147,9 @@ export class DefaultPackageManager {
|
|
|
1080
1147
|
type: "npm",
|
|
1081
1148
|
spec,
|
|
1082
1149
|
name,
|
|
1083
|
-
|
|
1150
|
+
version,
|
|
1151
|
+
range: getNpmVersionRange(version),
|
|
1152
|
+
pinned: isExactNpmVersion(version),
|
|
1084
1153
|
};
|
|
1085
1154
|
}
|
|
1086
1155
|
if (isLocalPath(source)) {
|
|
@@ -1093,16 +1162,12 @@ export class DefaultPackageManager {
|
|
|
1093
1162
|
}
|
|
1094
1163
|
return { type: "local", path: source };
|
|
1095
1164
|
}
|
|
1096
|
-
async
|
|
1165
|
+
async installedNpmMatchesConfiguredVersion(source, installedPath) {
|
|
1097
1166
|
const installedVersion = this.getInstalledNpmVersion(installedPath);
|
|
1098
1167
|
if (!installedVersion) {
|
|
1099
1168
|
return false;
|
|
1100
1169
|
}
|
|
1101
|
-
|
|
1102
|
-
if (!pinnedVersion) {
|
|
1103
|
-
return true;
|
|
1104
|
-
}
|
|
1105
|
-
return installedVersion === pinnedVersion;
|
|
1170
|
+
return source.range ? satisfies(installedVersion, source.range) : true;
|
|
1106
1171
|
}
|
|
1107
1172
|
async npmHasAvailableUpdate(source, installedPath) {
|
|
1108
1173
|
if (isOfflineModeEnabled()) {
|
|
@@ -1113,8 +1178,8 @@ export class DefaultPackageManager {
|
|
|
1113
1178
|
return false;
|
|
1114
1179
|
}
|
|
1115
1180
|
try {
|
|
1116
|
-
const
|
|
1117
|
-
return
|
|
1181
|
+
const targetVersion = await this.getLatestNpmVersion(source.version ? source.spec : source.name, source.range);
|
|
1182
|
+
return targetVersion !== installedVersion;
|
|
1118
1183
|
}
|
|
1119
1184
|
catch {
|
|
1120
1185
|
return false;
|
|
@@ -1133,13 +1198,23 @@ export class DefaultPackageManager {
|
|
|
1133
1198
|
return undefined;
|
|
1134
1199
|
}
|
|
1135
1200
|
}
|
|
1136
|
-
async getLatestNpmVersion(
|
|
1201
|
+
async getLatestNpmVersion(packageSpec, range) {
|
|
1137
1202
|
const npmCommand = this.getNpmCommand();
|
|
1138
|
-
const stdout = await this.runCommandCapture(npmCommand.command, [...npmCommand.args, "view",
|
|
1203
|
+
const stdout = await this.runCommandCapture(npmCommand.command, [...npmCommand.args, "view", packageSpec, "version", "--json"], { cwd: this.cwd, timeoutMs: NETWORK_TIMEOUT_MS });
|
|
1139
1204
|
const raw = stdout.trim();
|
|
1140
1205
|
if (!raw)
|
|
1141
1206
|
throw new Error("Empty response from npm view");
|
|
1142
|
-
|
|
1207
|
+
const parsed = JSON.parse(raw);
|
|
1208
|
+
if (typeof parsed === "string") {
|
|
1209
|
+
return parsed;
|
|
1210
|
+
}
|
|
1211
|
+
if (Array.isArray(parsed)) {
|
|
1212
|
+
const versions = parsed.filter((value) => typeof value === "string" && value.length > 0);
|
|
1213
|
+
const latest = range ? maxSatisfying(versions, range) : [...versions].sort(rcompare)[0];
|
|
1214
|
+
if (latest)
|
|
1215
|
+
return latest;
|
|
1216
|
+
}
|
|
1217
|
+
throw new Error("Unexpected response from npm view");
|
|
1143
1218
|
}
|
|
1144
1219
|
async gitHasAvailableUpdate(installedPath) {
|
|
1145
1220
|
if (isOfflineModeEnabled()) {
|
|
@@ -1303,25 +1378,30 @@ export class DefaultPackageManager {
|
|
|
1303
1378
|
}
|
|
1304
1379
|
/**
|
|
1305
1380
|
* Dedupe packages: if same package identity appears in both global and project,
|
|
1306
|
-
* keep only the project one (project wins).
|
|
1381
|
+
* keep only the project one (project wins). A project entry with autoload=false
|
|
1382
|
+
* is a delta over the global entry, so both are kept (delta first).
|
|
1307
1383
|
*/
|
|
1308
1384
|
dedupePackages(packages) {
|
|
1385
|
+
const result = [];
|
|
1309
1386
|
const seen = new Map();
|
|
1310
1387
|
for (const entry of packages) {
|
|
1311
|
-
const
|
|
1312
|
-
const
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1388
|
+
const identity = this.getPackageIdentity(this.getPackageSourceString(entry.pkg), entry.scope);
|
|
1389
|
+
const index = seen.get(identity);
|
|
1390
|
+
if (index === undefined) {
|
|
1391
|
+
seen.set(identity, result.length);
|
|
1392
|
+
result.push(entry);
|
|
1393
|
+
continue;
|
|
1394
|
+
}
|
|
1395
|
+
const existing = result[index];
|
|
1396
|
+
if (existing?.scope === "project" && entry.scope === "user") {
|
|
1397
|
+
if (typeof existing.pkg === "object" && existing.pkg.autoload === false)
|
|
1398
|
+
result.push(entry);
|
|
1316
1399
|
}
|
|
1317
|
-
else if (entry.scope === "project"
|
|
1318
|
-
|
|
1319
|
-
seen.set(identity, entry);
|
|
1400
|
+
else if (entry.scope === "project") {
|
|
1401
|
+
result[index] = entry;
|
|
1320
1402
|
}
|
|
1321
|
-
// If existing is project and new is global, keep existing (project)
|
|
1322
|
-
// If both are same scope, keep first one
|
|
1323
1403
|
}
|
|
1324
|
-
return
|
|
1404
|
+
return result;
|
|
1325
1405
|
}
|
|
1326
1406
|
parseNpmSpec(spec) {
|
|
1327
1407
|
const match = spec.match(/^(@?[^@]+(?:\/[^@]+)?)(?:@(.+))?$/);
|
|
@@ -1332,6 +1412,11 @@ export class DefaultPackageManager {
|
|
|
1332
1412
|
const version = match[2];
|
|
1333
1413
|
return { name, version };
|
|
1334
1414
|
}
|
|
1415
|
+
assertProjectTrustedForScope(scope) {
|
|
1416
|
+
if (scope === "project" && !this.settingsManager.isProjectTrusted()) {
|
|
1417
|
+
throw new Error("Project is not trusted; refusing to access project package storage");
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1335
1420
|
getNpmCommand() {
|
|
1336
1421
|
const configuredCommand = this.settingsManager.getNpmCommand();
|
|
1337
1422
|
if (!configuredCommand || configuredCommand.length === 0) {
|
|
@@ -1343,6 +1428,13 @@ export class DefaultPackageManager {
|
|
|
1343
1428
|
}
|
|
1344
1429
|
return { command, args };
|
|
1345
1430
|
}
|
|
1431
|
+
getPackageManagerName() {
|
|
1432
|
+
const npmCommand = this.getNpmCommand();
|
|
1433
|
+
const commandParts = [npmCommand.command, ...npmCommand.args];
|
|
1434
|
+
const separatorIndex = commandParts.lastIndexOf("--");
|
|
1435
|
+
const packageManagerCommand = separatorIndex >= 0 ? commandParts[separatorIndex + 1] : npmCommand.command;
|
|
1436
|
+
return packageManagerCommand ? basename(packageManagerCommand).replace(/\.(cmd|exe)$/i, "") : "";
|
|
1437
|
+
}
|
|
1346
1438
|
async runNpmCommand(args, options) {
|
|
1347
1439
|
const npmCommand = this.getNpmCommand();
|
|
1348
1440
|
await this.runCommand(npmCommand.command, [...npmCommand.args, ...args], options);
|
|
@@ -1358,29 +1450,58 @@ export class DefaultPackageManager {
|
|
|
1358
1450
|
const npmCommand = this.getNpmCommand();
|
|
1359
1451
|
return this.runCommandSync(npmCommand.command, [...npmCommand.args, ...args]);
|
|
1360
1452
|
}
|
|
1453
|
+
getNpmInstallArgs(specs, installRoot) {
|
|
1454
|
+
const packageManagerName = this.getPackageManagerName();
|
|
1455
|
+
// Extension packages run inside mcpi and resolve mcpi APIs through loader aliases/virtual modules.
|
|
1456
|
+
// Disable peer dependency resolution for managed installs (npm's --legacy-peer-deps, and
|
|
1457
|
+
// equivalent bun/pnpm settings) so package managers do not install or solve host-provided
|
|
1458
|
+
// @sammorrowdrums/mcpi-* peers. Stale auto-installed upstream peers can otherwise block updates.
|
|
1459
|
+
if (packageManagerName === "bun") {
|
|
1460
|
+
return ["install", ...specs, "--cwd", installRoot, "--omit=peer"];
|
|
1461
|
+
}
|
|
1462
|
+
if (packageManagerName === "pnpm") {
|
|
1463
|
+
return [
|
|
1464
|
+
"install",
|
|
1465
|
+
...specs,
|
|
1466
|
+
"--prefix",
|
|
1467
|
+
installRoot,
|
|
1468
|
+
"--config.auto-install-peers=false",
|
|
1469
|
+
"--config.strict-peer-dependencies=false",
|
|
1470
|
+
"--config.strict-dep-builds=false",
|
|
1471
|
+
];
|
|
1472
|
+
}
|
|
1473
|
+
return ["install", ...specs, "--prefix", installRoot, "--legacy-peer-deps"];
|
|
1474
|
+
}
|
|
1361
1475
|
async installNpm(source, scope, temporary) {
|
|
1362
|
-
if (scope === "user" && !temporary) {
|
|
1363
|
-
await this.runNpmCommand(["install", "-g", source.spec]);
|
|
1364
|
-
return;
|
|
1365
|
-
}
|
|
1366
1476
|
const installRoot = this.getNpmInstallRoot(scope, temporary);
|
|
1367
1477
|
this.ensureNpmProject(installRoot);
|
|
1368
|
-
await this.runNpmCommand([
|
|
1478
|
+
await this.runNpmCommand(this.getNpmInstallArgs([source.spec], installRoot));
|
|
1369
1479
|
}
|
|
1370
1480
|
async uninstallNpm(source, scope) {
|
|
1371
|
-
if (scope === "user") {
|
|
1372
|
-
await this.runNpmCommand(["uninstall", "-g", source.name]);
|
|
1373
|
-
return;
|
|
1374
|
-
}
|
|
1375
1481
|
const installRoot = this.getNpmInstallRoot(scope, false);
|
|
1376
1482
|
if (!existsSync(installRoot)) {
|
|
1377
1483
|
return;
|
|
1378
1484
|
}
|
|
1379
|
-
|
|
1485
|
+
const packageManagerName = this.getPackageManagerName();
|
|
1486
|
+
if (packageManagerName === "bun") {
|
|
1487
|
+
await this.runNpmCommand(["uninstall", source.name, "--cwd", installRoot]);
|
|
1488
|
+
return;
|
|
1489
|
+
}
|
|
1490
|
+
const args = ["uninstall", source.name, "--prefix", installRoot];
|
|
1491
|
+
if (packageManagerName !== "pnpm") {
|
|
1492
|
+
args.push("--legacy-peer-deps");
|
|
1493
|
+
}
|
|
1494
|
+
await this.runNpmCommand(args);
|
|
1380
1495
|
}
|
|
1381
1496
|
async installGit(source, scope) {
|
|
1382
1497
|
const targetDir = this.getGitInstallPath(source, scope);
|
|
1383
1498
|
if (existsSync(targetDir)) {
|
|
1499
|
+
if (source.ref) {
|
|
1500
|
+
await this.ensureGitRef(targetDir, ["fetch", "origin", source.ref], "FETCH_HEAD");
|
|
1501
|
+
return;
|
|
1502
|
+
}
|
|
1503
|
+
const target = await this.getLocalGitUpdateTarget(targetDir);
|
|
1504
|
+
await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
|
|
1384
1505
|
return;
|
|
1385
1506
|
}
|
|
1386
1507
|
const gitRoot = this.getGitInstallRoot(scope);
|
|
@@ -1388,13 +1509,21 @@ export class DefaultPackageManager {
|
|
|
1388
1509
|
this.ensureGitIgnore(gitRoot);
|
|
1389
1510
|
}
|
|
1390
1511
|
mkdirSync(dirname(targetDir), { recursive: true });
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
await this.runCommand("git", ["
|
|
1512
|
+
rmSync(this.getGitUpdateMarkerPath(targetDir), { force: true });
|
|
1513
|
+
try {
|
|
1514
|
+
await this.runCommand("git", ["clone", source.repo, targetDir]);
|
|
1515
|
+
if (source.ref) {
|
|
1516
|
+
await this.runCommand("git", ["checkout", source.ref], { cwd: targetDir });
|
|
1517
|
+
}
|
|
1518
|
+
const packageJsonPath = join(targetDir, "package.json");
|
|
1519
|
+
if (existsSync(packageJsonPath)) {
|
|
1520
|
+
await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
|
|
1521
|
+
}
|
|
1394
1522
|
}
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1523
|
+
catch (error) {
|
|
1524
|
+
rmSync(targetDir, { recursive: true, force: true });
|
|
1525
|
+
this.pruneEmptyGitParents(targetDir, gitRoot);
|
|
1526
|
+
throw error;
|
|
1398
1527
|
}
|
|
1399
1528
|
}
|
|
1400
1529
|
async updateGit(source, scope) {
|
|
@@ -1403,27 +1532,85 @@ export class DefaultPackageManager {
|
|
|
1403
1532
|
await this.installGit(source, scope);
|
|
1404
1533
|
return;
|
|
1405
1534
|
}
|
|
1535
|
+
if (source.ref) {
|
|
1536
|
+
await this.ensureGitRef(targetDir, ["fetch", "origin", source.ref], "FETCH_HEAD");
|
|
1537
|
+
return;
|
|
1538
|
+
}
|
|
1406
1539
|
const target = await this.getLocalGitUpdateTarget(targetDir);
|
|
1540
|
+
await this.ensureGitRef(targetDir, target.fetchArgs, target.ref);
|
|
1541
|
+
}
|
|
1542
|
+
hasMissingGitDependencies(targetDir) {
|
|
1543
|
+
const packageJsonPath = join(targetDir, "package.json");
|
|
1544
|
+
if (!existsSync(packageJsonPath))
|
|
1545
|
+
return false;
|
|
1546
|
+
try {
|
|
1547
|
+
const manifest = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
1548
|
+
if (!manifest.dependencies ||
|
|
1549
|
+
typeof manifest.dependencies !== "object" ||
|
|
1550
|
+
Array.isArray(manifest.dependencies)) {
|
|
1551
|
+
return false;
|
|
1552
|
+
}
|
|
1553
|
+
const nodeModulesDir = resolve(targetDir, "node_modules");
|
|
1554
|
+
return Object.keys(manifest.dependencies).some((name) => {
|
|
1555
|
+
const dependencyPath = resolve(nodeModulesDir, name);
|
|
1556
|
+
if (!dependencyPath.startsWith(`${nodeModulesDir}${sep}`))
|
|
1557
|
+
return false;
|
|
1558
|
+
return !existsSync(dependencyPath);
|
|
1559
|
+
});
|
|
1560
|
+
}
|
|
1561
|
+
catch {
|
|
1562
|
+
return false;
|
|
1563
|
+
}
|
|
1564
|
+
}
|
|
1565
|
+
async repairMissingGitDependencies(targetDir) {
|
|
1566
|
+
if (!this.hasMissingGitDependencies(targetDir))
|
|
1567
|
+
return;
|
|
1568
|
+
await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
|
|
1569
|
+
}
|
|
1570
|
+
getGitUpdateMarkerPath(targetDir) {
|
|
1571
|
+
return join(dirname(targetDir), `.${basename(targetDir)}.mcpi-update-incomplete`);
|
|
1572
|
+
}
|
|
1573
|
+
async cleanAndInstallGitDependencies(targetDir, markerPath) {
|
|
1574
|
+
// Clean untracked files (extensions should be pristine). If this fails after
|
|
1575
|
+
// deleting dependencies, repair them so the existing extension still loads.
|
|
1576
|
+
try {
|
|
1577
|
+
await this.runCommand("git", ["clean", "-fdx"], { cwd: targetDir });
|
|
1578
|
+
}
|
|
1579
|
+
catch (error) {
|
|
1580
|
+
await this.repairMissingGitDependencies(targetDir).catch(() => { });
|
|
1581
|
+
throw error;
|
|
1582
|
+
}
|
|
1583
|
+
const packageJsonPath = join(targetDir, "package.json");
|
|
1584
|
+
if (existsSync(packageJsonPath)) {
|
|
1585
|
+
await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
|
|
1586
|
+
}
|
|
1587
|
+
rmSync(markerPath, { force: true });
|
|
1588
|
+
}
|
|
1589
|
+
async ensureGitRef(targetDir, fetchArgs, ref) {
|
|
1407
1590
|
// Fetch only the ref we will reset to, avoiding unrelated branch/tag noise.
|
|
1408
|
-
await this.runCommand("git",
|
|
1591
|
+
await this.runCommand("git", fetchArgs, { cwd: targetDir });
|
|
1409
1592
|
const localHead = await this.runCommandCapture("git", ["rev-parse", "HEAD"], {
|
|
1410
1593
|
cwd: targetDir,
|
|
1411
1594
|
timeoutMs: NETWORK_TIMEOUT_MS,
|
|
1412
1595
|
});
|
|
1413
|
-
const
|
|
1596
|
+
const commitRef = `${ref}^{commit}`;
|
|
1597
|
+
const targetHead = await this.runCommandCapture("git", ["rev-parse", commitRef], {
|
|
1414
1598
|
cwd: targetDir,
|
|
1415
1599
|
timeoutMs: NETWORK_TIMEOUT_MS,
|
|
1416
1600
|
});
|
|
1417
|
-
|
|
1601
|
+
const markerPath = this.getGitUpdateMarkerPath(targetDir);
|
|
1602
|
+
if (localHead.trim() === targetHead.trim()) {
|
|
1603
|
+
if (existsSync(markerPath)) {
|
|
1604
|
+
await this.cleanAndInstallGitDependencies(targetDir, markerPath);
|
|
1605
|
+
}
|
|
1606
|
+
else {
|
|
1607
|
+
await this.repairMissingGitDependencies(targetDir);
|
|
1608
|
+
}
|
|
1418
1609
|
return;
|
|
1419
1610
|
}
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
await this.
|
|
1423
|
-
const packageJsonPath = join(targetDir, "package.json");
|
|
1424
|
-
if (existsSync(packageJsonPath)) {
|
|
1425
|
-
await this.runNpmCommand(this.getGitDependencyInstallArgs(), { cwd: targetDir });
|
|
1426
|
-
}
|
|
1611
|
+
writeFileSync(markerPath, "", "utf-8");
|
|
1612
|
+
await this.runCommand("git", ["reset", "--hard", commitRef], { cwd: targetDir });
|
|
1613
|
+
await this.cleanAndInstallGitDependencies(targetDir, markerPath);
|
|
1427
1614
|
}
|
|
1428
1615
|
async refreshTemporaryGitSource(source, sourceStr) {
|
|
1429
1616
|
if (isOfflineModeEnabled()) {
|
|
@@ -1440,9 +1627,8 @@ export class DefaultPackageManager {
|
|
|
1440
1627
|
}
|
|
1441
1628
|
async removeGit(source, scope) {
|
|
1442
1629
|
const targetDir = this.getGitInstallPath(source, scope);
|
|
1443
|
-
if (!existsSync(targetDir))
|
|
1444
|
-
return;
|
|
1445
1630
|
rmSync(targetDir, { recursive: true, force: true });
|
|
1631
|
+
rmSync(this.getGitUpdateMarkerPath(targetDir), { force: true });
|
|
1446
1632
|
this.pruneEmptyGitParents(targetDir, this.getGitInstallRoot(scope));
|
|
1447
1633
|
}
|
|
1448
1634
|
pruneEmptyGitParents(targetDir, installRoot) {
|
|
@@ -1472,10 +1658,11 @@ export class DefaultPackageManager {
|
|
|
1472
1658
|
if (!existsSync(installRoot)) {
|
|
1473
1659
|
mkdirSync(installRoot, { recursive: true });
|
|
1474
1660
|
}
|
|
1661
|
+
markPathIgnoredByCloudSync(installRoot);
|
|
1475
1662
|
this.ensureGitIgnore(installRoot);
|
|
1476
1663
|
const packageJsonPath = join(installRoot, "package.json");
|
|
1477
1664
|
if (!existsSync(packageJsonPath)) {
|
|
1478
|
-
const pkgJson = { name: "
|
|
1665
|
+
const pkgJson = { name: "mcpi-extensions", private: true };
|
|
1479
1666
|
writeFileSync(packageJsonPath, JSON.stringify(pkgJson, null, 2), "utf-8");
|
|
1480
1667
|
}
|
|
1481
1668
|
}
|
|
@@ -1493,9 +1680,10 @@ export class DefaultPackageManager {
|
|
|
1493
1680
|
return this.getTemporaryDir("npm");
|
|
1494
1681
|
}
|
|
1495
1682
|
if (scope === "project") {
|
|
1683
|
+
this.assertProjectTrustedForScope(scope);
|
|
1496
1684
|
return join(this.cwd, CONFIG_DIR_NAME, "npm");
|
|
1497
1685
|
}
|
|
1498
|
-
return join(this.
|
|
1686
|
+
return join(this.cacheDir, "npm");
|
|
1499
1687
|
}
|
|
1500
1688
|
getGlobalNpmRoot() {
|
|
1501
1689
|
const npmCommand = this.getNpmCommand();
|
|
@@ -1503,47 +1691,94 @@ export class DefaultPackageManager {
|
|
|
1503
1691
|
if (this.globalNpmRoot && this.globalNpmRootCommandKey === commandKey) {
|
|
1504
1692
|
return this.globalNpmRoot;
|
|
1505
1693
|
}
|
|
1506
|
-
|
|
1507
|
-
|
|
1694
|
+
if (this.getPackageManagerName() === "bun") {
|
|
1695
|
+
const binDir = this.runNpmCommandSync(["pm", "bin", "-g"]).trim();
|
|
1696
|
+
this.globalNpmRoot = join(dirname(binDir), "install", "global", "node_modules");
|
|
1697
|
+
}
|
|
1698
|
+
else {
|
|
1699
|
+
this.globalNpmRoot = this.runNpmCommandSync(["root", "-g"]).trim();
|
|
1700
|
+
}
|
|
1508
1701
|
this.globalNpmRootCommandKey = commandKey;
|
|
1509
1702
|
return this.globalNpmRoot;
|
|
1510
1703
|
}
|
|
1511
|
-
|
|
1704
|
+
getPnpmGlobalPackagePath(packageName) {
|
|
1705
|
+
if (this.getPackageManagerName() !== "pnpm") {
|
|
1706
|
+
return undefined;
|
|
1707
|
+
}
|
|
1708
|
+
const output = this.runNpmCommandSync(["list", "-g", "--depth", "0", "--json"]);
|
|
1709
|
+
const entries = JSON.parse(output);
|
|
1710
|
+
for (const entry of entries) {
|
|
1711
|
+
const path = entry.dependencies?.[packageName]?.path;
|
|
1712
|
+
if (path)
|
|
1713
|
+
return path;
|
|
1714
|
+
}
|
|
1715
|
+
return undefined;
|
|
1716
|
+
}
|
|
1717
|
+
getManagedNpmInstallPath(source, scope) {
|
|
1512
1718
|
if (scope === "temporary") {
|
|
1513
1719
|
return join(this.getTemporaryDir("npm"), "node_modules", source.name);
|
|
1514
1720
|
}
|
|
1515
1721
|
if (scope === "project") {
|
|
1722
|
+
this.assertProjectTrustedForScope(scope);
|
|
1516
1723
|
return join(this.cwd, CONFIG_DIR_NAME, "npm", "node_modules", source.name);
|
|
1517
1724
|
}
|
|
1518
|
-
return join(this.
|
|
1725
|
+
return join(this.cacheDir, "npm", "node_modules", source.name);
|
|
1726
|
+
}
|
|
1727
|
+
getLegacyGlobalNpmInstallPath(source) {
|
|
1728
|
+
try {
|
|
1729
|
+
return this.getPnpmGlobalPackagePath(source.name) ?? join(this.getGlobalNpmRoot(), source.name);
|
|
1730
|
+
}
|
|
1731
|
+
catch {
|
|
1732
|
+
return undefined;
|
|
1733
|
+
}
|
|
1734
|
+
}
|
|
1735
|
+
getNpmInstallPath(source, scope) {
|
|
1736
|
+
const managedPath = this.getManagedNpmInstallPath(source, scope);
|
|
1737
|
+
if (scope !== "user" || existsSync(managedPath)) {
|
|
1738
|
+
return managedPath;
|
|
1739
|
+
}
|
|
1740
|
+
const legacyPath = this.getLegacyGlobalNpmInstallPath(source);
|
|
1741
|
+
return legacyPath && existsSync(legacyPath) ? legacyPath : managedPath;
|
|
1519
1742
|
}
|
|
1520
1743
|
getGitInstallPath(source, scope) {
|
|
1521
1744
|
if (scope === "temporary") {
|
|
1522
1745
|
return this.getTemporaryDir(`git-${source.host}`, source.path);
|
|
1523
1746
|
}
|
|
1524
|
-
|
|
1525
|
-
|
|
1747
|
+
const installRoot = this.getGitInstallRoot(scope);
|
|
1748
|
+
if (!installRoot) {
|
|
1749
|
+
throw new Error("Missing git install root");
|
|
1526
1750
|
}
|
|
1527
|
-
return
|
|
1751
|
+
return this.resolveManagedPath(installRoot, source.host, source.path);
|
|
1528
1752
|
}
|
|
1529
1753
|
getGitInstallRoot(scope) {
|
|
1530
1754
|
if (scope === "temporary") {
|
|
1531
1755
|
return undefined;
|
|
1532
1756
|
}
|
|
1533
1757
|
if (scope === "project") {
|
|
1758
|
+
this.assertProjectTrustedForScope(scope);
|
|
1534
1759
|
return join(this.cwd, CONFIG_DIR_NAME, "git");
|
|
1535
1760
|
}
|
|
1536
|
-
return join(this.
|
|
1761
|
+
return join(this.cacheDir, "git");
|
|
1537
1762
|
}
|
|
1538
1763
|
getTemporaryDir(prefix, suffix) {
|
|
1764
|
+
const root = this.resolveManagedPath(getExtensionTempFolder(this.cacheDir), prefix);
|
|
1539
1765
|
const hash = createHash("sha256")
|
|
1540
1766
|
.update(`${prefix}-${suffix ?? ""}`)
|
|
1541
1767
|
.digest("hex")
|
|
1542
1768
|
.slice(0, 8);
|
|
1543
|
-
return
|
|
1769
|
+
return this.resolveManagedPath(root, hash, suffix ?? "");
|
|
1770
|
+
}
|
|
1771
|
+
resolveManagedPath(root, ...parts) {
|
|
1772
|
+
const resolvedRoot = resolve(root);
|
|
1773
|
+
const resolvedPath = resolve(resolvedRoot, ...parts);
|
|
1774
|
+
if (resolvedPath !== resolvedRoot && !resolvedPath.startsWith(`${resolvedRoot}${sep}`)) {
|
|
1775
|
+
throw new Error(`Refusing to use path outside package install root: ${resolvedPath}`);
|
|
1776
|
+
}
|
|
1777
|
+
return resolvedPath;
|
|
1544
1778
|
}
|
|
1545
1779
|
getBaseDirForScope(scope) {
|
|
1546
1780
|
if (scope === "project") {
|
|
1781
|
+
this.assertProjectTrustedForScope(scope);
|
|
1547
1782
|
return join(this.cwd, CONFIG_DIR_NAME);
|
|
1548
1783
|
}
|
|
1549
1784
|
if (scope === "user") {
|
|
@@ -1552,31 +1787,20 @@ export class DefaultPackageManager {
|
|
|
1552
1787
|
return this.cwd;
|
|
1553
1788
|
}
|
|
1554
1789
|
resolvePath(input) {
|
|
1555
|
-
|
|
1556
|
-
if (trimmed === "~")
|
|
1557
|
-
return getHomeDir();
|
|
1558
|
-
if (trimmed.startsWith("~/"))
|
|
1559
|
-
return join(getHomeDir(), trimmed.slice(2));
|
|
1560
|
-
if (trimmed.startsWith("~"))
|
|
1561
|
-
return join(getHomeDir(), trimmed.slice(1));
|
|
1562
|
-
return resolve(this.cwd, trimmed);
|
|
1790
|
+
return resolvePath(input, this.cwd, { homeDir: getHomeDir(), trim: true });
|
|
1563
1791
|
}
|
|
1564
1792
|
resolvePathFromBase(input, baseDir) {
|
|
1565
|
-
|
|
1566
|
-
if (trimmed === "~")
|
|
1567
|
-
return getHomeDir();
|
|
1568
|
-
if (trimmed.startsWith("~/"))
|
|
1569
|
-
return join(getHomeDir(), trimmed.slice(2));
|
|
1570
|
-
if (trimmed.startsWith("~"))
|
|
1571
|
-
return join(getHomeDir(), trimmed.slice(1));
|
|
1572
|
-
return resolve(baseDir, trimmed);
|
|
1793
|
+
return resolvePath(input, baseDir, { homeDir: getHomeDir(), trim: true });
|
|
1573
1794
|
}
|
|
1574
1795
|
collectPackageResources(packageRoot, accumulator, filter, metadata) {
|
|
1575
1796
|
if (filter) {
|
|
1576
1797
|
for (const resourceType of RESOURCE_TYPES) {
|
|
1577
1798
|
const patterns = filter[resourceType];
|
|
1578
1799
|
const target = this.getTargetMap(accumulator, resourceType);
|
|
1579
|
-
if (
|
|
1800
|
+
if (filter.autoload === false) {
|
|
1801
|
+
this.applyPackageDeltaFilter(packageRoot, patterns ?? [], resourceType, target, metadata);
|
|
1802
|
+
}
|
|
1803
|
+
else if (patterns !== undefined) {
|
|
1580
1804
|
this.applyPackageFilter(packageRoot, patterns, resourceType, target, metadata);
|
|
1581
1805
|
}
|
|
1582
1806
|
else {
|
|
@@ -1585,7 +1809,7 @@ export class DefaultPackageManager {
|
|
|
1585
1809
|
}
|
|
1586
1810
|
return true;
|
|
1587
1811
|
}
|
|
1588
|
-
const manifest =
|
|
1812
|
+
const manifest = readPiManifest(join(packageRoot, "package.json"));
|
|
1589
1813
|
if (manifest) {
|
|
1590
1814
|
for (const resourceType of RESOURCE_TYPES) {
|
|
1591
1815
|
const entries = manifest[resourceType];
|
|
@@ -1608,7 +1832,7 @@ export class DefaultPackageManager {
|
|
|
1608
1832
|
return hasAnyDir;
|
|
1609
1833
|
}
|
|
1610
1834
|
collectDefaultResources(packageRoot, resourceType, target, metadata) {
|
|
1611
|
-
const manifest =
|
|
1835
|
+
const manifest = readPiManifest(join(packageRoot, "package.json"));
|
|
1612
1836
|
const entries = manifest?.[resourceType];
|
|
1613
1837
|
if (entries) {
|
|
1614
1838
|
this.addManifestEntries(entries, packageRoot, resourceType, target, metadata);
|
|
@@ -1639,13 +1863,23 @@ export class DefaultPackageManager {
|
|
|
1639
1863
|
this.addResource(target, f, metadata, enabled);
|
|
1640
1864
|
}
|
|
1641
1865
|
}
|
|
1866
|
+
applyPackageDeltaFilter(packageRoot, userPatterns, resourceType, target, metadata) {
|
|
1867
|
+
if (userPatterns.length === 0) {
|
|
1868
|
+
return;
|
|
1869
|
+
}
|
|
1870
|
+
const { allFiles } = this.collectManifestFiles(packageRoot, resourceType);
|
|
1871
|
+
const enabledByUser = applyAutoloadDisabledPatterns(allFiles, userPatterns, packageRoot);
|
|
1872
|
+
for (const [filePath, enabled] of enabledByUser) {
|
|
1873
|
+
this.addResource(target, filePath, metadata, enabled);
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1642
1876
|
/**
|
|
1643
1877
|
* Collect all files from a package for a resource type, applying manifest patterns.
|
|
1644
1878
|
* Returns { allFiles, enabledByManifest } where enabledByManifest is the set of files
|
|
1645
1879
|
* that pass the manifest's own patterns.
|
|
1646
1880
|
*/
|
|
1647
1881
|
collectManifestFiles(packageRoot, resourceType) {
|
|
1648
|
-
const manifest =
|
|
1882
|
+
const manifest = readPiManifest(join(packageRoot, "package.json"));
|
|
1649
1883
|
const entries = manifest?.[resourceType];
|
|
1650
1884
|
if (entries && entries.length > 0) {
|
|
1651
1885
|
const allFiles = this.collectFilesFromManifestEntries(entries, packageRoot, resourceType);
|
|
@@ -1660,20 +1894,6 @@ export class DefaultPackageManager {
|
|
|
1660
1894
|
const allFiles = collectResourceFiles(conventionDir, resourceType);
|
|
1661
1895
|
return { allFiles, enabledByManifest: new Set(allFiles) };
|
|
1662
1896
|
}
|
|
1663
|
-
readPiManifest(packageRoot) {
|
|
1664
|
-
const packageJsonPath = join(packageRoot, "package.json");
|
|
1665
|
-
if (!existsSync(packageJsonPath)) {
|
|
1666
|
-
return null;
|
|
1667
|
-
}
|
|
1668
|
-
try {
|
|
1669
|
-
const content = readFileSync(packageJsonPath, "utf-8");
|
|
1670
|
-
const pkg = JSON.parse(content);
|
|
1671
|
-
return pkg.pi ?? null;
|
|
1672
|
-
}
|
|
1673
|
-
catch {
|
|
1674
|
-
return null;
|
|
1675
|
-
}
|
|
1676
|
-
}
|
|
1677
1897
|
addManifestEntries(entries, root, resourceType, target, metadata) {
|
|
1678
1898
|
if (!entries)
|
|
1679
1899
|
return;
|
|
@@ -1753,7 +1973,10 @@ export class DefaultPackageManager {
|
|
|
1753
1973
|
themes: join(projectBaseDir, "themes"),
|
|
1754
1974
|
};
|
|
1755
1975
|
const userAgentsSkillsDir = join(getHomeDir(), ".agents", "skills");
|
|
1756
|
-
const
|
|
1976
|
+
const projectTrusted = this.settingsManager.isProjectTrusted();
|
|
1977
|
+
const projectAgentsSkillDirs = projectTrusted
|
|
1978
|
+
? collectAncestorAgentsSkillDirs(this.cwd).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir))
|
|
1979
|
+
: [];
|
|
1757
1980
|
const addResources = (resourceType, paths, metadata, overrides, baseDir) => {
|
|
1758
1981
|
const target = this.getTargetMap(accumulator, resourceType);
|
|
1759
1982
|
for (const path of paths) {
|
|
@@ -1761,15 +1984,36 @@ export class DefaultPackageManager {
|
|
|
1761
1984
|
this.addResource(target, path, metadata, enabled);
|
|
1762
1985
|
}
|
|
1763
1986
|
};
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1987
|
+
if (projectTrusted) {
|
|
1988
|
+
// Project extensions from .mcpi/
|
|
1989
|
+
addResources("extensions", collectAutoExtensionEntries(projectDirs.extensions), projectMetadata, projectOverrides.extensions, projectBaseDir);
|
|
1990
|
+
// Project skills from .mcpi/
|
|
1991
|
+
addResources("skills", collectAutoSkillEntries(projectDirs.skills, "mcpi"), projectMetadata, projectOverrides.skills, projectBaseDir);
|
|
1992
|
+
}
|
|
1993
|
+
// Project skills from .agents/ (each with its own baseDir)
|
|
1994
|
+
for (const agentsSkillsDir of projectAgentsSkillDirs) {
|
|
1995
|
+
const agentsBaseDir = dirname(agentsSkillsDir); // the .agents directory
|
|
1996
|
+
const agentsMetadata = {
|
|
1997
|
+
...projectMetadata,
|
|
1998
|
+
baseDir: agentsBaseDir,
|
|
1999
|
+
};
|
|
2000
|
+
addResources("skills", collectAutoSkillEntries(agentsSkillsDir, "agents"), agentsMetadata, projectOverrides.skills, agentsBaseDir);
|
|
2001
|
+
}
|
|
2002
|
+
if (projectTrusted) {
|
|
2003
|
+
addResources("prompts", collectAutoPromptEntries(projectDirs.prompts), projectMetadata, projectOverrides.prompts, projectBaseDir);
|
|
2004
|
+
addResources("themes", collectAutoThemeEntries(projectDirs.themes), projectMetadata, projectOverrides.themes, projectBaseDir);
|
|
2005
|
+
}
|
|
2006
|
+
// User extensions from the mcpi config directory
|
|
1771
2007
|
addResources("extensions", collectAutoExtensionEntries(userDirs.extensions), userMetadata, userOverrides.extensions, globalBaseDir);
|
|
1772
|
-
|
|
2008
|
+
// User skills from the mcpi config directory
|
|
2009
|
+
addResources("skills", collectAutoSkillEntries(userDirs.skills, "mcpi"), userMetadata, userOverrides.skills, globalBaseDir);
|
|
2010
|
+
// User skills from ~/.agents/ (with its own baseDir)
|
|
2011
|
+
const userAgentsBaseDir = dirname(userAgentsSkillsDir);
|
|
2012
|
+
const userAgentsMetadata = {
|
|
2013
|
+
...userMetadata,
|
|
2014
|
+
baseDir: userAgentsBaseDir,
|
|
2015
|
+
};
|
|
2016
|
+
addResources("skills", collectAutoSkillEntries(userAgentsSkillsDir, "agents"), userAgentsMetadata, userOverrides.skills, userAgentsBaseDir);
|
|
1773
2017
|
addResources("prompts", collectAutoPromptEntries(userDirs.prompts), userMetadata, userOverrides.prompts, globalBaseDir);
|
|
1774
2018
|
addResources("themes", collectAutoThemeEntries(userDirs.themes), userMetadata, userOverrides.themes, globalBaseDir);
|
|
1775
2019
|
}
|
|
@@ -1823,52 +2067,44 @@ export class DefaultPackageManager {
|
|
|
1823
2067
|
};
|
|
1824
2068
|
}
|
|
1825
2069
|
toResolvedPaths(accumulator) {
|
|
1826
|
-
const
|
|
2070
|
+
const mapToResolved = (entries) => {
|
|
1827
2071
|
const resolved = Array.from(entries.entries()).map(([path, { metadata, enabled }]) => ({
|
|
1828
2072
|
path,
|
|
1829
2073
|
enabled,
|
|
1830
2074
|
metadata,
|
|
1831
2075
|
}));
|
|
1832
2076
|
resolved.sort((a, b) => resourcePrecedenceRank(a.metadata) - resourcePrecedenceRank(b.metadata));
|
|
1833
|
-
|
|
2077
|
+
const seen = new Set();
|
|
2078
|
+
return resolved.filter((entry) => {
|
|
2079
|
+
const canonicalPath = canonicalizePath(entry.path);
|
|
2080
|
+
if (seen.has(canonicalPath))
|
|
2081
|
+
return false;
|
|
2082
|
+
seen.add(canonicalPath);
|
|
2083
|
+
return true;
|
|
2084
|
+
});
|
|
1834
2085
|
};
|
|
1835
|
-
const seenCanonicalSkillPaths = new Set();
|
|
1836
|
-
const resolvedSkills = toResolved(accumulator.skills).filter((entry) => {
|
|
1837
|
-
let canonicalPath;
|
|
1838
|
-
try {
|
|
1839
|
-
// Resolve symlink aliases to detect duplicate files.
|
|
1840
|
-
canonicalPath = realpathSync(entry.path);
|
|
1841
|
-
}
|
|
1842
|
-
catch {
|
|
1843
|
-
// Fallback to raw path to match loadSkills() behavior.
|
|
1844
|
-
canonicalPath = entry.path;
|
|
1845
|
-
}
|
|
1846
|
-
if (seenCanonicalSkillPaths.has(canonicalPath)) {
|
|
1847
|
-
return false;
|
|
1848
|
-
}
|
|
1849
|
-
seenCanonicalSkillPaths.add(canonicalPath);
|
|
1850
|
-
return true;
|
|
1851
|
-
});
|
|
1852
2086
|
return {
|
|
1853
|
-
extensions:
|
|
1854
|
-
skills:
|
|
1855
|
-
prompts:
|
|
1856
|
-
themes:
|
|
2087
|
+
extensions: mapToResolved(accumulator.extensions),
|
|
2088
|
+
skills: mapToResolved(accumulator.skills),
|
|
2089
|
+
prompts: mapToResolved(accumulator.prompts),
|
|
2090
|
+
themes: mapToResolved(accumulator.themes),
|
|
1857
2091
|
};
|
|
1858
2092
|
}
|
|
1859
2093
|
spawnCommand(command, args, options) {
|
|
1860
|
-
|
|
2094
|
+
const env = getEnv();
|
|
2095
|
+
return spawnProcess(command, args, {
|
|
1861
2096
|
cwd: options?.cwd,
|
|
1862
2097
|
stdio: isStdoutTakenOver() ? ["ignore", 2, 2] : "inherit",
|
|
1863
|
-
|
|
2098
|
+
env,
|
|
1864
2099
|
});
|
|
1865
2100
|
}
|
|
1866
2101
|
spawnCaptureCommand(command, args, options) {
|
|
1867
|
-
|
|
2102
|
+
const baseEnv = getEnv();
|
|
2103
|
+
const env = options?.env ? { ...baseEnv, ...options.env } : baseEnv;
|
|
2104
|
+
return spawnProcess(command, args, {
|
|
1868
2105
|
cwd: options?.cwd,
|
|
1869
2106
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1870
|
-
|
|
1871
|
-
env: options?.env ? { ...process.env, ...options.env } : process.env,
|
|
2107
|
+
env,
|
|
1872
2108
|
});
|
|
1873
2109
|
}
|
|
1874
2110
|
runCommandCapture(command, args, options) {
|
|
@@ -1925,13 +2161,14 @@ export class DefaultPackageManager {
|
|
|
1925
2161
|
});
|
|
1926
2162
|
}
|
|
1927
2163
|
runCommandSync(command, args) {
|
|
1928
|
-
const
|
|
2164
|
+
const env = getEnv();
|
|
2165
|
+
const result = spawnProcessSync(command, args, {
|
|
1929
2166
|
stdio: ["ignore", "pipe", "pipe"],
|
|
1930
2167
|
encoding: "utf-8",
|
|
1931
|
-
|
|
2168
|
+
env,
|
|
1932
2169
|
});
|
|
1933
|
-
if (result.status !== 0) {
|
|
1934
|
-
throw new Error(`Failed to run ${command} ${args.join(" ")}: ${result.stderr || result.stdout}`);
|
|
2170
|
+
if (result.error || result.status !== 0) {
|
|
2171
|
+
throw new Error(`Failed to run ${command} ${args.join(" ")}: ${result.error?.message || result.stderr || result.stdout}`);
|
|
1935
2172
|
}
|
|
1936
2173
|
return (result.stdout || result.stderr || "").trim();
|
|
1937
2174
|
}
|