@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/web/search/render.ts
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Tree-based rendering with collapsed/expanded states for web search results.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import
|
|
8
|
-
import type {
|
|
6
|
+
import type { Component } from "@oh-my-pi/pi-tui";
|
|
7
|
+
import { Text } from "@oh-my-pi/pi-tui";
|
|
8
|
+
import type { RenderResultOptions } from "../../extensibility/custom-tools/types";
|
|
9
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
9
10
|
import {
|
|
10
11
|
formatAge,
|
|
11
12
|
formatCount,
|
|
@@ -17,9 +18,8 @@ import {
|
|
|
17
18
|
PREVIEW_LIMITS,
|
|
18
19
|
TRUNCATE_LENGTHS,
|
|
19
20
|
truncate,
|
|
20
|
-
} from "
|
|
21
|
-
import
|
|
22
|
-
import { Text } from "@oh-my-pi/pi-tui";
|
|
21
|
+
} from "../../tools/render-utils";
|
|
22
|
+
import { renderOutputBlock, renderStatusLine, renderTreeList } from "../../tui";
|
|
23
23
|
import type { WebSearchResponse } from "./types";
|
|
24
24
|
|
|
25
25
|
const MAX_COLLAPSED_ANSWER_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
|
|
@@ -27,15 +27,15 @@ const MAX_EXPANDED_ANSWER_LINES = PREVIEW_LIMITS.EXPANDED_LINES;
|
|
|
27
27
|
const MAX_ANSWER_LINE_LEN = TRUNCATE_LENGTHS.LINE;
|
|
28
28
|
const MAX_SNIPPET_LINES = 2;
|
|
29
29
|
const MAX_SNIPPET_LINE_LEN = TRUNCATE_LENGTHS.LINE;
|
|
30
|
-
const
|
|
30
|
+
const MAX_COLLAPSED_ITEMS = PREVIEW_LIMITS.COLLAPSED_ITEMS;
|
|
31
31
|
const MAX_QUERY_PREVIEW = 2;
|
|
32
32
|
const MAX_QUERY_LEN = 90;
|
|
33
33
|
const MAX_REQUEST_ID_LEN = 36;
|
|
34
34
|
|
|
35
35
|
function renderFallbackText(contentText: string, expanded: boolean, theme: Theme): Component {
|
|
36
|
-
const lines = contentText.split("\n").filter(
|
|
36
|
+
const lines = contentText.split("\n").filter(line => line.trim());
|
|
37
37
|
const maxLines = expanded ? lines.length : 6;
|
|
38
|
-
const displayLines = lines.slice(0, maxLines).map(
|
|
38
|
+
const displayLines = lines.slice(0, maxLines).map(line => truncate(line.trim(), 110, theme.format.ellipsis));
|
|
39
39
|
const remaining = lines.length - displayLines.length;
|
|
40
40
|
|
|
41
41
|
const headerIcon = formatStatusIcon("warning", theme);
|
|
@@ -70,6 +70,7 @@ export function renderWebSearchResult(
|
|
|
70
70
|
result: { content: Array<{ type: string; text?: string }>; details?: WebSearchRenderDetails },
|
|
71
71
|
options: RenderResultOptions,
|
|
72
72
|
theme: Theme,
|
|
73
|
+
args?: { query?: string; provider?: string },
|
|
73
74
|
): Component {
|
|
74
75
|
const { expanded } = options;
|
|
75
76
|
const details = result.details;
|
|
@@ -79,7 +80,7 @@ export function renderWebSearchResult(
|
|
|
79
80
|
return new Text(theme.fg("error", `Error: ${details.error}`), 0, 0);
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
const rawText = result.content?.find(
|
|
83
|
+
const rawText = result.content?.find(block => block.type === "text")?.text?.trim() ?? "";
|
|
83
84
|
const response = details?.response;
|
|
84
85
|
if (!response) {
|
|
85
86
|
return renderFallbackText(rawText, expanded, theme);
|
|
@@ -90,24 +91,23 @@ export function renderWebSearchResult(
|
|
|
90
91
|
const citations = Array.isArray(response.citations) ? response.citations : [];
|
|
91
92
|
const citationCount = citations.length;
|
|
92
93
|
const related = Array.isArray(response.relatedQuestions)
|
|
93
|
-
? response.relatedQuestions.filter(
|
|
94
|
+
? response.relatedQuestions.filter(item => typeof item === "string")
|
|
94
95
|
: [];
|
|
95
96
|
const relatedCount = related.length;
|
|
96
97
|
const searchQueries = Array.isArray(response.searchQueries)
|
|
97
|
-
? response.searchQueries.filter(
|
|
98
|
+
? response.searchQueries.filter(item => typeof item === "string")
|
|
98
99
|
: [];
|
|
99
100
|
const provider = response.provider;
|
|
100
101
|
|
|
101
102
|
// Get answer text
|
|
102
103
|
const answerText = typeof response.answer === "string" ? response.answer.trim() : "";
|
|
103
104
|
const contentText = answerText || rawText;
|
|
104
|
-
const totalAnswerLines = contentText ? contentText.split("\n").filter(
|
|
105
|
+
const totalAnswerLines = contentText ? contentText.split("\n").filter(l => l.trim()).length : 0;
|
|
105
106
|
const answerLimit = expanded ? MAX_EXPANDED_ANSWER_LINES : MAX_COLLAPSED_ANSWER_LINES;
|
|
106
107
|
const answerPreview = contentText
|
|
107
108
|
? getPreviewLines(contentText, answerLimit, MAX_ANSWER_LINE_LEN, theme.format.ellipsis)
|
|
108
109
|
: [];
|
|
109
110
|
|
|
110
|
-
// Build header: status icon Web Search (provider) · counts
|
|
111
111
|
const providerLabel =
|
|
112
112
|
provider === "anthropic"
|
|
113
113
|
? "Anthropic"
|
|
@@ -116,144 +116,110 @@ export function renderWebSearchResult(
|
|
|
116
116
|
: provider === "exa"
|
|
117
117
|
? "Exa"
|
|
118
118
|
: "Unknown";
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const answerTitle = `${theme.fg("accent", theme.status.info)} ${theme.fg("accent", "Answer")}`;
|
|
134
|
-
text += `\n ${theme.fg("dim", theme.tree.branch)} ${answerTitle}`;
|
|
135
|
-
|
|
136
|
-
const remaining = totalAnswerLines - answerPreview.length;
|
|
137
|
-
const allLines: Array<{ text: string; style: "dim" | "muted" }> = [];
|
|
138
|
-
|
|
139
|
-
if (answerPreview.length === 0) {
|
|
140
|
-
allLines.push({ text: "No answer text returned", style: "muted" });
|
|
141
|
-
} else {
|
|
142
|
-
for (const line of answerPreview) {
|
|
143
|
-
allLines.push({ text: line, style: "dim" });
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
if (remaining > 0) {
|
|
147
|
-
allLines.push({ text: formatMoreItems(remaining, "line", theme), style: "muted" });
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
for (let i = 0; i < allLines.length; i++) {
|
|
151
|
-
const { text: lineText, style } = allLines[i];
|
|
152
|
-
const isLastLine = i === allLines.length - 1;
|
|
153
|
-
const lineBranch = isLastLine ? theme.tree.last : theme.tree.branch;
|
|
154
|
-
text += `\n ${theme.fg("dim", theme.tree.vertical)} ${theme.fg("dim", lineBranch)} ${theme.fg(style, lineText)}`;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const summary = [
|
|
158
|
-
formatCount("source", sourceCount),
|
|
159
|
-
formatCount("citation", citationCount),
|
|
160
|
-
formatCount("related question", relatedCount),
|
|
161
|
-
].join(theme.sep.dot);
|
|
162
|
-
text += `\n ${theme.fg("dim", theme.tree.last)} ${theme.fg("muted", summary)}`;
|
|
163
|
-
return new Text(text, 0, 0);
|
|
164
|
-
}
|
|
119
|
+
const queryPreview = args?.query
|
|
120
|
+
? truncate(args.query, 80, theme.format.ellipsis)
|
|
121
|
+
: searchQueries[0]
|
|
122
|
+
? truncate(searchQueries[0], 80, theme.format.ellipsis)
|
|
123
|
+
: undefined;
|
|
124
|
+
const header = renderStatusLine(
|
|
125
|
+
{
|
|
126
|
+
icon: sourceCount > 0 ? "success" : "warning",
|
|
127
|
+
title: "Web Search",
|
|
128
|
+
description: providerLabel,
|
|
129
|
+
meta: [formatCount("source", sourceCount)],
|
|
130
|
+
},
|
|
131
|
+
theme,
|
|
132
|
+
);
|
|
165
133
|
|
|
134
|
+
const remainingAnswer = totalAnswerLines - answerPreview.length;
|
|
166
135
|
const answerLines = answerPreview.length > 0 ? answerPreview : ["No answer text returned"];
|
|
167
|
-
const
|
|
168
|
-
|
|
136
|
+
const answerTree = renderTreeList(
|
|
137
|
+
{
|
|
138
|
+
items: answerLines,
|
|
139
|
+
expanded: true,
|
|
140
|
+
maxCollapsed: answerLines.length,
|
|
141
|
+
itemType: "line",
|
|
142
|
+
renderItem: line => (line === "No answer text returned" ? theme.fg("muted", line) : theme.fg("dim", line)),
|
|
143
|
+
},
|
|
144
|
+
theme,
|
|
169
145
|
);
|
|
170
|
-
const remainingAnswer = totalAnswerLines - answerPreview.length;
|
|
171
146
|
if (remainingAnswer > 0) {
|
|
172
|
-
|
|
147
|
+
answerTree.push(theme.fg("muted", formatMoreItems(remainingAnswer, "line", theme)));
|
|
173
148
|
}
|
|
174
149
|
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
? src.
|
|
185
|
-
: "
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
metaParts
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
metaParts.push(theme.fg("muted",
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
theme.format.ellipsis,
|
|
211
|
-
);
|
|
212
|
-
for (const snippetLine of snippetLines) {
|
|
213
|
-
sourceLines.push(theme.fg("muted", `${theme.format.dash} ${snippetLine}`));
|
|
150
|
+
const sourceTree = renderTreeList(
|
|
151
|
+
{
|
|
152
|
+
items: sources,
|
|
153
|
+
expanded,
|
|
154
|
+
maxCollapsed: MAX_COLLAPSED_ITEMS,
|
|
155
|
+
itemType: "source",
|
|
156
|
+
renderItem: src => {
|
|
157
|
+
const titleText =
|
|
158
|
+
typeof src.title === "string" && src.title.trim()
|
|
159
|
+
? src.title
|
|
160
|
+
: typeof src.url === "string" && src.url.trim()
|
|
161
|
+
? src.url
|
|
162
|
+
: "Untitled";
|
|
163
|
+
const title = truncate(titleText, 70, theme.format.ellipsis);
|
|
164
|
+
const url = typeof src.url === "string" ? src.url : "";
|
|
165
|
+
const domain = url ? getDomain(url) : "";
|
|
166
|
+
const age = formatAge(src.ageSeconds) || (typeof src.publishedDate === "string" ? src.publishedDate : "");
|
|
167
|
+
const metaParts: string[] = [];
|
|
168
|
+
if (domain) metaParts.push(theme.fg("dim", `(${domain})`));
|
|
169
|
+
if (typeof src.author === "string" && src.author.trim()) metaParts.push(theme.fg("muted", src.author));
|
|
170
|
+
if (age) metaParts.push(theme.fg("muted", age));
|
|
171
|
+
const metaSep = theme.fg("dim", theme.sep.dot);
|
|
172
|
+
const metaSuffix = metaParts.length > 0 ? ` ${metaParts.join(metaSep)}` : "";
|
|
173
|
+
const lines: string[] = [`${theme.fg("accent", title)}${metaSuffix}`];
|
|
174
|
+
const snippetText = typeof src.snippet === "string" ? src.snippet : "";
|
|
175
|
+
if (snippetText.trim()) {
|
|
176
|
+
const snippetLines = getPreviewLines(
|
|
177
|
+
snippetText,
|
|
178
|
+
MAX_SNIPPET_LINES,
|
|
179
|
+
MAX_SNIPPET_LINE_LEN,
|
|
180
|
+
theme.format.ellipsis,
|
|
181
|
+
);
|
|
182
|
+
for (const snippetLine of snippetLines) {
|
|
183
|
+
lines.push(theme.fg("muted", `${theme.format.dash} ${snippetLine}`));
|
|
184
|
+
}
|
|
214
185
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
186
|
+
if (url) lines.push(theme.fg("mdLinkUrl", url));
|
|
187
|
+
return lines;
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
theme,
|
|
191
|
+
);
|
|
222
192
|
|
|
223
|
-
const relatedLines:
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
193
|
+
const relatedLines = related.length > 0 ? related : ["No related questions"];
|
|
194
|
+
const relatedTree = renderTreeList(
|
|
195
|
+
{
|
|
196
|
+
items: relatedLines,
|
|
197
|
+
expanded,
|
|
198
|
+
maxCollapsed: MAX_COLLAPSED_ITEMS,
|
|
199
|
+
itemType: "question",
|
|
200
|
+
renderItem: line => theme.fg("muted", line === "No related questions" ? line : `${theme.format.dash} ${line}`),
|
|
201
|
+
},
|
|
202
|
+
theme,
|
|
203
|
+
);
|
|
204
|
+
if (!expanded && relatedCount > MAX_COLLAPSED_ITEMS) {
|
|
205
|
+
relatedTree.push(theme.fg("muted", formatMoreItems(relatedCount - MAX_COLLAPSED_ITEMS, "question", theme)));
|
|
234
206
|
}
|
|
235
207
|
|
|
236
208
|
const metaLines: string[] = [];
|
|
237
209
|
metaLines.push(`${theme.fg("muted", "Provider:")} ${theme.fg("text", providerLabel)}`);
|
|
238
|
-
if (response.model) {
|
|
239
|
-
metaLines.push(`${theme.fg("muted", "Model:")} ${theme.fg("text", response.model)}`);
|
|
240
|
-
}
|
|
210
|
+
if (response.model) metaLines.push(`${theme.fg("muted", "Model:")} ${theme.fg("text", response.model)}`);
|
|
241
211
|
metaLines.push(`${theme.fg("muted", "Sources:")} ${theme.fg("text", String(sourceCount))}`);
|
|
242
|
-
if (citationCount > 0)
|
|
212
|
+
if (citationCount > 0)
|
|
243
213
|
metaLines.push(`${theme.fg("muted", "Citations:")} ${theme.fg("text", String(citationCount))}`);
|
|
244
|
-
}
|
|
245
|
-
if (relatedCount > 0) {
|
|
246
|
-
metaLines.push(`${theme.fg("muted", "Related:")} ${theme.fg("text", String(relatedCount))}`);
|
|
247
|
-
}
|
|
214
|
+
if (relatedCount > 0) metaLines.push(`${theme.fg("muted", "Related:")} ${theme.fg("text", String(relatedCount))}`);
|
|
248
215
|
if (response.usage) {
|
|
249
216
|
const usageParts: string[] = [];
|
|
250
217
|
if (response.usage.inputTokens !== undefined) usageParts.push(`in ${response.usage.inputTokens}`);
|
|
251
218
|
if (response.usage.outputTokens !== undefined) usageParts.push(`out ${response.usage.outputTokens}`);
|
|
252
219
|
if (response.usage.totalTokens !== undefined) usageParts.push(`total ${response.usage.totalTokens}`);
|
|
253
220
|
if (response.usage.searchRequests !== undefined) usageParts.push(`search ${response.usage.searchRequests}`);
|
|
254
|
-
if (usageParts.length > 0)
|
|
221
|
+
if (usageParts.length > 0)
|
|
255
222
|
metaLines.push(`${theme.fg("muted", "Usage:")} ${theme.fg("text", usageParts.join(theme.sep.dot))}`);
|
|
256
|
-
}
|
|
257
223
|
}
|
|
258
224
|
if (response.requestId) {
|
|
259
225
|
metaLines.push(
|
|
@@ -264,55 +230,42 @@ export function renderWebSearchResult(
|
|
|
264
230
|
);
|
|
265
231
|
}
|
|
266
232
|
if (searchQueries.length > 0) {
|
|
267
|
-
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}
|
|
272
|
-
if (searchQueries.length > MAX_QUERY_PREVIEW) {
|
|
273
|
-
metaLines.push(theme.fg("muted", formatMoreItems(searchQueries.length - MAX_QUERY_PREVIEW, "query", theme)));
|
|
274
|
-
}
|
|
233
|
+
const queriesPreview = searchQueries.slice(0, MAX_QUERY_PREVIEW);
|
|
234
|
+
const queryList = queriesPreview.map(q => truncate(q, MAX_QUERY_LEN, theme.format.ellipsis));
|
|
235
|
+
const suffix = searchQueries.length > queriesPreview.length ? theme.format.ellipsis : "";
|
|
236
|
+
metaLines.push(`${theme.fg("muted", "Queries:")} ${theme.fg("text", queryList.join("; "))}${suffix}`);
|
|
275
237
|
}
|
|
276
238
|
|
|
277
|
-
const sections
|
|
239
|
+
const sections = [
|
|
240
|
+
...(queryPreview
|
|
241
|
+
? [
|
|
242
|
+
{
|
|
243
|
+
lines: [`${theme.fg("muted", "Query:")} ${theme.fg("text", queryPreview)}`],
|
|
244
|
+
},
|
|
245
|
+
]
|
|
246
|
+
: []),
|
|
247
|
+
{ label: theme.fg("toolTitle", "Answer"), lines: answerTree },
|
|
278
248
|
{
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
lines: answerSectionLines,
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
title: "Sources",
|
|
285
|
-
icon: formatStatusIcon(sourceCount > 0 ? "success" : "warning", theme),
|
|
286
|
-
lines: sourceLines,
|
|
287
|
-
},
|
|
288
|
-
{
|
|
289
|
-
title: "Related",
|
|
290
|
-
icon: formatStatusIcon(relatedCount > 0 ? "info" : "warning", theme),
|
|
291
|
-
lines: relatedLines,
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
title: "Meta",
|
|
295
|
-
icon: formatStatusIcon("info", theme),
|
|
296
|
-
lines: metaLines,
|
|
249
|
+
label: theme.fg("toolTitle", "Sources"),
|
|
250
|
+
lines: sourceTree.length > 0 ? sourceTree : [theme.fg("muted", "No sources returned")],
|
|
297
251
|
},
|
|
252
|
+
{ label: theme.fg("toolTitle", "Related"), lines: relatedTree },
|
|
253
|
+
{ label: theme.fg("toolTitle", "Metadata"), lines: metaLines },
|
|
298
254
|
];
|
|
299
255
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return new Text(text, 0, 0);
|
|
256
|
+
return {
|
|
257
|
+
render: (width: number) =>
|
|
258
|
+
renderOutputBlock(
|
|
259
|
+
{
|
|
260
|
+
header,
|
|
261
|
+
state: sourceCount > 0 ? "success" : "warning",
|
|
262
|
+
sections,
|
|
263
|
+
width,
|
|
264
|
+
},
|
|
265
|
+
theme,
|
|
266
|
+
),
|
|
267
|
+
invalidate: () => {},
|
|
268
|
+
};
|
|
316
269
|
}
|
|
317
270
|
|
|
318
271
|
/** Render web search call (query preview) */
|
|
@@ -322,11 +275,12 @@ export function renderWebSearchCall(
|
|
|
322
275
|
): Component {
|
|
323
276
|
const provider = args.provider ?? "auto";
|
|
324
277
|
const query = truncate(args.query, 80, theme.format.ellipsis);
|
|
325
|
-
const text =
|
|
278
|
+
const text = renderStatusLine({ icon: "pending", title: "Web Search", description: query, meta: [provider] }, theme);
|
|
326
279
|
return new Text(text, 0, 0);
|
|
327
280
|
}
|
|
328
281
|
|
|
329
282
|
export const webSearchToolRenderer = {
|
|
330
283
|
renderCall: renderWebSearchCall,
|
|
331
284
|
renderResult: renderWebSearchResult,
|
|
285
|
+
mergeCallAndResult: true,
|
|
332
286
|
};
|
package/tsconfig.json
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2024",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"lib": [
|
|
6
|
-
"ES2024"
|
|
7
|
-
],
|
|
8
|
-
"strict": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"forceConsistentCasingInFileNames": true,
|
|
12
|
-
"moduleResolution": "Bundler",
|
|
13
|
-
"resolveJsonModule": true,
|
|
14
|
-
"allowImportingTsExtensions": true,
|
|
15
|
-
"experimentalDecorators": true,
|
|
16
|
-
"emitDecoratorMetadata": true,
|
|
17
|
-
"useDefineForClassFields": false,
|
|
18
|
-
"types": [
|
|
19
|
-
"bun",
|
|
20
|
-
"node"
|
|
21
|
-
],
|
|
22
|
-
"noEmit": true,
|
|
23
|
-
"baseUrl": ".",
|
|
24
|
-
"paths": {
|
|
25
|
-
"@oh-my-pi/pi-coding-agent": [
|
|
26
|
-
"./src/index.ts"
|
|
27
|
-
],
|
|
28
|
-
"@oh-my-pi/pi-coding-agent/*": [
|
|
29
|
-
"./src/*"
|
|
30
|
-
]
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"include": [
|
|
34
|
-
"src/**/*.ts"
|
|
35
|
-
],
|
|
36
|
-
"exclude": [
|
|
37
|
-
"node_modules",
|
|
38
|
-
"dist",
|
|
39
|
-
"**/*.test.ts",
|
|
40
|
-
"test/**"
|
|
41
|
-
]
|
|
42
|
-
}
|