@oh-my-pi/pi-coding-agent 8.0.20 → 8.2.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 +125 -0
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +54 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +3 -4
- package/src/capability/extension-module.ts +3 -4
- package/src/capability/extension.ts +3 -4
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +3 -4
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +3 -4
- package/src/capability/mcp.ts +3 -4
- package/src/capability/prompt.ts +3 -4
- package/src/capability/rule.ts +3 -4
- package/src/capability/settings.ts +2 -3
- package/src/capability/skill.ts +3 -4
- package/src/capability/slash-command.ts +3 -4
- package/src/capability/ssh.ts +3 -4
- package/src/capability/system-prompt.ts +3 -4
- package/src/capability/tool.ts +3 -4
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -25
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +307 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +351 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +26 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +40 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +131 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +36 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +233 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +11 -0
- package/src/commit/git/index.ts +212 -0
- package/src/commit/git/operations.ts +53 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +63 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +80 -0
- package/src/commit/pipeline.ts +240 -0
- package/src/commit/prompts/analysis-system.md +155 -0
- package/src/commit/prompts/analysis-user.md +41 -0
- package/src/commit/prompts/changelog-system.md +56 -0
- package/src/commit/prompts/changelog-user.md +19 -0
- package/src/commit/prompts/file-observer-system.md +26 -0
- package/src/commit/prompts/file-observer-user.md +9 -0
- package/src/commit/prompts/reduce-system.md +60 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +4 -0
- package/src/commit/prompts/summary-system.md +52 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +65 -38
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +141 -50
- package/src/config.ts +64 -66
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +22 -24
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +18 -15
- package/src/extensibility/custom-commands/types.ts +2 -3
- package/src/extensibility/custom-tools/loader.ts +11 -12
- package/src/extensibility/custom-tools/types.ts +7 -8
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +76 -54
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +20 -27
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +9 -10
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +11 -18
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +54 -54
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +109 -9
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +99 -61
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +71 -37
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +6 -7
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +63 -52
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +33 -5
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +16 -19
- package/src/modes/components/tree-selector.ts +12 -12
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +31 -31
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -28
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +89 -0
- package/src/modes/theme/theme.ts +130 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +11 -18
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +43 -16
- package/src/prompts/tools/task.md +2 -0
- package/src/sdk.ts +100 -65
- package/src/session/agent-session.ts +84 -85
- package/src/session/agent-storage.ts +43 -39
- package/src/session/artifacts.ts +32 -10
- package/src/session/auth-storage.ts +50 -39
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +14 -56
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +28 -35
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +40 -34
- package/src/task/output-manager.ts +93 -0
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +24 -30
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +33 -39
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +41 -20
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +91 -97
- package/src/tools/calculator.ts +49 -47
- package/src/tools/complete.ts +4 -5
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +84 -124
- package/src/tools/find.ts +94 -98
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +100 -116
- package/src/tools/index.ts +80 -55
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +44 -70
- package/src/tools/notebook.ts +51 -67
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +104 -217
- package/src/tools/read.ts +92 -33
- package/src/tools/render-utils.ts +8 -23
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +69 -49
- package/src/tools/todo-write.ts +37 -25
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +99 -75
- package/src/tui/code-cell.ts +109 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +72 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +55 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +48 -0
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +5 -10
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +129 -175
- package/tsconfig.json +0 -42
|
@@ -2,25 +2,24 @@
|
|
|
2
2
|
* State manager for the Extension Control Center.
|
|
3
3
|
* Handles data loading, tree building, filtering, and toggle persistence.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
import type { ContextFile } from "
|
|
7
|
-
import type { ExtensionModule } from "
|
|
8
|
-
import type { Hook } from "
|
|
9
|
-
import type { MCPServer } from "
|
|
10
|
-
import type { Prompt } from "
|
|
11
|
-
import type { Rule } from "
|
|
12
|
-
import type { Skill } from "
|
|
13
|
-
import type { SlashCommand } from "
|
|
14
|
-
import type { CustomTool } from "
|
|
15
|
-
import type { SourceMeta } from "
|
|
5
|
+
import { logger } from "@oh-my-pi/pi-utils";
|
|
6
|
+
import type { ContextFile } from "../../../capability/context-file";
|
|
7
|
+
import type { ExtensionModule } from "../../../capability/extension-module";
|
|
8
|
+
import type { Hook } from "../../../capability/hook";
|
|
9
|
+
import type { MCPServer } from "../../../capability/mcp";
|
|
10
|
+
import type { Prompt } from "../../../capability/prompt";
|
|
11
|
+
import type { Rule } from "../../../capability/rule";
|
|
12
|
+
import type { Skill } from "../../../capability/skill";
|
|
13
|
+
import type { SlashCommand } from "../../../capability/slash-command";
|
|
14
|
+
import type { CustomTool } from "../../../capability/tool";
|
|
15
|
+
import type { SourceMeta } from "../../../capability/types";
|
|
16
16
|
import {
|
|
17
17
|
disableProvider,
|
|
18
18
|
enableProvider,
|
|
19
19
|
getAllProvidersInfo,
|
|
20
20
|
isProviderEnabled,
|
|
21
21
|
loadCapability,
|
|
22
|
-
} from "
|
|
23
|
-
import { logger } from "@oh-my-pi/pi-utils";
|
|
22
|
+
} from "../../../discovery";
|
|
24
23
|
import type {
|
|
25
24
|
DashboardState,
|
|
26
25
|
Extension,
|
|
@@ -103,8 +102,8 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
|
|
|
103
102
|
try {
|
|
104
103
|
const skills = await loadCapability<Skill>("skills", loadOpts);
|
|
105
104
|
addItems(skills.all, "skill", {
|
|
106
|
-
getDescription:
|
|
107
|
-
getTrigger:
|
|
105
|
+
getDescription: s => s.frontmatter?.description,
|
|
106
|
+
getTrigger: s => s.frontmatter?.globs?.join(", "),
|
|
108
107
|
});
|
|
109
108
|
} catch (error) {
|
|
110
109
|
logger.warn("Failed to load skills capability", { error: String(error) });
|
|
@@ -114,8 +113,8 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
|
|
|
114
113
|
try {
|
|
115
114
|
const rules = await loadCapability<Rule>("rules", loadOpts);
|
|
116
115
|
addItems(rules.all, "rule", {
|
|
117
|
-
getDescription:
|
|
118
|
-
getTrigger:
|
|
116
|
+
getDescription: r => r.description,
|
|
117
|
+
getTrigger: r => r.globs?.join(", ") || (r.alwaysApply ? "always" : undefined),
|
|
119
118
|
});
|
|
120
119
|
} catch (error) {
|
|
121
120
|
logger.warn("Failed to load rules capability", { error: String(error) });
|
|
@@ -125,7 +124,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
|
|
|
125
124
|
try {
|
|
126
125
|
const tools = await loadCapability<CustomTool>("tools", loadOpts);
|
|
127
126
|
addItems(tools.all, "tool", {
|
|
128
|
-
getDescription:
|
|
127
|
+
getDescription: t => t.description,
|
|
129
128
|
});
|
|
130
129
|
} catch (error) {
|
|
131
130
|
logger.warn("Failed to load tools capability", { error: String(error) });
|
|
@@ -134,7 +133,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
|
|
|
134
133
|
// Load extension modules
|
|
135
134
|
try {
|
|
136
135
|
const modules = await loadCapability<ExtensionModule>("extension-modules", loadOpts);
|
|
137
|
-
const nativeModules = modules.all.filter(
|
|
136
|
+
const nativeModules = modules.all.filter(module => module._source.provider === "native");
|
|
138
137
|
addItems(nativeModules, "extension-module");
|
|
139
138
|
} catch (error) {
|
|
140
139
|
logger.warn("Failed to load extension-modules capability", { error: String(error) });
|
|
@@ -188,7 +187,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
|
|
|
188
187
|
const prompts = await loadCapability<Prompt>("prompts", loadOpts);
|
|
189
188
|
addItems(prompts.all, "prompt", {
|
|
190
189
|
getDescription: () => undefined,
|
|
191
|
-
getTrigger:
|
|
190
|
+
getTrigger: p => `/prompts:${p.name}`,
|
|
192
191
|
});
|
|
193
192
|
} catch (error) {
|
|
194
193
|
logger.warn("Failed to load prompts capability", { error: String(error) });
|
|
@@ -199,7 +198,7 @@ export async function loadAllExtensions(cwd?: string, disabledIds?: string[]): P
|
|
|
199
198
|
const commands = await loadCapability<SlashCommand>("slash-commands", loadOpts);
|
|
200
199
|
addItems(commands.all, "slash-command", {
|
|
201
200
|
getDescription: () => undefined,
|
|
202
|
-
getTrigger:
|
|
201
|
+
getTrigger: c => `/${c.name}`,
|
|
203
202
|
});
|
|
204
203
|
} catch (error) {
|
|
205
204
|
logger.warn("Failed to load slash-commands capability", { error: String(error) });
|
|
@@ -396,7 +395,7 @@ export function applyFilter(extensions: Extension[], query: string): Extension[]
|
|
|
396
395
|
return extensions;
|
|
397
396
|
}
|
|
398
397
|
|
|
399
|
-
return extensions.filter(
|
|
398
|
+
return extensions.filter(ext => {
|
|
400
399
|
const searchable = [
|
|
401
400
|
ext.name,
|
|
402
401
|
ext.displayName,
|
|
@@ -408,7 +407,7 @@ export function applyFilter(extensions: Extension[], query: string): Extension[]
|
|
|
408
407
|
.join(" ")
|
|
409
408
|
.toLowerCase();
|
|
410
409
|
|
|
411
|
-
return tokens.every(
|
|
410
|
+
return tokens.every(token => searchable.includes(token));
|
|
412
411
|
});
|
|
413
412
|
}
|
|
414
413
|
|
|
@@ -506,7 +505,7 @@ export function filterByProvider(extensions: Extension[], providerId: string): E
|
|
|
506
505
|
if (providerId === "all") {
|
|
507
506
|
return extensions;
|
|
508
507
|
}
|
|
509
|
-
return extensions.filter(
|
|
508
|
+
return extensions.filter(ext => ext.source.provider === providerId);
|
|
510
509
|
}
|
|
511
510
|
|
|
512
511
|
/**
|
|
@@ -564,12 +563,12 @@ export async function refreshState(
|
|
|
564
563
|
const searchFiltered = applyFilter(tabFiltered, state.searchQuery);
|
|
565
564
|
|
|
566
565
|
// Find new index for current provider (tabs may have reordered)
|
|
567
|
-
const newActiveTabIndex = tabs.findIndex(
|
|
566
|
+
const newActiveTabIndex = tabs.findIndex(t => t.id === providerId);
|
|
568
567
|
const activeTabIndex = newActiveTabIndex >= 0 ? newActiveTabIndex : 0;
|
|
569
568
|
|
|
570
569
|
// Try to preserve selection
|
|
571
570
|
const selectedId = state.selected?.id;
|
|
572
|
-
let selected = selectedId ? searchFiltered.find(
|
|
571
|
+
let selected = selectedId ? searchFiltered.find(e => e.id === selectedId) : null;
|
|
573
572
|
if (!selected && searchFiltered.length > 0) {
|
|
574
573
|
selected = searchFiltered[Math.min(state.listIndex, searchFiltered.length - 1)];
|
|
575
574
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
2
3
|
import type { AssistantMessage } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
4
|
-
import type { AgentSession } from "@oh-my-pi/pi-coding-agent/session/agent-session";
|
|
5
|
-
import { shortenPath } from "@oh-my-pi/pi-coding-agent/tools/render-utils";
|
|
6
4
|
import { type Component, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
|
|
7
|
-
import {
|
|
5
|
+
import { isEnoent } from "@oh-my-pi/pi-utils";
|
|
6
|
+
import { theme } from "../../modes/theme/theme";
|
|
7
|
+
import type { AgentSession } from "../../session/agent-session";
|
|
8
|
+
import { shortenPath } from "../../tools/render-utils";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* Sanitize text for display in a single-line status.
|
|
@@ -18,20 +19,19 @@ function sanitizeStatusText(text: string): string {
|
|
|
18
19
|
.trim();
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
* Returns the path to .git/HEAD if found, null otherwise.
|
|
24
|
-
*/
|
|
25
|
-
function findGitHeadPath(): string | null {
|
|
22
|
+
/** Find the git root by walking up from cwd. Returns path and content of .git/HEAD if found. */
|
|
23
|
+
async function findGitHeadPath(): Promise<{ path: string; content: string } | null> {
|
|
26
24
|
let dir = process.cwd();
|
|
27
25
|
while (true) {
|
|
28
|
-
const gitHeadPath = join(dir, ".git", "HEAD");
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
const gitHeadPath = path.join(dir, ".git", "HEAD");
|
|
27
|
+
try {
|
|
28
|
+
const content = await Bun.file(gitHeadPath).text();
|
|
29
|
+
return { path: gitHeadPath, content };
|
|
30
|
+
} catch (err) {
|
|
31
|
+
if (!isEnoent(err)) throw err;
|
|
31
32
|
}
|
|
32
|
-
const parent = dirname(dir);
|
|
33
|
+
const parent = path.dirname(dir);
|
|
33
34
|
if (parent === dir) {
|
|
34
|
-
// Reached filesystem root
|
|
35
35
|
return null;
|
|
36
36
|
}
|
|
37
37
|
dir = parent;
|
|
@@ -44,7 +44,7 @@ function findGitHeadPath(): string | null {
|
|
|
44
44
|
export class FooterComponent implements Component {
|
|
45
45
|
private session: AgentSession;
|
|
46
46
|
private cachedBranch: string | null | undefined = undefined; // undefined = not checked yet, null = not in git repo, string = branch name
|
|
47
|
-
private gitWatcher: FSWatcher | null = null;
|
|
47
|
+
private gitWatcher: fs.FSWatcher | null = null;
|
|
48
48
|
private onBranchChange: (() => void) | null = null;
|
|
49
49
|
private autoCompactEnabled: boolean = true;
|
|
50
50
|
private extensionStatuses: Map<string, string> = new Map();
|
|
@@ -88,21 +88,22 @@ export class FooterComponent implements Component {
|
|
|
88
88
|
this.gitWatcher = null;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
findGitHeadPath().then(result => {
|
|
92
|
+
if (!result) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
95
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
try {
|
|
97
|
+
this.gitWatcher = fs.watch(result.path, () => {
|
|
98
|
+
this.cachedBranch = undefined; // Invalidate cache
|
|
99
|
+
if (this.onBranchChange) {
|
|
100
|
+
this.onBranchChange();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
} catch {
|
|
104
|
+
// Silently fail if we can't watch
|
|
105
|
+
}
|
|
106
|
+
});
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
/**
|
|
@@ -130,27 +131,30 @@ export class FooterComponent implements Component {
|
|
|
130
131
|
return this.cachedBranch;
|
|
131
132
|
}
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
// Note: fire-and-forget async call - will return undefined on first call
|
|
135
|
+
// This is acceptable since it's a cached value that will update on next render
|
|
136
|
+
findGitHeadPath().then(result => {
|
|
137
|
+
if (!result) {
|
|
136
138
|
this.cachedBranch = null;
|
|
137
|
-
|
|
139
|
+
if (this.onBranchChange) {
|
|
140
|
+
this.onBranchChange();
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
138
143
|
}
|
|
139
|
-
const content =
|
|
144
|
+
const content = result.content.trim();
|
|
140
145
|
|
|
141
146
|
if (content.startsWith("ref: refs/heads/")) {
|
|
142
|
-
// Normal branch: extract branch name
|
|
143
147
|
this.cachedBranch = content.slice(16);
|
|
144
148
|
} else {
|
|
145
|
-
// Detached HEAD state
|
|
146
149
|
this.cachedBranch = "detached";
|
|
147
150
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
151
|
+
if (this.onBranchChange) {
|
|
152
|
+
this.onBranchChange();
|
|
153
|
+
}
|
|
154
|
+
});
|
|
152
155
|
|
|
153
|
-
|
|
156
|
+
// Return undefined while loading (will show on next render once loaded)
|
|
157
|
+
return null;
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
render(width: number): string[] {
|
|
@@ -177,7 +181,7 @@ export class FooterComponent implements Component {
|
|
|
177
181
|
const lastAssistantMessage = state.messages
|
|
178
182
|
.slice()
|
|
179
183
|
.reverse()
|
|
180
|
-
.find(
|
|
184
|
+
.find(m => m.role === "assistant" && m.stopReason !== "aborted") as AssistantMessage | undefined;
|
|
181
185
|
|
|
182
186
|
// Calculate context percentage from last message (input + output + cacheRead + cacheWrite)
|
|
183
187
|
const contextTokens = lastAssistantMessage
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
2
|
-
import type { HistoryEntry, HistoryStorage } from "@oh-my-pi/pi-coding-agent/session/history-storage";
|
|
3
1
|
import {
|
|
4
2
|
type Component,
|
|
5
3
|
Container,
|
|
@@ -10,6 +8,8 @@ import {
|
|
|
10
8
|
truncateToWidth,
|
|
11
9
|
visibleWidth,
|
|
12
10
|
} from "@oh-my-pi/pi-tui";
|
|
11
|
+
import { theme } from "../../modes/theme/theme";
|
|
12
|
+
import type { HistoryEntry, HistoryStorage } from "../../session/history-storage";
|
|
13
13
|
import { DynamicBorder } from "./dynamic-border";
|
|
14
14
|
|
|
15
15
|
class HistoryResultsList implements Component {
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* Multi-line editor component for hooks.
|
|
3
3
|
* Supports Ctrl+G for external editor.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
import { rm } from "node:fs/promises";
|
|
5
|
+
import * as fs from "node:fs/promises";
|
|
7
6
|
import * as os from "node:os";
|
|
8
7
|
import * as path from "node:path";
|
|
9
|
-
import { getEditorTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
10
8
|
import { Container, Editor, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
11
9
|
import { nanoid } from "nanoid";
|
|
10
|
+
import { getEditorTheme, theme } from "../../modes/theme/theme";
|
|
12
11
|
import { DynamicBorder } from "./dynamic-border";
|
|
13
12
|
|
|
14
13
|
export class HookEditorComponent extends Container {
|
|
@@ -110,7 +109,7 @@ export class HookEditorComponent extends Container {
|
|
|
110
109
|
}
|
|
111
110
|
} finally {
|
|
112
111
|
try {
|
|
113
|
-
await rm(tmpFile, { force: true });
|
|
112
|
+
await fs.rm(tmpFile, { force: true });
|
|
114
113
|
} catch {
|
|
115
114
|
// Ignore cleanup errors
|
|
116
115
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Simple text input component for hooks.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
6
4
|
import { Container, Input, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
5
|
+
import { theme } from "../../modes/theme/theme";
|
|
7
6
|
import { CountdownTimer } from "./countdown-timer";
|
|
8
7
|
import { DynamicBorder } from "./dynamic-border";
|
|
9
8
|
|
|
@@ -44,7 +43,7 @@ export class HookInputComponent extends Container {
|
|
|
44
43
|
this.countdown = new CountdownTimer(
|
|
45
44
|
opts.timeout,
|
|
46
45
|
opts.tui,
|
|
47
|
-
|
|
46
|
+
s => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)),
|
|
48
47
|
() => this.onCancelCallback(),
|
|
49
48
|
);
|
|
50
49
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { TextContent } from "@oh-my-pi/pi-ai";
|
|
2
|
-
import type { HookMessageRenderer } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
|
|
3
|
-
import { getMarkdownTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
4
|
-
import type { HookMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
|
|
5
2
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
6
3
|
import { Box, Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
4
|
+
import type { HookMessageRenderer } from "../../extensibility/hooks/types";
|
|
5
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
6
|
+
import type { HookMessage } from "../../session/messages";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Component that renders a custom message entry from hooks.
|
|
@@ -24,7 +24,7 @@ export class HookMessageComponent extends Container {
|
|
|
24
24
|
this.addChild(new Spacer(1));
|
|
25
25
|
|
|
26
26
|
// Create box with purple background (used for default rendering)
|
|
27
|
-
this.box = new Box(1, 1,
|
|
27
|
+
this.box = new Box(1, 1, t => theme.bg("customMessageBg", t));
|
|
28
28
|
|
|
29
29
|
this.rebuild();
|
|
30
30
|
}
|
|
@@ -80,7 +80,7 @@ export class HookMessageComponent extends Container {
|
|
|
80
80
|
} else {
|
|
81
81
|
text = this.message.content
|
|
82
82
|
.filter((c): c is TextContent => c.type === "text")
|
|
83
|
-
.map(
|
|
83
|
+
.map(c => c.text)
|
|
84
84
|
.join("\n");
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
* Generic selector component for hooks.
|
|
3
3
|
* Displays a list of string options with keyboard navigation.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
7
5
|
import { Container, matchesKey, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
6
|
+
import { theme } from "../../modes/theme/theme";
|
|
8
7
|
import { CountdownTimer } from "./countdown-timer";
|
|
9
8
|
import { DynamicBorder } from "./dynamic-border";
|
|
10
9
|
|
|
@@ -50,7 +49,7 @@ export class HookSelectorComponent extends Container {
|
|
|
50
49
|
this.countdown = new CountdownTimer(
|
|
51
50
|
opts.timeout,
|
|
52
51
|
opts.tui,
|
|
53
|
-
|
|
52
|
+
s => this.titleText.setText(theme.fg("accent", `${this.baseTitle} (${s}s)`)),
|
|
54
53
|
() => this.onCancelCallback(),
|
|
55
54
|
);
|
|
56
55
|
}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utilities for formatting keybinding hints in the UI.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import type { AppAction, KeybindingsManager } from "@oh-my-pi/pi-coding-agent/config/keybindings";
|
|
6
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
7
4
|
import { type EditorAction, getEditorKeybindings, type KeyId } from "@oh-my-pi/pi-tui";
|
|
5
|
+
import type { AppAction, KeybindingsManager } from "../../config/keybindings";
|
|
6
|
+
import { theme } from "../../modes/theme/theme";
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* Format keys array as display string (e.g., ["ctrl+c", "escape"] -> "ctrl+c/escape").
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getOAuthProviders } from "@oh-my-pi/pi-ai";
|
|
2
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
3
2
|
import { Container, getEditorKeybindings, Input, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
4
3
|
import { $ } from "bun";
|
|
4
|
+
import { theme } from "../../modes/theme/theme";
|
|
5
5
|
import { DynamicBorder } from "./dynamic-border";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -23,7 +23,7 @@ export class LoginDialogComponent extends Container {
|
|
|
23
23
|
super();
|
|
24
24
|
this.tui = tui;
|
|
25
25
|
|
|
26
|
-
const providerInfo = getOAuthProviders().find(
|
|
26
|
+
const providerInfo = getOAuthProviders().find(p => p.id === providerId);
|
|
27
27
|
const providerName = providerInfo?.name || providerId;
|
|
28
28
|
|
|
29
29
|
// Top border
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
import { type Model, modelsAreEqual } from "@oh-my-pi/pi-ai";
|
|
2
|
-
import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
|
|
3
|
-
import { parseModelString } from "@oh-my-pi/pi-coding-agent/config/model-resolver";
|
|
4
|
-
import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
5
|
-
import { type ThemeColor, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
6
|
-
import { fuzzyFilter } from "@oh-my-pi/pi-coding-agent/utils/fuzzy";
|
|
7
2
|
import {
|
|
8
3
|
Container,
|
|
9
4
|
Input,
|
|
@@ -16,6 +11,11 @@ import {
|
|
|
16
11
|
type TUI,
|
|
17
12
|
visibleWidth,
|
|
18
13
|
} from "@oh-my-pi/pi-tui";
|
|
14
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
15
|
+
import { parseModelString } from "../../config/model-resolver";
|
|
16
|
+
import type { SettingsManager } from "../../config/settings-manager";
|
|
17
|
+
import { type ThemeColor, theme } from "../../modes/theme/theme";
|
|
18
|
+
import { fuzzyFilter } from "../../utils/fuzzy";
|
|
19
19
|
import { DynamicBorder } from "./dynamic-border";
|
|
20
20
|
|
|
21
21
|
function makeInvertedBadge(label: string, color: ThemeColor): string {
|
|
@@ -190,7 +190,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
190
190
|
if (defaultStr) {
|
|
191
191
|
const parsed = parseModelString(defaultStr);
|
|
192
192
|
if (parsed) {
|
|
193
|
-
this.defaultModel = allModels.find(
|
|
193
|
+
this.defaultModel = allModels.find(m => m.provider === parsed.provider && m.id === parsed.id);
|
|
194
194
|
}
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -199,7 +199,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
199
199
|
if (smolStr) {
|
|
200
200
|
const parsed = parseModelString(smolStr);
|
|
201
201
|
if (parsed) {
|
|
202
|
-
this.smolModel = allModels.find(
|
|
202
|
+
this.smolModel = allModels.find(m => m.provider === parsed.provider && m.id === parsed.id);
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
205
|
|
|
@@ -208,7 +208,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
208
208
|
if (slowStr) {
|
|
209
209
|
const parsed = parseModelString(slowStr);
|
|
210
210
|
if (parsed) {
|
|
211
|
-
this.slowModel = allModels.find(
|
|
211
|
+
this.slowModel = allModels.find(m => m.provider === parsed.provider && m.id === parsed.id);
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
214
|
}
|
|
@@ -218,7 +218,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
218
218
|
|
|
219
219
|
// Use scoped models if provided via --models flag
|
|
220
220
|
if (this.scopedModels.length > 0) {
|
|
221
|
-
models = this.scopedModels.map(
|
|
221
|
+
models = this.scopedModels.map(scoped => ({
|
|
222
222
|
provider: scoped.model.provider,
|
|
223
223
|
id: scoped.model.id,
|
|
224
224
|
model: scoped.model,
|
|
@@ -279,7 +279,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
279
279
|
private updateTabBar(): void {
|
|
280
280
|
this.headerContainer.clear();
|
|
281
281
|
|
|
282
|
-
const tabs: Tab[] = this.providers.map(
|
|
282
|
+
const tabs: Tab[] = this.providers.map(provider => ({ id: provider, label: provider }));
|
|
283
283
|
const tabBar = new TabBar("Models", tabs, getTabBarTheme(), this.activeTabIndex);
|
|
284
284
|
tabBar.onTabChange = (_tab, index) => {
|
|
285
285
|
this.activeTabIndex = index;
|
|
@@ -300,7 +300,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
300
300
|
// Start with all models or filter by provider
|
|
301
301
|
let baseModels = this.allModels;
|
|
302
302
|
if (activeProvider !== ALL_TAB) {
|
|
303
|
-
baseModels = this.allModels.filter(
|
|
303
|
+
baseModels = this.allModels.filter(m => m.provider.toUpperCase() === activeProvider);
|
|
304
304
|
}
|
|
305
305
|
|
|
306
306
|
// Apply fuzzy filter if query is present
|
|
@@ -426,7 +426,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
426
426
|
const menuWidth = Math.max(
|
|
427
427
|
visibleWidth(headerText),
|
|
428
428
|
visibleWidth(hintText),
|
|
429
|
-
...actionLines.map(
|
|
429
|
+
...actionLines.map(line => visibleWidth(line)),
|
|
430
430
|
);
|
|
431
431
|
|
|
432
432
|
// Menu header
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getOAuthProviders, type OAuthProviderInfo } from "@oh-my-pi/pi-ai";
|
|
2
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
3
|
-
import type { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
|
|
4
2
|
import { Container, matchesKey, Spacer, TruncatedText } from "@oh-my-pi/pi-tui";
|
|
3
|
+
import { theme } from "../../modes/theme/theme";
|
|
4
|
+
import type { AuthStorage } from "../../session/auth-storage";
|
|
5
5
|
import { DynamicBorder } from "./dynamic-border";
|
|
6
6
|
|
|
7
7
|
/**
|