@oh-my-pi/pi-coding-agent 7.0.0 → 8.0.1
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 +87 -0
- package/README.md +1 -1
- package/docs/hooks.md +2 -2
- package/docs/sdk.md +1 -1
- package/package.json +12 -11
- package/scripts/format-prompts.ts +143 -0
- package/scripts/generate-template.ts +1 -1
- package/src/cli/args.ts +3 -3
- package/src/cli/config-cli.ts +4 -4
- package/src/cli/file-processor.ts +3 -3
- package/src/cli/list-models.ts +2 -2
- package/src/cli/plugin-cli.ts +3 -3
- package/src/cli/session-picker.ts +2 -2
- package/src/cli/setup-cli.ts +2 -2
- package/src/cli/stats-cli.ts +1 -1
- package/src/cli/update-cli.ts +2 -2
- package/src/{core → config}/keybindings.ts +1 -1
- package/src/{core → config}/model-registry.ts +1 -1
- package/src/{core → config}/model-resolver.ts +3 -3
- package/src/{core → config}/prompt-templates.ts +2 -2
- package/src/{core → config}/settings-manager.ts +6 -6
- package/src/{core/cursor/exec-bridge.ts → cursor.ts} +4 -4
- package/src/discovery/agents-md.ts +4 -4
- package/src/discovery/builtin.ts +17 -17
- package/src/discovery/claude.ts +12 -12
- package/src/discovery/cline.ts +6 -6
- package/src/discovery/codex.ts +21 -21
- package/src/discovery/cursor.ts +9 -9
- package/src/discovery/gemini.ts +9 -9
- package/src/discovery/github.ts +6 -6
- package/src/discovery/helpers.ts +4 -4
- package/src/discovery/index.ts +16 -16
- package/src/discovery/mcp-json.ts +4 -4
- package/src/discovery/ssh.ts +4 -4
- package/src/discovery/vscode.ts +4 -4
- package/src/discovery/windsurf.ts +6 -6
- package/src/{core/tools/exa → exa}/company.ts +2 -3
- package/src/{core/tools/exa → exa}/index.ts +2 -2
- package/src/{core/tools/exa → exa}/linkedin.ts +2 -3
- package/src/{core/tools/exa → exa}/mcp-client.ts +2 -2
- package/src/{core/tools/exa → exa}/render.ts +3 -3
- package/src/{core/tools/exa → exa}/researcher.ts +1 -1
- package/src/{core/tools/exa → exa}/search.ts +2 -10
- package/src/{core/tools/exa → exa}/websets.ts +1 -1
- package/src/{core → exec}/bash-executor.ts +22 -6
- package/src/{core → export}/custom-share.ts +1 -1
- package/src/{core/export-html → export/html}/index.ts +3 -3
- package/src/{core → export}/ttsr.ts +2 -2
- package/src/{core → extensibility}/custom-commands/bundled/review/index.ts +4 -4
- package/src/{core → extensibility}/custom-commands/loader.ts +3 -3
- package/src/{core → extensibility}/custom-commands/types.ts +1 -1
- package/src/{core → extensibility}/custom-tools/loader.ts +9 -9
- package/src/{core → extensibility}/custom-tools/types.ts +6 -6
- package/src/{core → extensibility}/custom-tools/wrapper.ts +1 -1
- package/src/{core → extensibility}/extensions/loader.ts +8 -8
- package/src/{core → extensibility}/extensions/runner.ts +3 -3
- package/src/{core → extensibility}/extensions/types.ts +15 -15
- package/src/{core → extensibility}/extensions/wrapper.ts +1 -1
- package/src/{core → extensibility}/hooks/index.ts +1 -1
- package/src/{core → extensibility}/hooks/loader.ts +7 -7
- package/src/{core → extensibility}/hooks/runner.ts +4 -4
- package/src/{core → extensibility}/hooks/types.ts +9 -9
- package/src/{core → extensibility}/plugins/doctor.ts +1 -1
- package/src/{core → extensibility}/plugins/installer.ts +2 -3
- package/src/{core → extensibility}/plugins/paths.ts +1 -1
- package/src/{core → extensibility}/skills.ts +8 -48
- package/src/{core → extensibility}/slash-commands.ts +6 -6
- package/src/index.ts +127 -128
- package/src/internal-urls/agent-protocol.ts +126 -0
- package/src/internal-urls/artifact-protocol.ts +93 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/router.ts +69 -0
- package/src/internal-urls/rule-protocol.ts +56 -0
- package/src/internal-urls/skill-protocol.ts +112 -0
- package/src/internal-urls/types.ts +48 -0
- package/src/{core/python-executor.ts → ipy/executor.ts} +51 -11
- package/src/{core/python-gateway-coordinator.ts → ipy/gateway-coordinator.ts} +41 -325
- package/src/{core/python-kernel.ts → ipy/kernel.ts} +38 -10
- package/src/ipy/prelude.ts +3 -0
- package/src/{core/tools/lsp → lsp}/client.ts +7 -6
- package/src/{core/tools/lsp → lsp}/clients/biome-client.ts +1 -1
- package/src/{core/tools/lsp → lsp}/clients/index.ts +1 -1
- package/src/{core/tools/lsp → lsp}/clients/lsp-linter-client.ts +4 -4
- package/src/{core/tools/lsp → lsp}/config.ts +1 -1
- package/src/{core/tools/lsp → lsp}/index.ts +16 -15
- package/src/{core/tools/lsp → lsp}/render.ts +2 -2
- package/src/{core/tools/lsp → lsp}/types.ts +14 -16
- package/src/{core/tools/lsp → lsp}/utils.ts +1 -1
- package/src/main.ts +12 -12
- package/src/{core/mcp → mcp}/config.ts +8 -8
- package/src/{core/mcp → mcp}/loader.ts +5 -6
- package/src/{core/mcp → mcp}/manager.ts +2 -2
- package/src/{core/mcp → mcp}/tool-bridge.ts +35 -6
- package/src/{core/mcp → mcp}/tool-cache.ts +1 -1
- package/src/{core/mcp → mcp}/transports/http.ts +7 -1
- package/src/{core/mcp → mcp}/transports/stdio.ts +1 -1
- package/src/{core/mcp → mcp}/types.ts +1 -1
- package/src/migrations.ts +2 -2
- package/src/modes/{interactive/components → components}/armin.ts +1 -1
- package/src/modes/{interactive/components → components}/assistant-message.ts +1 -1
- package/src/modes/{interactive/components → components}/bash-execution.ts +37 -29
- package/src/modes/{interactive/components → components}/bordered-loader.ts +1 -1
- package/src/modes/{interactive/components → components}/branch-summary-message.ts +2 -2
- package/src/modes/{interactive/components → components}/compaction-summary-message.ts +2 -2
- package/src/modes/{interactive/components → components}/custom-message.ts +3 -3
- package/src/modes/{interactive/components → components}/diff.ts +1 -1
- package/src/modes/{interactive/components → components}/dynamic-border.ts +1 -1
- package/src/modes/{interactive/components → components}/extensions/extension-dashboard.ts +3 -3
- package/src/modes/{interactive/components → components}/extensions/extension-list.ts +2 -2
- package/src/modes/{interactive/components → components}/extensions/inspector-panel.ts +1 -1
- package/src/modes/{interactive/components → components}/extensions/state-manager.ts +11 -17
- package/src/modes/{interactive/components → components}/extensions/types.ts +1 -1
- package/src/modes/{interactive/components → components}/footer.ts +3 -3
- package/src/modes/{interactive/components → components}/history-search.ts +2 -2
- package/src/modes/{interactive/components → components}/hook-editor.ts +1 -1
- package/src/modes/{interactive/components → components}/hook-input.ts +1 -1
- package/src/modes/{interactive/components → components}/hook-message.ts +3 -3
- package/src/modes/{interactive/components → components}/hook-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/keybinding-hints.ts +2 -2
- package/src/modes/{interactive/components → components}/login-dialog.ts +1 -1
- package/src/modes/{interactive/components → components}/model-selector.ts +5 -5
- package/src/modes/{interactive/components → components}/oauth-selector.ts +2 -2
- package/src/modes/{interactive/components → components}/plugin-settings.ts +3 -3
- package/src/modes/{interactive/components → components}/python-execution.ts +35 -24
- package/src/modes/{interactive/components → components}/queue-mode-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/read-tool-group.ts +2 -2
- package/src/modes/{interactive/components → components}/session-selector.ts +3 -3
- package/src/modes/{interactive/components → components}/settings-defs.ts +2 -2
- package/src/modes/{interactive/components → components}/settings-selector.ts +2 -2
- package/src/modes/{interactive/components → components}/show-images-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/status-line/segments.ts +2 -2
- package/src/modes/{interactive/components → components}/status-line/separators.ts +1 -1
- package/src/modes/{interactive/components → components}/status-line/types.ts +2 -2
- package/src/modes/{interactive/components → components}/status-line-segment-editor.ts +2 -2
- package/src/modes/{interactive/components → components}/status-line.ts +3 -3
- package/src/modes/{interactive/components → components}/theme-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/thinking-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/todo-display.ts +3 -4
- package/src/modes/{interactive/components → components}/todo-reminder.ts +2 -2
- package/src/modes/{interactive/components → components}/tool-execution.ts +8 -8
- package/src/modes/{interactive/components → components}/tree-selector.ts +3 -3
- package/src/modes/{interactive/components → components}/ttsr-notification.ts +2 -2
- package/src/modes/{interactive/components → components}/user-message-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/user-message.ts +1 -1
- package/src/modes/{interactive/components → components}/welcome.ts +2 -2
- package/src/modes/{interactive/controllers → controllers}/command-controller.ts +32 -30
- package/src/modes/{interactive/controllers → controllers}/event-controller.ts +9 -9
- package/src/modes/{interactive/controllers → controllers}/extension-ui-controller.ts +8 -8
- package/src/modes/{interactive/controllers → controllers}/input-controller.ts +6 -6
- package/src/modes/{interactive/controllers → controllers}/selector-controller.ts +16 -16
- package/src/modes/index.ts +1 -1
- package/src/modes/{interactive/interactive-mode.ts → interactive-mode.ts} +14 -14
- package/src/modes/print-mode.ts +1 -1
- package/src/modes/rpc/rpc-client.ts +3 -3
- package/src/modes/rpc/rpc-mode.ts +3 -3
- package/src/modes/rpc/rpc-types.ts +3 -3
- package/src/modes/{interactive/theme → theme}/theme.ts +1 -1
- package/src/modes/{interactive/types.ts → types.ts} +8 -9
- package/src/modes/{interactive/utils → utils}/ui-helpers.ts +20 -27
- package/src/{core/tools/patch → patch}/applicator.ts +1 -1
- package/src/{core/tools/patch → patch}/diff.ts +1 -1
- package/src/{core/tools/patch → patch}/index.ts +31 -36
- package/src/{core/tools/patch → patch}/shared.ts +9 -6
- package/src/prompts/agents/explore.md +83 -46
- package/src/prompts/agents/init.md +9 -4
- package/src/prompts/agents/plan.md +8 -7
- package/src/prompts/agents/reviewer.md +36 -18
- package/src/prompts/agents/task.md +4 -4
- package/src/prompts/compaction/branch-summary-preamble.md +0 -1
- package/src/prompts/review-request.md +0 -1
- package/src/prompts/system/custom-system-prompt.md +2 -14
- package/src/prompts/system/file-operations.md +0 -2
- package/src/prompts/system/system-prompt.md +147 -138
- package/src/prompts/system/web-search.md +26 -0
- package/src/prompts/tools/ask.md +31 -24
- package/src/prompts/tools/bash.md +20 -17
- package/src/prompts/tools/calculator.md +9 -5
- package/src/prompts/tools/fetch.md +16 -0
- package/src/prompts/tools/find.md +15 -5
- package/src/prompts/tools/gemini-image.md +21 -6
- package/src/prompts/tools/grep.md +28 -12
- package/src/prompts/tools/lsp.md +35 -14
- package/src/prompts/tools/patch.md +39 -41
- package/src/prompts/tools/python.md +59 -76
- package/src/prompts/tools/read.md +23 -22
- package/src/prompts/tools/replace.md +19 -12
- package/src/prompts/tools/ssh.md +21 -28
- package/src/prompts/tools/task.md +54 -44
- package/src/prompts/tools/todo-write.md +52 -163
- package/src/prompts/tools/web-search.md +16 -9
- package/src/prompts/tools/write.md +13 -2
- package/src/{core/sdk.ts → sdk.ts} +65 -34
- package/src/{core → session}/agent-session.ts +45 -37
- package/src/{core → session}/agent-storage.ts +2 -2
- package/src/session/artifacts.ts +110 -0
- package/src/{core → session}/auth-storage.ts +1 -1
- package/src/{core → session}/compaction/branch-summarization.ts +5 -5
- package/src/{core → session}/compaction/compaction.ts +6 -6
- package/src/{core → session}/compaction/utils.ts +3 -3
- package/src/{core → session}/history-storage.ts +1 -1
- package/src/{core → session}/messages.ts +6 -8
- package/src/{core → session}/session-manager.ts +2 -2
- package/src/{core → session}/storage-migration.ts +2 -2
- package/src/session/streaming-output.ts +177 -0
- package/src/{core/ssh → ssh}/connection-manager.ts +1 -1
- package/src/{core/ssh → ssh}/ssh-executor.ts +19 -4
- package/src/{core/ssh → ssh}/sshfs-mount.ts +1 -1
- package/src/{core/system-prompt.ts → system-prompt.ts} +8 -37
- package/src/{core/tools/task → task}/agents.ts +8 -8
- package/src/{core/tools/task → task}/commands.ts +5 -6
- package/src/{core/tools/task → task}/discovery.ts +3 -3
- package/src/{core/tools/task → task}/executor.ts +34 -44
- package/src/{core/tools/task → task}/index.ts +206 -50
- package/src/{core/tools/task → task}/render.ts +80 -23
- package/src/{core/tools/task → task}/subprocess-tool-registry.ts +1 -1
- package/src/task/template.ts +47 -0
- package/src/{core/tools/task → task}/types.ts +19 -27
- package/src/{core/tools/task → task}/worker-protocol.ts +8 -4
- package/src/{core/tools/task → task}/worker.ts +34 -29
- package/src/task/worktree.ts +166 -0
- package/src/{core/tools → tools}/ask.ts +13 -21
- package/src/{core/tools → tools}/bash-interceptor.ts +1 -1
- package/src/{core/tools → tools}/bash.ts +61 -63
- package/src/{core/tools → tools}/calculator.ts +4 -4
- package/src/{core/tools → tools}/complete.ts +1 -1
- package/src/{core/tools → tools}/context.ts +2 -2
- package/src/{core/tools/web-fetch.ts → tools/fetch.ts} +97 -76
- package/src/{core/tools → tools}/find.ts +80 -104
- package/src/{core/tools → tools}/gemini-image.ts +420 -29
- package/src/{core/tools → tools}/grep.ts +155 -164
- package/src/{core/tools → tools}/index.ts +63 -56
- package/src/tools/list-limit.ts +40 -0
- package/src/{core/tools → tools}/ls.ts +44 -35
- package/src/{core/tools → tools}/notebook.ts +3 -3
- package/src/tools/output-meta.ts +443 -0
- package/src/tools/output-utils.ts +63 -0
- package/src/{core/tools → tools}/python.ts +105 -89
- package/src/tools/read.ts +882 -0
- package/src/{core/tools → tools}/render-utils.ts +1 -1
- package/src/{core/tools → tools}/renderers.ts +8 -10
- package/src/{core/tools → tools}/review.ts +2 -2
- package/src/{core/tools → tools}/ssh.ts +56 -59
- package/src/{core/tools → tools}/todo-write.ts +12 -23
- package/src/tools/tool-errors.ts +95 -0
- package/src/tools/tool-result.ts +92 -0
- package/src/{core/tools → tools}/truncate.ts +2 -2
- package/src/{core/tools → tools}/write.ts +15 -13
- package/src/utils/changelog.ts +1 -1
- package/src/{core → utils}/file-mentions.ts +4 -4
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/shell.ts +1 -1
- package/src/{core → utils}/title-generator.ts +4 -4
- package/src/utils/tools-manager.ts +1 -1
- package/src/{core/tools/web-scrapers → web/scrapers}/choosealicense.ts +1 -1
- package/src/{core/tools/web-scrapers → web/scrapers}/twitter.ts +3 -2
- package/src/{core/tools/web-scrapers → web/scrapers}/types.ts +4 -2
- package/src/{core/tools/web-scrapers → web/scrapers}/utils.ts +1 -1
- package/src/{core/tools/web-scrapers → web/scrapers}/youtube.ts +14 -13
- package/src/{core/tools/web-search → web/search}/auth.ts +4 -4
- package/src/{core/tools/web-search → web/search}/index.ts +22 -71
- package/src/{core/tools/web-search → web/search}/providers/anthropic.ts +7 -10
- package/src/{core/tools/web-search → web/search}/providers/exa.ts +2 -2
- package/src/{core/tools/web-search → web/search}/providers/perplexity.ts +4 -16
- package/src/{core/tools/web-search → web/search}/render.ts +3 -3
- package/tsconfig.json +25 -0
- package/scripts/migrate-sessions.sh +0 -93
- package/src/core/index.ts +0 -56
- package/src/core/python-prelude.ts +0 -3
- package/src/core/ssh-executor.ts +0 -5
- package/src/core/streaming-output.ts +0 -115
- package/src/core/tools/output.ts +0 -519
- package/src/core/tools/read.ts +0 -717
- package/src/core/tools/task/template.ts +0 -37
- package/src/prompts/tools/output.md +0 -47
- package/src/prompts/tools/web-fetch.md +0 -9
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
- /package/src/{core/tools/exa → exa}/types.ts +0 -0
- /package/src/{core → exec}/exec.ts +0 -0
- /package/src/{core/export-html → export/html}/template.css +0 -0
- /package/src/{core/export-html → export/html}/template.generated.ts +0 -0
- /package/src/{core/export-html → export/html}/template.html +0 -0
- /package/src/{core/export-html → export/html}/template.js +0 -0
- /package/src/{core/export-html → export/html}/template.macro.ts +0 -0
- /package/src/{core/export-html → export/html}/vendor/highlight.min.js +0 -0
- /package/src/{core/export-html → export/html}/vendor/marked.min.js +0 -0
- /package/src/{core → extensibility}/custom-commands/index.ts +0 -0
- /package/src/{core → extensibility}/custom-tools/index.ts +0 -0
- /package/src/{core → extensibility}/extensions/index.ts +0 -0
- /package/src/{core → extensibility}/hooks/tool-wrapper.ts +0 -0
- /package/src/{core → extensibility}/plugins/index.ts +0 -0
- /package/src/{core → extensibility}/plugins/loader.ts +0 -0
- /package/src/{core → extensibility}/plugins/manager.ts +0 -0
- /package/src/{core → extensibility}/plugins/parser.ts +0 -0
- /package/src/{core → extensibility}/plugins/types.ts +0 -0
- /package/src/{core/python-modules.ts → ipy/modules.ts} +0 -0
- /package/src/{core/python-prelude.py → ipy/prelude.py} +0 -0
- /package/src/{core/tools/lsp → lsp}/defaults.json +0 -0
- /package/src/{core/tools/lsp → lsp}/edits.ts +0 -0
- /package/src/{core/tools/lsp → lsp}/lspmux.ts +0 -0
- /package/src/{core/tools/lsp → lsp}/rust-analyzer.ts +0 -0
- /package/src/{core/mcp → mcp}/client.ts +0 -0
- /package/src/{core/mcp → mcp}/index.ts +0 -0
- /package/src/{core/mcp → mcp}/json-rpc.ts +0 -0
- /package/src/{core/mcp → mcp}/transports/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/countdown-timer.ts +0 -0
- /package/src/modes/{interactive/components → components}/custom-editor.ts +0 -0
- /package/src/modes/{interactive/components → components}/extensions/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/status-line/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/status-line/presets.ts +0 -0
- /package/src/modes/{interactive/components → components}/visual-truncate.ts +0 -0
- /package/src/modes/{interactive/theme → theme}/dark.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/alabaster.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/amethyst.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/anthracite.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/basalt.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/birch.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-abyss.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-arctic.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-aurora.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-catppuccin.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-cavern.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-copper.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-cosmos.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-cyberpunk.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-dracula.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-eclipse.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-ember.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-equinox.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-forest.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-github.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-gruvbox.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-lavender.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-lunar.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-midnight.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-monochrome.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-monokai.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-nebula.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-nord.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-ocean.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-one.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-rainforest.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-reef.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-retro.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-rose-pine.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-sakura.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-slate.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-solarized.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-solstice.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-starfall.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-sunset.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-swamp.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-synthwave.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-taiga.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-terminal.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-tokyo-night.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-tundra.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-twilight.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-volcanic.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/graphite.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/index.ts +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-arctic.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-aurora-day.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-canyon.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-catppuccin.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-cirrus.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-coral.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-cyberpunk.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-dawn.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-dunes.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-eucalyptus.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-forest.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-frost.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-github.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-glacier.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-gruvbox.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-haze.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-honeycomb.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-lagoon.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-lavender.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-meadow.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-mint.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-monochrome.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-ocean.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-one.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-opal.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-orchard.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-paper.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-prism.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-retro.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-sand.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-savanna.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-solarized.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-soleil.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-sunset.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-synthwave.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-tokyo-night.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-wetland.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-zenith.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/limestone.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/mahogany.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/marble.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/obsidian.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/onyx.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/pearl.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/porcelain.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/quartz.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/sandstone.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/titanium.json +0 -0
- /package/src/modes/{interactive/theme → theme}/light.json +0 -0
- /package/src/modes/{interactive/theme → theme}/theme-schema.json +0 -0
- /package/src/{core/tools/patch → patch}/fuzzy.ts +0 -0
- /package/src/{core/tools/patch → patch}/normalize.ts +0 -0
- /package/src/{core/tools/patch → patch}/normative.ts +0 -0
- /package/src/{core/tools/patch → patch}/parser.ts +0 -0
- /package/src/{core/tools/patch → patch}/types.ts +0 -0
- /package/src/{core → session}/compaction/index.ts +0 -0
- /package/src/{core → session}/session-storage.ts +0 -0
- /package/src/{core/tools/task → task}/name-generator.ts +0 -0
- /package/src/{core/tools/task → task}/omp-command.ts +0 -0
- /package/src/{core/tools/task → task}/parallel.ts +0 -0
- /package/src/{core/tools → tools}/jtd-to-json-schema.ts +0 -0
- /package/src/{core/tools → tools}/path-utils.ts +0 -0
- /package/src/{core → utils}/event-bus.ts +0 -0
- /package/src/{core → utils}/frontmatter.ts +0 -0
- /package/src/{core → utils}/terminal-notify.ts +0 -0
- /package/src/{core → utils}/timings.ts +0 -0
- /package/src/{core → utils}/utils.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/artifacthub.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/arxiv.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/aur.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/biorxiv.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/bluesky.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/brew.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/cheatsh.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/chocolatey.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/cisa-kev.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/clojars.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/coingecko.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/crates-io.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/crossref.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/devto.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/discogs.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/discourse.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/dockerhub.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/fdroid.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/firefox-addons.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/flathub.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/github-gist.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/github.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/gitlab.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/go-pkg.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/hackage.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/hackernews.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/hex.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/huggingface.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/iacr.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/index.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/jetbrains-marketplace.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/lemmy.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/lobsters.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/mastodon.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/maven.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/mdn.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/metacpan.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/musicbrainz.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/npm.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/nuget.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/nvd.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/ollama.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/open-vsx.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/opencorporates.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/openlibrary.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/orcid.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/osv.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/packagist.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/pub-dev.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/pubmed.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/pypi.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/rawg.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/readthedocs.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/reddit.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/repology.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/rfc.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/rubygems.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/searchcode.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/sec-edgar.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/semantic-scholar.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/snapcraft.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/sourcegraph.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/spdx.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/spotify.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/stackoverflow.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/terraform.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/tldr.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/vimeo.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/vscode-marketplace.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/w3c.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/wikidata.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/wikipedia.ts +0 -0
- /package/src/{core/tools/web-search → web/search}/types.ts +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import type { Diagnostic, DiagnosticSeverity, LinterClient, ServerConfig } from "
|
|
7
|
+
import type { Diagnostic, DiagnosticSeverity, LinterClient, ServerConfig } from "$c/lsp/types";
|
|
8
8
|
|
|
9
9
|
// =============================================================================
|
|
10
10
|
// Biome JSON Output Types
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
export { BiomeClient } from "./biome-client";
|
|
9
9
|
export { LspLinterClient } from "./lsp-linter-client";
|
|
10
10
|
|
|
11
|
-
import type { LinterClient, ServerConfig } from "
|
|
11
|
+
import type { LinterClient, ServerConfig } from "$c/lsp/types";
|
|
12
12
|
import { LspLinterClient } from "./lsp-linter-client";
|
|
13
13
|
|
|
14
14
|
// Cache of linter clients by server name + cwd
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Uses the Language Server Protocol for formatting and diagnostics.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { getOrCreateClient, notifySaved, sendRequest, syncContent } from "
|
|
7
|
-
import { applyTextEditsToString } from "
|
|
8
|
-
import type { Diagnostic, LinterClient, LspClient, ServerConfig, TextEdit } from "
|
|
9
|
-
import { fileToUri } from "
|
|
6
|
+
import { getOrCreateClient, notifySaved, sendRequest, syncContent } from "$c/lsp/client";
|
|
7
|
+
import { applyTextEditsToString } from "$c/lsp/edits";
|
|
8
|
+
import type { Diagnostic, LinterClient, LspClient, ServerConfig, TextEdit } from "$c/lsp/types";
|
|
9
|
+
import { fileToUri } from "$c/lsp/utils";
|
|
10
10
|
|
|
11
11
|
/** Default formatting options for LSP */
|
|
12
12
|
const DEFAULT_FORMAT_OPTIONS = {
|
|
@@ -3,7 +3,7 @@ import { basename, extname, join } from "node:path";
|
|
|
3
3
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
4
4
|
import { YAML } from "bun";
|
|
5
5
|
import { globSync } from "glob";
|
|
6
|
-
import { getConfigDirPaths } from "
|
|
6
|
+
import { getConfigDirPaths } from "$c/config";
|
|
7
7
|
import { BiomeClient } from "./clients/biome-client";
|
|
8
8
|
import DEFAULTS from "./defaults.json" with { type: "json" };
|
|
9
9
|
import type { ServerConfig } from "./types";
|
|
@@ -4,11 +4,12 @@ import path from "node:path";
|
|
|
4
4
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
5
5
|
import { logger, once, untilAborted } from "@oh-my-pi/pi-utils";
|
|
6
6
|
import type { BunFile } from "bun";
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import type { ToolSession } from "
|
|
11
|
-
import { resolveToCwd } from "
|
|
7
|
+
import { renderPromptTemplate } from "$c/config/prompt-templates";
|
|
8
|
+
import { type Theme, theme } from "$c/modes/theme/theme";
|
|
9
|
+
import lspDescription from "$c/prompts/tools/lsp.md" with { type: "text" };
|
|
10
|
+
import type { ToolSession } from "$c/tools/index";
|
|
11
|
+
import { resolveToCwd } from "$c/tools/path-utils";
|
|
12
|
+
import { throwIfAborted } from "$c/tools/tool-errors";
|
|
12
13
|
import {
|
|
13
14
|
ensureFileOpen,
|
|
14
15
|
getActiveClients,
|
|
@@ -152,15 +153,15 @@ async function syncFileContent(
|
|
|
152
153
|
servers: Array<[string, ServerConfig]>,
|
|
153
154
|
signal?: AbortSignal,
|
|
154
155
|
): Promise<void> {
|
|
155
|
-
|
|
156
|
+
throwIfAborted(signal);
|
|
156
157
|
await Promise.allSettled(
|
|
157
158
|
servers.map(async ([_serverName, serverConfig]) => {
|
|
158
|
-
|
|
159
|
+
throwIfAborted(signal);
|
|
159
160
|
if (serverConfig.createClient) {
|
|
160
161
|
return;
|
|
161
162
|
}
|
|
162
163
|
const client = await getOrCreateClient(serverConfig, cwd);
|
|
163
|
-
|
|
164
|
+
throwIfAborted(signal);
|
|
164
165
|
await syncContent(client, absolutePath, content, signal);
|
|
165
166
|
}),
|
|
166
167
|
);
|
|
@@ -180,10 +181,10 @@ async function notifyFileSaved(
|
|
|
180
181
|
servers: Array<[string, ServerConfig]>,
|
|
181
182
|
signal?: AbortSignal,
|
|
182
183
|
): Promise<void> {
|
|
183
|
-
|
|
184
|
+
throwIfAborted(signal);
|
|
184
185
|
await Promise.allSettled(
|
|
185
186
|
servers.map(async ([_serverName, serverConfig]) => {
|
|
186
|
-
|
|
187
|
+
throwIfAborted(signal);
|
|
187
188
|
if (serverConfig.createClient) {
|
|
188
189
|
return;
|
|
189
190
|
}
|
|
@@ -342,7 +343,7 @@ async function waitForDiagnostics(
|
|
|
342
343
|
): Promise<Diagnostic[]> {
|
|
343
344
|
const start = Date.now();
|
|
344
345
|
while (Date.now() - start < timeoutMs) {
|
|
345
|
-
|
|
346
|
+
throwIfAborted(signal);
|
|
346
347
|
const diagnostics = client.diagnostics.get(uri);
|
|
347
348
|
const versionOk = minVersion === undefined || client.diagnosticsVersion > minVersion;
|
|
348
349
|
if (diagnostics !== undefined && versionOk) return diagnostics;
|
|
@@ -521,7 +522,7 @@ async function getDiagnosticsForFile(
|
|
|
521
522
|
// Wait for diagnostics from all servers in parallel
|
|
522
523
|
const results = await Promise.allSettled(
|
|
523
524
|
servers.map(async ([serverName, serverConfig]) => {
|
|
524
|
-
|
|
525
|
+
throwIfAborted(signal);
|
|
525
526
|
// Use custom linter client if configured
|
|
526
527
|
if (serverConfig.createClient) {
|
|
527
528
|
const linterClient = getLinterClient(serverName, serverConfig, cwd);
|
|
@@ -531,7 +532,7 @@ async function getDiagnosticsForFile(
|
|
|
531
532
|
|
|
532
533
|
// Default: use LSP
|
|
533
534
|
const client = await getOrCreateClient(serverConfig, cwd);
|
|
534
|
-
|
|
535
|
+
throwIfAborted(signal);
|
|
535
536
|
// Content already synced + didSave sent, wait for fresh diagnostics
|
|
536
537
|
const minVersion = minVersions?.get(serverName);
|
|
537
538
|
const diagnostics = await waitForDiagnostics(client, uri, 3000, signal, minVersion);
|
|
@@ -621,7 +622,7 @@ async function formatContent(
|
|
|
621
622
|
|
|
622
623
|
for (const [serverName, serverConfig] of servers) {
|
|
623
624
|
try {
|
|
624
|
-
|
|
625
|
+
throwIfAborted(signal);
|
|
625
626
|
// Use custom linter client if configured
|
|
626
627
|
if (serverConfig.createClient) {
|
|
627
628
|
const linterClient = getLinterClient(serverName, serverConfig, cwd);
|
|
@@ -630,7 +631,7 @@ async function formatContent(
|
|
|
630
631
|
|
|
631
632
|
// Default: use LSP
|
|
632
633
|
const client = await getOrCreateClient(serverConfig, cwd);
|
|
633
|
-
|
|
634
|
+
throwIfAborted(signal);
|
|
634
635
|
|
|
635
636
|
const caps = client.serverCapabilities;
|
|
636
637
|
if (!caps?.documentFormattingProvider) {
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
import type { AgentToolResult, RenderResultOptions } from "@oh-my-pi/pi-agent-core";
|
|
12
12
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
13
13
|
import { highlight, supportsLanguage } from "cli-highlight";
|
|
14
|
-
import { getLanguageFromPath, type Theme } from "
|
|
15
|
-
import { formatExpandHint, formatMoreItems, TRUNCATE_LENGTHS, truncate } from "
|
|
14
|
+
import { getLanguageFromPath, type Theme } from "$c/modes/theme/theme";
|
|
15
|
+
import { formatExpandHint, formatMoreItems, TRUNCATE_LENGTHS, truncate } from "$c/tools/render-utils";
|
|
16
16
|
import type { LspParams, LspToolDetails } from "./types";
|
|
17
17
|
|
|
18
18
|
// =============================================================================
|
|
@@ -30,23 +30,21 @@ export const lspSchema = Type.Object({
|
|
|
30
30
|
"related_tests",
|
|
31
31
|
"reload_workspace",
|
|
32
32
|
],
|
|
33
|
-
{ description: "LSP
|
|
34
|
-
),
|
|
35
|
-
files: Type.Optional(Type.Array(Type.String({ description: "File paths for diagnostics" }))),
|
|
36
|
-
file: Type.Optional(Type.String({ description: "File path for file-specific actions" })),
|
|
37
|
-
line: Type.Optional(Type.Number({ description: "1-based line number" })),
|
|
38
|
-
column: Type.Optional(Type.Number({ description: "1-based column number" })),
|
|
39
|
-
end_line: Type.Optional(Type.Number({ description: "1-based end line number for ranges" })),
|
|
40
|
-
end_character: Type.Optional(Type.Number({ description: "1-based end column number for ranges" })),
|
|
41
|
-
query: Type.Optional(Type.String({ description: "Search query for symbols/SSR pattern" })),
|
|
42
|
-
new_name: Type.Optional(Type.String({ description: "New name for rename action" })),
|
|
43
|
-
replacement: Type.Optional(Type.String({ description: "Replacement for SSR action" })),
|
|
44
|
-
kind: Type.Optional(Type.String({ description: "Code action kind filter (quickfix, refactor, source)" })),
|
|
45
|
-
apply: Type.Optional(Type.Boolean({ description: "Apply edits instead of preview (default: true)" })),
|
|
46
|
-
action_index: Type.Optional(Type.Number({ description: "Index of code action to apply" })),
|
|
47
|
-
include_declaration: Type.Optional(
|
|
48
|
-
Type.Boolean({ description: "Include declaration in references (default: true)" }),
|
|
33
|
+
{ description: "LSP operation" },
|
|
49
34
|
),
|
|
35
|
+
files: Type.Optional(Type.Array(Type.String({ description: "File path" }))),
|
|
36
|
+
file: Type.Optional(Type.String({ description: "File path" })),
|
|
37
|
+
line: Type.Optional(Type.Number({ description: "Line number (1-indexed)" })),
|
|
38
|
+
column: Type.Optional(Type.Number({ description: "Column number (1-indexed)" })),
|
|
39
|
+
end_line: Type.Optional(Type.Number({ description: "End line for range (1-indexed)" })),
|
|
40
|
+
end_character: Type.Optional(Type.Number({ description: "End column for range (1-indexed)" })),
|
|
41
|
+
query: Type.Optional(Type.String({ description: "Search query or SSR pattern" })),
|
|
42
|
+
new_name: Type.Optional(Type.String({ description: "New name for rename" })),
|
|
43
|
+
replacement: Type.Optional(Type.String({ description: "Replacement text for SSR" })),
|
|
44
|
+
kind: Type.Optional(Type.String({ description: "Action kind: quickfix, refactor, source" })),
|
|
45
|
+
apply: Type.Optional(Type.Boolean({ description: "Apply edits (default: true)" })),
|
|
46
|
+
action_index: Type.Optional(Type.Number({ description: "Index of action to apply" })),
|
|
47
|
+
include_declaration: Type.Optional(Type.Boolean({ description: "Include declaration in refs (default: true)" })),
|
|
50
48
|
});
|
|
51
49
|
|
|
52
50
|
export type LspParams = Static<typeof lspSchema>;
|
package/src/main.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { createInterface } from "node:readline/promises";
|
|
|
11
11
|
import { type ImageContent, supportsXhigh } from "@oh-my-pi/pi-ai";
|
|
12
12
|
import { postmortem } from "@oh-my-pi/pi-utils";
|
|
13
13
|
import chalk from "chalk";
|
|
14
|
+
import { initTheme, stopThemeWatcher } from "$c/modes/theme/theme";
|
|
14
15
|
import { type Args, parseArgs, printHelp } from "./cli/args";
|
|
15
16
|
import { parseConfigArgs, printConfigHelp, runConfigCommand } from "./cli/config-cli";
|
|
16
17
|
import { processFileArguments } from "./cli/file-processor";
|
|
@@ -21,21 +22,20 @@ import { parseSetupArgs, printSetupHelp, runSetupCommand } from "./cli/setup-cli
|
|
|
21
22
|
import { parseStatsArgs, printStatsHelp, runStatsCommand } from "./cli/stats-cli";
|
|
22
23
|
import { parseUpdateArgs, printUpdateHelp, runUpdateCommand } from "./cli/update-cli";
|
|
23
24
|
import { findConfigFile, getModelsPath, VERSION } from "./config";
|
|
24
|
-
import type {
|
|
25
|
-
import {
|
|
26
|
-
import
|
|
27
|
-
import type { ModelRegistry } from "./core/model-registry";
|
|
28
|
-
import { parseModelPattern, parseModelString, resolveModelScope, type ScopedModel } from "./core/model-resolver";
|
|
29
|
-
import { type CreateAgentSessionOptions, createAgentSession, discoverAuthStorage, discoverModels } from "./core/sdk";
|
|
30
|
-
import { type SessionInfo, SessionManager } from "./core/session-manager";
|
|
31
|
-
import { SettingsManager } from "./core/settings-manager";
|
|
32
|
-
import { resolvePromptInput } from "./core/system-prompt";
|
|
33
|
-
import { printTimings, time } from "./core/timings";
|
|
25
|
+
import type { ModelRegistry } from "./config/model-registry";
|
|
26
|
+
import { parseModelPattern, parseModelString, resolveModelScope, type ScopedModel } from "./config/model-resolver";
|
|
27
|
+
import { SettingsManager } from "./config/settings-manager";
|
|
34
28
|
import { initializeWithSettings } from "./discovery";
|
|
29
|
+
import { exportFromFile } from "./export/html/index";
|
|
30
|
+
import type { ExtensionUIContext } from "./extensibility/extensions/types";
|
|
35
31
|
import { runMigrations, showDeprecationWarnings } from "./migrations";
|
|
36
32
|
import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index";
|
|
37
|
-
import {
|
|
33
|
+
import { type CreateAgentSessionOptions, createAgentSession, discoverAuthStorage, discoverModels } from "./sdk";
|
|
34
|
+
import type { AgentSession } from "./session/agent-session";
|
|
35
|
+
import { type SessionInfo, SessionManager } from "./session/session-manager";
|
|
36
|
+
import { resolvePromptInput } from "./system-prompt";
|
|
38
37
|
import { getChangelogPath, getNewEntries, parseChangelog } from "./utils/changelog";
|
|
38
|
+
import { printTimings, time } from "./utils/timings";
|
|
39
39
|
|
|
40
40
|
async function checkForNewVersion(currentVersion: string): Promise<string | undefined> {
|
|
41
41
|
try {
|
|
@@ -85,7 +85,7 @@ async function runInteractiveMode(
|
|
|
85
85
|
initialMessages: string[],
|
|
86
86
|
setExtensionUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void,
|
|
87
87
|
lspServers: Array<{ name: string; status: "ready" | "error"; fileTypes: string[] }> | undefined,
|
|
88
|
-
mcpManager: import("./
|
|
88
|
+
mcpManager: import("./mcp/index").MCPManager | undefined,
|
|
89
89
|
initialMessage?: string,
|
|
90
90
|
initialImages?: ImageContent[],
|
|
91
91
|
): Promise<void> {
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* Uses the capability system to load MCP servers from multiple sources.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { mcpCapability } from "
|
|
8
|
-
import type { MCPServer } from "
|
|
9
|
-
import { loadCapability } from "
|
|
7
|
+
import { mcpCapability } from "$c/capability/mcp";
|
|
8
|
+
import type { MCPServer } from "$c/discovery";
|
|
9
|
+
import { loadCapability } from "$c/discovery";
|
|
10
10
|
import type { MCPServerConfig } from "./types";
|
|
11
11
|
|
|
12
12
|
/** Options for loading MCP configs */
|
|
@@ -24,7 +24,7 @@ export interface LoadMCPConfigsResult {
|
|
|
24
24
|
/** Extracted Exa API keys (if any were filtered) */
|
|
25
25
|
exaApiKeys: string[];
|
|
26
26
|
/** Source metadata for each server */
|
|
27
|
-
sources: Record<string, import("
|
|
27
|
+
sources: Record<string, import("../capability/types").SourceMeta>;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
@@ -90,7 +90,7 @@ export async function loadAllMCPConfigs(cwd: string, options?: LoadMCPConfigsOpt
|
|
|
90
90
|
|
|
91
91
|
// Convert to legacy format and preserve source metadata
|
|
92
92
|
const configs: Record<string, MCPServerConfig> = {};
|
|
93
|
-
const sources: Record<string, import("
|
|
93
|
+
const sources: Record<string, import("../capability/types").SourceMeta> = {};
|
|
94
94
|
for (const server of servers) {
|
|
95
95
|
configs[server.name] = convertToLegacyConfig(server);
|
|
96
96
|
sources[server.name] = server._source;
|
|
@@ -180,7 +180,7 @@ export interface ExaFilterResult {
|
|
|
180
180
|
/** Extracted Exa API keys (if any) */
|
|
181
181
|
exaApiKeys: string[];
|
|
182
182
|
/** Source metadata for remaining servers */
|
|
183
|
-
sources: Record<string, import("
|
|
183
|
+
sources: Record<string, import("../capability/types").SourceMeta>;
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
/**
|
|
@@ -189,10 +189,10 @@ export interface ExaFilterResult {
|
|
|
189
189
|
*/
|
|
190
190
|
export function filterExaMCPServers(
|
|
191
191
|
configs: Record<string, MCPServerConfig>,
|
|
192
|
-
sources: Record<string, import("
|
|
192
|
+
sources: Record<string, import("../capability/types").SourceMeta>,
|
|
193
193
|
): ExaFilterResult {
|
|
194
194
|
const filtered: Record<string, MCPServerConfig> = {};
|
|
195
|
-
const filteredSources: Record<string, import("
|
|
195
|
+
const filteredSources: Record<string, import("../capability/types").SourceMeta> = {};
|
|
196
196
|
const exaApiKeys: string[] = [];
|
|
197
197
|
|
|
198
198
|
for (const [name, config] of Object.entries(configs)) {
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
8
|
+
import type { LoadedCustomTool } from "$c/extensibility/custom-tools/types";
|
|
9
|
+
import { AgentStorage } from "$c/session/agent-storage";
|
|
10
10
|
import { type MCPLoadResult, MCPManager } from "./manager";
|
|
11
|
-
import { parseMCPToolName } from "./tool-bridge";
|
|
12
11
|
import { MCPToolCache } from "./tool-cache";
|
|
13
12
|
|
|
14
13
|
/** Result from loading MCP tools */
|
|
@@ -80,9 +79,9 @@ export async function discoverAndLoadMCPTools(cwd: string, options?: MCPToolsLoa
|
|
|
80
79
|
|
|
81
80
|
// Convert MCP tools to LoadedCustomTool format
|
|
82
81
|
const loadedTools: LoadedCustomTool[] = result.tools.map((tool) => {
|
|
83
|
-
//
|
|
84
|
-
const
|
|
85
|
-
const serverName =
|
|
82
|
+
// MCPTool and DeferredMCPTool have these properties
|
|
83
|
+
const mcpTool = tool as { mcpServerName?: string };
|
|
84
|
+
const serverName = mcpTool.mcpServerName;
|
|
86
85
|
|
|
87
86
|
// Get provider info from manager's connection if available
|
|
88
87
|
const connection = serverName ? manager.getConnection(serverName) : undefined;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
9
9
|
import type { TSchema } from "@sinclair/typebox";
|
|
10
|
-
import type { CustomTool } from "
|
|
10
|
+
import type { CustomTool } from "$c/extensibility/custom-tools/types";
|
|
11
11
|
import { connectToServer, disconnectServer, listTools } from "./client";
|
|
12
12
|
import { loadAllMCPConfigs, validateServerConfig } from "./config";
|
|
13
13
|
import type { MCPToolDetails } from "./tool-bridge";
|
|
@@ -15,7 +15,7 @@ import { DeferredMCPTool, MCPTool } from "./tool-bridge";
|
|
|
15
15
|
import type { MCPToolCache } from "./tool-cache";
|
|
16
16
|
import type { MCPServerConfig, MCPServerConnection, MCPToolDefinition } from "./types";
|
|
17
17
|
|
|
18
|
-
type SourceMeta = import("
|
|
18
|
+
type SourceMeta = import("../capability/types").SourceMeta;
|
|
19
19
|
|
|
20
20
|
type ToolLoadResult = {
|
|
21
21
|
connection: MCPServerConnection;
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import type { AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
8
8
|
import type { TSchema } from "@sinclair/typebox";
|
|
9
|
-
import type { SourceMeta } from "
|
|
10
|
-
import type { CustomTool, CustomToolContext, CustomToolResult } from "
|
|
9
|
+
import type { SourceMeta } from "$c/capability/types";
|
|
10
|
+
import type { CustomTool, CustomToolContext, CustomToolResult } from "$c/extensibility/custom-tools/types";
|
|
11
11
|
import { callTool } from "./client";
|
|
12
12
|
import type { MCPContent, MCPServerConnection, MCPToolDefinition } from "./types";
|
|
13
13
|
|
|
@@ -66,21 +66,38 @@ function formatMCPContent(content: MCPContent[]): string {
|
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* Create a unique tool name for an MCP tool.
|
|
69
|
-
*
|
|
69
|
+
*
|
|
70
|
+
* Prefixes with server name to avoid conflicts. If the tool name already
|
|
71
|
+
* starts with the server name (e.g., server "puppeteer" with tool
|
|
72
|
+
* "puppeteer_screenshot"), strips the redundant prefix to produce
|
|
73
|
+
* "mcp_puppeteer_screenshot" instead of "mcp_puppeteer_puppeteer_screenshot".
|
|
70
74
|
*/
|
|
71
75
|
export function createMCPToolName(serverName: string, toolName: string): string {
|
|
72
|
-
//
|
|
73
|
-
|
|
76
|
+
// Strip redundant server name prefix from tool name if present
|
|
77
|
+
const prefixWithUnderscore = `${serverName}_`;
|
|
78
|
+
const prefixWithHyphen = `${serverName}-`;
|
|
79
|
+
|
|
80
|
+
let normalizedToolName = toolName;
|
|
81
|
+
if (toolName.startsWith(prefixWithUnderscore)) {
|
|
82
|
+
normalizedToolName = toolName.slice(prefixWithUnderscore.length);
|
|
83
|
+
} else if (toolName.startsWith(prefixWithHyphen)) {
|
|
84
|
+
normalizedToolName = toolName.slice(prefixWithHyphen.length);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return `mcp_${serverName}_${normalizedToolName}`;
|
|
74
88
|
}
|
|
75
89
|
|
|
76
90
|
/**
|
|
77
91
|
* Parse an MCP tool name back to server and tool components.
|
|
92
|
+
*
|
|
93
|
+
* Note: This returns the normalized tool name (with server prefix stripped).
|
|
94
|
+
* The original MCP tool name may have had the server name as a prefix.
|
|
78
95
|
*/
|
|
79
96
|
export function parseMCPToolName(name: string): { serverName: string; toolName: string } | null {
|
|
80
97
|
if (!name.startsWith("mcp_")) return null;
|
|
81
98
|
|
|
82
99
|
const rest = name.slice(4);
|
|
83
|
-
const underscoreIdx = rest.
|
|
100
|
+
const underscoreIdx = rest.indexOf("_");
|
|
84
101
|
if (underscoreIdx === -1) return null;
|
|
85
102
|
|
|
86
103
|
return {
|
|
@@ -97,6 +114,10 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
|
|
|
97
114
|
public readonly label: string;
|
|
98
115
|
public readonly description: string;
|
|
99
116
|
public readonly parameters: TSchema;
|
|
117
|
+
/** Original MCP tool name (before normalization) */
|
|
118
|
+
public readonly mcpToolName: string;
|
|
119
|
+
/** Server name */
|
|
120
|
+
public readonly mcpServerName: string;
|
|
100
121
|
|
|
101
122
|
/** Create MCPTool instances for all tools from an MCP server connection */
|
|
102
123
|
static fromTools(connection: MCPServerConnection, tools: MCPToolDefinition[]): MCPTool[] {
|
|
@@ -111,6 +132,8 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
|
|
|
111
132
|
this.label = `${connection.name}/${tool.name}`;
|
|
112
133
|
this.description = tool.description ?? `MCP tool from ${connection.name}`;
|
|
113
134
|
this.parameters = convertSchema(tool.inputSchema);
|
|
135
|
+
this.mcpToolName = tool.name;
|
|
136
|
+
this.mcpServerName = connection.name;
|
|
114
137
|
}
|
|
115
138
|
|
|
116
139
|
async execute(
|
|
@@ -168,6 +191,10 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
|
|
|
168
191
|
public readonly label: string;
|
|
169
192
|
public readonly description: string;
|
|
170
193
|
public readonly parameters: TSchema;
|
|
194
|
+
/** Original MCP tool name (before normalization) */
|
|
195
|
+
public readonly mcpToolName: string;
|
|
196
|
+
/** Server name */
|
|
197
|
+
public readonly mcpServerName: string;
|
|
171
198
|
private readonly fallbackProvider: string | undefined;
|
|
172
199
|
private readonly fallbackProviderName: string | undefined;
|
|
173
200
|
|
|
@@ -191,6 +218,8 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
|
|
|
191
218
|
this.label = `${serverName}/${tool.name}`;
|
|
192
219
|
this.description = tool.description ?? `MCP tool from ${serverName}`;
|
|
193
220
|
this.parameters = convertSchema(tool.inputSchema);
|
|
221
|
+
this.mcpToolName = tool.name;
|
|
222
|
+
this.mcpServerName = serverName;
|
|
194
223
|
this.fallbackProvider = source?.provider;
|
|
195
224
|
this.fallbackProviderName = source?.providerName;
|
|
196
225
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
8
|
-
import type { AgentStorage } from "
|
|
8
|
+
import type { AgentStorage } from "$c/session/agent-storage";
|
|
9
9
|
import type { MCPServerConfig, MCPToolDefinition } from "./types";
|
|
10
10
|
|
|
11
11
|
const CACHE_VERSION = 1;
|
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
* Based on MCP spec 2025-03-26.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type {
|
|
8
|
+
import type {
|
|
9
|
+
JsonRpcMessage,
|
|
10
|
+
JsonRpcResponse,
|
|
11
|
+
MCPHttpServerConfig,
|
|
12
|
+
MCPSseServerConfig,
|
|
13
|
+
MCPTransport,
|
|
14
|
+
} from "$c/mcp/types";
|
|
9
15
|
|
|
10
16
|
/** Generate unique request ID */
|
|
11
17
|
function generateId(): string {
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { type Subprocess, spawn } from "bun";
|
|
9
|
-
import type { JsonRpcResponse, MCPStdioServerConfig, MCPTransport } from "
|
|
9
|
+
import type { JsonRpcResponse, MCPStdioServerConfig, MCPTransport } from "$c/mcp/types";
|
|
10
10
|
|
|
11
11
|
/** Generate unique request ID */
|
|
12
12
|
function generateId(): string {
|
|
@@ -218,7 +218,7 @@ export interface MCPServerConnection {
|
|
|
218
218
|
/** Cached tools (populated on demand) */
|
|
219
219
|
tools?: MCPToolDefinition[];
|
|
220
220
|
/** Source metadata (for display) */
|
|
221
|
-
_source?: import("
|
|
221
|
+
_source?: import("../capability/types").SourceMeta;
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
/** MCP tool with server context */
|
package/src/migrations.ts
CHANGED
|
@@ -6,9 +6,9 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, w
|
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
8
8
|
import chalk from "chalk";
|
|
9
|
+
import { AgentStorage } from "$c/session/agent-storage";
|
|
10
|
+
import type { AuthCredential } from "$c/session/auth-storage";
|
|
9
11
|
import { getAgentDbPath, getAgentDir, getBinDir } from "./config";
|
|
10
|
-
import { AgentStorage } from "./core/agent-storage";
|
|
11
|
-
import type { AuthCredential } from "./core/auth-storage";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Migrate legacy oauth.json and settings.json apiKeys to agent.db.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AssistantMessage } from "@oh-my-pi/pi-ai";
|
|
2
2
|
import { Container, Markdown, Spacer, Text } from "@oh-my-pi/pi-tui";
|
|
3
|
-
import { getMarkdownTheme, theme } from "
|
|
3
|
+
import { getMarkdownTheme, theme } from "$c/modes/theme/theme";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Component that renders a complete assistant message
|
|
@@ -4,13 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import { Container, Loader, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
6
6
|
import stripAnsi from "strip-ansi";
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type TruncationResult,
|
|
11
|
-
truncateTail,
|
|
12
|
-
} from "../../../core/tools/truncate";
|
|
13
|
-
import { getSymbolTheme, theme } from "../theme/theme";
|
|
7
|
+
import { getSymbolTheme, theme } from "$c/modes/theme/theme";
|
|
8
|
+
import type { TruncationMeta } from "$c/tools/output-meta";
|
|
9
|
+
import { formatSize } from "$c/tools/truncate";
|
|
14
10
|
import { DynamicBorder } from "./dynamic-border";
|
|
15
11
|
import { truncateToVisualLines } from "./visual-truncate";
|
|
16
12
|
|
|
@@ -23,8 +19,7 @@ export class BashExecutionComponent extends Container {
|
|
|
23
19
|
private status: "running" | "complete" | "cancelled" | "error" = "running";
|
|
24
20
|
private exitCode: number | undefined = undefined;
|
|
25
21
|
private loader: Loader;
|
|
26
|
-
private
|
|
27
|
-
private fullOutputPath?: string;
|
|
22
|
+
private truncation?: TruncationMeta;
|
|
28
23
|
private expanded = false;
|
|
29
24
|
private contentContainer: Container;
|
|
30
25
|
|
|
@@ -78,9 +73,7 @@ export class BashExecutionComponent extends Container {
|
|
|
78
73
|
}
|
|
79
74
|
|
|
80
75
|
appendOutput(chunk: string): void {
|
|
81
|
-
|
|
82
|
-
// Note: binary data is already sanitized in tui-renderer.ts executeBashCommand
|
|
83
|
-
const clean = stripAnsi(chunk).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
76
|
+
const clean = this.normalizeOutput(chunk);
|
|
84
77
|
|
|
85
78
|
// Append to output lines
|
|
86
79
|
const newLines = clean.split("\n");
|
|
@@ -98,8 +91,7 @@ export class BashExecutionComponent extends Container {
|
|
|
98
91
|
setComplete(
|
|
99
92
|
exitCode: number | undefined,
|
|
100
93
|
cancelled: boolean,
|
|
101
|
-
|
|
102
|
-
fullOutputPath?: string,
|
|
94
|
+
options?: { output?: string; truncation?: TruncationMeta },
|
|
103
95
|
): void {
|
|
104
96
|
this.exitCode = exitCode;
|
|
105
97
|
this.status = cancelled
|
|
@@ -107,8 +99,10 @@ export class BashExecutionComponent extends Container {
|
|
|
107
99
|
: exitCode !== 0 && exitCode !== undefined && exitCode !== null
|
|
108
100
|
? "error"
|
|
109
101
|
: "complete";
|
|
110
|
-
this.
|
|
111
|
-
|
|
102
|
+
this.truncation = options?.truncation;
|
|
103
|
+
if (options?.output !== undefined) {
|
|
104
|
+
this.setOutput(options.output);
|
|
105
|
+
}
|
|
112
106
|
|
|
113
107
|
// Stop loader
|
|
114
108
|
this.loader.stop();
|
|
@@ -117,15 +111,7 @@ export class BashExecutionComponent extends Container {
|
|
|
117
111
|
}
|
|
118
112
|
|
|
119
113
|
private updateDisplay(): void {
|
|
120
|
-
|
|
121
|
-
const fullOutput = this.outputLines.join("\n");
|
|
122
|
-
const contextTruncation = truncateTail(fullOutput, {
|
|
123
|
-
maxLines: DEFAULT_MAX_LINES,
|
|
124
|
-
maxBytes: DEFAULT_MAX_BYTES,
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
// Get the lines to potentially display (after context truncation)
|
|
128
|
-
const availableLines = contextTruncation.content ? contextTruncation.content.split("\n") : [];
|
|
114
|
+
const availableLines = this.outputLines;
|
|
129
115
|
|
|
130
116
|
// Apply preview truncation based on expanded state
|
|
131
117
|
const previewLogicalLines = availableLines.slice(-PREVIEW_LINES);
|
|
@@ -177,10 +163,21 @@ export class BashExecutionComponent extends Container {
|
|
|
177
163
|
statusParts.push(theme.fg("error", `(exit ${this.exitCode})`));
|
|
178
164
|
}
|
|
179
165
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
166
|
+
if (this.truncation) {
|
|
167
|
+
const warnings: string[] = [];
|
|
168
|
+
if (this.truncation.artifactId) {
|
|
169
|
+
warnings.push(`Full output: artifact://${this.truncation.artifactId}`);
|
|
170
|
+
}
|
|
171
|
+
if (this.truncation.truncatedBy === "lines") {
|
|
172
|
+
warnings.push(
|
|
173
|
+
`Truncated: showing ${this.truncation.outputLines} of ${this.truncation.totalLines} lines`,
|
|
174
|
+
);
|
|
175
|
+
} else {
|
|
176
|
+
warnings.push(
|
|
177
|
+
`Truncated: ${this.truncation.outputLines} lines shown (${formatSize(this.truncation.outputBytes)} limit)`,
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
statusParts.push(theme.fg("warning", warnings.join(". ")));
|
|
184
181
|
}
|
|
185
182
|
|
|
186
183
|
if (statusParts.length > 0) {
|
|
@@ -189,6 +186,17 @@ export class BashExecutionComponent extends Container {
|
|
|
189
186
|
}
|
|
190
187
|
}
|
|
191
188
|
|
|
189
|
+
private normalizeOutput(text: string): string {
|
|
190
|
+
// Strip ANSI codes and normalize line endings
|
|
191
|
+
// Note: binary data is already sanitized in tui-renderer.ts executeBashCommand
|
|
192
|
+
return stripAnsi(text).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private setOutput(output: string): void {
|
|
196
|
+
const clean = this.normalizeOutput(output);
|
|
197
|
+
this.outputLines = clean ? clean.split("\n") : [];
|
|
198
|
+
}
|
|
199
|
+
|
|
192
200
|
/**
|
|
193
201
|
* Get the raw output for creating BashExecutionMessage.
|
|
194
202
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CancellableLoader, Container, Spacer, Text, type TUI } from "@oh-my-pi/pi-tui";
|
|
2
|
-
import type { Theme } from "
|
|
2
|
+
import type { Theme } from "$c/modes/theme/theme";
|
|
3
3
|
import { DynamicBorder } from "./dynamic-border";
|
|
4
4
|
|
|
5
5
|
/** Loader wrapped with borders for hook UI */
|