@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +51 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +2 -3
- package/src/capability/extension-module.ts +2 -3
- package/src/capability/extension.ts +2 -3
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +2 -3
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +2 -3
- package/src/capability/mcp.ts +2 -3
- package/src/capability/prompt.ts +2 -3
- package/src/capability/rule.ts +2 -3
- package/src/capability/settings.ts +1 -2
- package/src/capability/skill.ts +2 -3
- package/src/capability/slash-command.ts +2 -3
- package/src/capability/ssh.ts +2 -3
- package/src/capability/system-prompt.ts +2 -3
- package/src/capability/tool.ts +2 -3
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -21
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +21 -23
- package/src/commit/agentic/fallback.ts +9 -9
- package/src/commit/agentic/index.ts +30 -38
- package/src/commit/agentic/state.ts +1 -6
- package/src/commit/agentic/tools/analyze-file.ts +15 -15
- package/src/commit/agentic/tools/git-file-diff.ts +3 -3
- package/src/commit/agentic/tools/git-hunk.ts +7 -7
- package/src/commit/agentic/tools/git-overview.ts +5 -5
- package/src/commit/agentic/tools/index.ts +14 -14
- package/src/commit/agentic/tools/propose-changelog.ts +6 -6
- package/src/commit/agentic/tools/propose-commit.ts +8 -8
- package/src/commit/agentic/tools/recent-commits.ts +2 -2
- package/src/commit/agentic/tools/split-commit.ts +19 -23
- package/src/commit/agentic/topo-sort.ts +1 -1
- package/src/commit/agentic/trivial.ts +3 -3
- package/src/commit/agentic/validation.ts +12 -12
- package/src/commit/analysis/conventional.ts +7 -11
- package/src/commit/analysis/index.ts +4 -4
- package/src/commit/analysis/scope.ts +4 -4
- package/src/commit/analysis/summary.ts +7 -9
- package/src/commit/analysis/validation.ts +1 -1
- package/src/commit/changelog/detect.ts +6 -6
- package/src/commit/changelog/generate.ts +7 -9
- package/src/commit/changelog/index.ts +13 -13
- package/src/commit/changelog/parse.ts +2 -2
- package/src/commit/cli.ts +1 -1
- package/src/commit/git/diff.ts +3 -3
- package/src/commit/git/index.ts +19 -24
- package/src/commit/index.ts +1 -1
- package/src/commit/map-reduce/index.ts +9 -9
- package/src/commit/map-reduce/map-phase.ts +19 -34
- package/src/commit/map-reduce/reduce-phase.ts +9 -11
- package/src/commit/message.ts +2 -2
- package/src/commit/model-selection.ts +3 -7
- package/src/commit/pipeline.ts +20 -22
- package/src/commit/utils/exclusions.ts +3 -3
- package/src/config/file-lock.ts +17 -7
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +55 -37
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +50 -34
- package/src/config.ts +60 -62
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +16 -18
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +17 -14
- package/src/extensibility/custom-commands/types.ts +1 -2
- package/src/extensibility/custom-tools/loader.ts +10 -11
- package/src/extensibility/custom-tools/types.ts +6 -7
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +75 -53
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +19 -26
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +8 -9
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +10 -17
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +46 -46
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +14 -10
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +10 -16
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +55 -34
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +3 -4
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +60 -49
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +6 -6
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +11 -16
- package/src/modes/components/tree-selector.ts +11 -11
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +27 -29
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -25
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +2 -2
- package/src/modes/theme/theme.ts +128 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +10 -11
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +12 -13
- package/src/sdk.ts +60 -63
- package/src/session/agent-session.ts +83 -84
- package/src/session/agent-storage.ts +11 -11
- package/src/session/artifacts.ts +8 -9
- package/src/session/auth-storage.ts +25 -29
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +2 -3
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +27 -34
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +33 -36
- package/src/task/output-manager.ts +3 -4
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +19 -20
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +32 -38
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +8 -9
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +19 -18
- package/src/tools/calculator.ts +12 -12
- package/src/tools/complete.ts +3 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +23 -26
- package/src/tools/find.ts +15 -16
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +27 -27
- package/src/tools/index.ts +78 -56
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +7 -7
- package/src/tools/notebook.ts +5 -5
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +1 -1
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +36 -37
- package/src/tools/read.ts +23 -23
- package/src/tools/render-utils.ts +8 -9
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +31 -30
- package/src/tools/todo-write.ts +13 -13
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +11 -16
- package/src/tui/code-cell.ts +3 -9
- package/src/tui/file-list.ts +3 -4
- package/src/tui/output-block.ts +1 -2
- package/src/tui/status-line.ts +2 -3
- package/src/tui/tree-list.ts +2 -3
- package/src/tui/types.ts +1 -2
- package/src/tui/utils.ts +2 -3
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +4 -9
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +16 -18
- package/scripts/generate-wasm-b64.ts +0 -24
- package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
- package/src/task/.executor.ts.kate-swp +0 -0
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
package/src/tools/list-limit.ts
CHANGED
package/src/tools/ls.ts
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import nodePath from "node:path";
|
|
2
2
|
import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
|
|
3
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
4
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
5
|
-
import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
|
|
6
|
-
import { ToolError, throwIfAborted } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
7
|
-
import { renderFileList, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
|
|
8
3
|
import { type Component, Text } from "@oh-my-pi/pi-tui";
|
|
9
4
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
10
5
|
import { Type } from "@sinclair/typebox";
|
|
6
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
7
|
+
import type { Theme } from "../modes/theme/theme";
|
|
8
|
+
import { renderFileList, renderStatusLine } from "../tui";
|
|
11
9
|
import type { ToolSession } from ".";
|
|
12
10
|
import { applyListLimit } from "./list-limit";
|
|
11
|
+
import type { OutputMeta } from "./output-meta";
|
|
13
12
|
import { resolveToCwd } from "./path-utils";
|
|
14
13
|
import {
|
|
15
14
|
formatAge,
|
|
@@ -19,6 +18,7 @@ import {
|
|
|
19
18
|
formatErrorMessage,
|
|
20
19
|
PREVIEW_LIMITS,
|
|
21
20
|
} from "./render-utils";
|
|
21
|
+
import { ToolError, throwIfAborted } from "./tool-errors";
|
|
22
22
|
import { toolResult } from "./tool-result";
|
|
23
23
|
import { type TruncationResult, truncateHead } from "./truncate";
|
|
24
24
|
|
|
@@ -224,7 +224,7 @@ export const lsToolRenderer = {
|
|
|
224
224
|
args?: LsRenderArgs,
|
|
225
225
|
): Component {
|
|
226
226
|
const details = result.details;
|
|
227
|
-
const textContent = result.content?.find(
|
|
227
|
+
const textContent = result.content?.find(c => c.type === "text")?.text ?? "";
|
|
228
228
|
|
|
229
229
|
if (result.isError) {
|
|
230
230
|
const header = renderStatusLine({ icon: "error", title: "Ls", description: args?.path || "." }, uiTheme);
|
|
@@ -243,7 +243,7 @@ export const lsToolRenderer = {
|
|
|
243
243
|
let rawEntries: string[] | undefined = details?.rawEntries;
|
|
244
244
|
if (entries.length === 0) {
|
|
245
245
|
const rawLines = textContent.split("\n").filter((l: string) => l.trim());
|
|
246
|
-
entries = rawLines.filter(
|
|
246
|
+
entries = rawLines.filter(line => !/^\[.*\]$/.test(line.trim()));
|
|
247
247
|
rawEntries = undefined; // Can't reliably extract raw paths from text
|
|
248
248
|
}
|
|
249
249
|
|
package/src/tools/notebook.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
2
2
|
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
3
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
4
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
5
|
-
import type { ToolSession } from "@oh-my-pi/pi-coding-agent/sdk";
|
|
6
|
-
import { renderCodeCell, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
|
|
7
3
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
8
4
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
9
5
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
10
6
|
import { type Static, Type } from "@sinclair/typebox";
|
|
7
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
8
|
+
import type { Theme } from "../modes/theme/theme";
|
|
9
|
+
import type { ToolSession } from "../sdk";
|
|
10
|
+
import { renderCodeCell, renderStatusLine } from "../tui";
|
|
11
11
|
import { resolveToCwd } from "./path-utils";
|
|
12
12
|
import { formatCount, formatErrorMessage, PREVIEW_LIMITS } from "./render-utils";
|
|
13
13
|
|
|
@@ -249,7 +249,7 @@ export const notebookToolRenderer = {
|
|
|
249
249
|
if (lineCount > 0) summaryParts.push(formatCount("line", lineCount));
|
|
250
250
|
if (totalCells !== undefined) summaryParts.push(`${totalCells} total`);
|
|
251
251
|
|
|
252
|
-
const outputLines = summaryParts.map(
|
|
252
|
+
const outputLines = summaryParts.map(part => uiTheme.fg("dim", part));
|
|
253
253
|
const codeText = cellSource.join("");
|
|
254
254
|
const language = cellType === "markdown" ? "markdown" : undefined;
|
|
255
255
|
|
package/src/tools/output-meta.ts
CHANGED
|
@@ -4,13 +4,12 @@
|
|
|
4
4
|
* Tools populate details.meta using the fluent OutputMetaBuilder.
|
|
5
5
|
* The tool wrapper automatically formats and appends notices at message boundary.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
|
|
10
|
-
import type { OutputSummary } from "
|
|
11
|
-
import type { TruncationResult } from "@oh-my-pi/pi-coding-agent/tools/truncate";
|
|
12
|
-
import { formatSize } from "@oh-my-pi/pi-coding-agent/tools/truncate";
|
|
9
|
+
import type { OutputSummary } from "../session/streaming-output";
|
|
13
10
|
import { renderError } from "./tool-errors";
|
|
11
|
+
import type { TruncationResult } from "./truncate";
|
|
12
|
+
import { formatSize } from "./truncate";
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* Truncation metadata for the output notice.
|
package/src/tools/path-utils.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
2
|
import * as os from "node:os";
|
|
3
|
-
import
|
|
3
|
+
import * as path from "node:path";
|
|
4
4
|
|
|
5
5
|
const UNICODE_SPACES = /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g;
|
|
6
6
|
const NARROW_NO_BREAK_SPACE = "\u202F";
|
|
@@ -15,7 +15,7 @@ function tryMacOSScreenshotPath(filePath: string): string {
|
|
|
15
15
|
|
|
16
16
|
function fileExists(filePath: string): boolean {
|
|
17
17
|
try {
|
|
18
|
-
accessSync(filePath, constants.F_OK);
|
|
18
|
+
fs.accessSync(filePath, fs.constants.F_OK);
|
|
19
19
|
return true;
|
|
20
20
|
} catch {
|
|
21
21
|
return false;
|
|
@@ -39,10 +39,10 @@ export function expandPath(filePath: string): string {
|
|
|
39
39
|
*/
|
|
40
40
|
export function resolveToCwd(filePath: string, cwd: string): string {
|
|
41
41
|
const expanded = expandPath(filePath);
|
|
42
|
-
if (isAbsolute(expanded)) {
|
|
42
|
+
if (path.isAbsolute(expanded)) {
|
|
43
43
|
return expanded;
|
|
44
44
|
}
|
|
45
|
-
return
|
|
45
|
+
return path.resolve(cwd, expanded);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export function resolveReadPath(filePath: string, cwd: string): string {
|
package/src/tools/python.ts
CHANGED
|
@@ -1,24 +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 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
|
-
import { getTreeBranch, getTreeContinuePrefix, renderCodeCell } from "@oh-my-pi/pi-coding-agent/tui";
|
|
15
4
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
16
5
|
import { Text, truncateToWidth } from "@oh-my-pi/pi-tui";
|
|
17
6
|
import { type Static, Type } from "@sinclair/typebox";
|
|
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";
|
|
18
16
|
import type { ToolSession } from ".";
|
|
17
|
+
import type { OutputMeta } from "./output-meta";
|
|
19
18
|
import { allocateOutputArtifact, createTailBuffer } from "./output-utils";
|
|
20
19
|
import { resolveToCwd } from "./path-utils";
|
|
21
20
|
import { shortenPath, ToolUIKit, truncate } from "./render-utils";
|
|
21
|
+
import { ToolAbortError, ToolError } from "./tool-errors";
|
|
22
22
|
import { toolResult } from "./tool-result";
|
|
23
23
|
import { DEFAULT_MAX_BYTES } from "./truncate";
|
|
24
24
|
|
|
@@ -177,9 +177,8 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
177
177
|
// Clamp to reasonable range: 1s - 600s (10 min)
|
|
178
178
|
timeoutSec = Math.max(1, Math.min(600, timeoutSec));
|
|
179
179
|
const timeoutMs = timeoutSec * 1000;
|
|
180
|
-
const
|
|
181
|
-
const
|
|
182
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
180
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
181
|
+
const combinedSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
183
182
|
let outputSink: OutputSink | undefined;
|
|
184
183
|
let outputSummary: OutputSummary | undefined;
|
|
185
184
|
let outputDumped = false;
|
|
@@ -226,7 +225,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
226
225
|
|
|
227
226
|
const buildUpdateDetails = (): PythonToolDetails => {
|
|
228
227
|
const details: PythonToolDetails = {
|
|
229
|
-
cells: cellResults.map(
|
|
228
|
+
cells: cellResults.map(cell => ({
|
|
230
229
|
...cell,
|
|
231
230
|
statusEvents: cell.statusEvents ? [...cell.statusEvents] : undefined,
|
|
232
231
|
})),
|
|
@@ -258,7 +257,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
258
257
|
outputSink = new OutputSink({
|
|
259
258
|
artifactPath,
|
|
260
259
|
artifactId,
|
|
261
|
-
onChunk:
|
|
260
|
+
onChunk: chunk => {
|
|
262
261
|
appendTail(chunk);
|
|
263
262
|
pushUpdate();
|
|
264
263
|
},
|
|
@@ -267,7 +266,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
267
266
|
const baseExecutorOptions: Omit<PythonExecutorOptions, "reset"> = {
|
|
268
267
|
cwd: commandCwd,
|
|
269
268
|
timeoutMs,
|
|
270
|
-
signal:
|
|
269
|
+
signal: combinedSignal,
|
|
271
270
|
sessionId,
|
|
272
271
|
kernelMode: this.session.settings?.getPythonKernelMode?.() ?? "session",
|
|
273
272
|
useSharedGateway: this.session.settings?.getPythonSharedGateway?.() ?? true,
|
|
@@ -289,7 +288,7 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
289
288
|
const executorOptions: PythonExecutorOptions = {
|
|
290
289
|
...baseExecutorOptions,
|
|
291
290
|
reset: isFirstCell ? reset : false,
|
|
292
|
-
onChunk: async
|
|
291
|
+
onChunk: async chunk => {
|
|
293
292
|
await outputSink!.push(chunk);
|
|
294
293
|
},
|
|
295
294
|
};
|
|
@@ -398,7 +397,6 @@ export class PythonTool implements AgentTool<typeof pythonSchema> {
|
|
|
398
397
|
|
|
399
398
|
return resultBuilder.done();
|
|
400
399
|
} finally {
|
|
401
|
-
signal?.removeEventListener("abort", onAbort);
|
|
402
400
|
if (!outputDumped) {
|
|
403
401
|
try {
|
|
404
402
|
await finalizeOutput();
|
|
@@ -640,14 +638,14 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
|
|
|
640
638
|
switch (op) {
|
|
641
639
|
case "find":
|
|
642
640
|
case "glob":
|
|
643
|
-
if (data.matches) addItems(data.matches as unknown[],
|
|
641
|
+
if (data.matches) addItems(data.matches as unknown[], m => String(m));
|
|
644
642
|
break;
|
|
645
643
|
case "ls":
|
|
646
|
-
if (data.items) addItems(data.items as unknown[],
|
|
644
|
+
if (data.items) addItems(data.items as unknown[], m => String(m));
|
|
647
645
|
break;
|
|
648
646
|
case "grep":
|
|
649
647
|
if (data.hits) {
|
|
650
|
-
addItems(data.hits as unknown[],
|
|
648
|
+
addItems(data.hits as unknown[], h => {
|
|
651
649
|
const hit = h as { line: number; text: string };
|
|
652
650
|
return `${hit.line}: ${truncate(hit.text, 60, theme.format.ellipsis)}`;
|
|
653
651
|
});
|
|
@@ -655,7 +653,7 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
|
|
|
655
653
|
break;
|
|
656
654
|
case "rgrep":
|
|
657
655
|
if (data.hits) {
|
|
658
|
-
addItems(data.hits as unknown[],
|
|
656
|
+
addItems(data.hits as unknown[], h => {
|
|
659
657
|
const hit = h as { file: string; line: number; text: string };
|
|
660
658
|
return `${shortenPath(hit.file)}:${hit.line}: ${truncate(hit.text, 50, theme.format.ellipsis)}`;
|
|
661
659
|
});
|
|
@@ -663,28 +661,28 @@ function formatStatusEventExpanded(event: PythonStatusEvent, theme: Theme): stri
|
|
|
663
661
|
break;
|
|
664
662
|
case "rsed":
|
|
665
663
|
if (data.changed) {
|
|
666
|
-
addItems(data.changed as unknown[],
|
|
664
|
+
addItems(data.changed as unknown[], c => {
|
|
667
665
|
const change = c as { file: string; count: number };
|
|
668
666
|
return `${shortenPath(change.file)}: ${change.count} replacement${change.count !== 1 ? "s" : ""}`;
|
|
669
667
|
});
|
|
670
668
|
}
|
|
671
669
|
break;
|
|
672
670
|
case "env":
|
|
673
|
-
if (data.keys) addItems(data.keys as unknown[],
|
|
671
|
+
if (data.keys) addItems(data.keys as unknown[], k => String(k), 10);
|
|
674
672
|
break;
|
|
675
673
|
case "git_log":
|
|
676
674
|
if (data.entries) {
|
|
677
|
-
addItems(data.entries as unknown[],
|
|
675
|
+
addItems(data.entries as unknown[], e => {
|
|
678
676
|
const entry = e as { sha: string; subject: string };
|
|
679
677
|
return `${entry.sha} ${truncate(entry.subject, 50, theme.format.ellipsis)}`;
|
|
680
678
|
});
|
|
681
679
|
}
|
|
682
680
|
break;
|
|
683
681
|
case "git_status":
|
|
684
|
-
if (data.files) addItems(data.files as unknown[],
|
|
682
|
+
if (data.files) addItems(data.files as unknown[], f => String(f));
|
|
685
683
|
break;
|
|
686
684
|
case "git_branch":
|
|
687
|
-
if (data.branches) addItems(data.branches as unknown[],
|
|
685
|
+
if (data.branches) addItems(data.branches as unknown[], b => String(b));
|
|
688
686
|
break;
|
|
689
687
|
case "read":
|
|
690
688
|
case "cat":
|
|
@@ -750,7 +748,7 @@ function formatCellOutputLines(
|
|
|
750
748
|
const rawLines = cell.output ? cell.output.split("\n") : [];
|
|
751
749
|
const displayLines = expanded ? rawLines : rawLines.slice(-previewLines);
|
|
752
750
|
const hiddenCount = rawLines.length - displayLines.length;
|
|
753
|
-
const outputLines = displayLines.map(
|
|
751
|
+
const outputLines = displayLines.map(line => theme.fg("toolOutput", line));
|
|
754
752
|
|
|
755
753
|
if (outputLines.length === 0) {
|
|
756
754
|
return { lines: [], hiddenCount: 0 };
|
|
@@ -767,13 +765,14 @@ export const pythonToolRenderer = {
|
|
|
767
765
|
let displayWorkdir = args.cwd;
|
|
768
766
|
|
|
769
767
|
if (displayWorkdir) {
|
|
770
|
-
const resolvedCwd = resolve(cwd);
|
|
771
|
-
const resolvedWorkdir = resolve(displayWorkdir);
|
|
768
|
+
const resolvedCwd = path.resolve(cwd);
|
|
769
|
+
const resolvedWorkdir = path.resolve(displayWorkdir);
|
|
772
770
|
if (resolvedWorkdir === resolvedCwd) {
|
|
773
771
|
displayWorkdir = undefined;
|
|
774
772
|
} else {
|
|
775
|
-
const relativePath = relative(resolvedCwd, resolvedWorkdir);
|
|
776
|
-
const isWithinCwd =
|
|
773
|
+
const relativePath = path.relative(resolvedCwd, resolvedWorkdir);
|
|
774
|
+
const isWithinCwd =
|
|
775
|
+
relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${path.sep}`);
|
|
777
776
|
if (isWithinCwd) {
|
|
778
777
|
displayWorkdir = relativePath;
|
|
779
778
|
}
|
|
@@ -832,7 +831,7 @@ export const pythonToolRenderer = {
|
|
|
832
831
|
|
|
833
832
|
const expanded = renderContext?.expanded ?? options.expanded;
|
|
834
833
|
const previewLines = renderContext?.previewLines ?? PYTHON_DEFAULT_PREVIEW_LINES;
|
|
835
|
-
const output = renderContext?.output ?? (result.content?.find(
|
|
834
|
+
const output = renderContext?.output ?? (result.content?.find(c => c.type === "text")?.text ?? "").trimEnd();
|
|
836
835
|
|
|
837
836
|
const jsonOutputs = details?.jsonOutputs ?? [];
|
|
838
837
|
const jsonLines = jsonOutputs.flatMap((value, index) => {
|
|
@@ -951,7 +950,7 @@ export const pythonToolRenderer = {
|
|
|
951
950
|
if (expanded) {
|
|
952
951
|
const styledOutput = combinedOutput
|
|
953
952
|
.split("\n")
|
|
954
|
-
.map(
|
|
953
|
+
.map(line => uiTheme.fg("toolOutput", line))
|
|
955
954
|
.join("\n");
|
|
956
955
|
const lines = [
|
|
957
956
|
styledOutput,
|
|
@@ -964,7 +963,7 @@ export const pythonToolRenderer = {
|
|
|
964
963
|
|
|
965
964
|
const styledOutput = combinedOutput
|
|
966
965
|
.split("\n")
|
|
967
|
-
.map(
|
|
966
|
+
.map(line => uiTheme.fg("toolOutput", line))
|
|
968
967
|
.join("\n");
|
|
969
968
|
const textContent = `\n${styledOutput}`;
|
|
970
969
|
|
package/src/tools/read.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as os from "node:os";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
4
4
|
import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
|
|
5
|
-
import { CONFIG_DIR_NAME } from "@oh-my-pi/pi-coding-agent/config";
|
|
6
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
7
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
8
|
-
import { getLanguageFromPath, type Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
9
|
-
import readDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/read.md" with { type: "text" };
|
|
10
|
-
import type { ToolSession } from "@oh-my-pi/pi-coding-agent/sdk";
|
|
11
|
-
import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
|
|
12
|
-
import { ToolAbortError, ToolError, throwIfAborted } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
13
|
-
import { renderCodeCell, renderOutputBlock, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
|
|
14
|
-
import { formatDimensionNote, resizeImage } from "@oh-my-pi/pi-coding-agent/utils/image-resize";
|
|
15
|
-
import { detectSupportedImageMimeTypeFromFile } from "@oh-my-pi/pi-coding-agent/utils/mime";
|
|
16
|
-
import { ensureTool } from "@oh-my-pi/pi-coding-agent/utils/tools-manager";
|
|
17
5
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
18
6
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
19
7
|
import { ptree } from "@oh-my-pi/pi-utils";
|
|
20
8
|
import { Type } from "@sinclair/typebox";
|
|
9
|
+
import { CONFIG_DIR_NAME } from "../config";
|
|
10
|
+
import { renderPromptTemplate } from "../config/prompt-templates";
|
|
11
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
12
|
+
import { getLanguageFromPath, type Theme } from "../modes/theme/theme";
|
|
13
|
+
import readDescription from "../prompts/tools/read.md" with { type: "text" };
|
|
14
|
+
import type { ToolSession } from "../sdk";
|
|
15
|
+
import { renderCodeCell, renderOutputBlock, renderStatusLine } from "../tui";
|
|
16
|
+
import { formatDimensionNote, resizeImage } from "../utils/image-resize";
|
|
17
|
+
import { detectSupportedImageMimeTypeFromFile } from "../utils/mime";
|
|
18
|
+
import { ensureTool } from "../utils/tools-manager";
|
|
21
19
|
import { runFd } from "./find";
|
|
22
20
|
import { applyListLimit } from "./list-limit";
|
|
23
21
|
import { LsTool } from "./ls";
|
|
22
|
+
import type { OutputMeta } from "./output-meta";
|
|
24
23
|
import { resolveReadPath, resolveToCwd } from "./path-utils";
|
|
25
24
|
import { shortenPath, wrapBrackets } from "./render-utils";
|
|
25
|
+
import { ToolAbortError, ToolError, throwIfAborted } from "./tool-errors";
|
|
26
26
|
import { toolResult } from "./tool-result";
|
|
27
27
|
import {
|
|
28
28
|
DEFAULT_MAX_BYTES,
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
const CONVERTIBLE_EXTENSIONS = new Set([".pdf", ".doc", ".docx", ".ppt", ".pptx", ".xls", ".xlsx", ".rtf", ".epub"]);
|
|
38
38
|
|
|
39
39
|
// Remote mount path prefix (sshfs mounts) - skip fuzzy matching to avoid hangs
|
|
40
|
-
const REMOTE_MOUNT_PREFIX = path.join(homedir(), CONFIG_DIR_NAME, "remote") + path.sep;
|
|
40
|
+
const REMOTE_MOUNT_PREFIX = path.join(os.homedir(), CONFIG_DIR_NAME, "remote") + path.sep;
|
|
41
41
|
|
|
42
42
|
function isRemoteMountPath(absolutePath: string): boolean {
|
|
43
43
|
return absolutePath.startsWith(REMOTE_MOUNT_PREFIX);
|
|
@@ -202,8 +202,8 @@ async function listCandidateFiles(
|
|
|
202
202
|
if (output) {
|
|
203
203
|
const nestedGitignores = output
|
|
204
204
|
.split("\n")
|
|
205
|
-
.map(
|
|
206
|
-
.filter(
|
|
205
|
+
.map(line => line.replace(/\r$/, "").trim())
|
|
206
|
+
.filter(line => line.length > 0);
|
|
207
207
|
for (const file of nestedGitignores) {
|
|
208
208
|
const normalized = file.replace(/\\/g, "/");
|
|
209
209
|
if (normalized.includes("/node_modules/") || normalized.includes("/.git/")) {
|
|
@@ -238,8 +238,8 @@ async function listCandidateFiles(
|
|
|
238
238
|
|
|
239
239
|
const files = output
|
|
240
240
|
.split("\n")
|
|
241
|
-
.map(
|
|
242
|
-
.filter(
|
|
241
|
+
.map(line => line.replace(/\r$/, "").trim())
|
|
242
|
+
.filter(line => line.length > 0);
|
|
243
243
|
|
|
244
244
|
return { files, truncated: files.length >= MAX_FUZZY_CANDIDATES };
|
|
245
245
|
}
|
|
@@ -337,7 +337,7 @@ async function findReadPathSuggestions(
|
|
|
337
337
|
});
|
|
338
338
|
|
|
339
339
|
const listLimit = applyListLimit(matches, { limit: MAX_FUZZY_RESULTS });
|
|
340
|
-
const suggestions = listLimit.items.map(
|
|
340
|
+
const suggestions = listLimit.items.map(match => match.path);
|
|
341
341
|
|
|
342
342
|
return { suggestions, scopeLabel, truncated };
|
|
343
343
|
}
|
|
@@ -446,7 +446,7 @@ export class ReadTool implements AgentTool<typeof readSchema, ReadToolDetails> {
|
|
|
446
446
|
|
|
447
447
|
if (suggestions?.suggestions.length) {
|
|
448
448
|
const scopeLabel = suggestions.scopeLabel ? ` in ${suggestions.scopeLabel}` : "";
|
|
449
|
-
message += `\n\nClosest matches${scopeLabel}:\n${suggestions.suggestions.map(
|
|
449
|
+
message += `\n\nClosest matches${scopeLabel}:\n${suggestions.suggestions.map(match => `- ${match}`).join("\n")}`;
|
|
450
450
|
if (suggestions.truncated) {
|
|
451
451
|
message += `\n[Search truncated to first ${MAX_FUZZY_CANDIDATES} paths. Refine the path if the match isn't listed.]`;
|
|
452
452
|
}
|
|
@@ -856,8 +856,8 @@ export const readToolRenderer = {
|
|
|
856
856
|
args?: ReadRenderArgs,
|
|
857
857
|
): Component {
|
|
858
858
|
const details = result.details;
|
|
859
|
-
const contentText = result.content?.find(
|
|
860
|
-
const imageContent = result.content?.find(
|
|
859
|
+
const contentText = result.content?.find(c => c.type === "text")?.text ?? "";
|
|
860
|
+
const imageContent = result.content?.find(c => c.type === "image");
|
|
861
861
|
const rawPath = args?.file_path || args?.path || "";
|
|
862
862
|
const filePath = shortenPath(rawPath);
|
|
863
863
|
const lang = getLanguageFromPath(rawPath);
|
|
@@ -892,7 +892,7 @@ export const readToolRenderer = {
|
|
|
892
892
|
{ icon: "success", title: "Read", description: filePath || rawPath || "image" },
|
|
893
893
|
uiTheme,
|
|
894
894
|
);
|
|
895
|
-
const detailLines = contentText ? contentText.split("\n").map(
|
|
895
|
+
const detailLines = contentText ? contentText.split("\n").map(line => uiTheme.fg("toolOutput", line)) : [];
|
|
896
896
|
const lines = [...detailLines, ...warningLines];
|
|
897
897
|
return {
|
|
898
898
|
render: (width: number) =>
|
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
* Provides consistent formatting, truncation, and display patterns across all
|
|
5
5
|
* tool renderers to ensure a unified TUI experience.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import { getTreeBranch } from "@oh-my-pi/pi-coding-agent/tui/utils";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import type { Theme } from "../modes/theme/theme";
|
|
9
|
+
import { getTreeBranch } from "../tui/utils";
|
|
11
10
|
|
|
12
11
|
// =============================================================================
|
|
13
12
|
// Standardized Display Constants
|
|
@@ -62,8 +61,8 @@ export function truncate(text: string, maxLen: number, ellipsis: string): string
|
|
|
62
61
|
* Get first N lines of text as preview, with each line truncated.
|
|
63
62
|
*/
|
|
64
63
|
export function getPreviewLines(text: string, maxLines: number, maxLineLen: number, ellipsis: string): string[] {
|
|
65
|
-
const lines = text.split("\n").filter(
|
|
66
|
-
return lines.slice(0, maxLines).map(
|
|
64
|
+
const lines = text.split("\n").filter(l => l.trim());
|
|
65
|
+
return lines.slice(0, maxLines).map(l => truncate(l.trim(), maxLineLen, ellipsis));
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
// =============================================================================
|
|
@@ -554,7 +553,7 @@ export function truncateDiffByHunk(
|
|
|
554
553
|
|
|
555
554
|
const segments = parseDiffSegments(lines);
|
|
556
555
|
|
|
557
|
-
const changeSegments = segments.filter(
|
|
556
|
+
const changeSegments = segments.filter(s => s.isChange);
|
|
558
557
|
const changeLineCount = changeSegments.reduce((sum, s) => sum + s.lines.length, 0);
|
|
559
558
|
|
|
560
559
|
if (changeLineCount > maxLines) {
|
|
@@ -579,7 +578,7 @@ export function truncateDiffByHunk(
|
|
|
579
578
|
}
|
|
580
579
|
|
|
581
580
|
const contextBudget = maxLines - changeLineCount;
|
|
582
|
-
const contextSegments = segments.filter(
|
|
581
|
+
const contextSegments = segments.filter(s => !s.isChange && !s.isEllipsis);
|
|
583
582
|
const totalContextLines = contextSegments.reduce((sum, s) => sum + s.lines.length, 0);
|
|
584
583
|
|
|
585
584
|
const kept: string[] = [];
|
|
@@ -643,7 +642,7 @@ export function truncateDiffByHunk(
|
|
|
643
642
|
// =============================================================================
|
|
644
643
|
|
|
645
644
|
export function shortenPath(filePath: string, homeDir?: string): string {
|
|
646
|
-
const home = homeDir ?? homedir();
|
|
645
|
+
const home = homeDir ?? os.homedir();
|
|
647
646
|
if (home && filePath.startsWith(home)) {
|
|
648
647
|
return `~${filePath.slice(home.length)}`;
|
|
649
648
|
}
|
package/src/tools/renderers.ts
CHANGED
|
@@ -3,14 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* These provide rich visualization for tool calls and results in the TUI.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
8
|
-
import { lspToolRenderer } from "@oh-my-pi/pi-coding-agent/lsp/render";
|
|
9
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
10
|
-
import { editToolRenderer } from "@oh-my-pi/pi-coding-agent/patch";
|
|
11
|
-
import { taskToolRenderer } from "@oh-my-pi/pi-coding-agent/task/render";
|
|
12
|
-
import { webSearchToolRenderer } from "@oh-my-pi/pi-coding-agent/web/search/render";
|
|
13
6
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
7
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
8
|
+
import { lspToolRenderer } from "../lsp/render";
|
|
9
|
+
import type { Theme } from "../modes/theme/theme";
|
|
10
|
+
import { editToolRenderer } from "../patch";
|
|
11
|
+
import { taskToolRenderer } from "../task/render";
|
|
12
|
+
import { webSearchToolRenderer } from "../web/search/render";
|
|
14
13
|
import { askToolRenderer } from "./ask";
|
|
15
14
|
import { bashToolRenderer } from "./bash";
|
|
16
15
|
import { calculatorToolRenderer } from "./calculator";
|
package/src/tools/review.ts
CHANGED
|
@@ -5,12 +5,17 @@
|
|
|
5
5
|
* Hidden by default - only enabled when explicitly listed in agent's tools.
|
|
6
6
|
* Reviewers finish via `complete` tool with SubmitReviewDetails schema.
|
|
7
7
|
*/
|
|
8
|
-
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
// Subprocess tool handlers - registered for extraction/rendering in task tool
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
import path from "node:path";
|
|
9
12
|
import type { AgentTool } from "@oh-my-pi/pi-agent-core";
|
|
10
|
-
import
|
|
13
|
+
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
11
14
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
12
15
|
import { Container, Text } from "@oh-my-pi/pi-tui";
|
|
13
16
|
import { Type } from "@sinclair/typebox";
|
|
17
|
+
import type { Theme, ThemeColor } from "../modes/theme/theme";
|
|
18
|
+
import { subprocessToolRegistry } from "../task/subprocess-tool-registry";
|
|
14
19
|
|
|
15
20
|
export type FindingPriority = "P0" | "P1" | "P2" | "P3";
|
|
16
21
|
|
|
@@ -145,17 +150,9 @@ export interface SubmitReviewDetails {
|
|
|
145
150
|
// Re-export types for external use
|
|
146
151
|
export type { ReportFindingDetails };
|
|
147
152
|
|
|
148
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
149
|
-
// Subprocess tool handlers - registered for extraction/rendering in task tool
|
|
150
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
151
|
-
|
|
152
|
-
import path from "node:path";
|
|
153
|
-
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
154
|
-
import { subprocessToolRegistry } from "@oh-my-pi/pi-coding-agent/task/subprocess-tool-registry";
|
|
155
|
-
|
|
156
153
|
// Register report_finding handler
|
|
157
154
|
subprocessToolRegistry.register<ReportFindingDetails>("report_finding", {
|
|
158
|
-
extractData:
|
|
155
|
+
extractData: event => event.result?.details as ReportFindingDetails | undefined,
|
|
159
156
|
|
|
160
157
|
renderInline: (data, theme) => {
|
|
161
158
|
const { label, icon, color } = getPriorityDisplay(data.priority, theme);
|