@phi-code-admin/phi-code 0.74.2 → 0.75.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 +1186 -4
- package/README.md +478 -379
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +9 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +12 -7
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +87 -45
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +4 -0
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +7 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js +2 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -5
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +226 -30
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +117 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +300 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +86 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +117 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +63 -82
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +674 -628
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/api-key-store.d.ts +87 -0
- package/dist/core/api-key-store.d.ts.map +1 -0
- package/dist/core/api-key-store.js +168 -0
- package/dist/core/api-key-store.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +12 -5
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +34 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts +0 -15
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +28 -129
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +3 -2
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +4 -4
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +32 -27
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/config-watcher.d.ts +47 -0
- package/dist/core/config-watcher.d.ts.map +1 -0
- package/dist/core/config-watcher.js +135 -0
- package/dist/core/config-watcher.js.map +1 -0
- package/dist/core/default-models.json +80 -0
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +7 -3
- package/dist/core/exec.js.map +1 -1
- 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 +7 -4
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +15 -13
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +112 -17
- package/dist/core/export-html/template.html +1 -0
- package/dist/core/export-html/template.js +312 -64
- package/dist/core/export-html/tool-renderer.d.ts +9 -10
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +61 -16
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +5 -4
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +2 -2
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts +0 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +98 -18
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +27 -14
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +299 -115
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +200 -44
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js +10 -0
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +4 -11
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +7 -87
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +22 -2
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +225 -49
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/index.d.ts +5 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/keybindings.d.ts +348 -50
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +276 -132
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-registry.d.ts +41 -5
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +316 -136
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +6 -0
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +70 -37
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +59 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +49 -7
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +655 -122
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +12 -10
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +37 -38
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +33 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +6 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js +75 -8
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +18 -8
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +217 -123
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +25 -8
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +84 -37
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +11 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +42 -27
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +34 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +113 -13
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts +13 -11
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +59 -19
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts +2 -3
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +9 -6
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +3 -3
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +16 -55
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/timings.d.ts +1 -0
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js +6 -0
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +27 -14
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +301 -208
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts +23 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js +154 -59
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts +22 -12
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +243 -65
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +37 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +10 -14
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +202 -110
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +14 -22
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +100 -35
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +27 -60
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +96 -45
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts +8 -11
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +66 -15
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +50 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +178 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts +9 -13
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +175 -52
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +21 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +49 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts +8 -11
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +167 -32
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +12 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +5 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +326 -404
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +2 -2
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +24 -4
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +10 -6
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +5 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +32 -3
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +0 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +31 -12
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +7 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +5 -3
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +5 -3
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +49 -16
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +5 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +3 -3
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +14 -7
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +6 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js +8 -6
- 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.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +1 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +16 -10
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +13 -7
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +18 -11
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +7 -2
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts +8 -36
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js +23 -48
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +5 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +35 -14
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +41 -22
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +18 -6
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +104 -31
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +5 -12
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +61 -42
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts +2 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +109 -73
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +9 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +84 -4
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +6 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +5 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +7 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +6 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +20 -34
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +158 -636
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts +21 -2
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +224 -52
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts +2 -2
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +20 -16
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +8 -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.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +67 -39
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +1556 -680
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/light.json +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +3 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +101 -72
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/print-mode.d.ts +2 -2
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +107 -77
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +8 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +22 -16
- 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 +184 -94
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +14 -4
- 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 +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +460 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts +12 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +86 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +94 -11
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts +1 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +96 -46
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -0
- package/dist/utils/exif-orientation.js.map +1 -0
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js +5 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize.d.ts +5 -5
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js +51 -95
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/paths.d.ts +16 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +50 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.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 +10 -6
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +29 -25
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +11 -6
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +77 -0
- package/dist/utils/version-check.js.map +1 -0
- package/docs/compaction.md +394 -0
- package/docs/custom-provider.md +646 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/extensions.md +2596 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +70 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +197 -0
- package/docs/models.md +474 -0
- package/docs/packages.md +223 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +243 -0
- package/docs/quickstart.md +142 -0
- package/docs/rpc.md +1407 -0
- package/docs/sdk.md +1149 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +137 -0
- package/docs/settings.md +279 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +232 -0
- package/docs/terminal-setup.md +106 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +918 -0
- package/docs/usage.md +277 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +208 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +150 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +127 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +132 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1348 -0
- package/examples/extensions/overlay-test.ts +150 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +430 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +987 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +206 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +141 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +49 -0
- package/examples/sdk/03-custom-prompt.ts +62 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +44 -0
- package/examples/sdk/06-extensions.ts +90 -0
- package/examples/sdk/07-context-files.ts +42 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +73 -0
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +147 -0
- package/extensions/phi/init.ts +15 -1
- package/extensions/phi/keys.ts +186 -0
- package/extensions/phi/providers/alibaba.ts +126 -0
- package/extensions/phi/providers/opencode-go.ts +204 -0
- package/extensions/phi/setup.ts +692 -0
- package/extensions/phi/smart-router.ts +8 -0
- package/extensions/phi/web-search.ts +432 -186
- package/package.json +111 -106
- package/scripts/copy-assets.sh +0 -0
- package/scripts/migrate-sessions.sh +0 -0
package/dist/main.js
CHANGED
|
@@ -4,30 +4,35 @@
|
|
|
4
4
|
* This file handles CLI argument parsing and translates them into
|
|
5
5
|
* createAgentSession() options. The SDK does the heavy lifting.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { resolve } from "node:path";
|
|
8
|
+
import { createInterface } from "node:readline";
|
|
8
9
|
import chalk from "chalk";
|
|
9
|
-
import {
|
|
10
|
+
import { modelsAreEqual } from "phi-code-ai";
|
|
11
|
+
import { ProcessTerminal, setKeybindings, TUI } from "phi-code-tui";
|
|
10
12
|
import { parseArgs, printHelp } from "./cli/args.js";
|
|
11
|
-
import { selectConfig } from "./cli/config-selector.js";
|
|
12
13
|
import { processFileArguments } from "./cli/file-processor.js";
|
|
14
|
+
import { buildInitialMessage } from "./cli/initial-message.js";
|
|
13
15
|
import { listModels } from "./cli/list-models.js";
|
|
14
16
|
import { selectSession } from "./cli/session-picker.js";
|
|
15
|
-
import {
|
|
17
|
+
import { ENV_SESSION_DIR, expandTildePath, getAgentDir, VERSION } from "./config.js";
|
|
18
|
+
import { createAgentSessionRuntime } from "./core/agent-session-runtime.js";
|
|
19
|
+
import { createAgentSessionFromServices, createAgentSessionServices, } from "./core/agent-session-services.js";
|
|
20
|
+
import { formatNoModelsAvailableMessage } from "./core/auth-guidance.js";
|
|
16
21
|
import { AuthStorage } from "./core/auth-storage.js";
|
|
17
22
|
import { exportFromFile } from "./core/export-html/index.js";
|
|
18
23
|
import { KeybindingsManager } from "./core/keybindings.js";
|
|
19
|
-
import { ModelRegistry } from "./core/model-registry.js";
|
|
20
24
|
import { resolveCliModel, resolveModelScope } from "./core/model-resolver.js";
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import { createAgentSession } from "./core/sdk.js";
|
|
25
|
+
import { restoreStdout, takeOverStdout } from "./core/output-guard.js";
|
|
26
|
+
import { formatMissingSessionCwdPrompt, getMissingSessionCwdIssue, MissingSessionCwdError, } from "./core/session-cwd.js";
|
|
24
27
|
import { SessionManager } from "./core/session-manager.js";
|
|
25
28
|
import { SettingsManager } from "./core/settings-manager.js";
|
|
26
|
-
import { printTimings, time } from "./core/timings.js";
|
|
27
|
-
import { allTools } from "./core/tools/index.js";
|
|
29
|
+
import { printTimings, resetTimings, time } from "./core/timings.js";
|
|
28
30
|
import { runMigrations, showDeprecationWarnings } from "./migrations.js";
|
|
29
31
|
import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index.js";
|
|
32
|
+
import { ExtensionSelectorComponent } from "./modes/interactive/components/extension-selector.js";
|
|
30
33
|
import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme.js";
|
|
34
|
+
import { handleConfigCommand, handlePackageCommand } from "./package-manager-cli.js";
|
|
35
|
+
import { isLocalPath } from "./utils/paths.js";
|
|
31
36
|
/**
|
|
32
37
|
* Read all content from piped stdin.
|
|
33
38
|
* Returns undefined if stdin is a TTY (interactive terminal).
|
|
@@ -49,13 +54,17 @@ async function readPipedStdin() {
|
|
|
49
54
|
process.stdin.resume();
|
|
50
55
|
});
|
|
51
56
|
}
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
function collectSettingsDiagnostics(settingsManager, context) {
|
|
58
|
+
return settingsManager.drainErrors().map(({ scope, error }) => ({
|
|
59
|
+
type: "warning",
|
|
60
|
+
message: `(${context}, ${scope} settings) ${error.message}`,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
function reportDiagnostics(diagnostics) {
|
|
64
|
+
for (const diagnostic of diagnostics) {
|
|
65
|
+
const color = diagnostic.type === "error" ? chalk.red : diagnostic.type === "warning" ? chalk.yellow : chalk.dim;
|
|
66
|
+
const prefix = diagnostic.type === "error" ? "Error: " : diagnostic.type === "warning" ? "Warning: " : "";
|
|
67
|
+
console.error(color(`${prefix}${diagnostic.message}`));
|
|
59
68
|
}
|
|
60
69
|
}
|
|
61
70
|
function isTruthyEnvFlag(value) {
|
|
@@ -63,221 +72,32 @@ function isTruthyEnvFlag(value) {
|
|
|
63
72
|
return false;
|
|
64
73
|
return value === "1" || value.toLowerCase() === "true" || value.toLowerCase() === "yes";
|
|
65
74
|
}
|
|
66
|
-
function
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return `${APP_NAME} install <source> [-l]`;
|
|
70
|
-
case "remove":
|
|
71
|
-
return `${APP_NAME} remove <source> [-l]`;
|
|
72
|
-
case "update":
|
|
73
|
-
return `${APP_NAME} update [source]`;
|
|
74
|
-
case "list":
|
|
75
|
-
return `${APP_NAME} list`;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
function printPackageCommandHelp(command) {
|
|
79
|
-
switch (command) {
|
|
80
|
-
case "install":
|
|
81
|
-
console.log(`${chalk.bold("Usage:")}
|
|
82
|
-
${getPackageCommandUsage("install")}
|
|
83
|
-
|
|
84
|
-
Install a package and add it to settings.
|
|
85
|
-
|
|
86
|
-
Options:
|
|
87
|
-
-l, --local Install project-locally (.pi/settings.json)
|
|
88
|
-
|
|
89
|
-
Examples:
|
|
90
|
-
${APP_NAME} install npm:@foo/bar
|
|
91
|
-
${APP_NAME} install git:github.com/user/repo
|
|
92
|
-
${APP_NAME} install git:git@github.com:user/repo
|
|
93
|
-
${APP_NAME} install https://github.com/user/repo
|
|
94
|
-
${APP_NAME} install ssh://git@github.com/user/repo
|
|
95
|
-
${APP_NAME} install ./local/path
|
|
96
|
-
`);
|
|
97
|
-
return;
|
|
98
|
-
case "remove":
|
|
99
|
-
console.log(`${chalk.bold("Usage:")}
|
|
100
|
-
${getPackageCommandUsage("remove")}
|
|
101
|
-
|
|
102
|
-
Remove a package and its source from settings.
|
|
103
|
-
|
|
104
|
-
Options:
|
|
105
|
-
-l, --local Remove from project settings (.pi/settings.json)
|
|
106
|
-
|
|
107
|
-
Example:
|
|
108
|
-
${APP_NAME} remove npm:@foo/bar
|
|
109
|
-
`);
|
|
110
|
-
return;
|
|
111
|
-
case "update":
|
|
112
|
-
console.log(`${chalk.bold("Usage:")}
|
|
113
|
-
${getPackageCommandUsage("update")}
|
|
114
|
-
|
|
115
|
-
Update installed packages.
|
|
116
|
-
If <source> is provided, only that package is updated.
|
|
117
|
-
`);
|
|
118
|
-
return;
|
|
119
|
-
case "list":
|
|
120
|
-
console.log(`${chalk.bold("Usage:")}
|
|
121
|
-
${getPackageCommandUsage("list")}
|
|
122
|
-
|
|
123
|
-
List installed packages from user and project settings.
|
|
124
|
-
`);
|
|
125
|
-
return;
|
|
75
|
+
function resolveAppMode(parsed, stdinIsTTY) {
|
|
76
|
+
if (parsed.mode === "rpc") {
|
|
77
|
+
return "rpc";
|
|
126
78
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const [command, ...rest] = args;
|
|
130
|
-
if (command !== "install" && command !== "remove" && command !== "update" && command !== "list") {
|
|
131
|
-
return undefined;
|
|
79
|
+
if (parsed.mode === "json") {
|
|
80
|
+
return "json";
|
|
132
81
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
let invalidOption;
|
|
136
|
-
let source;
|
|
137
|
-
for (const arg of rest) {
|
|
138
|
-
if (arg === "-h" || arg === "--help") {
|
|
139
|
-
help = true;
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
if (arg === "-l" || arg === "--local") {
|
|
143
|
-
if (command === "install" || command === "remove") {
|
|
144
|
-
local = true;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
invalidOption = invalidOption ?? arg;
|
|
148
|
-
}
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (arg.startsWith("-")) {
|
|
152
|
-
invalidOption = invalidOption ?? arg;
|
|
153
|
-
continue;
|
|
154
|
-
}
|
|
155
|
-
if (!source) {
|
|
156
|
-
source = arg;
|
|
157
|
-
}
|
|
82
|
+
if (parsed.print || !stdinIsTTY) {
|
|
83
|
+
return "print";
|
|
158
84
|
}
|
|
159
|
-
return
|
|
85
|
+
return "interactive";
|
|
160
86
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (!options) {
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
if (options.help) {
|
|
167
|
-
printPackageCommandHelp(options.command);
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
if (options.invalidOption) {
|
|
171
|
-
console.error(chalk.red(`Unknown option ${options.invalidOption} for "${options.command}".`));
|
|
172
|
-
console.error(chalk.dim(`Use "${APP_NAME} --help" or "${getPackageCommandUsage(options.command)}".`));
|
|
173
|
-
process.exitCode = 1;
|
|
174
|
-
return true;
|
|
175
|
-
}
|
|
176
|
-
const source = options.source;
|
|
177
|
-
if ((options.command === "install" || options.command === "remove") && !source) {
|
|
178
|
-
console.error(chalk.red(`Missing ${options.command} source.`));
|
|
179
|
-
console.error(chalk.dim(`Usage: ${getPackageCommandUsage(options.command)}`));
|
|
180
|
-
process.exitCode = 1;
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
const cwd = process.cwd();
|
|
184
|
-
const agentDir = getAgentDir();
|
|
185
|
-
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
186
|
-
reportSettingsErrors(settingsManager, "package command");
|
|
187
|
-
const packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });
|
|
188
|
-
packageManager.setProgressCallback((event) => {
|
|
189
|
-
if (event.type === "start") {
|
|
190
|
-
process.stdout.write(chalk.dim(`${event.message}\n`));
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
try {
|
|
194
|
-
switch (options.command) {
|
|
195
|
-
case "install":
|
|
196
|
-
await packageManager.install(source, { local: options.local });
|
|
197
|
-
packageManager.addSourceToSettings(source, { local: options.local });
|
|
198
|
-
console.log(chalk.green(`Installed ${source}`));
|
|
199
|
-
return true;
|
|
200
|
-
case "remove": {
|
|
201
|
-
await packageManager.remove(source, { local: options.local });
|
|
202
|
-
const removed = packageManager.removeSourceFromSettings(source, { local: options.local });
|
|
203
|
-
if (!removed) {
|
|
204
|
-
console.error(chalk.red(`No matching package found for ${source}`));
|
|
205
|
-
process.exitCode = 1;
|
|
206
|
-
return true;
|
|
207
|
-
}
|
|
208
|
-
console.log(chalk.green(`Removed ${source}`));
|
|
209
|
-
return true;
|
|
210
|
-
}
|
|
211
|
-
case "list": {
|
|
212
|
-
const globalSettings = settingsManager.getGlobalSettings();
|
|
213
|
-
const projectSettings = settingsManager.getProjectSettings();
|
|
214
|
-
const globalPackages = globalSettings.packages ?? [];
|
|
215
|
-
const projectPackages = projectSettings.packages ?? [];
|
|
216
|
-
if (globalPackages.length === 0 && projectPackages.length === 0) {
|
|
217
|
-
console.log(chalk.dim("No packages installed."));
|
|
218
|
-
return true;
|
|
219
|
-
}
|
|
220
|
-
const formatPackage = (pkg, scope) => {
|
|
221
|
-
const source = typeof pkg === "string" ? pkg : pkg.source;
|
|
222
|
-
const filtered = typeof pkg === "object";
|
|
223
|
-
const display = filtered ? `${source} (filtered)` : source;
|
|
224
|
-
console.log(` ${display}`);
|
|
225
|
-
const path = packageManager.getInstalledPath(source, scope);
|
|
226
|
-
if (path) {
|
|
227
|
-
console.log(chalk.dim(` ${path}`));
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
if (globalPackages.length > 0) {
|
|
231
|
-
console.log(chalk.bold("User packages:"));
|
|
232
|
-
for (const pkg of globalPackages) {
|
|
233
|
-
formatPackage(pkg, "user");
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
if (projectPackages.length > 0) {
|
|
237
|
-
if (globalPackages.length > 0)
|
|
238
|
-
console.log();
|
|
239
|
-
console.log(chalk.bold("Project packages:"));
|
|
240
|
-
for (const pkg of projectPackages) {
|
|
241
|
-
formatPackage(pkg, "project");
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
return true;
|
|
245
|
-
}
|
|
246
|
-
case "update":
|
|
247
|
-
await packageManager.update(source);
|
|
248
|
-
if (source) {
|
|
249
|
-
console.log(chalk.green(`Updated ${source}`));
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
console.log(chalk.green("Updated packages"));
|
|
253
|
-
}
|
|
254
|
-
return true;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
const message = error instanceof Error ? error.message : "Unknown package command error";
|
|
259
|
-
console.error(chalk.red(`Error: ${message}`));
|
|
260
|
-
process.exitCode = 1;
|
|
261
|
-
return true;
|
|
262
|
-
}
|
|
87
|
+
function toPrintOutputMode(appMode) {
|
|
88
|
+
return appMode === "json" ? "json" : "text";
|
|
263
89
|
}
|
|
264
|
-
async function prepareInitialMessage(parsed, autoResizeImages) {
|
|
90
|
+
async function prepareInitialMessage(parsed, autoResizeImages, stdinContent) {
|
|
265
91
|
if (parsed.fileArgs.length === 0) {
|
|
266
|
-
return {};
|
|
92
|
+
return buildInitialMessage({ parsed, stdinContent });
|
|
267
93
|
}
|
|
268
94
|
const { text, images } = await processFileArguments(parsed.fileArgs, { autoResizeImages });
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
initialMessage = text;
|
|
276
|
-
}
|
|
277
|
-
return {
|
|
278
|
-
initialMessage,
|
|
279
|
-
initialImages: images.length > 0 ? images : undefined,
|
|
280
|
-
};
|
|
95
|
+
return buildInitialMessage({
|
|
96
|
+
parsed,
|
|
97
|
+
fileText: text,
|
|
98
|
+
fileImages: images,
|
|
99
|
+
stdinContent,
|
|
100
|
+
});
|
|
281
101
|
}
|
|
282
102
|
/**
|
|
283
103
|
* Resolve a session argument to a file path.
|
|
@@ -317,48 +137,89 @@ async function promptConfirm(message) {
|
|
|
317
137
|
});
|
|
318
138
|
});
|
|
319
139
|
}
|
|
320
|
-
|
|
140
|
+
function validateForkFlags(parsed) {
|
|
141
|
+
if (!parsed.fork)
|
|
142
|
+
return;
|
|
143
|
+
const conflictingFlags = [
|
|
144
|
+
parsed.session ? "--session" : undefined,
|
|
145
|
+
parsed.continue ? "--continue" : undefined,
|
|
146
|
+
parsed.resume ? "--resume" : undefined,
|
|
147
|
+
parsed.noSession ? "--no-session" : undefined,
|
|
148
|
+
].filter((flag) => flag !== undefined);
|
|
149
|
+
if (conflictingFlags.length > 0) {
|
|
150
|
+
console.error(chalk.red(`Error: --fork cannot be combined with ${conflictingFlags.join(", ")}`));
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function forkSessionOrExit(sourcePath, cwd, sessionDir) {
|
|
155
|
+
try {
|
|
156
|
+
return SessionManager.forkFrom(sourcePath, cwd, sessionDir);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
160
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function createSessionManager(parsed, cwd, sessionDir, settingsManager) {
|
|
321
165
|
if (parsed.noSession) {
|
|
322
166
|
return SessionManager.inMemory();
|
|
323
167
|
}
|
|
168
|
+
if (parsed.fork) {
|
|
169
|
+
const resolved = await resolveSessionPath(parsed.fork, cwd, sessionDir);
|
|
170
|
+
switch (resolved.type) {
|
|
171
|
+
case "path":
|
|
172
|
+
case "local":
|
|
173
|
+
case "global":
|
|
174
|
+
return forkSessionOrExit(resolved.path, cwd, sessionDir);
|
|
175
|
+
case "not_found":
|
|
176
|
+
console.error(chalk.red(`No session found matching '${resolved.arg}'`));
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
324
180
|
if (parsed.session) {
|
|
325
|
-
const resolved = await resolveSessionPath(parsed.session, cwd,
|
|
181
|
+
const resolved = await resolveSessionPath(parsed.session, cwd, sessionDir);
|
|
326
182
|
switch (resolved.type) {
|
|
327
183
|
case "path":
|
|
328
184
|
case "local":
|
|
329
|
-
return SessionManager.open(resolved.path,
|
|
185
|
+
return SessionManager.open(resolved.path, sessionDir);
|
|
330
186
|
case "global": {
|
|
331
|
-
// Session found in different project - ask user if they want to fork
|
|
332
187
|
console.log(chalk.yellow(`Session found in different project: ${resolved.cwd}`));
|
|
333
188
|
const shouldFork = await promptConfirm("Fork this session into current directory?");
|
|
334
189
|
if (!shouldFork) {
|
|
335
190
|
console.log(chalk.dim("Aborted."));
|
|
336
191
|
process.exit(0);
|
|
337
192
|
}
|
|
338
|
-
return
|
|
193
|
+
return forkSessionOrExit(resolved.path, cwd, sessionDir);
|
|
339
194
|
}
|
|
340
195
|
case "not_found":
|
|
341
196
|
console.error(chalk.red(`No session found matching '${resolved.arg}'`));
|
|
342
197
|
process.exit(1);
|
|
343
198
|
}
|
|
344
199
|
}
|
|
345
|
-
if (parsed.
|
|
346
|
-
|
|
200
|
+
if (parsed.resume) {
|
|
201
|
+
initTheme(settingsManager.getTheme(), true);
|
|
202
|
+
try {
|
|
203
|
+
const selectedPath = await selectSession((onProgress) => SessionManager.list(cwd, sessionDir, onProgress), SessionManager.listAll);
|
|
204
|
+
if (!selectedPath) {
|
|
205
|
+
console.log(chalk.dim("No session selected"));
|
|
206
|
+
process.exit(0);
|
|
207
|
+
}
|
|
208
|
+
return SessionManager.open(selectedPath, sessionDir);
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
stopThemeWatcher();
|
|
212
|
+
}
|
|
347
213
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
if (parsed.sessionDir) {
|
|
351
|
-
return SessionManager.create(cwd, parsed.sessionDir);
|
|
214
|
+
if (parsed.continue) {
|
|
215
|
+
return SessionManager.continueRecent(cwd, sessionDir);
|
|
352
216
|
}
|
|
353
|
-
|
|
354
|
-
return undefined;
|
|
217
|
+
return SessionManager.create(cwd, sessionDir);
|
|
355
218
|
}
|
|
356
|
-
function buildSessionOptions(parsed, scopedModels,
|
|
219
|
+
function buildSessionOptions(parsed, scopedModels, hasExistingSession, modelRegistry, settingsManager) {
|
|
357
220
|
const options = {};
|
|
221
|
+
const diagnostics = [];
|
|
358
222
|
let cliThinkingFromModel = false;
|
|
359
|
-
if (sessionManager) {
|
|
360
|
-
options.sessionManager = sessionManager;
|
|
361
|
-
}
|
|
362
223
|
// Model from CLI
|
|
363
224
|
// - supports --provider <name> --model <pattern>
|
|
364
225
|
// - supports --model <provider>/<pattern>
|
|
@@ -369,11 +230,10 @@ function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry
|
|
|
369
230
|
modelRegistry,
|
|
370
231
|
});
|
|
371
232
|
if (resolved.warning) {
|
|
372
|
-
|
|
233
|
+
diagnostics.push({ type: "warning", message: resolved.warning });
|
|
373
234
|
}
|
|
374
235
|
if (resolved.error) {
|
|
375
|
-
|
|
376
|
-
process.exit(1);
|
|
236
|
+
diagnostics.push({ type: "error", message: resolved.error });
|
|
377
237
|
}
|
|
378
238
|
if (resolved.model) {
|
|
379
239
|
options.model = resolved.model;
|
|
@@ -385,7 +245,7 @@ function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry
|
|
|
385
245
|
}
|
|
386
246
|
}
|
|
387
247
|
}
|
|
388
|
-
if (!options.model && scopedModels.length > 0 && !
|
|
248
|
+
if (!options.model && scopedModels.length > 0 && !hasExistingSession) {
|
|
389
249
|
// Check if saved default is in scoped models - use it if so, otherwise first scoped model
|
|
390
250
|
const savedProvider = settingsManager.getDefaultProvider();
|
|
391
251
|
const savedModelId = settingsManager.getDefaultModel();
|
|
@@ -423,39 +283,42 @@ function buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry
|
|
|
423
283
|
// (handled by caller before createAgentSession)
|
|
424
284
|
// Tools
|
|
425
285
|
if (parsed.noTools) {
|
|
426
|
-
|
|
427
|
-
// --tools can still add specific ones back
|
|
428
|
-
if (parsed.tools && parsed.tools.length > 0) {
|
|
429
|
-
options.tools = parsed.tools.map((name) => allTools[name]);
|
|
430
|
-
}
|
|
431
|
-
else {
|
|
432
|
-
options.tools = [];
|
|
433
|
-
}
|
|
286
|
+
options.noTools = "all";
|
|
434
287
|
}
|
|
435
|
-
else if (parsed.
|
|
436
|
-
options.
|
|
288
|
+
else if (parsed.noBuiltinTools) {
|
|
289
|
+
options.noTools = "builtin";
|
|
437
290
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
async function handleConfigCommand(args) {
|
|
441
|
-
if (args[0] !== "config") {
|
|
442
|
-
return false;
|
|
291
|
+
if (parsed.tools) {
|
|
292
|
+
options.tools = [...parsed.tools];
|
|
443
293
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
294
|
+
return { options, cliThinkingFromModel, diagnostics };
|
|
295
|
+
}
|
|
296
|
+
function resolveCliPaths(cwd, paths) {
|
|
297
|
+
return paths?.map((value) => (isLocalPath(value) ? resolve(cwd, value) : value));
|
|
298
|
+
}
|
|
299
|
+
async function promptForMissingSessionCwd(issue, settingsManager) {
|
|
300
|
+
initTheme(settingsManager.getTheme());
|
|
301
|
+
setKeybindings(KeybindingsManager.create());
|
|
302
|
+
return new Promise((resolve) => {
|
|
303
|
+
const ui = new TUI(new ProcessTerminal(), settingsManager.getShowHardwareCursor());
|
|
304
|
+
ui.setClearOnShrink(settingsManager.getClearOnShrink());
|
|
305
|
+
let settled = false;
|
|
306
|
+
const finish = (result) => {
|
|
307
|
+
if (settled) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
settled = true;
|
|
311
|
+
ui.stop();
|
|
312
|
+
resolve(result);
|
|
313
|
+
};
|
|
314
|
+
const selector = new ExtensionSelectorComponent(formatMissingSessionCwdPrompt(issue), ["Continue", "Cancel"], (option) => finish(option === "Continue" ? issue.fallbackCwd : undefined), () => finish(undefined), { tui: ui });
|
|
315
|
+
ui.addChild(selector);
|
|
316
|
+
ui.setFocus(selector);
|
|
317
|
+
ui.start();
|
|
455
318
|
});
|
|
456
|
-
process.exit(0);
|
|
457
319
|
}
|
|
458
|
-
export async function main(args) {
|
|
320
|
+
export async function main(args, options) {
|
|
321
|
+
resetTimings();
|
|
459
322
|
const offlineMode = args.includes("--offline") || isTruthyEnvFlag(process.env.PI_OFFLINE);
|
|
460
323
|
if (offlineMode) {
|
|
461
324
|
process.env.PI_OFFLINE = "1";
|
|
@@ -467,79 +330,26 @@ export async function main(args) {
|
|
|
467
330
|
if (await handleConfigCommand(args)) {
|
|
468
331
|
return;
|
|
469
332
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
reportSettingsErrors(settingsManager, "startup");
|
|
479
|
-
const authStorage = AuthStorage.create();
|
|
480
|
-
const modelRegistry = new ModelRegistry(authStorage, getModelsPath());
|
|
481
|
-
const resourceLoader = new DefaultResourceLoader({
|
|
482
|
-
cwd,
|
|
483
|
-
agentDir,
|
|
484
|
-
settingsManager,
|
|
485
|
-
additionalExtensionPaths: firstPass.extensions,
|
|
486
|
-
additionalSkillPaths: firstPass.skills,
|
|
487
|
-
additionalPromptTemplatePaths: firstPass.promptTemplates,
|
|
488
|
-
additionalThemePaths: firstPass.themes,
|
|
489
|
-
noExtensions: firstPass.noExtensions,
|
|
490
|
-
noSkills: firstPass.noSkills,
|
|
491
|
-
noPromptTemplates: firstPass.noPromptTemplates,
|
|
492
|
-
noThemes: firstPass.noThemes,
|
|
493
|
-
systemPrompt: firstPass.systemPrompt,
|
|
494
|
-
appendSystemPrompt: firstPass.appendSystemPrompt,
|
|
495
|
-
});
|
|
496
|
-
await resourceLoader.reload();
|
|
497
|
-
time("resourceLoader.reload");
|
|
498
|
-
const extensionsResult = resourceLoader.getExtensions();
|
|
499
|
-
for (const { path, error } of extensionsResult.errors) {
|
|
500
|
-
console.error(chalk.red(`Failed to load extension "${path}": ${error}`));
|
|
501
|
-
}
|
|
502
|
-
// Apply pending provider registrations from extensions immediately
|
|
503
|
-
// so they're available for model resolution before AgentSession is created
|
|
504
|
-
for (const { name, config } of extensionsResult.runtime.pendingProviderRegistrations) {
|
|
505
|
-
modelRegistry.registerProvider(name, config);
|
|
506
|
-
}
|
|
507
|
-
extensionsResult.runtime.pendingProviderRegistrations = [];
|
|
508
|
-
const extensionFlags = new Map();
|
|
509
|
-
for (const ext of extensionsResult.extensions) {
|
|
510
|
-
for (const [name, flag] of ext.flags) {
|
|
511
|
-
extensionFlags.set(name, { type: flag.type });
|
|
333
|
+
const parsed = parseArgs(args);
|
|
334
|
+
if (parsed.diagnostics.length > 0) {
|
|
335
|
+
for (const d of parsed.diagnostics) {
|
|
336
|
+
const color = d.type === "error" ? chalk.red : chalk.yellow;
|
|
337
|
+
console.error(color(`${d.type === "error" ? "Error" : "Warning"}: ${d.message}`));
|
|
338
|
+
}
|
|
339
|
+
if (parsed.diagnostics.some((d) => d.type === "error")) {
|
|
340
|
+
process.exit(1);
|
|
512
341
|
}
|
|
513
342
|
}
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
343
|
+
time("parseArgs");
|
|
344
|
+
let appMode = resolveAppMode(parsed, process.stdin.isTTY);
|
|
345
|
+
const shouldTakeOverStdout = appMode !== "interactive";
|
|
346
|
+
if (shouldTakeOverStdout) {
|
|
347
|
+
takeOverStdout();
|
|
519
348
|
}
|
|
520
349
|
if (parsed.version) {
|
|
521
350
|
console.log(VERSION);
|
|
522
351
|
process.exit(0);
|
|
523
352
|
}
|
|
524
|
-
if (parsed.help) {
|
|
525
|
-
printHelp();
|
|
526
|
-
process.exit(0);
|
|
527
|
-
}
|
|
528
|
-
if (parsed.listModels !== undefined) {
|
|
529
|
-
const searchPattern = typeof parsed.listModels === "string" ? parsed.listModels : undefined;
|
|
530
|
-
await listModels(modelRegistry, searchPattern);
|
|
531
|
-
process.exit(0);
|
|
532
|
-
}
|
|
533
|
-
// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
|
|
534
|
-
if (parsed.mode !== "rpc") {
|
|
535
|
-
const stdinContent = await readPipedStdin();
|
|
536
|
-
if (stdinContent !== undefined) {
|
|
537
|
-
// Force print mode since interactive mode requires a TTY for keyboard input
|
|
538
|
-
parsed.print = true;
|
|
539
|
-
// Prepend stdin content to messages
|
|
540
|
-
parsed.messages.unshift(stdinContent);
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
353
|
if (parsed.export) {
|
|
544
354
|
let result;
|
|
545
355
|
try {
|
|
@@ -558,72 +368,168 @@ export async function main(args) {
|
|
|
558
368
|
console.error(chalk.red("Error: @file arguments are not supported in RPC mode"));
|
|
559
369
|
process.exit(1);
|
|
560
370
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
const
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
if (
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
371
|
+
validateForkFlags(parsed);
|
|
372
|
+
// Run migrations (pass cwd for project-local migrations)
|
|
373
|
+
const { migratedAuthProviders: migratedProviders, deprecationWarnings } = runMigrations(process.cwd());
|
|
374
|
+
time("runMigrations");
|
|
375
|
+
const cwd = process.cwd();
|
|
376
|
+
const agentDir = getAgentDir();
|
|
377
|
+
const startupSettingsManager = SettingsManager.create(cwd, agentDir);
|
|
378
|
+
reportDiagnostics(collectSettingsDiagnostics(startupSettingsManager, "startup session lookup"));
|
|
379
|
+
// Decide the final runtime cwd before creating cwd-bound runtime services.
|
|
380
|
+
// --session and --resume may select a session from another project, so project-local
|
|
381
|
+
// settings, resources, provider registrations, and models must be resolved only after
|
|
382
|
+
// the target session cwd is known. The startup-cwd settings manager is used only for
|
|
383
|
+
// sessionDir lookup during session selection.
|
|
384
|
+
const envSessionDir = process.env[ENV_SESSION_DIR];
|
|
385
|
+
const sessionDir = parsed.sessionDir ??
|
|
386
|
+
(envSessionDir ? expandTildePath(envSessionDir) : undefined) ??
|
|
387
|
+
startupSettingsManager.getSessionDir();
|
|
388
|
+
let sessionManager = await createSessionManager(parsed, cwd, sessionDir, startupSettingsManager);
|
|
389
|
+
const missingSessionCwdIssue = getMissingSessionCwdIssue(sessionManager, cwd);
|
|
390
|
+
if (missingSessionCwdIssue) {
|
|
391
|
+
if (appMode === "interactive") {
|
|
392
|
+
const selectedCwd = await promptForMissingSessionCwd(missingSessionCwdIssue, startupSettingsManager);
|
|
393
|
+
if (!selectedCwd) {
|
|
394
|
+
process.exit(0);
|
|
395
|
+
}
|
|
396
|
+
sessionManager = SessionManager.open(missingSessionCwdIssue.sessionFile, sessionDir, selectedCwd);
|
|
585
397
|
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
const { options: sessionOptions, cliThinkingFromModel } = buildSessionOptions(parsed, scopedModels, sessionManager, modelRegistry, settingsManager);
|
|
589
|
-
sessionOptions.authStorage = authStorage;
|
|
590
|
-
sessionOptions.modelRegistry = modelRegistry;
|
|
591
|
-
sessionOptions.resourceLoader = resourceLoader;
|
|
592
|
-
// Handle CLI --api-key as runtime override (not persisted)
|
|
593
|
-
if (parsed.apiKey) {
|
|
594
|
-
if (!sessionOptions.model) {
|
|
595
|
-
console.error(chalk.red("--api-key requires a model to be specified via --model, --provider/--model, or --models"));
|
|
398
|
+
else {
|
|
399
|
+
console.error(chalk.red(new MissingSessionCwdError(missingSessionCwdIssue).message));
|
|
596
400
|
process.exit(1);
|
|
597
401
|
}
|
|
598
|
-
authStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);
|
|
599
|
-
}
|
|
600
|
-
const { session, modelFallbackMessage } = await createAgentSession(sessionOptions);
|
|
601
|
-
if (!isInteractive && !session.model) {
|
|
602
|
-
console.error(chalk.red("No models available."));
|
|
603
|
-
console.error(chalk.yellow("\nSet an API key environment variable:"));
|
|
604
|
-
console.error(" ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, etc.");
|
|
605
|
-
console.error(chalk.yellow(`\nOr create ${getModelsPath()}`));
|
|
606
|
-
process.exit(1);
|
|
607
402
|
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
const
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
403
|
+
time("createSessionManager");
|
|
404
|
+
const resolvedExtensionPaths = resolveCliPaths(cwd, parsed.extensions);
|
|
405
|
+
const resolvedSkillPaths = resolveCliPaths(cwd, parsed.skills);
|
|
406
|
+
const resolvedPromptTemplatePaths = resolveCliPaths(cwd, parsed.promptTemplates);
|
|
407
|
+
const resolvedThemePaths = resolveCliPaths(cwd, parsed.themes);
|
|
408
|
+
const authStorage = AuthStorage.create();
|
|
409
|
+
const createRuntime = async ({ cwd, agentDir, sessionManager, sessionStartEvent, }) => {
|
|
410
|
+
const services = await createAgentSessionServices({
|
|
411
|
+
cwd,
|
|
412
|
+
agentDir,
|
|
413
|
+
authStorage,
|
|
414
|
+
extensionFlagValues: parsed.unknownFlags,
|
|
415
|
+
resourceLoaderOptions: {
|
|
416
|
+
additionalExtensionPaths: resolvedExtensionPaths,
|
|
417
|
+
additionalSkillPaths: resolvedSkillPaths,
|
|
418
|
+
additionalPromptTemplatePaths: resolvedPromptTemplatePaths,
|
|
419
|
+
additionalThemePaths: resolvedThemePaths,
|
|
420
|
+
noExtensions: parsed.noExtensions,
|
|
421
|
+
noSkills: parsed.noSkills,
|
|
422
|
+
noPromptTemplates: parsed.noPromptTemplates,
|
|
423
|
+
noThemes: parsed.noThemes,
|
|
424
|
+
noContextFiles: parsed.noContextFiles,
|
|
425
|
+
systemPrompt: parsed.systemPrompt,
|
|
426
|
+
appendSystemPrompt: parsed.appendSystemPrompt,
|
|
427
|
+
extensionFactories: options?.extensionFactories,
|
|
428
|
+
},
|
|
429
|
+
});
|
|
430
|
+
const { settingsManager, modelRegistry, resourceLoader } = services;
|
|
431
|
+
const diagnostics = [
|
|
432
|
+
...services.diagnostics,
|
|
433
|
+
...collectSettingsDiagnostics(settingsManager, "runtime creation"),
|
|
434
|
+
...resourceLoader.getExtensions().errors.map(({ path, error }) => ({
|
|
435
|
+
type: "error",
|
|
436
|
+
message: `Failed to load extension "${path}": ${error}`,
|
|
437
|
+
})),
|
|
438
|
+
];
|
|
439
|
+
const modelPatterns = parsed.models ?? settingsManager.getEnabledModels();
|
|
440
|
+
const scopedModels = modelPatterns && modelPatterns.length > 0 ? await resolveModelScope(modelPatterns, modelRegistry) : [];
|
|
441
|
+
const { options: sessionOptions, cliThinkingFromModel, diagnostics: sessionOptionDiagnostics, } = buildSessionOptions(parsed, scopedModels, sessionManager.buildSessionContext().messages.length > 0, modelRegistry, settingsManager);
|
|
442
|
+
diagnostics.push(...sessionOptionDiagnostics);
|
|
443
|
+
if (parsed.apiKey) {
|
|
444
|
+
if (!sessionOptions.model) {
|
|
445
|
+
diagnostics.push({
|
|
446
|
+
type: "error",
|
|
447
|
+
message: "--api-key requires a model to be specified via --model, --provider/--model, or --models",
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
authStorage.setRuntimeApiKey(sessionOptions.model.provider, parsed.apiKey);
|
|
452
|
+
}
|
|
615
453
|
}
|
|
616
|
-
|
|
617
|
-
|
|
454
|
+
const created = await createAgentSessionFromServices({
|
|
455
|
+
services,
|
|
456
|
+
sessionManager,
|
|
457
|
+
sessionStartEvent,
|
|
458
|
+
model: sessionOptions.model,
|
|
459
|
+
thinkingLevel: sessionOptions.thinkingLevel,
|
|
460
|
+
scopedModels: sessionOptions.scopedModels,
|
|
461
|
+
tools: sessionOptions.tools,
|
|
462
|
+
noTools: sessionOptions.noTools,
|
|
463
|
+
customTools: sessionOptions.customTools,
|
|
464
|
+
});
|
|
465
|
+
const cliThinkingOverride = parsed.thinking !== undefined || cliThinkingFromModel;
|
|
466
|
+
if (created.session.model && cliThinkingOverride) {
|
|
467
|
+
created.session.setThinkingLevel(created.session.thinkingLevel);
|
|
618
468
|
}
|
|
619
|
-
|
|
620
|
-
|
|
469
|
+
return {
|
|
470
|
+
...created,
|
|
471
|
+
services,
|
|
472
|
+
diagnostics,
|
|
473
|
+
};
|
|
474
|
+
};
|
|
475
|
+
time("createRuntime");
|
|
476
|
+
const runtime = await createAgentSessionRuntime(createRuntime, {
|
|
477
|
+
cwd: sessionManager.getCwd(),
|
|
478
|
+
agentDir,
|
|
479
|
+
sessionManager,
|
|
480
|
+
});
|
|
481
|
+
const { services, session, modelFallbackMessage } = runtime;
|
|
482
|
+
const { settingsManager, modelRegistry, resourceLoader } = services;
|
|
483
|
+
if (parsed.help) {
|
|
484
|
+
const extensionFlags = resourceLoader
|
|
485
|
+
.getExtensions()
|
|
486
|
+
.extensions.flatMap((extension) => Array.from(extension.flags.values()));
|
|
487
|
+
printHelp(extensionFlags);
|
|
488
|
+
process.exit(0);
|
|
489
|
+
}
|
|
490
|
+
if (parsed.listModels !== undefined) {
|
|
491
|
+
const searchPattern = typeof parsed.listModels === "string" ? parsed.listModels : undefined;
|
|
492
|
+
await listModels(modelRegistry, searchPattern);
|
|
493
|
+
process.exit(0);
|
|
494
|
+
}
|
|
495
|
+
// Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
|
|
496
|
+
let stdinContent;
|
|
497
|
+
if (appMode !== "rpc") {
|
|
498
|
+
stdinContent = await readPipedStdin();
|
|
499
|
+
if (stdinContent !== undefined && appMode === "interactive") {
|
|
500
|
+
appMode = "print";
|
|
621
501
|
}
|
|
622
502
|
}
|
|
623
|
-
|
|
624
|
-
|
|
503
|
+
time("readPipedStdin");
|
|
504
|
+
const { initialMessage, initialImages } = await prepareInitialMessage(parsed, settingsManager.getImageAutoResize(), stdinContent);
|
|
505
|
+
time("prepareInitialMessage");
|
|
506
|
+
initTheme(settingsManager.getTheme(), appMode === "interactive");
|
|
507
|
+
time("initTheme");
|
|
508
|
+
// Show deprecation warnings in interactive mode
|
|
509
|
+
if (appMode === "interactive" && deprecationWarnings.length > 0) {
|
|
510
|
+
await showDeprecationWarnings(deprecationWarnings);
|
|
511
|
+
}
|
|
512
|
+
const scopedModels = [...session.scopedModels];
|
|
513
|
+
time("resolveModelScope");
|
|
514
|
+
reportDiagnostics(runtime.diagnostics);
|
|
515
|
+
if (runtime.diagnostics.some((diagnostic) => diagnostic.type === "error")) {
|
|
516
|
+
process.exit(1);
|
|
517
|
+
}
|
|
518
|
+
time("createAgentSession");
|
|
519
|
+
if (appMode !== "interactive" && !session.model) {
|
|
520
|
+
console.error(chalk.red(formatNoModelsAvailableMessage()));
|
|
521
|
+
process.exit(1);
|
|
625
522
|
}
|
|
626
|
-
|
|
523
|
+
const startupBenchmark = isTruthyEnvFlag(process.env.PI_STARTUP_BENCHMARK);
|
|
524
|
+
if (startupBenchmark && appMode !== "interactive") {
|
|
525
|
+
console.error(chalk.red("Error: PI_STARTUP_BENCHMARK only supports interactive mode"));
|
|
526
|
+
process.exit(1);
|
|
527
|
+
}
|
|
528
|
+
if (appMode === "rpc") {
|
|
529
|
+
printTimings();
|
|
530
|
+
await runRpcMode(runtime);
|
|
531
|
+
}
|
|
532
|
+
else if (appMode === "interactive") {
|
|
627
533
|
if (scopedModels.length > 0 && (parsed.verbose || !settingsManager.getQuietStartup())) {
|
|
628
534
|
const modelList = scopedModels
|
|
629
535
|
.map((sm) => {
|
|
@@ -633,8 +539,7 @@ export async function main(args) {
|
|
|
633
539
|
.join(", ");
|
|
634
540
|
console.log(chalk.dim(`Model scope: ${modelList} ${chalk.gray("(Ctrl+P to cycle)")}`));
|
|
635
541
|
}
|
|
636
|
-
|
|
637
|
-
const mode = new InteractiveMode(session, {
|
|
542
|
+
const interactiveMode = new InteractiveMode(runtime, {
|
|
638
543
|
migratedProviders,
|
|
639
544
|
modelFallbackMessage,
|
|
640
545
|
initialMessage,
|
|
@@ -642,20 +547,37 @@ export async function main(args) {
|
|
|
642
547
|
initialMessages: parsed.messages,
|
|
643
548
|
verbose: parsed.verbose,
|
|
644
549
|
});
|
|
645
|
-
|
|
550
|
+
if (startupBenchmark) {
|
|
551
|
+
await interactiveMode.init();
|
|
552
|
+
time("interactiveMode.init");
|
|
553
|
+
printTimings();
|
|
554
|
+
interactiveMode.stop();
|
|
555
|
+
stopThemeWatcher();
|
|
556
|
+
if (process.stdout.writableLength > 0) {
|
|
557
|
+
await new Promise((resolve) => process.stdout.once("drain", resolve));
|
|
558
|
+
}
|
|
559
|
+
if (process.stderr.writableLength > 0) {
|
|
560
|
+
await new Promise((resolve) => process.stderr.once("drain", resolve));
|
|
561
|
+
}
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
printTimings();
|
|
565
|
+
await interactiveMode.run();
|
|
646
566
|
}
|
|
647
567
|
else {
|
|
648
|
-
|
|
649
|
-
|
|
568
|
+
printTimings();
|
|
569
|
+
const exitCode = await runPrintMode(runtime, {
|
|
570
|
+
mode: toPrintOutputMode(appMode),
|
|
650
571
|
messages: parsed.messages,
|
|
651
572
|
initialMessage,
|
|
652
573
|
initialImages,
|
|
653
574
|
});
|
|
654
575
|
stopThemeWatcher();
|
|
655
|
-
|
|
656
|
-
|
|
576
|
+
restoreStdout();
|
|
577
|
+
if (exitCode !== 0) {
|
|
578
|
+
process.exitCode = exitCode;
|
|
657
579
|
}
|
|
658
|
-
|
|
580
|
+
return;
|
|
659
581
|
}
|
|
660
582
|
}
|
|
661
583
|
//# sourceMappingURL=main.js.map
|