@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
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
2
2
|
import type { OAuthProvider } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
3
|
+
import type { Component } from "@oh-my-pi/pi-tui";
|
|
4
|
+
import { Input, Loader, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
5
|
+
import { getAgentDbPath } from "../../config";
|
|
6
|
+
import { disableProvider, enableProvider } from "../../discovery";
|
|
7
|
+
import { AssistantMessageComponent } from "../../modes/components/assistant-message";
|
|
8
|
+
import { ExtensionDashboard } from "../../modes/components/extensions";
|
|
9
|
+
import { HistorySearchComponent } from "../../modes/components/history-search";
|
|
10
|
+
import { ModelSelectorComponent } from "../../modes/components/model-selector";
|
|
11
|
+
import { OAuthSelectorComponent } from "../../modes/components/oauth-selector";
|
|
12
|
+
import { SessionSelectorComponent } from "../../modes/components/session-selector";
|
|
13
|
+
import { SettingsSelectorComponent } from "../../modes/components/settings-selector";
|
|
14
|
+
import { ToolExecutionComponent } from "../../modes/components/tool-execution";
|
|
15
|
+
import { TreeSelectorComponent } from "../../modes/components/tree-selector";
|
|
16
|
+
import { UserMessageSelectorComponent } from "../../modes/components/user-message-selector";
|
|
15
17
|
import {
|
|
16
18
|
getAvailableThemes,
|
|
17
19
|
getSymbolTheme,
|
|
20
|
+
setColorBlindMode,
|
|
18
21
|
setSymbolPreset,
|
|
19
22
|
setTheme,
|
|
20
23
|
theme,
|
|
21
|
-
} from "
|
|
22
|
-
import type { InteractiveModeContext } from "
|
|
23
|
-
import { SessionManager } from "
|
|
24
|
-
import { setPreferredImageProvider, setPreferredWebSearchProvider } from "
|
|
25
|
-
import type { Component } from "@oh-my-pi/pi-tui";
|
|
26
|
-
import { Input, Loader, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
24
|
+
} from "../../modes/theme/theme";
|
|
25
|
+
import type { InteractiveModeContext } from "../../modes/types";
|
|
26
|
+
import { SessionManager } from "../../session/session-manager";
|
|
27
|
+
import { setPreferredImageProvider, setPreferredWebSearchProvider } from "../../tools";
|
|
27
28
|
|
|
28
29
|
export class SelectorController {
|
|
29
30
|
constructor(private ctx: InteractiveModeContext) {}
|
|
@@ -46,49 +47,52 @@ export class SelectorController {
|
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
showSettingsSelector(): void {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
{
|
|
59
|
-
onChange: (id, value) => this.handleSettingChange(id, value),
|
|
60
|
-
onThemePreview: (themeName) => {
|
|
61
|
-
const result = setTheme(themeName, true);
|
|
62
|
-
if (result.success) {
|
|
63
|
-
this.ctx.ui.invalidate();
|
|
64
|
-
this.ctx.ui.requestRender();
|
|
65
|
-
}
|
|
50
|
+
getAvailableThemes().then(availableThemes => {
|
|
51
|
+
this.showSelector(done => {
|
|
52
|
+
const selector = new SettingsSelectorComponent(
|
|
53
|
+
this.ctx.settingsManager,
|
|
54
|
+
{
|
|
55
|
+
availableThinkingLevels: this.ctx.session.getAvailableThinkingLevels(),
|
|
56
|
+
thinkingLevel: this.ctx.session.thinkingLevel,
|
|
57
|
+
availableThemes,
|
|
58
|
+
cwd: process.cwd(),
|
|
66
59
|
},
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
60
|
+
{
|
|
61
|
+
onChange: (id, value) => this.handleSettingChange(id, value),
|
|
62
|
+
onThemePreview: themeName => {
|
|
63
|
+
setTheme(themeName, true).then(result => {
|
|
64
|
+
if (result.success) {
|
|
65
|
+
this.ctx.ui.invalidate();
|
|
66
|
+
this.ctx.ui.requestRender();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
onStatusLinePreview: settings => {
|
|
71
|
+
// Update status line with preview settings
|
|
72
|
+
const currentSettings = this.ctx.settingsManager.getStatusLineSettings();
|
|
73
|
+
this.ctx.statusLine.updateSettings({ ...currentSettings, ...settings });
|
|
74
|
+
this.ctx.updateEditorTopBorder();
|
|
75
|
+
this.ctx.ui.requestRender();
|
|
76
|
+
},
|
|
77
|
+
getStatusLinePreview: () => {
|
|
78
|
+
// Return the rendered status line for inline preview
|
|
79
|
+
const width = this.ctx.ui.getWidth();
|
|
80
|
+
return this.ctx.statusLine.getTopBorder(width).content;
|
|
81
|
+
},
|
|
82
|
+
onPluginsChanged: () => {
|
|
83
|
+
this.ctx.ui.requestRender();
|
|
84
|
+
},
|
|
85
|
+
onCancel: () => {
|
|
86
|
+
done();
|
|
87
|
+
// Restore status line to saved settings
|
|
88
|
+
this.ctx.statusLine.updateSettings(this.ctx.settingsManager.getStatusLineSettings());
|
|
89
|
+
this.ctx.updateEditorTopBorder();
|
|
90
|
+
this.ctx.ui.requestRender();
|
|
91
|
+
},
|
|
88
92
|
},
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
);
|
|
94
|
+
return { component: selector, focus: selector };
|
|
95
|
+
});
|
|
92
96
|
});
|
|
93
97
|
}
|
|
94
98
|
|
|
@@ -96,10 +100,10 @@ export class SelectorController {
|
|
|
96
100
|
const historyStorage = this.ctx.historyStorage;
|
|
97
101
|
if (!historyStorage) return;
|
|
98
102
|
|
|
99
|
-
this.showSelector(
|
|
103
|
+
this.showSelector(done => {
|
|
100
104
|
const component = new HistorySearchComponent(
|
|
101
105
|
historyStorage,
|
|
102
|
-
|
|
106
|
+
prompt => {
|
|
103
107
|
done();
|
|
104
108
|
this.ctx.editor.setText(prompt);
|
|
105
109
|
this.ctx.ui.requestRender();
|
|
@@ -123,7 +127,7 @@ export class SelectorController {
|
|
|
123
127
|
this.ctx.settingsManager,
|
|
124
128
|
this.ctx.ui.terminal.rows,
|
|
125
129
|
);
|
|
126
|
-
this.showSelector(
|
|
130
|
+
this.showSelector(done => {
|
|
127
131
|
dashboard.onClose = () => {
|
|
128
132
|
done();
|
|
129
133
|
this.ctx.ui.requestRender();
|
|
@@ -189,20 +193,28 @@ export class SelectorController {
|
|
|
189
193
|
this.ctx.rebuildChatFromMessages();
|
|
190
194
|
break;
|
|
191
195
|
case "theme": {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
setTheme(value as string, true).then(result => {
|
|
197
|
+
this.ctx.statusLine.invalidate();
|
|
198
|
+
this.ctx.updateEditorTopBorder();
|
|
199
|
+
this.ctx.ui.invalidate();
|
|
200
|
+
if (!result.success) {
|
|
201
|
+
this.ctx.showError(`Failed to load theme "${value}": ${result.error}\nFell back to dark theme.`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
199
204
|
break;
|
|
200
205
|
}
|
|
201
206
|
case "symbolPreset": {
|
|
202
|
-
setSymbolPreset(value as "unicode" | "nerd" | "ascii")
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
207
|
+
setSymbolPreset(value as "unicode" | "nerd" | "ascii").then(() => {
|
|
208
|
+
this.ctx.statusLine.invalidate();
|
|
209
|
+
this.ctx.updateEditorTopBorder();
|
|
210
|
+
this.ctx.ui.invalidate();
|
|
211
|
+
});
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
case "colorBlindMode": {
|
|
215
|
+
setColorBlindMode(value === "true" || value === true).then(() => {
|
|
216
|
+
this.ctx.ui.invalidate();
|
|
217
|
+
});
|
|
206
218
|
break;
|
|
207
219
|
}
|
|
208
220
|
case "statusLinePreset":
|
|
@@ -239,7 +251,7 @@ export class SelectorController {
|
|
|
239
251
|
}
|
|
240
252
|
|
|
241
253
|
showModelSelector(options?: { temporaryOnly?: boolean }): void {
|
|
242
|
-
this.showSelector(
|
|
254
|
+
this.showSelector(done => {
|
|
243
255
|
const selector = new ModelSelectorComponent(
|
|
244
256
|
this.ctx.ui,
|
|
245
257
|
this.ctx.session.model,
|
|
@@ -291,10 +303,10 @@ export class SelectorController {
|
|
|
291
303
|
return;
|
|
292
304
|
}
|
|
293
305
|
|
|
294
|
-
this.showSelector(
|
|
306
|
+
this.showSelector(done => {
|
|
295
307
|
const selector = new UserMessageSelectorComponent(
|
|
296
|
-
userMessages.map(
|
|
297
|
-
async
|
|
308
|
+
userMessages.map(m => ({ id: m.entryId, text: m.text })),
|
|
309
|
+
async entryId => {
|
|
298
310
|
const result = await this.ctx.session.branch(entryId);
|
|
299
311
|
if (result.cancelled) {
|
|
300
312
|
// Hook cancelled the branch
|
|
@@ -336,12 +348,12 @@ export class SelectorController {
|
|
|
336
348
|
return;
|
|
337
349
|
}
|
|
338
350
|
|
|
339
|
-
this.showSelector(
|
|
351
|
+
this.showSelector(done => {
|
|
340
352
|
const selector = new TreeSelectorComponent(
|
|
341
353
|
tree,
|
|
342
354
|
visibleLeafId,
|
|
343
355
|
this.ctx.ui.terminal.rows,
|
|
344
|
-
async
|
|
356
|
+
async entryId => {
|
|
345
357
|
// Selecting the visible leaf is a no-op (already there)
|
|
346
358
|
if (entryId === visibleLeafId) {
|
|
347
359
|
done();
|
|
@@ -396,8 +408,8 @@ export class SelectorController {
|
|
|
396
408
|
this.ctx.chatContainer.addChild(new Spacer(1));
|
|
397
409
|
summaryLoader = new Loader(
|
|
398
410
|
this.ctx.ui,
|
|
399
|
-
|
|
400
|
-
|
|
411
|
+
spinner => theme.fg("accent", spinner),
|
|
412
|
+
text => theme.fg("muted", text),
|
|
401
413
|
"Summarizing branch... (esc to cancel)",
|
|
402
414
|
getSymbolTheme().spinnerFrames,
|
|
403
415
|
);
|
|
@@ -453,15 +465,15 @@ export class SelectorController {
|
|
|
453
465
|
});
|
|
454
466
|
}
|
|
455
467
|
|
|
456
|
-
showSessionSelector(): void {
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
468
|
+
async showSessionSelector(): Promise<void> {
|
|
469
|
+
const sessions = await SessionManager.list(
|
|
470
|
+
this.ctx.sessionManager.getCwd(),
|
|
471
|
+
this.ctx.sessionManager.getSessionDir(),
|
|
472
|
+
);
|
|
473
|
+
this.showSelector(done => {
|
|
462
474
|
const selector = new SessionSelectorComponent(
|
|
463
475
|
sessions,
|
|
464
|
-
async
|
|
476
|
+
async sessionPath => {
|
|
465
477
|
done();
|
|
466
478
|
await this.handleResumeSession(sessionPath);
|
|
467
479
|
},
|
|
@@ -505,14 +517,14 @@ export class SelectorController {
|
|
|
505
517
|
async showOAuthSelector(mode: "login" | "logout"): Promise<void> {
|
|
506
518
|
if (mode === "logout") {
|
|
507
519
|
const providers = this.ctx.session.modelRegistry.authStorage.list();
|
|
508
|
-
const loggedInProviders = providers.filter(
|
|
520
|
+
const loggedInProviders = providers.filter(p => this.ctx.session.modelRegistry.authStorage.hasOAuth(p));
|
|
509
521
|
if (loggedInProviders.length === 0) {
|
|
510
522
|
this.ctx.showStatus("No OAuth providers logged in. Use /login first.");
|
|
511
523
|
return;
|
|
512
524
|
}
|
|
513
525
|
}
|
|
514
526
|
|
|
515
|
-
this.showSelector(
|
|
527
|
+
this.showSelector(done => {
|
|
516
528
|
const selector = new OAuthSelectorComponent(
|
|
517
529
|
mode,
|
|
518
530
|
this.ctx.session.modelRegistry.authStorage,
|
|
@@ -546,7 +558,7 @@ export class SelectorController {
|
|
|
546
558
|
}
|
|
547
559
|
this.ctx.ui.requestRender();
|
|
548
560
|
|
|
549
|
-
return new Promise<string>(
|
|
561
|
+
return new Promise<string>(resolve => {
|
|
550
562
|
const codeInput = new Input();
|
|
551
563
|
codeInput.onSubmit = () => {
|
|
552
564
|
const code = codeInput.getValue();
|
package/src/modes/index.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { emergencyTerminalRestore } from "@oh-my-pi/pi-tui";
|
|
2
|
+
import { postmortem } from "@oh-my-pi/pi-utils";
|
|
3
|
+
|
|
1
4
|
/**
|
|
2
5
|
* Run modes for the coding agent.
|
|
3
6
|
*/
|
|
@@ -7,9 +10,6 @@ export { type ModelInfo, RpcClient, type RpcClientOptions, type RpcEventListener
|
|
|
7
10
|
export { runRpcMode } from "./rpc/rpc-mode";
|
|
8
11
|
export type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc/rpc-types";
|
|
9
12
|
|
|
10
|
-
import { emergencyTerminalRestore } from "@oh-my-pi/pi-tui";
|
|
11
|
-
import { postmortem } from "@oh-my-pi/pi-utils";
|
|
12
|
-
|
|
13
13
|
postmortem.register("terminal-restore", () => {
|
|
14
14
|
emergencyTerminalRestore();
|
|
15
15
|
});
|
|
@@ -2,20 +2,9 @@
|
|
|
2
2
|
* Interactive mode for the coding agent.
|
|
3
3
|
* Handles TUI rendering and user interaction, delegating business logic to AgentSession.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
import * as path from "node:path";
|
|
7
6
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
8
7
|
import type { AssistantMessage, ImageContent, Message, UsageReport } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import { KeybindingsManager } from "@oh-my-pi/pi-coding-agent/config/keybindings";
|
|
10
|
-
import type { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
11
|
-
import type { ExtensionUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/extensions";
|
|
12
|
-
import type { CompactOptions } from "@oh-my-pi/pi-coding-agent/extensibility/extensions/types";
|
|
13
|
-
import { loadSlashCommands } from "@oh-my-pi/pi-coding-agent/extensibility/slash-commands";
|
|
14
|
-
import type { AgentSession, AgentSessionEvent } from "@oh-my-pi/pi-coding-agent/session/agent-session";
|
|
15
|
-
import { HistoryStorage } from "@oh-my-pi/pi-coding-agent/session/history-storage";
|
|
16
|
-
import type { SessionContext, SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
17
|
-
import { getRecentSessions } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
18
|
-
import { setTerminalTitle } from "@oh-my-pi/pi-coding-agent/utils/title-generator";
|
|
19
8
|
import type { Component, Loader, SlashCommand } from "@oh-my-pi/pi-tui";
|
|
20
9
|
import {
|
|
21
10
|
CombinedAutocompleteProvider,
|
|
@@ -26,8 +15,18 @@ import {
|
|
|
26
15
|
Text,
|
|
27
16
|
TUI,
|
|
28
17
|
} from "@oh-my-pi/pi-tui";
|
|
29
|
-
import { logger, postmortem } from "@oh-my-pi/pi-utils";
|
|
18
|
+
import { isEnoent, logger, postmortem } from "@oh-my-pi/pi-utils";
|
|
30
19
|
import chalk from "chalk";
|
|
20
|
+
import { KeybindingsManager } from "../config/keybindings";
|
|
21
|
+
import type { SettingsManager } from "../config/settings-manager";
|
|
22
|
+
import type { ExtensionUIContext } from "../extensibility/extensions";
|
|
23
|
+
import type { CompactOptions } from "../extensibility/extensions/types";
|
|
24
|
+
import { loadSlashCommands } from "../extensibility/slash-commands";
|
|
25
|
+
import type { AgentSession, AgentSessionEvent } from "../session/agent-session";
|
|
26
|
+
import { HistoryStorage } from "../session/history-storage";
|
|
27
|
+
import type { SessionContext, SessionManager } from "../session/session-manager";
|
|
28
|
+
import { getRecentSessions } from "../session/session-manager";
|
|
29
|
+
import { setTerminalTitle } from "../utils/title-generator";
|
|
31
30
|
import type { AssistantMessageComponent } from "./components/assistant-message";
|
|
32
31
|
import type { BashExecutionComponent } from "./components/bash-execution";
|
|
33
32
|
import { CustomEditor } from "./components/custom-editor";
|
|
@@ -207,14 +206,14 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
207
206
|
];
|
|
208
207
|
|
|
209
208
|
// Convert hook commands to SlashCommand format
|
|
210
|
-
const hookCommands: SlashCommand[] = (this.session.extensionRunner?.getRegisteredCommands() ?? []).map(
|
|
209
|
+
const hookCommands: SlashCommand[] = (this.session.extensionRunner?.getRegisteredCommands() ?? []).map(cmd => ({
|
|
211
210
|
name: cmd.name,
|
|
212
211
|
description: cmd.description ?? "(hook command)",
|
|
213
212
|
getArgumentCompletions: cmd.getArgumentCompletions,
|
|
214
213
|
}));
|
|
215
214
|
|
|
216
215
|
// Convert custom commands (TypeScript) to SlashCommand format
|
|
217
|
-
const customCommands: SlashCommand[] = this.session.customCommands.map(
|
|
216
|
+
const customCommands: SlashCommand[] = this.session.customCommands.map(loaded => ({
|
|
218
217
|
name: loaded.command.name,
|
|
219
218
|
description: `${loaded.command.description} (${loaded.source})`,
|
|
220
219
|
}));
|
|
@@ -250,8 +249,8 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
250
249
|
|
|
251
250
|
// Load and convert file commands to SlashCommand format (async)
|
|
252
251
|
const fileCommands = await loadSlashCommands({ cwd: process.cwd() });
|
|
253
|
-
this.fileSlashCommands = new Set(fileCommands.map(
|
|
254
|
-
const fileSlashCommands: SlashCommand[] = fileCommands.map(
|
|
252
|
+
this.fileSlashCommands = new Set(fileCommands.map(cmd => cmd.name));
|
|
253
|
+
const fileSlashCommands: SlashCommand[] = fileCommands.map(cmd => ({
|
|
255
254
|
name: cmd.name,
|
|
256
255
|
description: cmd.description,
|
|
257
256
|
}));
|
|
@@ -268,14 +267,14 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
268
267
|
const providerName = this.session.model?.provider ?? "Unknown";
|
|
269
268
|
|
|
270
269
|
// Get recent sessions
|
|
271
|
-
const recentSessions = getRecentSessions(this.sessionManager.getSessionDir()).map(
|
|
270
|
+
const recentSessions = (await getRecentSessions(this.sessionManager.getSessionDir())).map(s => ({
|
|
272
271
|
name: s.name,
|
|
273
272
|
timeAgo: s.timeAgo,
|
|
274
273
|
}));
|
|
275
274
|
|
|
276
275
|
// Convert LSP servers to welcome format
|
|
277
276
|
const lspServerInfo =
|
|
278
|
-
this.lspServers?.map(
|
|
277
|
+
this.lspServers?.map(s => ({
|
|
279
278
|
name: s.name,
|
|
280
279
|
status: s.status as "ready" | "error" | "connecting",
|
|
281
280
|
fileTypes: s.fileTypes,
|
|
@@ -364,7 +363,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
364
363
|
|
|
365
364
|
async getUserInput(): Promise<{ text: string; images?: ImageContent[] }> {
|
|
366
365
|
const { promise, resolve } = Promise.withResolvers<{ text: string; images?: ImageContent[] }>();
|
|
367
|
-
this.onInputCallback =
|
|
366
|
+
this.onInputCallback = input => {
|
|
368
367
|
this.onInputCallback = undefined;
|
|
369
368
|
resolve(input);
|
|
370
369
|
};
|
|
@@ -452,17 +451,16 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
452
451
|
}
|
|
453
452
|
const artifactsDir = sessionFile.slice(0, -6);
|
|
454
453
|
const todoPath = path.join(artifactsDir, TODO_FILE_NAME);
|
|
455
|
-
const file = Bun.file(todoPath);
|
|
456
|
-
if (!(await file.exists())) {
|
|
457
|
-
this.renderTodoList();
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
454
|
try {
|
|
461
|
-
const data = (await file.json()) as { todos?: TodoItem[] };
|
|
455
|
+
const data = (await Bun.file(todoPath).json()) as { todos?: TodoItem[] };
|
|
462
456
|
if (data?.todos && Array.isArray(data.todos)) {
|
|
463
457
|
this.todoItems = data.todos;
|
|
464
458
|
}
|
|
465
459
|
} catch (error) {
|
|
460
|
+
if (isEnoent(error)) {
|
|
461
|
+
this.renderTodoList();
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
466
464
|
logger.warn("Failed to load todos", { path: todoPath, error: String(error) });
|
|
467
465
|
}
|
|
468
466
|
this.renderTodoList();
|
|
@@ -612,16 +610,16 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
612
610
|
return this.commandController.handleCopyCommand();
|
|
613
611
|
}
|
|
614
612
|
|
|
615
|
-
handleSessionCommand(): void {
|
|
616
|
-
this.commandController.handleSessionCommand();
|
|
613
|
+
handleSessionCommand(): Promise<void> {
|
|
614
|
+
return this.commandController.handleSessionCommand();
|
|
617
615
|
}
|
|
618
616
|
|
|
619
617
|
handleUsageCommand(reports?: UsageReport[] | null): Promise<void> {
|
|
620
618
|
return this.commandController.handleUsageCommand(reports);
|
|
621
619
|
}
|
|
622
620
|
|
|
623
|
-
handleChangelogCommand(): void {
|
|
624
|
-
this.commandController.handleChangelogCommand();
|
|
621
|
+
async handleChangelogCommand(): Promise<void> {
|
|
622
|
+
await this.commandController.handleChangelogCommand();
|
|
625
623
|
}
|
|
626
624
|
|
|
627
625
|
handleHotkeysCommand(): void {
|
package/src/modes/print-mode.ts
CHANGED
|
@@ -5,9 +5,8 @@
|
|
|
5
5
|
* - `omp -p "prompt"` - text output
|
|
6
6
|
* - `omp --mode json "prompt"` - JSON event stream
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
8
|
import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
|
|
10
|
-
import type { AgentSession } from "
|
|
9
|
+
import type { AgentSession } from "../session/agent-session";
|
|
11
10
|
|
|
12
11
|
/**
|
|
13
12
|
* Options for print mode.
|
|
@@ -44,12 +43,12 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
44
43
|
// ExtensionActions
|
|
45
44
|
{
|
|
46
45
|
sendMessage: (message, options) => {
|
|
47
|
-
session.sendCustomMessage(message, options).catch(
|
|
46
|
+
session.sendCustomMessage(message, options).catch(e => {
|
|
48
47
|
process.stderr.write(`Extension sendMessage failed: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
49
48
|
});
|
|
50
49
|
},
|
|
51
50
|
sendUserMessage: (content, options) => {
|
|
52
|
-
session.sendUserMessage(content, options).catch(
|
|
51
|
+
session.sendUserMessage(content, options).catch(e => {
|
|
53
52
|
process.stderr.write(
|
|
54
53
|
`Extension sendUserMessage failed: ${e instanceof Error ? e.message : String(e)}\n`,
|
|
55
54
|
);
|
|
@@ -64,14 +63,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
64
63
|
getActiveTools: () => session.getActiveToolNames(),
|
|
65
64
|
getAllTools: () => session.getAllToolNames(),
|
|
66
65
|
setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
|
|
67
|
-
setModel: async
|
|
66
|
+
setModel: async model => {
|
|
68
67
|
const key = await session.modelRegistry.getApiKey(model);
|
|
69
68
|
if (!key) return false;
|
|
70
69
|
await session.setModel(model);
|
|
71
70
|
return true;
|
|
72
71
|
},
|
|
73
72
|
getThinkingLevel: () => session.thinkingLevel,
|
|
74
|
-
setThinkingLevel:
|
|
73
|
+
setThinkingLevel: level => session.setThinkingLevel(level),
|
|
75
74
|
},
|
|
76
75
|
// ExtensionContextActions
|
|
77
76
|
{
|
|
@@ -81,7 +80,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
81
80
|
hasPendingMessages: () => session.queuedMessageCount > 0,
|
|
82
81
|
shutdown: () => {},
|
|
83
82
|
getContextUsage: () => session.getContextUsage(),
|
|
84
|
-
compact: async
|
|
83
|
+
compact: async instructionsOrOptions => {
|
|
85
84
|
const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
|
|
86
85
|
const options =
|
|
87
86
|
instructionsOrOptions && typeof instructionsOrOptions === "object"
|
|
@@ -94,14 +93,14 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
94
93
|
{
|
|
95
94
|
getContextUsage: () => session.getContextUsage(),
|
|
96
95
|
waitForIdle: () => session.agent.waitForIdle(),
|
|
97
|
-
newSession: async
|
|
96
|
+
newSession: async options => {
|
|
98
97
|
const success = await session.newSession({ parentSession: options?.parentSession });
|
|
99
98
|
if (success && options?.setup) {
|
|
100
99
|
await options.setup(session.sessionManager);
|
|
101
100
|
}
|
|
102
101
|
return { cancelled: !success };
|
|
103
102
|
},
|
|
104
|
-
branch: async
|
|
103
|
+
branch: async entryId => {
|
|
105
104
|
const result = await session.branch(entryId);
|
|
106
105
|
return { cancelled: result.cancelled };
|
|
107
106
|
},
|
|
@@ -109,7 +108,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
109
108
|
const result = await session.navigateTree(targetId, { summarize: options?.summarize });
|
|
110
109
|
return { cancelled: result.cancelled };
|
|
111
110
|
},
|
|
112
|
-
compact: async
|
|
111
|
+
compact: async instructionsOrOptions => {
|
|
113
112
|
const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
|
|
114
113
|
const options =
|
|
115
114
|
instructionsOrOptions && typeof instructionsOrOptions === "object"
|
|
@@ -120,7 +119,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
120
119
|
},
|
|
121
120
|
// No UI context
|
|
122
121
|
);
|
|
123
|
-
extensionRunner.onError(
|
|
122
|
+
extensionRunner.onError(err => {
|
|
124
123
|
process.stderr.write(`Extension error (${err.extensionPath}): ${err.error}\n`);
|
|
125
124
|
});
|
|
126
125
|
// Emit session_start event
|
|
@@ -130,7 +129,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
130
129
|
}
|
|
131
130
|
|
|
132
131
|
// Always subscribe to enable session persistence via _handleAgentEvent
|
|
133
|
-
session.subscribe(
|
|
132
|
+
session.subscribe(event => {
|
|
134
133
|
// In JSON mode, output all events
|
|
135
134
|
if (mode === "json") {
|
|
136
135
|
process.stdout.write(`${JSON.stringify(event)}\n`);
|
|
@@ -173,7 +172,7 @@ export async function runPrintMode(session: AgentSession, options: PrintModeOpti
|
|
|
173
172
|
// Ensure stdout is fully flushed before returning
|
|
174
173
|
// This prevents race conditions where the process exits before all output is written
|
|
175
174
|
await new Promise<void>((resolve, reject) => {
|
|
176
|
-
process.stdout.write("",
|
|
175
|
+
process.stdout.write("", err => {
|
|
177
176
|
if (err) reject(err);
|
|
178
177
|
else resolve();
|
|
179
178
|
});
|
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Spawns the agent in RPC mode and provides a typed API for all operations.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
6
|
import type { AgentEvent, AgentMessage, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
8
7
|
import type { ImageContent } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import type { BashResult } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
|
|
10
|
-
import type { SessionStats } from "@oh-my-pi/pi-coding-agent/session/agent-session";
|
|
11
|
-
import type { CompactionResult } from "@oh-my-pi/pi-coding-agent/session/compaction";
|
|
12
8
|
import { createSanitizerStream, createSplitterStream, createTextDecoderStream, ptree } from "@oh-my-pi/pi-utils";
|
|
9
|
+
import type { BashResult } from "../../exec/bash-executor";
|
|
10
|
+
import type { SessionStats } from "../../session/agent-session";
|
|
11
|
+
import type { CompactionResult } from "../../session/compaction";
|
|
13
12
|
import type { RpcCommand, RpcResponse, RpcSessionState } from "./rpc-types";
|
|
14
13
|
|
|
15
14
|
/** Distributive Omit that works with union types */
|
|
@@ -372,7 +371,7 @@ export class RpcClient {
|
|
|
372
371
|
waitForIdle(timeout = 60000): Promise<void> {
|
|
373
372
|
const { promise, resolve, reject } = Promise.withResolvers<void>();
|
|
374
373
|
let settled = false;
|
|
375
|
-
const unsubscribe = this.onEvent(
|
|
374
|
+
const unsubscribe = this.onEvent(event => {
|
|
376
375
|
if (event.type === "agent_end") {
|
|
377
376
|
settled = true;
|
|
378
377
|
unsubscribe();
|
|
@@ -397,7 +396,7 @@ export class RpcClient {
|
|
|
397
396
|
const { promise, resolve, reject } = Promise.withResolvers<AgentEvent[]>();
|
|
398
397
|
const events: AgentEvent[] = [];
|
|
399
398
|
let settled = false;
|
|
400
|
-
const unsubscribe = this.onEvent(
|
|
399
|
+
const unsubscribe = this.onEvent(event => {
|
|
401
400
|
events.push(event);
|
|
402
401
|
if (event.type === "agent_end") {
|
|
403
402
|
settled = true;
|
|
@@ -470,12 +469,12 @@ export class RpcClient {
|
|
|
470
469
|
})();
|
|
471
470
|
|
|
472
471
|
this.pendingRequests.set(id, {
|
|
473
|
-
resolve:
|
|
472
|
+
resolve: response => {
|
|
474
473
|
if (settled) return;
|
|
475
474
|
settled = true;
|
|
476
475
|
resolve(response);
|
|
477
476
|
},
|
|
478
|
-
reject:
|
|
477
|
+
reject: error => {
|
|
479
478
|
if (settled) return;
|
|
480
479
|
settled = true;
|
|
481
480
|
reject(error);
|