@oh-my-pi/pi-coding-agent 8.1.0 → 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 +21 -1
- 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 +51 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +2 -3
- package/src/capability/extension-module.ts +2 -3
- package/src/capability/extension.ts +2 -3
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +2 -3
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +2 -3
- package/src/capability/mcp.ts +2 -3
- package/src/capability/prompt.ts +2 -3
- package/src/capability/rule.ts +2 -3
- package/src/capability/settings.ts +1 -2
- package/src/capability/skill.ts +2 -3
- package/src/capability/slash-command.ts +2 -3
- package/src/capability/ssh.ts +2 -3
- package/src/capability/system-prompt.ts +2 -3
- package/src/capability/tool.ts +2 -3
- 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 -21
- 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 +21 -23
- package/src/commit/agentic/fallback.ts +9 -9
- package/src/commit/agentic/index.ts +30 -38
- package/src/commit/agentic/state.ts +1 -6
- package/src/commit/agentic/tools/analyze-file.ts +15 -15
- package/src/commit/agentic/tools/git-file-diff.ts +3 -3
- package/src/commit/agentic/tools/git-hunk.ts +7 -7
- package/src/commit/agentic/tools/git-overview.ts +5 -5
- package/src/commit/agentic/tools/index.ts +14 -14
- package/src/commit/agentic/tools/propose-changelog.ts +6 -6
- package/src/commit/agentic/tools/propose-commit.ts +8 -8
- package/src/commit/agentic/tools/recent-commits.ts +2 -2
- package/src/commit/agentic/tools/split-commit.ts +19 -23
- package/src/commit/agentic/topo-sort.ts +1 -1
- package/src/commit/agentic/trivial.ts +3 -3
- package/src/commit/agentic/validation.ts +12 -12
- package/src/commit/analysis/conventional.ts +7 -11
- package/src/commit/analysis/index.ts +4 -4
- package/src/commit/analysis/scope.ts +4 -4
- package/src/commit/analysis/summary.ts +7 -9
- package/src/commit/analysis/validation.ts +1 -1
- package/src/commit/changelog/detect.ts +6 -6
- package/src/commit/changelog/generate.ts +7 -9
- package/src/commit/changelog/index.ts +13 -13
- package/src/commit/changelog/parse.ts +2 -2
- package/src/commit/cli.ts +1 -1
- package/src/commit/git/diff.ts +3 -3
- package/src/commit/git/index.ts +19 -24
- package/src/commit/index.ts +1 -1
- package/src/commit/map-reduce/index.ts +9 -9
- package/src/commit/map-reduce/map-phase.ts +19 -34
- package/src/commit/map-reduce/reduce-phase.ts +9 -11
- package/src/commit/message.ts +2 -2
- package/src/commit/model-selection.ts +3 -7
- package/src/commit/pipeline.ts +20 -22
- package/src/commit/utils/exclusions.ts +3 -3
- package/src/config/file-lock.ts +17 -7
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +55 -37
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +50 -34
- package/src/config.ts +60 -62
- 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 +16 -18
- 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 +17 -14
- package/src/extensibility/custom-commands/types.ts +1 -2
- package/src/extensibility/custom-tools/loader.ts +10 -11
- package/src/extensibility/custom-tools/types.ts +6 -7
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +75 -53
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +19 -26
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +8 -9
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +10 -17
- 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 +46 -46
- 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 +14 -10
- 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 +10 -16
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +55 -34
- 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 +3 -4
- 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 +60 -49
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +6 -6
- 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 +11 -16
- package/src/modes/components/tree-selector.ts +11 -11
- 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 +27 -29
- 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 -25
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +2 -2
- package/src/modes/theme/theme.ts +128 -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 +10 -11
- 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 +12 -13
- package/src/sdk.ts +60 -63
- package/src/session/agent-session.ts +83 -84
- package/src/session/agent-storage.ts +11 -11
- package/src/session/artifacts.ts +8 -9
- package/src/session/auth-storage.ts +25 -29
- 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 +2 -3
- 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 +27 -34
- 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 +33 -36
- package/src/task/output-manager.ts +3 -4
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +19 -20
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +32 -38
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +8 -9
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +19 -18
- package/src/tools/calculator.ts +12 -12
- package/src/tools/complete.ts +3 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +23 -26
- package/src/tools/find.ts +15 -16
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +27 -27
- package/src/tools/index.ts +78 -56
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +7 -7
- package/src/tools/notebook.ts +5 -5
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +1 -1
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +36 -37
- package/src/tools/read.ts +23 -23
- package/src/tools/render-utils.ts +8 -9
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +31 -30
- package/src/tools/todo-write.ts +13 -13
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +11 -16
- package/src/tui/code-cell.ts +3 -9
- package/src/tui/file-list.ts +3 -4
- package/src/tui/output-block.ts +1 -2
- package/src/tui/status-line.ts +2 -3
- package/src/tui/tree-list.ts +2 -3
- package/src/tui/types.ts +1 -2
- package/src/tui/utils.ts +2 -3
- 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 +4 -9
- 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 +16 -18
- package/scripts/generate-wasm-b64.ts +0 -24
- package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
- package/src/task/.executor.ts.kate-swp +0 -0
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
package/src/migrations.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* One-time migrations that run on startup.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import { AgentStorage } from "@oh-my-pi/pi-coding-agent/session/agent-storage";
|
|
8
|
-
import type { AuthCredential } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
|
|
9
|
-
import { logger } from "@oh-my-pi/pi-utils";
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
import { isEnoent, logger } from "@oh-my-pi/pi-utils";
|
|
10
7
|
import chalk from "chalk";
|
|
11
8
|
import { getAgentDbPath, getAgentDir, getBinDir } from "./config";
|
|
9
|
+
import { AgentStorage } from "./session/agent-storage";
|
|
10
|
+
import type { AuthCredential } from "./session/auth-storage";
|
|
12
11
|
|
|
13
12
|
/**
|
|
14
13
|
* Migrate legacy oauth.json and settings.json apiKeys to agent.db.
|
|
@@ -17,16 +16,16 @@ import { getAgentDbPath, getAgentDir, getBinDir } from "./config";
|
|
|
17
16
|
*/
|
|
18
17
|
export async function migrateAuthToAgentDb(): Promise<string[]> {
|
|
19
18
|
const agentDir = getAgentDir();
|
|
20
|
-
const oauthPath = join(agentDir, "oauth.json");
|
|
21
|
-
const settingsPath = join(agentDir, "settings.json");
|
|
19
|
+
const oauthPath = path.join(agentDir, "oauth.json");
|
|
20
|
+
const settingsPath = path.join(agentDir, "settings.json");
|
|
22
21
|
const storage = await AgentStorage.open(getAgentDbPath(agentDir));
|
|
23
22
|
|
|
24
23
|
const migrated: Record<string, AuthCredential[]> = {};
|
|
25
24
|
const providers: string[] = [];
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
try {
|
|
27
|
+
const oauth = await Bun.file(oauthPath).json();
|
|
28
28
|
try {
|
|
29
|
-
const oauth = JSON.parse(readFileSync(oauthPath, "utf-8"));
|
|
30
29
|
for (const [provider, cred] of Object.entries(oauth)) {
|
|
31
30
|
if (storage.listAuthCredentials(provider).length > 0) {
|
|
32
31
|
continue;
|
|
@@ -34,16 +33,19 @@ export async function migrateAuthToAgentDb(): Promise<string[]> {
|
|
|
34
33
|
migrated[provider] = [{ type: "oauth", ...(cred as object) } as AuthCredential];
|
|
35
34
|
providers.push(provider);
|
|
36
35
|
}
|
|
37
|
-
|
|
36
|
+
await fs.promises.rename(oauthPath, `${oauthPath}.migrated`);
|
|
38
37
|
} catch (error) {
|
|
39
38
|
logger.warn("Failed to migrate oauth.json", { path: oauthPath, error: String(error) });
|
|
40
39
|
}
|
|
40
|
+
} catch (err) {
|
|
41
|
+
if (!isEnoent(err)) {
|
|
42
|
+
logger.warn("Failed to read oauth.json", { path: oauthPath, error: String(err) });
|
|
43
|
+
}
|
|
41
44
|
}
|
|
42
45
|
|
|
43
|
-
|
|
46
|
+
try {
|
|
47
|
+
const settings = await Bun.file(settingsPath).json();
|
|
44
48
|
try {
|
|
45
|
-
const content = readFileSync(settingsPath, "utf-8");
|
|
46
|
-
const settings = JSON.parse(content);
|
|
47
49
|
if (settings.apiKeys && typeof settings.apiKeys === "object") {
|
|
48
50
|
for (const [provider, key] of Object.entries(settings.apiKeys)) {
|
|
49
51
|
if (typeof key !== "string") continue;
|
|
@@ -53,11 +55,15 @@ export async function migrateAuthToAgentDb(): Promise<string[]> {
|
|
|
53
55
|
providers.push(provider);
|
|
54
56
|
}
|
|
55
57
|
delete settings.apiKeys;
|
|
56
|
-
|
|
58
|
+
await Bun.write(settingsPath, JSON.stringify(settings, null, 2));
|
|
57
59
|
}
|
|
58
60
|
} catch (error) {
|
|
59
61
|
logger.warn("Failed to migrate settings.json apiKeys", { path: settingsPath, error: String(error) });
|
|
60
62
|
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
if (!isEnoent(err)) {
|
|
65
|
+
logger.warn("Failed to read settings.json", { path: settingsPath, error: String(err) });
|
|
66
|
+
}
|
|
61
67
|
}
|
|
62
68
|
|
|
63
69
|
for (const [provider, credentials] of Object.entries(migrated)) {
|
|
@@ -76,15 +82,14 @@ export async function migrateAuthToAgentDb(): Promise<string[]> {
|
|
|
76
82
|
*
|
|
77
83
|
* See: https://github.com/badlogic/pi-mono/issues/320
|
|
78
84
|
*/
|
|
79
|
-
export function migrateSessionsFromAgentRoot(): void {
|
|
85
|
+
export async function migrateSessionsFromAgentRoot(): Promise<void> {
|
|
80
86
|
const agentDir = getAgentDir();
|
|
81
87
|
|
|
82
88
|
// Find all .jsonl files directly in agentDir (not in subdirectories)
|
|
83
89
|
let files: string[];
|
|
84
90
|
try {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
.map((f) => join(agentDir, f));
|
|
91
|
+
const entries = await fs.promises.readdir(agentDir);
|
|
92
|
+
files = entries.filter(f => f.endsWith(".jsonl")).map(f => path.join(agentDir, f));
|
|
88
93
|
} catch (error) {
|
|
89
94
|
logger.warn("Failed to read agent directory for session migration", { path: agentDir, error: String(error) });
|
|
90
95
|
return;
|
|
@@ -95,7 +100,13 @@ export function migrateSessionsFromAgentRoot(): void {
|
|
|
95
100
|
for (const file of files) {
|
|
96
101
|
try {
|
|
97
102
|
// Read first line to get session header
|
|
98
|
-
|
|
103
|
+
let content: string;
|
|
104
|
+
try {
|
|
105
|
+
content = await Bun.file(file).text();
|
|
106
|
+
} catch (err) {
|
|
107
|
+
if (isEnoent(err)) continue;
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
99
110
|
const firstLine = content.split("\n")[0];
|
|
100
111
|
if (!firstLine?.trim()) continue;
|
|
101
112
|
|
|
@@ -106,18 +117,18 @@ export function migrateSessionsFromAgentRoot(): void {
|
|
|
106
117
|
|
|
107
118
|
// Compute the correct session directory (same encoding as session-manager.ts)
|
|
108
119
|
const safePath = `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
|
|
109
|
-
const correctDir = join(agentDir, "sessions", safePath);
|
|
120
|
+
const correctDir = path.join(agentDir, "sessions", safePath);
|
|
110
121
|
|
|
111
122
|
// Create directory if needed
|
|
112
|
-
|
|
123
|
+
await fs.promises.mkdir(correctDir, { recursive: true });
|
|
113
124
|
|
|
114
125
|
// Move the file
|
|
115
126
|
const fileName = file.split("/").pop() || file.split("\\").pop();
|
|
116
|
-
const newPath = join(correctDir, fileName!);
|
|
127
|
+
const newPath = path.join(correctDir, fileName!);
|
|
117
128
|
|
|
118
|
-
if (existsSync(newPath)) continue; // Skip if target exists
|
|
129
|
+
if (fs.existsSync(newPath)) continue; // Skip if target exists
|
|
119
130
|
|
|
120
|
-
|
|
131
|
+
await fs.promises.rename(file, newPath);
|
|
121
132
|
} catch (error) {
|
|
122
133
|
logger.warn("Failed to migrate session file", { path: file, error: String(error) });
|
|
123
134
|
}
|
|
@@ -127,38 +138,38 @@ export function migrateSessionsFromAgentRoot(): void {
|
|
|
127
138
|
/**
|
|
128
139
|
* Move fd/rg binaries from tools/ to bin/ if they exist.
|
|
129
140
|
*/
|
|
130
|
-
function migrateToolsToBin(): void {
|
|
141
|
+
async function migrateToolsToBin(): Promise<void> {
|
|
131
142
|
const agentDir = getAgentDir();
|
|
132
|
-
const toolsDir = join(agentDir, "tools");
|
|
143
|
+
const toolsDir = path.join(agentDir, "tools");
|
|
133
144
|
const binDir = getBinDir();
|
|
134
145
|
|
|
135
|
-
if (!existsSync(toolsDir)) return;
|
|
146
|
+
if (!fs.existsSync(toolsDir)) return;
|
|
136
147
|
|
|
137
148
|
const binaries = ["fd", "rg", "fd.exe", "rg.exe"];
|
|
138
149
|
let movedAny = false;
|
|
139
150
|
|
|
140
151
|
for (const bin of binaries) {
|
|
141
|
-
const oldPath = join(toolsDir, bin);
|
|
142
|
-
const newPath = join(binDir, bin);
|
|
152
|
+
const oldPath = path.join(toolsDir, bin);
|
|
153
|
+
const newPath = path.join(binDir, bin);
|
|
154
|
+
if (!fs.existsSync(oldPath)) continue;
|
|
155
|
+
|
|
156
|
+
if (!fs.existsSync(binDir)) {
|
|
157
|
+
await fs.promises.mkdir(binDir, { recursive: true });
|
|
158
|
+
}
|
|
143
159
|
|
|
144
|
-
if (existsSync(
|
|
145
|
-
|
|
146
|
-
|
|
160
|
+
if (!fs.existsSync(newPath)) {
|
|
161
|
+
try {
|
|
162
|
+
await fs.promises.rename(oldPath, newPath);
|
|
163
|
+
movedAny = true;
|
|
164
|
+
} catch (error) {
|
|
165
|
+
logger.warn("Failed to migrate binary", { from: oldPath, to: newPath, error: String(error) });
|
|
147
166
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
}
|
|
155
|
-
} else {
|
|
156
|
-
// Target exists, just delete the old one
|
|
157
|
-
try {
|
|
158
|
-
rmSync(oldPath, { force: true });
|
|
159
|
-
} catch {
|
|
160
|
-
// Ignore
|
|
161
|
-
}
|
|
167
|
+
} else {
|
|
168
|
+
// Target exists, just delete the old one
|
|
169
|
+
try {
|
|
170
|
+
await fs.promises.rm(oldPath, { force: true });
|
|
171
|
+
} catch {
|
|
172
|
+
// Ignore
|
|
162
173
|
}
|
|
163
174
|
}
|
|
164
175
|
}
|
|
@@ -180,8 +191,8 @@ export async function runMigrations(_cwd: string): Promise<{
|
|
|
180
191
|
}> {
|
|
181
192
|
// Then: run data migrations
|
|
182
193
|
const migratedAuthProviders = await migrateAuthToAgentDb();
|
|
183
|
-
migrateSessionsFromAgentRoot();
|
|
184
|
-
migrateToolsToBin();
|
|
194
|
+
await migrateSessionsFromAgentRoot();
|
|
195
|
+
await migrateToolsToBin();
|
|
185
196
|
|
|
186
197
|
return { migratedAuthProviders, deprecationWarnings: [] };
|
|
187
198
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Armin says hi! A fun easter egg with animated XBM art.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
6
4
|
import type { Component, TUI } from "@oh-my-pi/pi-tui";
|
|
5
|
+
import { theme } from "../../modes/theme/theme";
|
|
7
6
|
|
|
8
7
|
// XBM image: 31x36 pixels, LSB first, 1=background, 0=foreground
|
|
9
8
|
const WIDTH = 31;
|
|
@@ -91,7 +90,7 @@ export class ArminComponent implements Component {
|
|
|
91
90
|
const padding = 1;
|
|
92
91
|
const availableWidth = width - padding;
|
|
93
92
|
|
|
94
|
-
this.cachedLines = this.currentGrid.map(
|
|
93
|
+
this.cachedLines = this.currentGrid.map(row => {
|
|
95
94
|
// Clip row to available width before applying color
|
|
96
95
|
const clipped = row.slice(0, availableWidth).join("");
|
|
97
96
|
const padRight = Math.max(0, width - padding - clipped.length);
|
|
@@ -332,7 +331,7 @@ export class ArminComponent implements Component {
|
|
|
332
331
|
|
|
333
332
|
if (state.phase < state.glitchFrames) {
|
|
334
333
|
// Glitch phase: show corrupted version
|
|
335
|
-
this.currentGrid = this.finalGrid.map(
|
|
334
|
+
this.currentGrid = this.finalGrid.map(row => {
|
|
336
335
|
const offset = Math.floor(Math.random() * 7) - 3;
|
|
337
336
|
const glitchRow = [...row];
|
|
338
337
|
|
|
@@ -355,7 +354,7 @@ export class ArminComponent implements Component {
|
|
|
355
354
|
}
|
|
356
355
|
|
|
357
356
|
// Final frame: show clean image
|
|
358
|
-
this.currentGrid = this.finalGrid.map(
|
|
357
|
+
this.currentGrid = this.finalGrid.map(row => [...row]);
|
|
359
358
|
return true;
|
|
360
359
|
}
|
|
361
360
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AssistantMessage } from "@oh-my-pi/pi-ai";
|
|
2
|
-
import { hasPendingMermaid, prerenderMermaid } from "@oh-my-pi/pi-coding-agent/modes/theme/mermaid-cache";
|
|
3
|
-
import { getMarkdownTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
4
2
|
import { Container, getCapabilities, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
3
|
+
import { hasPendingMermaid, prerenderMermaid } from "../../modes/theme/mermaid-cache";
|
|
4
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Component that renders a complete assistant message
|
|
@@ -42,7 +42,7 @@ export class AssistantMessageComponent extends Container {
|
|
|
42
42
|
if (!caps.images || this.prerenderInFlight) return;
|
|
43
43
|
|
|
44
44
|
// Check if any text content has pending mermaid blocks
|
|
45
|
-
const hasPending = message.content.some(
|
|
45
|
+
const hasPending = message.content.some(c => c.type === "text" && c.text.trim() && hasPendingMermaid(c.text));
|
|
46
46
|
if (!hasPending) return;
|
|
47
47
|
|
|
48
48
|
this.prerenderInFlight = true;
|
|
@@ -70,7 +70,7 @@ export class AssistantMessageComponent extends Container {
|
|
|
70
70
|
this.triggerMermaidPrerender(message);
|
|
71
71
|
|
|
72
72
|
const hasVisibleContent = message.content.some(
|
|
73
|
-
|
|
73
|
+
c => (c.type === "text" && c.text.trim()) || (c.type === "thinking" && c.thinking.trim()),
|
|
74
74
|
);
|
|
75
75
|
|
|
76
76
|
if (hasVisibleContent) {
|
|
@@ -86,7 +86,7 @@ export class AssistantMessageComponent extends Container {
|
|
|
86
86
|
this.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, getMarkdownTheme()));
|
|
87
87
|
} else if (content.type === "thinking" && content.thinking.trim()) {
|
|
88
88
|
// Check if there's text content after this thinking block
|
|
89
|
-
const hasTextAfter = message.content.slice(i + 1).some(
|
|
89
|
+
const hasTextAfter = message.content.slice(i + 1).some(c => c.type === "text" && c.text.trim());
|
|
90
90
|
|
|
91
91
|
if (this.hideThinkingBlock) {
|
|
92
92
|
// Show static "Thinking..." label when hidden
|
|
@@ -109,7 +109,7 @@ export class AssistantMessageComponent extends Container {
|
|
|
109
109
|
|
|
110
110
|
// Check if aborted - show after partial content
|
|
111
111
|
// But only if there are no tool calls (tool execution components will show the error)
|
|
112
|
-
const hasToolCalls = message.content.some(
|
|
112
|
+
const hasToolCalls = message.content.some(c => c.type === "toolCall");
|
|
113
113
|
if (!hasToolCalls) {
|
|
114
114
|
if (message.stopReason === "aborted") {
|
|
115
115
|
const abortMessage =
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Component for displaying bash command execution with streaming output.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import { getSymbolTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
6
|
-
import type { TruncationMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
|
|
7
|
-
import { formatSize } from "@oh-my-pi/pi-coding-agent/tools/truncate";
|
|
8
4
|
import { Container, Loader, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
9
5
|
import stripAnsi from "strip-ansi";
|
|
6
|
+
import { getSymbolTheme, theme } from "../../modes/theme/theme";
|
|
7
|
+
import type { TruncationMeta } from "../../tools/output-meta";
|
|
8
|
+
import { formatSize } from "../../tools/truncate";
|
|
10
9
|
import { DynamicBorder } from "./dynamic-border";
|
|
11
10
|
import { truncateToVisualLines } from "./visual-truncate";
|
|
12
11
|
|
|
@@ -48,8 +47,8 @@ export class BashExecutionComponent extends Container {
|
|
|
48
47
|
// Loader
|
|
49
48
|
this.loader = new Loader(
|
|
50
49
|
ui,
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
spinner => theme.fg(colorKey, spinner),
|
|
51
|
+
text => theme.fg("muted", text),
|
|
53
52
|
`Running${theme.format.ellipsis} (esc to cancel)`,
|
|
54
53
|
getSymbolTheme().spinnerFrames,
|
|
55
54
|
);
|
|
@@ -128,11 +127,11 @@ export class BashExecutionComponent extends Container {
|
|
|
128
127
|
if (availableLines.length > 0) {
|
|
129
128
|
if (this.expanded) {
|
|
130
129
|
// Show all lines
|
|
131
|
-
const displayText = availableLines.map(
|
|
130
|
+
const displayText = availableLines.map(line => theme.fg("muted", line)).join("\n");
|
|
132
131
|
this.contentContainer.addChild(new Text(`\n${displayText}`, 1, 0));
|
|
133
132
|
} else {
|
|
134
133
|
// Use shared visual truncation utility, recomputed per render width
|
|
135
|
-
const styledOutput = previewLogicalLines.map(
|
|
134
|
+
const styledOutput = previewLogicalLines.map(line => theme.fg("muted", line)).join("\n");
|
|
136
135
|
const previewText = `\n${styledOutput}`;
|
|
137
136
|
this.contentContainer.addChild({
|
|
138
137
|
render: (width: number) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
2
1
|
import { CancellableLoader, Container, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
2
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
3
3
|
import { DynamicBorder } from "./dynamic-border";
|
|
4
4
|
|
|
5
5
|
/** Loader wrapped with borders for hook UI */
|
|
@@ -12,8 +12,8 @@ export class BorderedLoader extends Container {
|
|
|
12
12
|
this.addChild(new DynamicBorder(borderColor));
|
|
13
13
|
this.loader = new CancellableLoader(
|
|
14
14
|
tui,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
s => theme.fg("accent", s),
|
|
16
|
+
s => theme.fg("muted", s),
|
|
17
17
|
message,
|
|
18
18
|
);
|
|
19
19
|
this.addChild(this.loader);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getMarkdownTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
2
|
-
import type { BranchSummaryMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
|
|
3
1
|
import { Box, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
2
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
3
|
+
import type { BranchSummaryMessage } from "../../session/messages";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Component that renders a branch summary message with collapsed/expanded state.
|
|
@@ -11,7 +11,7 @@ export class BranchSummaryMessageComponent extends Box {
|
|
|
11
11
|
private message: BranchSummaryMessage;
|
|
12
12
|
|
|
13
13
|
constructor(message: BranchSummaryMessage) {
|
|
14
|
-
super(1, 1,
|
|
14
|
+
super(1, 1, t => theme.bg("customMessageBg", t));
|
|
15
15
|
this.message = message;
|
|
16
16
|
this.updateDisplay();
|
|
17
17
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { getMarkdownTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
2
|
-
import type { CompactionSummaryMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
|
|
3
1
|
import { Box, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
2
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
3
|
+
import type { CompactionSummaryMessage } from "../../session/messages";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Component that renders a compaction message with collapsed/expanded state.
|
|
@@ -11,7 +11,7 @@ export class CompactionSummaryMessageComponent extends Box {
|
|
|
11
11
|
private message: CompactionSummaryMessage;
|
|
12
12
|
|
|
13
13
|
constructor(message: CompactionSummaryMessage) {
|
|
14
|
-
super(1, 1,
|
|
14
|
+
super(1, 1, t => theme.bg("customMessageBg", t));
|
|
15
15
|
this.message = message;
|
|
16
16
|
this.updateDisplay();
|
|
17
17
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { TextContent } from "@oh-my-pi/pi-ai";
|
|
2
|
-
import type { MessageRenderer } from "@oh-my-pi/pi-coding-agent/extensibility/extensions/types";
|
|
3
|
-
import { getMarkdownTheme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
4
|
-
import type { CustomMessage } 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 { MessageRenderer } from "../../extensibility/extensions/types";
|
|
5
|
+
import { getMarkdownTheme, theme } from "../../modes/theme/theme";
|
|
6
|
+
import type { CustomMessage } from "../../session/messages";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Component that renders a custom message entry from extensions.
|
|
@@ -24,7 +24,7 @@ export class CustomMessageComponent extends Container {
|
|
|
24
24
|
this.addChild(new Spacer(1));
|
|
25
25
|
|
|
26
26
|
// Create box with custom 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
|
}
|
|
@@ -79,7 +79,7 @@ export class CustomMessageComponent extends Container {
|
|
|
79
79
|
} else {
|
|
80
80
|
text = this.message.content
|
|
81
81
|
.filter((c): c is TextContent => c.type === "text")
|
|
82
|
-
.map(
|
|
82
|
+
.map(c => c.text)
|
|
83
83
|
.join("\n");
|
|
84
84
|
}
|
|
85
85
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
2
1
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
2
|
+
import { theme } from "../../modes/theme/theme";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Dynamic border component that adjusts to viewport width.
|
|
@@ -11,7 +11,7 @@ import type { Component } from "@oh-my-pi/pi-tui";
|
|
|
11
11
|
export class DynamicBorder implements Component {
|
|
12
12
|
private color: (str: string) => string;
|
|
13
13
|
|
|
14
|
-
constructor(color: (str: string) => string =
|
|
14
|
+
constructor(color: (str: string) => string = str => theme.fg("border", str)) {
|
|
15
15
|
this.color = color;
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
* - Space: Toggle selected item (or master switch)
|
|
12
12
|
* - Esc: Close dashboard (clears search first if active)
|
|
13
13
|
*/
|
|
14
|
-
|
|
15
|
-
import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
16
|
-
import { DynamicBorder } from "@oh-my-pi/pi-coding-agent/modes/components/dynamic-border";
|
|
17
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
18
14
|
import { type Component, Container, matchesKey, Spacer, Text, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
|
|
15
|
+
import type { SettingsManager } from "../../../config/settings-manager";
|
|
16
|
+
import { DynamicBorder } from "../../../modes/components/dynamic-border";
|
|
17
|
+
import { theme } from "../../../modes/theme/theme";
|
|
19
18
|
import { ExtensionList } from "./extension-list";
|
|
20
19
|
import { InspectorPanel } from "./inspector-panel";
|
|
21
20
|
import { applyFilter, createInitialState, filterByProvider, refreshState, toggleProvider } from "./state-manager";
|
|
@@ -60,14 +59,14 @@ export class ExtensionDashboard extends Container {
|
|
|
60
59
|
this.mainList = new ExtensionList(
|
|
61
60
|
this.state.searchFiltered,
|
|
62
61
|
{
|
|
63
|
-
onSelectionChange:
|
|
62
|
+
onSelectionChange: ext => {
|
|
64
63
|
this.state.selected = ext;
|
|
65
64
|
this.inspector.setExtension(ext);
|
|
66
65
|
},
|
|
67
66
|
onToggle: (extensionId, enabled) => {
|
|
68
67
|
this.handleExtensionToggle(extensionId, enabled);
|
|
69
68
|
},
|
|
70
|
-
onMasterToggle:
|
|
69
|
+
onMasterToggle: providerId => {
|
|
71
70
|
this.handleProviderToggle(providerId);
|
|
72
71
|
},
|
|
73
72
|
masterSwitchProvider: this.getActiveProviderId(),
|
|
@@ -176,7 +175,7 @@ export class ExtensionDashboard extends Container {
|
|
|
176
175
|
|
|
177
176
|
// Find the same tab in the new (re-sorted) list
|
|
178
177
|
if (currentTabId) {
|
|
179
|
-
const newIndex = this.state.tabs.findIndex(
|
|
178
|
+
const newIndex = this.state.tabs.findIndex(t => t.id === currentTabId);
|
|
180
179
|
if (newIndex >= 0) {
|
|
181
180
|
this.state.activeTabIndex = newIndex;
|
|
182
181
|
}
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
* that toggles the entire provider. All items below are dimmed when the
|
|
6
6
|
* master switch is off.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
import { isProviderEnabled } from "@oh-my-pi/pi-coding-agent/discovery";
|
|
10
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
11
8
|
import { type Component, matchesKey, truncateToWidth, visibleWidth } from "@oh-my-pi/pi-tui";
|
|
9
|
+
import { isProviderEnabled } from "../../../discovery";
|
|
10
|
+
import { theme } from "../../../modes/theme/theme";
|
|
12
11
|
import { applyFilter } from "./state-manager";
|
|
13
12
|
import type { Extension, ExtensionKind, ExtensionState } from "./types";
|
|
14
13
|
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Shows name, description, origin, status, and kind-specific preview.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { homedir } from "node:os";
|
|
8
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
6
|
+
import * as os from "node:os";
|
|
9
7
|
import { type Component, truncateToWidth, wrapTextWithAnsi } from "@oh-my-pi/pi-tui";
|
|
8
|
+
import { theme } from "../../../modes/theme/theme";
|
|
10
9
|
import type { Extension, ExtensionState } from "./types";
|
|
11
10
|
|
|
12
11
|
export class InspectorPanel implements Component {
|
|
@@ -304,7 +303,7 @@ export class InspectorPanel implements Component {
|
|
|
304
303
|
}
|
|
305
304
|
|
|
306
305
|
private shortenPath(path: string): string {
|
|
307
|
-
const home = homedir();
|
|
306
|
+
const home = os.homedir();
|
|
308
307
|
if (home && path.startsWith(home)) {
|
|
309
308
|
return `~${path.slice(home.length)}`;
|
|
310
309
|
}
|