@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/ls.ts
CHANGED
|
@@ -1,14 +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 { getLanguageFromPath, 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
3
|
import { type Component, Text } from "@oh-my-pi/pi-tui";
|
|
8
4
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
9
5
|
import { Type } from "@sinclair/typebox";
|
|
10
|
-
import type {
|
|
6
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
7
|
+
import type { Theme } from "../modes/theme/theme";
|
|
8
|
+
import { renderFileList, renderStatusLine } from "../tui";
|
|
9
|
+
import type { ToolSession } from ".";
|
|
11
10
|
import { applyListLimit } from "./list-limit";
|
|
11
|
+
import type { OutputMeta } from "./output-meta";
|
|
12
12
|
import { resolveToCwd } from "./path-utils";
|
|
13
13
|
import {
|
|
14
14
|
formatAge,
|
|
@@ -16,12 +16,9 @@ import {
|
|
|
16
16
|
formatCount,
|
|
17
17
|
formatEmptyMessage,
|
|
18
18
|
formatErrorMessage,
|
|
19
|
-
formatExpandHint,
|
|
20
|
-
formatMeta,
|
|
21
|
-
formatMoreItems,
|
|
22
|
-
formatTruncationSuffix,
|
|
23
19
|
PREVIEW_LIMITS,
|
|
24
20
|
} from "./render-utils";
|
|
21
|
+
import { ToolError, throwIfAborted } from "./tool-errors";
|
|
25
22
|
import { toolResult } from "./tool-result";
|
|
26
23
|
import { type TruncationResult, truncateHead } from "./truncate";
|
|
27
24
|
|
|
@@ -214,13 +211,9 @@ const COLLAPSED_LIST_LIMIT = PREVIEW_LIMITS.COLLAPSED_ITEMS;
|
|
|
214
211
|
export const lsToolRenderer = {
|
|
215
212
|
inline: true,
|
|
216
213
|
renderCall(args: LsRenderArgs, uiTheme: Theme): Component {
|
|
217
|
-
const label = uiTheme.fg("toolTitle", uiTheme.bold("Ls"));
|
|
218
|
-
let text = `${uiTheme.format.bullet} ${label} ${uiTheme.fg("accent", args.path || ".")}`;
|
|
219
|
-
|
|
220
214
|
const meta: string[] = [];
|
|
221
215
|
if (args.limit !== undefined) meta.push(`limit:${args.limit}`);
|
|
222
|
-
text
|
|
223
|
-
|
|
216
|
+
const text = renderStatusLine({ icon: "pending", title: "Ls", description: args.path || ".", meta }, uiTheme);
|
|
224
217
|
return new Text(text, 0, 0);
|
|
225
218
|
},
|
|
226
219
|
|
|
@@ -228,31 +221,35 @@ export const lsToolRenderer = {
|
|
|
228
221
|
result: { content: Array<{ type: string; text?: string }>; details?: LsToolDetails; isError?: boolean },
|
|
229
222
|
{ expanded }: RenderResultOptions,
|
|
230
223
|
uiTheme: Theme,
|
|
224
|
+
args?: LsRenderArgs,
|
|
231
225
|
): Component {
|
|
232
226
|
const details = result.details;
|
|
233
|
-
const textContent = result.content?.find(
|
|
227
|
+
const textContent = result.content?.find(c => c.type === "text")?.text ?? "";
|
|
234
228
|
|
|
235
229
|
if (result.isError) {
|
|
236
|
-
|
|
230
|
+
const header = renderStatusLine({ icon: "error", title: "Ls", description: args?.path || "." }, uiTheme);
|
|
231
|
+
return new Text([header, formatErrorMessage(textContent, uiTheme)].join("\n"), 0, 0);
|
|
237
232
|
}
|
|
238
233
|
|
|
239
234
|
if (
|
|
240
235
|
(!textContent || textContent.trim() === "" || textContent.trim() === "(empty directory)") &&
|
|
241
236
|
(!details?.entries || details.entries.length === 0)
|
|
242
237
|
) {
|
|
243
|
-
|
|
238
|
+
const header = renderStatusLine({ icon: "warning", title: "Ls", description: args?.path || "." }, uiTheme);
|
|
239
|
+
return new Text([header, formatEmptyMessage("Empty directory", uiTheme)].join("\n"), 0, 0);
|
|
244
240
|
}
|
|
245
241
|
|
|
246
242
|
let entries: string[] = details?.entries ? [...details.entries] : [];
|
|
247
243
|
let rawEntries: string[] | undefined = details?.rawEntries;
|
|
248
244
|
if (entries.length === 0) {
|
|
249
245
|
const rawLines = textContent.split("\n").filter((l: string) => l.trim());
|
|
250
|
-
entries = rawLines.filter(
|
|
246
|
+
entries = rawLines.filter(line => !/^\[.*\]$/.test(line.trim()));
|
|
251
247
|
rawEntries = undefined; // Can't reliably extract raw paths from text
|
|
252
248
|
}
|
|
253
249
|
|
|
254
250
|
if (entries.length === 0) {
|
|
255
|
-
|
|
251
|
+
const header = renderStatusLine({ icon: "warning", title: "Ls", description: args?.path || "." }, uiTheme);
|
|
252
|
+
return new Text([header, formatEmptyMessage("Empty directory", uiTheme)].join("\n"), 0, 0);
|
|
256
253
|
}
|
|
257
254
|
|
|
258
255
|
let dirCount = details?.dirCount;
|
|
@@ -260,8 +257,11 @@ export const lsToolRenderer = {
|
|
|
260
257
|
if (dirCount === undefined || fileCount === undefined) {
|
|
261
258
|
dirCount = 0;
|
|
262
259
|
fileCount = 0;
|
|
263
|
-
for (
|
|
264
|
-
|
|
260
|
+
for (let i = 0; i < entries.length; i++) {
|
|
261
|
+
const entry = entries[i];
|
|
262
|
+
const raw = rawEntries?.[i] ?? entry;
|
|
263
|
+
const name = raw.split(" (")[0];
|
|
264
|
+
if (name.endsWith("/")) {
|
|
265
265
|
dirCount += 1;
|
|
266
266
|
} else {
|
|
267
267
|
fileCount += 1;
|
|
@@ -272,62 +272,36 @@ export const lsToolRenderer = {
|
|
|
272
272
|
const truncation = details?.meta?.truncation;
|
|
273
273
|
const limits = details?.meta?.limits;
|
|
274
274
|
const truncated = Boolean(details?.entryLimitReached || truncation || limits?.resultLimit || limits?.headLimit);
|
|
275
|
-
const icon = truncated
|
|
276
|
-
? uiTheme.styledSymbol("status.warning", "warning")
|
|
277
|
-
: uiTheme.styledSymbol("status.success", "success");
|
|
278
|
-
|
|
279
275
|
const summaryText = [formatCount("dir", dirCount ?? 0), formatCount("file", fileCount ?? 0)].join(
|
|
280
276
|
uiTheme.sep.dot,
|
|
281
277
|
);
|
|
282
|
-
const
|
|
283
|
-
const
|
|
284
|
-
|
|
278
|
+
const meta = truncated ? [summaryText, uiTheme.fg("warning", "truncated")] : [summaryText];
|
|
279
|
+
const header = renderStatusLine(
|
|
280
|
+
{ icon: truncated ? "warning" : "success", title: "Ls", description: args?.path || ".", meta },
|
|
281
|
+
uiTheme,
|
|
282
|
+
);
|
|
285
283
|
|
|
286
|
-
|
|
284
|
+
const fileLines = renderFileList(
|
|
285
|
+
{
|
|
286
|
+
files: entries.map((entry, index) => ({
|
|
287
|
+
path: entry,
|
|
288
|
+
isDirectory: (rawEntries?.[index] ?? entry).endsWith("/"),
|
|
289
|
+
})),
|
|
290
|
+
expanded,
|
|
291
|
+
maxCollapsed: COLLAPSED_LIST_LIMIT,
|
|
292
|
+
},
|
|
293
|
+
uiTheme,
|
|
294
|
+
);
|
|
287
295
|
|
|
288
296
|
const truncationReasons: string[] = [];
|
|
289
|
-
if (limits?.resultLimit) {
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
if (truncation) {
|
|
293
|
-
truncationReasons.push(`output cap ${formatBytes(truncation.outputBytes)}`);
|
|
294
|
-
}
|
|
295
|
-
if (truncation?.artifactId) {
|
|
296
|
-
truncationReasons.push(`full output: artifact://${truncation.artifactId}`);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
const hasTruncation = truncationReasons.length > 0;
|
|
300
|
-
|
|
301
|
-
for (let i = 0; i < maxEntries; i++) {
|
|
302
|
-
const entry = entries[i];
|
|
303
|
-
const rawEntry = rawEntries?.[i] ?? entry;
|
|
304
|
-
const isLast = i === maxEntries - 1 && !hasMoreEntries && !hasTruncation;
|
|
305
|
-
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
306
|
-
const isDir = rawEntry.endsWith("/");
|
|
307
|
-
const entryPath = isDir ? rawEntry.slice(0, -1) : rawEntry;
|
|
308
|
-
const lang = isDir ? undefined : getLanguageFromPath(entryPath);
|
|
309
|
-
const entryIcon = isDir
|
|
310
|
-
? uiTheme.fg("accent", uiTheme.icon.folder)
|
|
311
|
-
: uiTheme.fg("muted", uiTheme.getLangIcon(lang));
|
|
312
|
-
const entryColor = isDir ? "accent" : "toolOutput";
|
|
313
|
-
text += `\n ${uiTheme.fg("dim", branch)} ${entryIcon} ${uiTheme.fg(entryColor, entry)}`;
|
|
314
|
-
}
|
|
297
|
+
if (limits?.resultLimit) truncationReasons.push(`entry limit ${limits.resultLimit.reached}`);
|
|
298
|
+
if (truncation) truncationReasons.push(`output cap ${formatBytes(truncation.outputBytes)}`);
|
|
299
|
+
if (truncation?.artifactId) truncationReasons.push(`full output: artifact://${truncation.artifactId}`);
|
|
315
300
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
text += `\n ${uiTheme.fg("dim", moreEntriesBranch)} ${uiTheme.fg(
|
|
319
|
-
"muted",
|
|
320
|
-
formatMoreItems(entries.length - maxEntries, "entry", uiTheme),
|
|
321
|
-
)}`;
|
|
322
|
-
}
|
|
301
|
+
const extraLines =
|
|
302
|
+
truncationReasons.length > 0 ? [uiTheme.fg("warning", `truncated: ${truncationReasons.join(", ")}`)] : [];
|
|
323
303
|
|
|
324
|
-
|
|
325
|
-
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg(
|
|
326
|
-
"warning",
|
|
327
|
-
`truncated: ${truncationReasons.join(", ")}`,
|
|
328
|
-
)}`;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return new Text(text, 0, 0);
|
|
304
|
+
return new Text([header, ...fileLines, ...extraLines].join("\n"), 0, 0);
|
|
332
305
|
},
|
|
306
|
+
mergeCallAndResult: true,
|
|
333
307
|
};
|
package/src/tools/notebook.ts
CHANGED
|
@@ -1,21 +1,15 @@
|
|
|
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
3
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
7
4
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
8
5
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
9
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";
|
|
10
11
|
import { resolveToCwd } from "./path-utils";
|
|
11
|
-
import {
|
|
12
|
-
formatCount,
|
|
13
|
-
formatErrorMessage,
|
|
14
|
-
formatExpandHint,
|
|
15
|
-
formatMeta,
|
|
16
|
-
formatMoreItems,
|
|
17
|
-
PREVIEW_LIMITS,
|
|
18
|
-
} from "./render-utils";
|
|
12
|
+
import { formatCount, formatErrorMessage, PREVIEW_LIMITS } from "./render-utils";
|
|
19
13
|
|
|
20
14
|
const notebookSchema = Type.Object({
|
|
21
15
|
action: StringEnum(["edit", "insert", "delete"], {
|
|
@@ -200,57 +194,31 @@ export class NotebookTool implements AgentTool<typeof notebookSchema, NotebookTo
|
|
|
200
194
|
|
|
201
195
|
interface NotebookRenderArgs {
|
|
202
196
|
action: string;
|
|
203
|
-
notebookPath
|
|
197
|
+
notebookPath?: string;
|
|
198
|
+
notebook_path?: string;
|
|
204
199
|
cellNumber?: number;
|
|
200
|
+
cell_index?: number;
|
|
205
201
|
cellType?: string;
|
|
202
|
+
cell_type?: string;
|
|
206
203
|
content?: string;
|
|
207
204
|
}
|
|
208
205
|
|
|
209
206
|
const COLLAPSED_TEXT_LIMIT = PREVIEW_LIMITS.COLLAPSED_LINES * 2;
|
|
210
207
|
|
|
211
|
-
function normalizeCellLines(lines: string[]): string[] {
|
|
212
|
-
return lines.map((line) => (line.endsWith("\n") ? line.slice(0, -1) : line));
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
function renderCellPreview(lines: string[], expanded: boolean, uiTheme: Theme): string {
|
|
216
|
-
const normalized = normalizeCellLines(lines);
|
|
217
|
-
if (normalized.length === 0) {
|
|
218
|
-
return `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "(empty cell)")}`;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
const maxLines = expanded ? normalized.length : Math.min(normalized.length, COLLAPSED_TEXT_LIMIT);
|
|
222
|
-
let text = "";
|
|
223
|
-
|
|
224
|
-
for (let i = 0; i < maxLines; i++) {
|
|
225
|
-
const isLast = i === maxLines - 1 && (expanded || normalized.length <= maxLines);
|
|
226
|
-
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
227
|
-
const line = normalized[i];
|
|
228
|
-
text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("toolOutput", line)}`;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const remaining = normalized.length - maxLines;
|
|
232
|
-
if (remaining > 0) {
|
|
233
|
-
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg(
|
|
234
|
-
"muted",
|
|
235
|
-
formatMoreItems(remaining, "line", uiTheme),
|
|
236
|
-
)}`;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return text;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
208
|
export const notebookToolRenderer = {
|
|
243
209
|
renderCall(args: NotebookRenderArgs, uiTheme: Theme): Component {
|
|
244
|
-
const label = uiTheme.fg("toolTitle", uiTheme.bold("Notebook"));
|
|
245
|
-
let text = `${label} ${uiTheme.fg("accent", args.action || "?")}`;
|
|
246
|
-
|
|
247
210
|
const meta: string[] = [];
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
211
|
+
const notebookPath = args.notebookPath ?? args.notebook_path;
|
|
212
|
+
const cellNumber = args.cellNumber ?? args.cell_index;
|
|
213
|
+
const cellType = args.cellType ?? args.cell_type;
|
|
214
|
+
meta.push(`in ${notebookPath || "?"}`);
|
|
215
|
+
if (cellNumber !== undefined) meta.push(`cell:${cellNumber}`);
|
|
216
|
+
if (cellType) meta.push(`type:${cellType}`);
|
|
217
|
+
|
|
218
|
+
const text = renderStatusLine(
|
|
219
|
+
{ icon: "pending", title: "Notebook", description: args.action || "?", meta },
|
|
220
|
+
uiTheme,
|
|
221
|
+
);
|
|
254
222
|
return new Text(text, 0, 0);
|
|
255
223
|
},
|
|
256
224
|
|
|
@@ -258,10 +226,13 @@ export const notebookToolRenderer = {
|
|
|
258
226
|
result: { content: Array<{ type: string; text?: string }>; details?: NotebookToolDetails },
|
|
259
227
|
{ expanded }: RenderResultOptions,
|
|
260
228
|
uiTheme: Theme,
|
|
229
|
+
args?: NotebookRenderArgs,
|
|
261
230
|
): Component {
|
|
262
231
|
const content = result.content?.[0];
|
|
263
232
|
if (content?.type === "text" && content.text?.startsWith("Error:")) {
|
|
264
|
-
|
|
233
|
+
const notebookPath = args?.notebookPath ?? args?.notebook_path ?? "?";
|
|
234
|
+
const header = renderStatusLine({ icon: "error", title: "Notebook", description: notebookPath }, uiTheme);
|
|
235
|
+
return new Text([header, formatErrorMessage(content.text, uiTheme)].join("\n"), 0, 0);
|
|
265
236
|
}
|
|
266
237
|
|
|
267
238
|
const details = result.details;
|
|
@@ -269,25 +240,38 @@ export const notebookToolRenderer = {
|
|
|
269
240
|
const cellIndex = details?.cellIndex;
|
|
270
241
|
const cellType = details?.cellType;
|
|
271
242
|
const totalCells = details?.totalCells;
|
|
272
|
-
const cellSource = details?.cellSource;
|
|
273
|
-
const lineCount = cellSource
|
|
274
|
-
const canExpand = cellSource !== undefined && cellSource.length > COLLAPSED_TEXT_LIMIT;
|
|
243
|
+
const cellSource = details?.cellSource ?? [];
|
|
244
|
+
const lineCount = cellSource.length;
|
|
275
245
|
|
|
276
|
-
const icon = uiTheme.styledSymbol("status.success", "success");
|
|
277
246
|
const actionLabel = action === "insert" ? "Inserted" : action === "delete" ? "Deleted" : "Edited";
|
|
278
247
|
const cellLabel = cellType || "cell";
|
|
279
|
-
const summaryParts = [`${actionLabel} ${cellLabel}
|
|
280
|
-
if (lineCount
|
|
248
|
+
const summaryParts = [`${actionLabel} ${cellLabel} ${cellIndex ?? "?"}`];
|
|
249
|
+
if (lineCount > 0) summaryParts.push(formatCount("line", lineCount));
|
|
281
250
|
if (totalCells !== undefined) summaryParts.push(`${totalCells} total`);
|
|
282
|
-
const summaryText = summaryParts.join(uiTheme.sep.dot);
|
|
283
251
|
|
|
284
|
-
const
|
|
285
|
-
|
|
252
|
+
const outputLines = summaryParts.map(part => uiTheme.fg("dim", part));
|
|
253
|
+
const codeText = cellSource.join("");
|
|
254
|
+
const language = cellType === "markdown" ? "markdown" : undefined;
|
|
286
255
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
256
|
+
const notebookPath = args?.notebookPath ?? args?.notebook_path;
|
|
257
|
+
const notebookLabel = notebookPath ? `${actionLabel} ${notebookPath}` : "Notebook";
|
|
258
|
+
return {
|
|
259
|
+
render: (width: number) =>
|
|
260
|
+
renderCodeCell(
|
|
261
|
+
{
|
|
262
|
+
code: codeText,
|
|
263
|
+
language,
|
|
264
|
+
title: notebookLabel,
|
|
265
|
+
status: "complete",
|
|
266
|
+
output: outputLines.join("\n"),
|
|
267
|
+
codeMaxLines: expanded ? Number.POSITIVE_INFINITY : COLLAPSED_TEXT_LIMIT,
|
|
268
|
+
expanded,
|
|
269
|
+
width,
|
|
270
|
+
},
|
|
271
|
+
uiTheme,
|
|
272
|
+
),
|
|
273
|
+
invalidate: () => {},
|
|
274
|
+
};
|
|
292
275
|
},
|
|
276
|
+
mergeCallAndResult: true,
|
|
293
277
|
};
|
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.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ArtifactManager } from "
|
|
2
|
-
import type { ToolSession } from "
|
|
1
|
+
import { ArtifactManager } from "../session/artifacts";
|
|
2
|
+
import type { ToolSession } from ".";
|
|
3
3
|
|
|
4
4
|
export interface TailBuffer {
|
|
5
5
|
append(chunk: string): void;
|
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 {
|