@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/tools/python.ts
CHANGED
|
@@ -1,23 +1,24 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as path from "node:path";
|
|
2
2
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
3
3
|
import type { ImageContent } from "@oh-my-pi/pi-ai";
|
|
4
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
5
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
6
|
-
import { executePython, getPreludeDocs, type PythonExecutorOptions } from "@oh-my-pi/pi-coding-agent/ipy/executor";
|
|
7
|
-
import type { PreludeHelper, PythonStatusEvent } from "@oh-my-pi/pi-coding-agent/ipy/kernel";
|
|
8
|
-
import { truncateToVisualLines } from "@oh-my-pi/pi-coding-agent/modes/components/visual-truncate";
|
|
9
|
-
import { highlightCode, type Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
10
|
-
import pythonDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/python.md" with { type: "text" };
|
|
11
|
-
import { OutputSink, type OutputSummary } from "@oh-my-pi/pi-coding-agent/session/streaming-output";
|
|
12
|
-
import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
|
|
13
|
-
import { ToolAbortError, ToolError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
14
4
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
15
|
-
import { Text, truncateToWidth
|
|
5
|
+
import { Text, truncateToWidth } from "@oh-my-pi/pi-tui";
|
|
16
6
|
import { type Static, Type } from "@sinclair/typebox";
|
|
17
|
-
import
|
|
7
|
+
import { renderPromptTemplate } from "../config/prompt-templates";
|
|
8
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
9
|
+
import { executePython, getPreludeDocs, type PythonExecutorOptions } from "../ipy/executor";
|
|
10
|
+
import type { PreludeHelper, PythonStatusEvent } from "../ipy/kernel";
|
|
11
|
+
import { truncateToVisualLines } from "../modes/components/visual-truncate";
|
|
12
|
+
import type { Theme } from "../modes/theme/theme";
|
|
13
|
+
import pythonDescription from "../prompts/tools/python.md" with { type: "text" };
|
|
14
|
+
import { OutputSink, type OutputSummary } from "../session/streaming-output";
|
|
15
|
+
import { getTreeBranch, getTreeContinuePrefix, renderCodeCell } from "../tui";
|
|
16
|
+
import type { ToolSession } from ".";
|
|
17
|
+
import type { OutputMeta } from "./output-meta";
|
|
18
18
|
import { allocateOutputArtifact, createTailBuffer } from "./output-utils";
|
|
19
19
|
import { resolveToCwd } from "./path-utils";
|
|
20
|
-
import {
|
|
20
|
+
import { shortenPath, ToolUIKit, truncate } from "./render-utils";
|
|
21
|
+
import { ToolAbortError, ToolError } from "./tool-errors";
|
|
21
22
|
import { toolResult } from "./tool-result";
|
|
22
23
|
import { DEFAULT_MAX_BYTES } from "./truncate";
|
|
23
24
|
|
|
@@ -176,9 +177,8 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
176
177
|
// Clamp to reasonable range: 1s - 600s (10 min)
|
|
177
178
|
timeoutSec = Math.max(1, Math.min(600, timeoutSec));
|
|
178
179
|
const timeoutMs = timeoutSec * 1000;
|
|
179
|
-
const
|
|
180
|
-
const
|
|
181
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
180
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
181
|
+
const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
182
182
|
let outputSink: OutputSink | undefined;
|
|
183
183
|
let outputSummary: OutputSummary | undefined;
|
|
184
184
|
let outputDumped = false;
|
|
@@ -225,7 +225,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
225
225
|
|
|
226
226
|
const buildUpdateDetails = (): PythonToolDetails => {
|
|
227
227
|
const details: PythonToolDetails = {
|
|
228
|
-
cells: cellResults.map(
|
|
228
|
+
cells: cellResults.map(cell => ({
|
|
229
229
|
...cell,
|
|
230
230
|
statusEvents: cell.statusEvents ? [...cell.statusEvents] : undefined,
|
|
231
231
|
})),
|
|
@@ -257,7 +257,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
257
257
|
outputSink = new OutputSink({
|
|
258
258
|
artifactPath,
|
|
259
259
|
artifactId,
|
|
260
|
-
onChunk:
|
|
260
|
+
onChunk: chunk => {
|
|
261
261
|
appendTail(chunk);
|
|
262
262
|
pushUpdate();
|
|
263
263
|
},
|
|
@@ -266,7 +266,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
266
266
|
const baseExecutorOptions: Omit<PythonExecutorOptions, "reset"> = {
|
|
267
267
|
cwd: commandCwd,
|
|
268
268
|
timeoutMs,
|
|
269
|
-
signal:
|
|
269
|
+
signal: combinedSignal,
|
|
270
270
|
sessionId,
|
|
271
271
|
kernelMode: this.session.settings?.getPythonKernelMode?.() ?? "session",
|
|
272
272
|
useSharedGateway: this.session.settings?.getPythonSharedGateway?.() ?? true,
|
|
@@ -288,7 +288,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
288
288
|
const executorOptions: PythonExecutorOptions = {
|
|
289
289
|
...baseExecutorOptions,
|
|
290
290
|
reset: isFirstCell ? reset : false,
|
|
291
|
-
onChunk: async
|
|
291
|
+
onChunk: async chunk => {
|
|
292
292
|
await outputSink!.push(chunk);
|
|
293
293
|
},
|
|
294
294
|
};
|
|
@@ -397,7 +397,6 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
397
397
|
|
|
398
398
|
return resultBuilder.done();
|
|
399
399
|
} finally {
|
|
400
|
-
signal?.removeEventListener("abort", onAbort);
|
|
401
400
|
if (!outputDumped) {
|
|
402
401
|
try {
|
|
403
402
|
await finalizeOutput();
|
|
@@ -639,14 +638,14 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
|
|
|
639
638
|
switch (op) {
|
|
640
639
|
case "find":
|
|
641
640
|
case "glob":
|
|
642
|
-
if (data.matches) addItems(data.matches as unknown[],
|
|
641
|
+
if (data.matches) addItems(data.matches as unknown[], m => String(m));
|
|
643
642
|
break;
|
|
644
643
|
case "ls":
|
|
645
|
-
if (data.items) addItems(data.items as unknown[],
|
|
644
|
+
if (data.items) addItems(data.items as unknown[], m => String(m));
|
|
646
645
|
break;
|
|
647
646
|
case "grep":
|
|
648
647
|
if (data.hits) {
|
|
649
|
-
addItems(data.hits as unknown[],
|
|
648
|
+
addItems(data.hits as unknown[], h => {
|
|
650
649
|
const hit = h as { line: number; text: string };
|
|
651
650
|
return `${hit.line}: ${truncate(hit.text, 60, theme.format.ellipsis)}`;
|
|
652
651
|
});
|
|
@@ -654,7 +653,7 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
|
|
|
654
653
|
break;
|
|
655
654
|
case "rgrep":
|
|
656
655
|
if (data.hits) {
|
|
657
|
-
addItems(data.hits as unknown[],
|
|
656
|
+
addItems(data.hits as unknown[], h => {
|
|
658
657
|
const hit = h as { file: string; line: number; text: string };
|
|
659
658
|
return `${shortenPath(hit.file)}:${hit.line}: ${truncate(hit.text, 50, theme.format.ellipsis)}`;
|
|
660
659
|
});
|
|
@@ -662,28 +661,28 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
|
|
|
662
661
|
break;
|
|
663
662
|
case "rsed":
|
|
664
663
|
if (data.changed) {
|
|
665
|
-
addItems(data.changed as unknown[],
|
|
664
|
+
addItems(data.changed as unknown[], c => {
|
|
666
665
|
const change = c as { file: string; count: number };
|
|
667
666
|
return `${shortenPath(change.file)}: ${change.count} replacement${change.count !== 1 ? "s" : ""}`;
|
|
668
667
|
});
|
|
669
668
|
}
|
|
670
669
|
break;
|
|
671
670
|
case "env":
|
|
672
|
-
if (data.keys) addItems(data.keys as unknown[],
|
|
671
|
+
if (data.keys) addItems(data.keys as unknown[], k => String(k), 10);
|
|
673
672
|
break;
|
|
674
673
|
case "git_log":
|
|
675
674
|
if (data.entries) {
|
|
676
|
-
addItems(data.entries as unknown[],
|
|
675
|
+
addItems(data.entries as unknown[], e => {
|
|
677
676
|
const entry = e as { sha: string; subject: string };
|
|
678
677
|
return `${entry.sha} ${truncate(entry.subject, 50, theme.format.ellipsis)}`;
|
|
679
678
|
});
|
|
680
679
|
}
|
|
681
680
|
break;
|
|
682
681
|
case "git_status":
|
|
683
|
-
if (data.files) addItems(data.files as unknown[],
|
|
682
|
+
if (data.files) addItems(data.files as unknown[], f => String(f));
|
|
684
683
|
break;
|
|
685
684
|
case "git_branch":
|
|
686
|
-
if (data.branches) addItems(data.branches as unknown[],
|
|
685
|
+
if (data.branches) addItems(data.branches as unknown[], b => String(b));
|
|
687
686
|
break;
|
|
688
687
|
case "read":
|
|
689
688
|
case "cat":
|
|
@@ -740,56 +739,6 @@ function renderStatusEvents(events: PythonStatusEvent[], theme: Theme, expanded:
|
|
|
740
739
|
return lines;
|
|
741
740
|
}
|
|
742
741
|
|
|
743
|
-
function applyCellBackground(line: string, width: number, bgFn?: (text: string) => string): string {
|
|
744
|
-
if (!bgFn) return line;
|
|
745
|
-
if (width <= 0) return bgFn(line);
|
|
746
|
-
const paddingNeeded = Math.max(0, width - visibleWidth(line));
|
|
747
|
-
const padded = line + " ".repeat(paddingNeeded);
|
|
748
|
-
return bgFn(padded);
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
function highlightPythonCode(code?: string): string[] {
|
|
752
|
-
return highlightCode(code ?? "", "python");
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
function formatCellStatus(cell: PythonCellResult, ui: ToolUIKit, spinnerFrame?: number): string | undefined {
|
|
756
|
-
switch (cell.status) {
|
|
757
|
-
case "pending":
|
|
758
|
-
return `${ui.statusIcon("pending")} ${ui.theme.fg("muted", "pending")}`;
|
|
759
|
-
case "running":
|
|
760
|
-
return `${ui.statusIcon("running", spinnerFrame)} ${ui.theme.fg("muted", "running")}`;
|
|
761
|
-
case "complete":
|
|
762
|
-
return ui.statusIcon("success");
|
|
763
|
-
case "error":
|
|
764
|
-
return ui.statusIcon("error");
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
function formatCellHeader(
|
|
769
|
-
cell: PythonCellResult,
|
|
770
|
-
index: number,
|
|
771
|
-
total: number,
|
|
772
|
-
ui: ToolUIKit,
|
|
773
|
-
spinnerFrame?: number,
|
|
774
|
-
workdirLabel?: string,
|
|
775
|
-
): string {
|
|
776
|
-
const indexLabel = ui.theme.fg("accent", `[${index + 1}/${total}]`);
|
|
777
|
-
const title = cell.title ? ` ${cell.title}` : "";
|
|
778
|
-
const metaParts: string[] = [];
|
|
779
|
-
if (workdirLabel) {
|
|
780
|
-
metaParts.push(ui.theme.fg("dim", workdirLabel));
|
|
781
|
-
}
|
|
782
|
-
if (cell.durationMs !== undefined) {
|
|
783
|
-
metaParts.push(ui.theme.fg("dim", `(${ui.formatDuration(cell.durationMs)})`));
|
|
784
|
-
}
|
|
785
|
-
const statusLabel = formatCellStatus(cell, ui, spinnerFrame);
|
|
786
|
-
if (statusLabel) {
|
|
787
|
-
metaParts.push(statusLabel);
|
|
788
|
-
}
|
|
789
|
-
const meta = metaParts.length > 0 ? ` ${metaParts.join(ui.theme.fg("dim", ui.theme.sep.dot))}` : "";
|
|
790
|
-
return `${indexLabel}${title}${meta}`;
|
|
791
|
-
}
|
|
792
|
-
|
|
793
742
|
function formatCellOutputLines(
|
|
794
743
|
cell: PythonCellResult,
|
|
795
744
|
expanded: boolean,
|
|
@@ -799,7 +748,7 @@ function formatCellOutputLines(
|
|
|
799
748
|
const rawLines = cell.output ? cell.output.split("\n") : [];
|
|
800
749
|
const displayLines = expanded ? rawLines : rawLines.slice(-previewLines);
|
|
801
750
|
const hiddenCount = rawLines.length - displayLines.length;
|
|
802
|
-
const outputLines = displayLines.map(
|
|
751
|
+
const outputLines = displayLines.map(line => theme.fg("toolOutput", line));
|
|
803
752
|
|
|
804
753
|
if (outputLines.length === 0) {
|
|
805
754
|
return { lines: [], hiddenCount: 0 };
|
|
@@ -808,101 +757,6 @@ function formatCellOutputLines(
|
|
|
808
757
|
return { lines: outputLines, hiddenCount };
|
|
809
758
|
}
|
|
810
759
|
|
|
811
|
-
function renderCellBlock(
|
|
812
|
-
cell: PythonCellResult,
|
|
813
|
-
index: number,
|
|
814
|
-
total: number,
|
|
815
|
-
ui: ToolUIKit,
|
|
816
|
-
options: {
|
|
817
|
-
expanded: boolean;
|
|
818
|
-
previewLines: number;
|
|
819
|
-
spinnerFrame?: number;
|
|
820
|
-
showOutput: boolean;
|
|
821
|
-
workdirLabel?: string;
|
|
822
|
-
width: number;
|
|
823
|
-
bgFn?: (text: string) => string;
|
|
824
|
-
},
|
|
825
|
-
): string[] {
|
|
826
|
-
const { expanded, previewLines, spinnerFrame, showOutput, workdirLabel, width, bgFn } = options;
|
|
827
|
-
const h = ui.theme.boxSharp.horizontal;
|
|
828
|
-
const v = ui.theme.boxSharp.vertical;
|
|
829
|
-
const cap = h.repeat(3);
|
|
830
|
-
const border = (text: string) => ui.theme.fg("dim", text);
|
|
831
|
-
const lineWidth = Math.max(0, width);
|
|
832
|
-
|
|
833
|
-
const buildBarLine = (leftChar: string, label?: string): string => {
|
|
834
|
-
const left = border(`${leftChar}${cap}`);
|
|
835
|
-
if (lineWidth <= 0) return left;
|
|
836
|
-
const rawLabel = label ? ` ${label} ` : " ";
|
|
837
|
-
const maxLabelWidth = Math.max(0, lineWidth - visibleWidth(left));
|
|
838
|
-
const trimmedLabel = truncateToWidth(rawLabel, maxLabelWidth, ui.theme.format.ellipsis);
|
|
839
|
-
const fillCount = Math.max(0, lineWidth - visibleWidth(left + trimmedLabel));
|
|
840
|
-
return `${left}${trimmedLabel}${border(h.repeat(fillCount))}`;
|
|
841
|
-
};
|
|
842
|
-
|
|
843
|
-
const lines: string[] = [];
|
|
844
|
-
lines.push(
|
|
845
|
-
applyCellBackground(
|
|
846
|
-
buildBarLine(ui.theme.boxSharp.topLeft, formatCellHeader(cell, index, total, ui, spinnerFrame, workdirLabel)),
|
|
847
|
-
lineWidth,
|
|
848
|
-
bgFn,
|
|
849
|
-
),
|
|
850
|
-
);
|
|
851
|
-
|
|
852
|
-
const codePrefix = border(`${v} `);
|
|
853
|
-
const codeWidth = Math.max(0, lineWidth - visibleWidth(codePrefix));
|
|
854
|
-
const codeLines = highlightPythonCode(cell.code);
|
|
855
|
-
for (const line of codeLines) {
|
|
856
|
-
const text = truncateToWidth(line, codeWidth, ui.theme.format.ellipsis);
|
|
857
|
-
lines.push(applyCellBackground(`${codePrefix}${text}`, lineWidth, bgFn));
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
const statusLines = renderStatusEvents(cell.statusEvents ?? [], ui.theme, expanded);
|
|
861
|
-
const outputContent = formatCellOutputLines(cell, expanded, previewLines, ui.theme);
|
|
862
|
-
const hasOutput = outputContent.lines.length > 0;
|
|
863
|
-
const hasStatus = statusLines.length > 0;
|
|
864
|
-
const showOutputSection = showOutput && (hasOutput || hasStatus);
|
|
865
|
-
|
|
866
|
-
if (showOutputSection) {
|
|
867
|
-
lines.push(
|
|
868
|
-
applyCellBackground(
|
|
869
|
-
buildBarLine(ui.theme.boxSharp.teeRight, ui.theme.fg("toolTitle", "Output")),
|
|
870
|
-
lineWidth,
|
|
871
|
-
bgFn,
|
|
872
|
-
),
|
|
873
|
-
);
|
|
874
|
-
|
|
875
|
-
for (const line of outputContent.lines) {
|
|
876
|
-
const text = truncateToWidth(line, codeWidth, ui.theme.format.ellipsis);
|
|
877
|
-
lines.push(applyCellBackground(`${codePrefix}${text}`, lineWidth, bgFn));
|
|
878
|
-
}
|
|
879
|
-
if (!expanded && outputContent.hiddenCount > 0) {
|
|
880
|
-
const hint = ui.theme.fg(
|
|
881
|
-
"dim",
|
|
882
|
-
`${ui.theme.format.ellipsis} ${outputContent.hiddenCount} more lines (ctrl+o to expand)`,
|
|
883
|
-
);
|
|
884
|
-
lines.push(
|
|
885
|
-
applyCellBackground(
|
|
886
|
-
`${codePrefix}${truncateToWidth(hint, codeWidth, ui.theme.format.ellipsis)}`,
|
|
887
|
-
lineWidth,
|
|
888
|
-
bgFn,
|
|
889
|
-
),
|
|
890
|
-
);
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
for (const line of statusLines) {
|
|
894
|
-
const text = truncateToWidth(line, codeWidth, ui.theme.format.ellipsis);
|
|
895
|
-
lines.push(applyCellBackground(`${codePrefix}${text}`, lineWidth, bgFn));
|
|
896
|
-
}
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
const bottomLeft = border(`${ui.theme.boxSharp.bottomLeft}${cap}`);
|
|
900
|
-
const bottomFillCount = Math.max(0, lineWidth - visibleWidth(bottomLeft));
|
|
901
|
-
const bottomLine = `${bottomLeft}${border(h.repeat(bottomFillCount))}`;
|
|
902
|
-
lines.push(applyCellBackground(bottomLine, lineWidth, bgFn));
|
|
903
|
-
return lines;
|
|
904
|
-
}
|
|
905
|
-
|
|
906
760
|
export const pythonToolRenderer = {
|
|
907
761
|
renderCall(args: PythonRenderArgs, uiTheme: Theme): Component {
|
|
908
762
|
const ui = new ToolUIKit(uiTheme);
|
|
@@ -911,13 +765,14 @@ export const pythonToolRenderer = {
|
|
|
911
765
|
let displayWorkdir = args.cwd;
|
|
912
766
|
|
|
913
767
|
if (displayWorkdir) {
|
|
914
|
-
const resolvedCwd = resolve(cwd);
|
|
915
|
-
const resolvedWorkdir = resolve(displayWorkdir);
|
|
768
|
+
const resolvedCwd = path.resolve(cwd);
|
|
769
|
+
const resolvedWorkdir = path.resolve(displayWorkdir);
|
|
916
770
|
if (resolvedWorkdir === resolvedCwd) {
|
|
917
771
|
displayWorkdir = undefined;
|
|
918
772
|
} else {
|
|
919
|
-
const relativePath = relative(resolvedCwd, resolvedWorkdir);
|
|
920
|
-
const isWithinCwd =
|
|
773
|
+
const relativePath = path.relative(resolvedCwd, resolvedWorkdir);
|
|
774
|
+
const isWithinCwd =
|
|
775
|
+
relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${path.sep}`);
|
|
921
776
|
if (isWithinCwd) {
|
|
922
777
|
displayWorkdir = relativePath;
|
|
923
778
|
}
|
|
@@ -937,23 +792,24 @@ export const pythonToolRenderer = {
|
|
|
937
792
|
const lines: string[] = [];
|
|
938
793
|
for (let i = 0; i < cells.length; i++) {
|
|
939
794
|
const cell = cells[i];
|
|
940
|
-
const
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
showOutput: false,
|
|
952
|
-
workdirLabel: i === 0 ? workdirLabel : undefined,
|
|
795
|
+
const cellTitle = cell.title;
|
|
796
|
+
const combinedTitle =
|
|
797
|
+
cellTitle && workdirLabel ? `${workdirLabel} · ${cellTitle}` : (cellTitle ?? workdirLabel);
|
|
798
|
+
const cellLines = renderCodeCell(
|
|
799
|
+
{
|
|
800
|
+
code: cell.code,
|
|
801
|
+
language: "python",
|
|
802
|
+
index: i,
|
|
803
|
+
total: cells.length,
|
|
804
|
+
title: combinedTitle,
|
|
805
|
+
status: "pending",
|
|
953
806
|
width,
|
|
954
|
-
|
|
955
|
-
|
|
807
|
+
codeMaxLines: PYTHON_DEFAULT_PREVIEW_LINES,
|
|
808
|
+
expanded: true,
|
|
809
|
+
},
|
|
810
|
+
uiTheme,
|
|
956
811
|
);
|
|
812
|
+
lines.push(...cellLines);
|
|
957
813
|
if (i < cells.length - 1) {
|
|
958
814
|
lines.push("");
|
|
959
815
|
}
|
|
@@ -975,7 +831,7 @@ export const pythonToolRenderer = {
|
|
|
975
831
|
|
|
976
832
|
const expanded = renderContext?.expanded ?? options.expanded;
|
|
977
833
|
const previewLines = renderContext?.previewLines ?? PYTHON_DEFAULT_PREVIEW_LINES;
|
|
978
|
-
const output = renderContext?.output ?? (result.content?.find(
|
|
834
|
+
const output = renderContext?.output ?? (result.content?.find(c => c.type === "text")?.text ?? "").trimEnd();
|
|
979
835
|
|
|
980
836
|
const jsonOutputs = details?.jsonOutputs ?? [];
|
|
981
837
|
const jsonLines = jsonOutputs.flatMap((value, index) => {
|
|
@@ -1015,23 +871,42 @@ export const pythonToolRenderer = {
|
|
|
1015
871
|
const lines: string[] = [];
|
|
1016
872
|
for (let i = 0; i < cellResults.length; i++) {
|
|
1017
873
|
const cell = cellResults[i];
|
|
1018
|
-
const
|
|
1019
|
-
const
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
874
|
+
const statusLines = renderStatusEvents(cell.statusEvents ?? [], uiTheme, expanded);
|
|
875
|
+
const outputContent = formatCellOutputLines(cell, expanded, previewLines, uiTheme);
|
|
876
|
+
const outputLines = [...outputContent.lines];
|
|
877
|
+
if (!expanded && outputContent.hiddenCount > 0) {
|
|
878
|
+
outputLines.push(
|
|
879
|
+
uiTheme.fg(
|
|
880
|
+
"dim",
|
|
881
|
+
`${uiTheme.format.ellipsis} ${outputContent.hiddenCount} more lines (ctrl+o to expand)`,
|
|
882
|
+
),
|
|
883
|
+
);
|
|
884
|
+
}
|
|
885
|
+
if (statusLines.length > 0) {
|
|
886
|
+
if (outputLines.length > 0) {
|
|
887
|
+
outputLines.push(uiTheme.fg("dim", "Status"));
|
|
888
|
+
}
|
|
889
|
+
outputLines.push(...statusLines);
|
|
890
|
+
}
|
|
891
|
+
const cellLines = renderCodeCell(
|
|
892
|
+
{
|
|
893
|
+
code: cell.code,
|
|
894
|
+
language: "python",
|
|
895
|
+
index: i,
|
|
896
|
+
total: cellResults.length,
|
|
897
|
+
title: cell.title,
|
|
898
|
+
status: cell.status,
|
|
1029
899
|
spinnerFrame: options.spinnerFrame,
|
|
1030
|
-
|
|
900
|
+
duration: cell.durationMs,
|
|
901
|
+
output: outputLines.length > 0 ? outputLines.join("\n") : undefined,
|
|
902
|
+
outputMaxLines: outputLines.length,
|
|
903
|
+
codeMaxLines: expanded ? Number.POSITIVE_INFINITY : PYTHON_DEFAULT_PREVIEW_LINES,
|
|
904
|
+
expanded,
|
|
1031
905
|
width,
|
|
1032
|
-
|
|
1033
|
-
|
|
906
|
+
},
|
|
907
|
+
uiTheme,
|
|
1034
908
|
);
|
|
909
|
+
lines.push(...cellLines);
|
|
1035
910
|
if (i < cellResults.length - 1) {
|
|
1036
911
|
lines.push("");
|
|
1037
912
|
}
|
|
@@ -1066,22 +941,29 @@ export const pythonToolRenderer = {
|
|
|
1066
941
|
}
|
|
1067
942
|
|
|
1068
943
|
if (!combinedOutput && statusLines.length > 0) {
|
|
1069
|
-
const lines = [...statusLines, timeoutLine, warningLine].filter(
|
|
944
|
+
const lines = [uiTheme.fg("dim", "Status"), ...statusLines, timeoutLine, warningLine].filter(
|
|
945
|
+
Boolean,
|
|
946
|
+
) as string[];
|
|
1070
947
|
return new Text(lines.join("\n"), 0, 0);
|
|
1071
948
|
}
|
|
1072
949
|
|
|
1073
950
|
if (expanded) {
|
|
1074
951
|
const styledOutput = combinedOutput
|
|
1075
952
|
.split("\n")
|
|
1076
|
-
.map(
|
|
953
|
+
.map(line => uiTheme.fg("toolOutput", line))
|
|
1077
954
|
.join("\n");
|
|
1078
|
-
const lines = [
|
|
955
|
+
const lines = [
|
|
956
|
+
styledOutput,
|
|
957
|
+
...(statusLines.length > 0 ? [uiTheme.fg("dim", "Status"), ...statusLines] : []),
|
|
958
|
+
timeoutLine,
|
|
959
|
+
warningLine,
|
|
960
|
+
].filter(Boolean) as string[];
|
|
1079
961
|
return new Text(lines.join("\n"), 0, 0);
|
|
1080
962
|
}
|
|
1081
963
|
|
|
1082
964
|
const styledOutput = combinedOutput
|
|
1083
965
|
.split("\n")
|
|
1084
|
-
.map(
|
|
966
|
+
.map(line => uiTheme.fg("toolOutput", line))
|
|
1085
967
|
.join("\n");
|
|
1086
968
|
const textContent = `\n${styledOutput}`;
|
|
1087
969
|
|
|
@@ -1107,8 +989,13 @@ export const pythonToolRenderer = {
|
|
|
1107
989
|
outputLines.push(truncateToWidth(skippedLine, width, uiTheme.fg("dim", uiTheme.format.ellipsis)));
|
|
1108
990
|
}
|
|
1109
991
|
outputLines.push(...cachedLines);
|
|
1110
|
-
|
|
1111
|
-
outputLines.push(
|
|
992
|
+
if (statusLines.length > 0) {
|
|
993
|
+
outputLines.push(
|
|
994
|
+
truncateToWidth(uiTheme.fg("dim", "Status"), width, uiTheme.fg("dim", uiTheme.format.ellipsis)),
|
|
995
|
+
);
|
|
996
|
+
for (const statusLine of statusLines) {
|
|
997
|
+
outputLines.push(truncateToWidth(statusLine, width, uiTheme.fg("dim", uiTheme.format.ellipsis)));
|
|
998
|
+
}
|
|
1112
999
|
}
|
|
1113
1000
|
if (timeoutLine) {
|
|
1114
1001
|
outputLines.push(truncateToWidth(timeoutLine, width, uiTheme.fg("dim", uiTheme.format.ellipsis)));
|