@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
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/index";
|
|
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);
|
|
@@ -10,15 +10,11 @@
|
|
|
10
10
|
* - Events: AgentSessionEvent objects streamed as they occur
|
|
11
11
|
* - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
import type {
|
|
15
|
-
ExtensionUIContext,
|
|
16
|
-
ExtensionUIDialogOptions,
|
|
17
|
-
} from "@oh-my-pi/pi-coding-agent/extensibility/extensions/index";
|
|
18
|
-
import { type Theme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
19
|
-
import type { AgentSession } from "@oh-my-pi/pi-coding-agent/session/agent-session";
|
|
20
13
|
import { readLines } from "@oh-my-pi/pi-utils";
|
|
21
14
|
import { nanoid } from "nanoid";
|
|
15
|
+
import type { ExtensionUIContext, ExtensionUIDialogOptions } from "../../extensibility/extensions";
|
|
16
|
+
import { type Theme, theme } from "../../modes/theme/theme";
|
|
17
|
+
import type { AgentSession } from "../../session/agent-session";
|
|
22
18
|
import type {
|
|
23
19
|
RpcCommand,
|
|
24
20
|
RpcExtensionUIRequest,
|
|
@@ -128,7 +124,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
128
124
|
dialogOptions,
|
|
129
125
|
undefined,
|
|
130
126
|
{ method: "select", title, options, timeout: dialogOptions?.timeout },
|
|
131
|
-
|
|
127
|
+
response =>
|
|
132
128
|
"cancelled" in response && response.cancelled
|
|
133
129
|
? undefined
|
|
134
130
|
: "value" in response
|
|
@@ -142,7 +138,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
142
138
|
dialogOptions,
|
|
143
139
|
false,
|
|
144
140
|
{ method: "confirm", title, message, timeout: dialogOptions?.timeout },
|
|
145
|
-
|
|
141
|
+
response =>
|
|
146
142
|
"cancelled" in response && response.cancelled
|
|
147
143
|
? false
|
|
148
144
|
: "confirmed" in response
|
|
@@ -160,7 +156,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
160
156
|
dialogOptions,
|
|
161
157
|
undefined,
|
|
162
158
|
{ method: "input", title, placeholder, timeout: dialogOptions?.timeout },
|
|
163
|
-
|
|
159
|
+
response =>
|
|
164
160
|
"cancelled" in response && response.cancelled
|
|
165
161
|
? undefined
|
|
166
162
|
: "value" in response
|
|
@@ -274,17 +270,17 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
274
270
|
return theme;
|
|
275
271
|
}
|
|
276
272
|
|
|
277
|
-
getAllThemes(): { name: string; path: string | undefined }[] {
|
|
278
|
-
return [];
|
|
273
|
+
getAllThemes(): Promise<{ name: string; path: string | undefined }[]> {
|
|
274
|
+
return Promise.resolve([]);
|
|
279
275
|
}
|
|
280
276
|
|
|
281
|
-
getTheme(_name: string): Theme | undefined {
|
|
282
|
-
return undefined;
|
|
277
|
+
getTheme(_name: string): Promise<Theme | undefined> {
|
|
278
|
+
return Promise.resolve(undefined);
|
|
283
279
|
}
|
|
284
280
|
|
|
285
|
-
setTheme(_theme: string | Theme): { success: boolean; error?: string } {
|
|
281
|
+
setTheme(_theme: string | Theme): Promise<{ success: boolean; error?: string }> {
|
|
286
282
|
// Theme switching not supported in RPC mode
|
|
287
|
-
return { success: false, error: "Theme switching not supported in RPC mode" };
|
|
283
|
+
return Promise.resolve({ success: false, error: "Theme switching not supported in RPC mode" });
|
|
288
284
|
}
|
|
289
285
|
|
|
290
286
|
setEditorComponent(): void {
|
|
@@ -299,12 +295,12 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
299
295
|
// ExtensionActions
|
|
300
296
|
{
|
|
301
297
|
sendMessage: (message, options) => {
|
|
302
|
-
session.sendCustomMessage(message, options).catch(
|
|
298
|
+
session.sendCustomMessage(message, options).catch(e => {
|
|
303
299
|
output(error(undefined, "extension_send", e.message));
|
|
304
300
|
});
|
|
305
301
|
},
|
|
306
302
|
sendUserMessage: (content, options) => {
|
|
307
|
-
session.sendUserMessage(content, options).catch(
|
|
303
|
+
session.sendUserMessage(content, options).catch(e => {
|
|
308
304
|
output(error(undefined, "extension_send_user", e.message));
|
|
309
305
|
});
|
|
310
306
|
},
|
|
@@ -317,14 +313,14 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
317
313
|
getActiveTools: () => session.getActiveToolNames(),
|
|
318
314
|
getAllTools: () => session.getAllToolNames(),
|
|
319
315
|
setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
|
|
320
|
-
setModel: async
|
|
316
|
+
setModel: async model => {
|
|
321
317
|
const key = await session.modelRegistry.getApiKey(model);
|
|
322
318
|
if (!key) return false;
|
|
323
319
|
await session.setModel(model);
|
|
324
320
|
return true;
|
|
325
321
|
},
|
|
326
322
|
getThinkingLevel: () => session.thinkingLevel,
|
|
327
|
-
setThinkingLevel:
|
|
323
|
+
setThinkingLevel: level => session.setThinkingLevel(level),
|
|
328
324
|
},
|
|
329
325
|
// ExtensionContextActions
|
|
330
326
|
{
|
|
@@ -336,7 +332,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
336
332
|
shutdownState.requested = true;
|
|
337
333
|
},
|
|
338
334
|
getContextUsage: () => session.getContextUsage(),
|
|
339
|
-
compact: async
|
|
335
|
+
compact: async instructionsOrOptions => {
|
|
340
336
|
const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
|
|
341
337
|
const options =
|
|
342
338
|
instructionsOrOptions && typeof instructionsOrOptions === "object"
|
|
@@ -349,7 +345,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
349
345
|
{
|
|
350
346
|
getContextUsage: () => session.getContextUsage(),
|
|
351
347
|
waitForIdle: () => session.agent.waitForIdle(),
|
|
352
|
-
newSession: async
|
|
348
|
+
newSession: async options => {
|
|
353
349
|
const success = await session.newSession({ parentSession: options?.parentSession });
|
|
354
350
|
// Note: setup callback runs but no UI feedback in RPC mode
|
|
355
351
|
if (success && options?.setup) {
|
|
@@ -357,7 +353,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
357
353
|
}
|
|
358
354
|
return { cancelled: !success };
|
|
359
355
|
},
|
|
360
|
-
branch: async
|
|
356
|
+
branch: async entryId => {
|
|
361
357
|
const result = await session.branch(entryId);
|
|
362
358
|
return { cancelled: result.cancelled };
|
|
363
359
|
},
|
|
@@ -365,7 +361,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
365
361
|
const result = await session.navigateTree(targetId, { summarize: options?.summarize });
|
|
366
362
|
return { cancelled: result.cancelled };
|
|
367
363
|
},
|
|
368
|
-
compact: async
|
|
364
|
+
compact: async instructionsOrOptions => {
|
|
369
365
|
const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
|
|
370
366
|
const options =
|
|
371
367
|
instructionsOrOptions && typeof instructionsOrOptions === "object"
|
|
@@ -376,7 +372,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
376
372
|
},
|
|
377
373
|
new RpcExtensionUIContext(pendingExtensionRequests, output),
|
|
378
374
|
);
|
|
379
|
-
extensionRunner.onError(
|
|
375
|
+
extensionRunner.onError(err => {
|
|
380
376
|
output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
|
|
381
377
|
});
|
|
382
378
|
// Emit session_start event
|
|
@@ -386,7 +382,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
386
382
|
}
|
|
387
383
|
|
|
388
384
|
// Output all agent events as JSON
|
|
389
|
-
session.subscribe(
|
|
385
|
+
session.subscribe(event => {
|
|
390
386
|
output(event);
|
|
391
387
|
});
|
|
392
388
|
|
|
@@ -408,7 +404,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
408
404
|
images: command.images,
|
|
409
405
|
streamingBehavior: command.streamingBehavior,
|
|
410
406
|
})
|
|
411
|
-
.catch(
|
|
407
|
+
.catch(e => output(error(id, "prompt", e.message)));
|
|
412
408
|
return success(id, "prompt");
|
|
413
409
|
}
|
|
414
410
|
|
|
@@ -461,7 +457,7 @@ export async function runRpcMode(session: AgentSession): Promise<never> {
|
|
|
461
457
|
|
|
462
458
|
case "set_model": {
|
|
463
459
|
const models = session.getAvailableModels();
|
|
464
|
-
const model = models.find(
|
|
460
|
+
const model = models.find(m => m.provider === command.provider && m.id === command.modelId);
|
|
465
461
|
if (!model) {
|
|
466
462
|
return error(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
|
|
467
463
|
}
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* Commands are sent as JSON lines on stdin.
|
|
5
5
|
* Responses and events are emitted as JSON lines on stdout.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentMessage, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
|
|
10
|
-
import type { BashResult } from "
|
|
11
|
-
import type { SessionStats } from "
|
|
12
|
-
import type { CompactionResult } from "
|
|
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
|
|
|
14
13
|
// ============================================================================
|
|
15
14
|
// RPC Commands (stdin)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {
|
|
2
|
+
extractMermaidBlocks,
|
|
3
|
+
type MermaidImage,
|
|
4
|
+
type MermaidRenderOptions,
|
|
5
|
+
renderMermaidToPng,
|
|
6
|
+
} from "@oh-my-pi/pi-tui";
|
|
7
|
+
|
|
8
|
+
const cache = new Map<string, MermaidImage>();
|
|
9
|
+
const pending = new Map<string, Promise<MermaidImage | null>>();
|
|
10
|
+
|
|
11
|
+
const defaultOptions: MermaidRenderOptions = {
|
|
12
|
+
theme: "dark",
|
|
13
|
+
backgroundColor: "transparent",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
let onRenderNeeded: (() => void) | null = null;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Set callback to trigger TUI re-render when mermaid images become available.
|
|
20
|
+
*/
|
|
21
|
+
export function setMermaidRenderCallback(callback: (() => void) | null): void {
|
|
22
|
+
onRenderNeeded = callback;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get a pre-rendered mermaid image by hash.
|
|
27
|
+
* Returns null if not cached or rendering failed.
|
|
28
|
+
*/
|
|
29
|
+
export function getMermaidImage(hash: string): MermaidImage | null {
|
|
30
|
+
return cache.get(hash) ?? null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Pre-render all mermaid blocks in markdown text.
|
|
35
|
+
* Renders in parallel, deduplicates concurrent requests.
|
|
36
|
+
* Calls render callback when new images are cached.
|
|
37
|
+
*/
|
|
38
|
+
export async function prerenderMermaid(
|
|
39
|
+
markdown: string,
|
|
40
|
+
options: MermaidRenderOptions = defaultOptions,
|
|
41
|
+
): Promise<void> {
|
|
42
|
+
const blocks = extractMermaidBlocks(markdown);
|
|
43
|
+
if (blocks.length === 0) return;
|
|
44
|
+
|
|
45
|
+
const promises: Promise<boolean>[] = [];
|
|
46
|
+
|
|
47
|
+
for (const { source, hash } of blocks) {
|
|
48
|
+
if (cache.has(hash)) continue;
|
|
49
|
+
|
|
50
|
+
let promise = pending.get(hash);
|
|
51
|
+
if (!promise) {
|
|
52
|
+
promise = renderMermaidToPng(source, options);
|
|
53
|
+
pending.set(hash, promise);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
promises.push(
|
|
57
|
+
promise.then(image => {
|
|
58
|
+
pending.delete(hash);
|
|
59
|
+
if (image) {
|
|
60
|
+
cache.set(hash, image);
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}),
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const results = await Promise.all(promises);
|
|
69
|
+
const newImages = results.some(added => added);
|
|
70
|
+
|
|
71
|
+
if (newImages && onRenderNeeded) {
|
|
72
|
+
onRenderNeeded();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Check if markdown contains mermaid blocks that aren't cached yet.
|
|
78
|
+
*/
|
|
79
|
+
export function hasPendingMermaid(markdown: string): boolean {
|
|
80
|
+
const blocks = extractMermaidBlocks(markdown);
|
|
81
|
+
return blocks.some(({ hash }) => !cache.has(hash));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Clear the mermaid cache.
|
|
86
|
+
*/
|
|
87
|
+
export function clearMermaidCache(): void {
|
|
88
|
+
cache.clear();
|
|
89
|
+
}
|