@oh-my-pi/pi-coding-agent 6.9.69 → 8.0.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 +219 -51
- package/README.md +1 -1
- package/docs/hooks.md +2 -2
- package/docs/sdk.md +1 -1
- package/examples/sdk/04-skills.ts +1 -1
- package/package.json +10 -10
- 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 +8 -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 +23 -7
- 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} +74 -13
- package/src/{core/python-gateway-coordinator.ts → ipy/gateway-coordinator.ts} +40 -270
- package/src/{core/python-kernel.ts → ipy/kernel.ts} +38 -10
- package/src/{core/python-prelude.py → ipy/prelude.py} +201 -8
- 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 +29 -17
- 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 +381 -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 +61 -13
- 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} +20 -15
- 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} +10 -10
- 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 +182 -171
- 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 -77
- 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 +157 -41
- package/src/{core → session}/agent-storage.ts +2 -2
- package/src/session/artifacts.ts +110 -0
- package/src/{core → session}/auth-storage.ts +525 -203
- 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 +96 -107
- 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 +106 -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/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/{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/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
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
import path from "node:path";
|
|
9
9
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
10
10
|
import { Container, Text } from "@oh-my-pi/pi-tui";
|
|
11
|
-
import type {
|
|
12
|
-
import type {
|
|
11
|
+
import type { RenderResultOptions } from "$c/extensibility/custom-tools/types";
|
|
12
|
+
import type { Theme } from "$c/modes/theme/theme";
|
|
13
13
|
import {
|
|
14
14
|
formatBadge,
|
|
15
15
|
formatDuration,
|
|
@@ -17,14 +17,14 @@ import {
|
|
|
17
17
|
formatStatusIcon,
|
|
18
18
|
formatTokens,
|
|
19
19
|
truncate,
|
|
20
|
-
} from "
|
|
20
|
+
} from "$c/tools/render-utils";
|
|
21
21
|
import {
|
|
22
22
|
type FindingPriority,
|
|
23
23
|
getPriorityInfo,
|
|
24
24
|
PRIORITY_LABELS,
|
|
25
25
|
type ReportFindingDetails,
|
|
26
26
|
type SubmitReviewDetails,
|
|
27
|
-
} from "
|
|
27
|
+
} from "$c/tools/review";
|
|
28
28
|
import { subprocessToolRegistry } from "./subprocess-tool-registry";
|
|
29
29
|
import type { AgentProgress, SingleResult, TaskParams, TaskToolDetails } from "./types";
|
|
30
30
|
|
|
@@ -236,7 +236,7 @@ function renderOutputSection(
|
|
|
236
236
|
try {
|
|
237
237
|
const parsed = JSON.parse(trimmedOutput);
|
|
238
238
|
|
|
239
|
-
// Collapsed: inline format like
|
|
239
|
+
// Collapsed: inline format like Args
|
|
240
240
|
if (!expanded) {
|
|
241
241
|
lines.push(`${continuePrefix}${theme.fg("dim", formatOutputInline(parsed, theme))}`);
|
|
242
242
|
return lines;
|
|
@@ -276,11 +276,25 @@ function renderOutputSection(
|
|
|
276
276
|
return lines;
|
|
277
277
|
}
|
|
278
278
|
|
|
279
|
-
function
|
|
280
|
-
const entries = Object.entries(
|
|
281
|
-
if (entries.length === 0) return "
|
|
279
|
+
function formatArgsInline(args: Record<string, string>, theme: Theme): string {
|
|
280
|
+
const entries = Object.entries(args);
|
|
281
|
+
if (entries.length === 0) return "No arguments";
|
|
282
|
+
|
|
283
|
+
// Single variable: show inline as "Key: value" without tree structure
|
|
284
|
+
if (entries.length === 1) {
|
|
285
|
+
const [key, value] = entries[0];
|
|
286
|
+
const humanKey = humanizeKey(key);
|
|
287
|
+
const displayValue = `"${truncate(value, 32, theme.format.ellipsis)}"`;
|
|
288
|
+
return `${humanKey}: ${displayValue}`;
|
|
289
|
+
}
|
|
290
|
+
|
|
282
291
|
const pairs = entries.map(([key, value]) => `${key}=${truncate(value, 24, theme.format.ellipsis)}`);
|
|
283
|
-
return `
|
|
292
|
+
return `Args: ${pairs.join(", ")}`;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** Convert snake_case or kebab-case to Title Case */
|
|
296
|
+
function humanizeKey(key: string): string {
|
|
297
|
+
return key.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
284
298
|
}
|
|
285
299
|
|
|
286
300
|
function formatScalarInline(value: unknown, maxLen: number, theme: Theme): string {
|
|
@@ -336,22 +350,37 @@ function formatOutputInline(data: unknown, theme: Theme, maxWidth = 80): string
|
|
|
336
350
|
return `Output: ${pairs.join(", ")}`;
|
|
337
351
|
}
|
|
338
352
|
|
|
339
|
-
function
|
|
340
|
-
|
|
353
|
+
function renderArgsSection(
|
|
354
|
+
args: Record<string, string> | undefined,
|
|
341
355
|
continuePrefix: string,
|
|
342
356
|
expanded: boolean,
|
|
343
357
|
theme: Theme,
|
|
344
358
|
): string[] {
|
|
345
|
-
if (!
|
|
359
|
+
if (!args) return [];
|
|
360
|
+
// Filter out auto-injected id and description
|
|
361
|
+
const filteredArgs = Object.fromEntries(
|
|
362
|
+
Object.entries(args).filter(([key]) => key !== "id" && key !== "description"),
|
|
363
|
+
);
|
|
364
|
+
if (Object.keys(filteredArgs).length === 0) return [];
|
|
346
365
|
const lines: string[] = [];
|
|
366
|
+
const entries = Object.entries(filteredArgs);
|
|
347
367
|
|
|
348
368
|
if (!expanded) {
|
|
349
|
-
lines.push(`${continuePrefix}${theme.fg("dim",
|
|
369
|
+
lines.push(`${continuePrefix}${theme.fg("dim", formatArgsInline(filteredArgs, theme))}`);
|
|
370
|
+
return lines;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Single variable: show inline as "Key: value" without tree structure
|
|
374
|
+
if (entries.length === 1) {
|
|
375
|
+
const [key, value] = entries[0];
|
|
376
|
+
const humanKey = humanizeKey(key);
|
|
377
|
+
const displayValue = `"${truncate(value, 60, theme.format.ellipsis)}"`;
|
|
378
|
+
lines.push(`${continuePrefix}${theme.fg("dim", `${humanKey}: ${displayValue}`)}`);
|
|
350
379
|
return lines;
|
|
351
380
|
}
|
|
352
381
|
|
|
353
|
-
lines.push(`${continuePrefix}${theme.fg("dim", "
|
|
354
|
-
const tree = renderJsonTreeLines(
|
|
382
|
+
lines.push(`${continuePrefix}${theme.fg("dim", "Args")}`);
|
|
383
|
+
const tree = renderJsonTreeLines(filteredArgs, theme, 4, 16);
|
|
355
384
|
for (const line of tree.lines) {
|
|
356
385
|
lines.push(`${continuePrefix} ${line}`);
|
|
357
386
|
}
|
|
@@ -380,6 +409,7 @@ export function renderCall(args: TaskParams, theme: Theme): Component {
|
|
|
380
409
|
const branch = theme.fg("dim", theme.tree.branch);
|
|
381
410
|
const last = theme.fg("dim", theme.tree.last);
|
|
382
411
|
const vertical = theme.fg("dim", theme.tree.vertical);
|
|
412
|
+
const showIsolated = args.isolated === true;
|
|
383
413
|
|
|
384
414
|
if (hasContext) {
|
|
385
415
|
lines.push(` ${branch} ${theme.fg("dim", "Context")}`);
|
|
@@ -387,11 +417,18 @@ export function renderCall(args: TaskParams, theme: Theme): Component {
|
|
|
387
417
|
const content = line ? theme.fg("muted", line) : "";
|
|
388
418
|
lines.push(` ${vertical} ${content}`);
|
|
389
419
|
}
|
|
390
|
-
|
|
420
|
+
const taskPrefix = showIsolated ? branch : last;
|
|
421
|
+
lines.push(` ${taskPrefix} ${theme.fg("dim", "Tasks")}: ${theme.fg("muted", `${args.tasks.length} agents`)}`);
|
|
422
|
+
if (showIsolated) {
|
|
423
|
+
lines.push(` ${last} ${theme.fg("dim", "Isolated")}: ${theme.fg("muted", "true")}`);
|
|
424
|
+
}
|
|
391
425
|
return new Text(lines.join("\n"), 0, 0);
|
|
392
426
|
}
|
|
393
427
|
|
|
394
428
|
lines.push(`${theme.fg("dim", "Tasks")}: ${theme.fg("muted", `${args.tasks.length} agents`)}`);
|
|
429
|
+
if (showIsolated) {
|
|
430
|
+
lines.push(`${theme.fg("dim", "Isolated")}: ${theme.fg("muted", "true")}`);
|
|
431
|
+
}
|
|
395
432
|
|
|
396
433
|
return new Text(lines.join("\n"), 0, 0);
|
|
397
434
|
}
|
|
@@ -418,9 +455,9 @@ function renderAgentProgress(
|
|
|
418
455
|
? "error"
|
|
419
456
|
: "accent";
|
|
420
457
|
|
|
421
|
-
// Main status line:
|
|
458
|
+
// Main status line: id: description [status] · stats · ⟨agent⟩
|
|
422
459
|
const description = progress.description?.trim();
|
|
423
|
-
const titlePart = description ? `${theme.bold(progress.
|
|
460
|
+
const titlePart = description ? `${theme.bold(progress.id)}: ${description}` : progress.id;
|
|
424
461
|
let statusLine = `${prefix} ${theme.fg(iconColor, icon)} ${theme.fg("accent", titlePart)}`;
|
|
425
462
|
|
|
426
463
|
// Only show badge for non-running states (spinner already indicates running)
|
|
@@ -445,7 +482,7 @@ function renderAgentProgress(
|
|
|
445
482
|
|
|
446
483
|
lines.push(statusLine);
|
|
447
484
|
|
|
448
|
-
lines.push(...
|
|
485
|
+
lines.push(...renderArgsSection(progress.args, continuePrefix, expanded, theme));
|
|
449
486
|
|
|
450
487
|
// Current tool (if running) or most recent completed tool
|
|
451
488
|
if (progress.status === "running") {
|
|
@@ -638,9 +675,9 @@ function renderAgentResult(result: SingleResult, isLast: boolean, expanded: bool
|
|
|
638
675
|
const iconColor = success ? "success" : "error";
|
|
639
676
|
const statusText = aborted ? "aborted" : success ? "done" : "failed";
|
|
640
677
|
|
|
641
|
-
// Main status line:
|
|
678
|
+
// Main status line: id: description [status] · stats · ⟨agent⟩
|
|
642
679
|
const description = result.description?.trim();
|
|
643
|
-
const titlePart = description ? `${theme.bold(result.
|
|
680
|
+
const titlePart = description ? `${theme.bold(result.id)}: ${description}` : result.id;
|
|
644
681
|
let statusLine = `${prefix} ${theme.fg(iconColor, icon)} ${theme.fg("accent", titlePart)} ${formatBadge(
|
|
645
682
|
statusText,
|
|
646
683
|
iconColor,
|
|
@@ -656,7 +693,7 @@ function renderAgentResult(result: SingleResult, isLast: boolean, expanded: bool
|
|
|
656
693
|
}
|
|
657
694
|
|
|
658
695
|
lines.push(statusLine);
|
|
659
|
-
lines.push(...
|
|
696
|
+
lines.push(...renderArgsSection(result.args, continuePrefix, expanded, theme));
|
|
660
697
|
|
|
661
698
|
// Check for review result (complete with review schema + report_finding)
|
|
662
699
|
const completeData = result.extractedToolData?.complete as Array<{ data: unknown }> | undefined;
|
|
@@ -722,6 +759,10 @@ function renderAgentResult(result: SingleResult, isLast: boolean, expanded: bool
|
|
|
722
759
|
lines.push(...renderOutputSection(result.output, continuePrefix, expanded, theme, 3, 12));
|
|
723
760
|
}
|
|
724
761
|
|
|
762
|
+
if (result.patchPath && !aborted && result.exitCode === 0) {
|
|
763
|
+
lines.push(`${continuePrefix}${theme.fg("dim", `Patch: ${result.patchPath}`)}`);
|
|
764
|
+
}
|
|
765
|
+
|
|
725
766
|
// Error message
|
|
726
767
|
if (result.error && !success) {
|
|
727
768
|
lines.push(`${continuePrefix}${theme.fg("error", truncate(result.error, 70, theme.format.ellipsis))}`);
|
|
@@ -739,6 +780,7 @@ export function renderResult(
|
|
|
739
780
|
theme: Theme,
|
|
740
781
|
): Component {
|
|
741
782
|
const { expanded, isPartial, spinnerFrame } = options;
|
|
783
|
+
const fallbackText = result.content.find((c) => c.type === "text")?.text ?? "";
|
|
742
784
|
const details = result.details;
|
|
743
785
|
|
|
744
786
|
if (!details) {
|
|
@@ -785,7 +827,22 @@ export function renderResult(
|
|
|
785
827
|
}
|
|
786
828
|
|
|
787
829
|
if (lines.length === 0) {
|
|
788
|
-
|
|
830
|
+
const text = fallbackText.trim() ? fallbackText : "No results";
|
|
831
|
+
return new Text(theme.fg("dim", truncate(text, 140, theme.format.ellipsis)), 0, 0);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
if (fallbackText.trim()) {
|
|
835
|
+
const summaryLines = fallbackText.split("\n");
|
|
836
|
+
const markerIndex = summaryLines.findIndex(
|
|
837
|
+
(line) => line.includes("<system-notification>") || line.startsWith("Applied patches:"),
|
|
838
|
+
);
|
|
839
|
+
if (markerIndex >= 0) {
|
|
840
|
+
const extra = summaryLines.slice(markerIndex);
|
|
841
|
+
for (const line of extra) {
|
|
842
|
+
if (!line.trim()) continue;
|
|
843
|
+
lines.push(theme.fg("dim", line));
|
|
844
|
+
}
|
|
845
|
+
}
|
|
789
846
|
}
|
|
790
847
|
|
|
791
848
|
const indented = lines.map((line) => (line.trim() ? ` ${line}` : ""));
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
11
|
-
import type { Theme } from "
|
|
11
|
+
import type { Theme } from "$c/modes/theme/theme";
|
|
12
12
|
|
|
13
13
|
/** Event from subprocess tool execution (parsed from JSONL) */
|
|
14
14
|
export interface SubprocessToolEvent {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { TaskItem } from "./types";
|
|
2
|
+
|
|
3
|
+
type RenderResult = {
|
|
4
|
+
task: string;
|
|
5
|
+
args: Record<string, string>;
|
|
6
|
+
id: string;
|
|
7
|
+
description: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function renderTemplate(template: string, task: TaskItem): RenderResult {
|
|
11
|
+
const { id, description, args } = task;
|
|
12
|
+
|
|
13
|
+
let usedPlaceholder = false;
|
|
14
|
+
const unknownArguments: string[] = [];
|
|
15
|
+
let renderedTask = template.replace(/\{\{(\w+)\}\}/g, (_match, key: string) => {
|
|
16
|
+
const value = args?.[key];
|
|
17
|
+
if (value) {
|
|
18
|
+
usedPlaceholder = true;
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
switch (key) {
|
|
22
|
+
case "id":
|
|
23
|
+
usedPlaceholder = true;
|
|
24
|
+
return id;
|
|
25
|
+
case "description":
|
|
26
|
+
usedPlaceholder = true;
|
|
27
|
+
return description;
|
|
28
|
+
default:
|
|
29
|
+
unknownArguments.push(key);
|
|
30
|
+
return `{{${key}}}`;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
if (unknownArguments.length > 0) {
|
|
35
|
+
throw new Error(`Task "${id}" has unknown arguments: ${unknownArguments.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!usedPlaceholder) {
|
|
39
|
+
renderedTask += `\n----------------------\n# ${id}\n${description}`;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
task: renderedTask,
|
|
43
|
+
args: { id, description, ...args },
|
|
44
|
+
id,
|
|
45
|
+
description,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -31,9 +31,6 @@ export const MAX_OUTPUT_BYTES = getEnv("OMP_TASK_MAX_OUTPUT_BYTES", 500_000);
|
|
|
31
31
|
/** Maximum output lines per agent */
|
|
32
32
|
export const MAX_OUTPUT_LINES = getEnv("OMP_TASK_MAX_OUTPUT_LINES", 5000);
|
|
33
33
|
|
|
34
|
-
/** Maximum agents to show in description */
|
|
35
|
-
export const MAX_AGENTS_IN_DESCRIPTION = getEnv("OMP_TASK_MAX_AGENTS_IN_DESCRIPTION", 10);
|
|
36
|
-
|
|
37
34
|
/** EventBus channel for raw subagent events */
|
|
38
35
|
export const TASK_SUBAGENT_EVENT_CHANNEL = "task:subagent:event";
|
|
39
36
|
|
|
@@ -43,35 +40,28 @@ export const TASK_SUBAGENT_PROGRESS_CHANNEL = "task:subagent:progress";
|
|
|
43
40
|
/** Single task item for parallel execution */
|
|
44
41
|
export const taskItemSchema = Type.Object({
|
|
45
42
|
id: Type.String({
|
|
46
|
-
description: "
|
|
43
|
+
description: "Task ID, CamelCase, max 32 chars",
|
|
47
44
|
maxLength: 32,
|
|
48
45
|
}),
|
|
49
|
-
description: Type.String({ description: "Short description for
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
description: Type.String({ description: "Short description for display" }),
|
|
47
|
+
args: Type.Optional(
|
|
48
|
+
Type.Record(Type.String(), Type.String(), {
|
|
49
|
+
description: "Arguments to fill {{placeholders}} in context",
|
|
50
|
+
}),
|
|
51
|
+
),
|
|
53
52
|
});
|
|
54
53
|
|
|
55
54
|
export type TaskItem = Static<typeof taskItemSchema>;
|
|
56
55
|
|
|
57
56
|
/** Task tool parameters */
|
|
58
57
|
export const taskSchema = Type.Object({
|
|
59
|
-
agent: Type.String({ description: "Agent type
|
|
60
|
-
context: Type.String({ description: "Template with {{placeholders}}
|
|
61
|
-
|
|
62
|
-
Type.String({
|
|
63
|
-
description: "Model override for all tasks (fuzzy matching, e.g. 'sonnet', 'opus')",
|
|
64
|
-
}),
|
|
65
|
-
),
|
|
58
|
+
agent: Type.String({ description: "Agent type for all tasks" }),
|
|
59
|
+
context: Type.String({ description: "Template with {{placeholders}} for args" }),
|
|
60
|
+
isolated: Type.Optional(Type.Boolean({ description: "Run in isolated git worktree" })),
|
|
66
61
|
output: Type.Optional(
|
|
67
|
-
Type.Record(Type.String(), Type.Unknown(), {
|
|
68
|
-
description: "JTD schema for structured subagent output",
|
|
69
|
-
}),
|
|
62
|
+
Type.Record(Type.String(), Type.Unknown(), { description: "JTD schema for structured output" }),
|
|
70
63
|
),
|
|
71
|
-
tasks: Type.Array(taskItemSchema, {
|
|
72
|
-
description: "Tasks to run in parallel",
|
|
73
|
-
maxItems: MAX_PARALLEL_TASKS,
|
|
74
|
-
}),
|
|
64
|
+
tasks: Type.Array(taskItemSchema, { description: "Tasks to run in parallel", maxItems: MAX_PARALLEL_TASKS }),
|
|
75
65
|
});
|
|
76
66
|
|
|
77
67
|
export type TaskParams = Static<typeof taskSchema>;
|
|
@@ -117,12 +107,12 @@ export interface AgentDefinition {
|
|
|
117
107
|
/** Progress tracking for a single agent */
|
|
118
108
|
export interface AgentProgress {
|
|
119
109
|
index: number;
|
|
120
|
-
|
|
110
|
+
id: string;
|
|
121
111
|
agent: string;
|
|
122
112
|
agentSource: AgentSource;
|
|
123
113
|
status: "pending" | "running" | "completed" | "failed" | "aborted";
|
|
124
114
|
task: string;
|
|
125
|
-
|
|
115
|
+
args?: Record<string, string>;
|
|
126
116
|
description?: string;
|
|
127
117
|
currentTool?: string;
|
|
128
118
|
currentToolArgs?: string;
|
|
@@ -140,11 +130,11 @@ export interface AgentProgress {
|
|
|
140
130
|
/** Result from a single agent execution */
|
|
141
131
|
export interface SingleResult {
|
|
142
132
|
index: number;
|
|
143
|
-
|
|
133
|
+
id: string;
|
|
144
134
|
agent: string;
|
|
145
135
|
agentSource: AgentSource;
|
|
146
136
|
task: string;
|
|
147
|
-
|
|
137
|
+
args?: Record<string, string>;
|
|
148
138
|
description?: string;
|
|
149
139
|
exitCode: number;
|
|
150
140
|
output: string;
|
|
@@ -159,9 +149,11 @@ export interface SingleResult {
|
|
|
159
149
|
usage?: Usage;
|
|
160
150
|
/** Output path for the task result */
|
|
161
151
|
outputPath?: string;
|
|
152
|
+
/** Patch path for isolated worktree output */
|
|
153
|
+
patchPath?: string;
|
|
162
154
|
/** Data extracted by registered subprocess tool handlers (keyed by tool name) */
|
|
163
155
|
extractedToolData?: Record<string, unknown[]>;
|
|
164
|
-
/** Output metadata for
|
|
156
|
+
/** Output metadata for agent:// URL integration */
|
|
165
157
|
outputMeta?: { lineCount: number; charCount: number };
|
|
166
158
|
}
|
|
167
159
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentEvent, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
2
|
+
import type { SerializedModelRegistry } from "$c/config/model-registry";
|
|
3
|
+
import type { Settings } from "$c/config/settings-manager";
|
|
4
|
+
import type { SerializedAuthStorage } from "$c/session/auth-storage";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* MCP tool metadata passed from parent to worker for proxy tool creation.
|
|
@@ -22,7 +22,10 @@ export interface MCPToolMetadata {
|
|
|
22
22
|
export interface MCPToolCallRequest {
|
|
23
23
|
type: "mcp_tool_call";
|
|
24
24
|
callId: string;
|
|
25
|
-
|
|
25
|
+
/** Server name for routing to correct connection */
|
|
26
|
+
serverName: string;
|
|
27
|
+
/** Original MCP tool name (as expected by the MCP server) */
|
|
28
|
+
mcpToolName: string;
|
|
26
29
|
params: Record<string, unknown>;
|
|
27
30
|
timeoutMs?: number;
|
|
28
31
|
}
|
|
@@ -84,6 +87,7 @@ export interface LspToolCallResponse {
|
|
|
84
87
|
|
|
85
88
|
export interface SubagentWorkerStartPayload {
|
|
86
89
|
cwd: string;
|
|
90
|
+
worktree?: string;
|
|
87
91
|
task: string;
|
|
88
92
|
systemPrompt: string;
|
|
89
93
|
model?: string;
|
|
@@ -17,18 +17,19 @@ import type { AgentEvent, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
|
17
17
|
import type { Api, Model } from "@oh-my-pi/pi-ai";
|
|
18
18
|
import { logger, postmortem, untilAborted } from "@oh-my-pi/pi-utils";
|
|
19
19
|
import type { TSchema } from "@sinclair/typebox";
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import {
|
|
23
|
-
import
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import
|
|
27
|
-
import { createAgentSession, discoverAuthStorage, discoverModels } from "
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import { getPythonToolDescription, type PythonToolDetails, type PythonToolParams, pythonSchema } from "
|
|
20
|
+
import { ModelRegistry } from "$c/config/model-registry";
|
|
21
|
+
import { parseModelPattern, parseModelString } from "$c/config/model-resolver";
|
|
22
|
+
import { renderPromptTemplate } from "$c/config/prompt-templates";
|
|
23
|
+
import { SettingsManager } from "$c/config/settings-manager";
|
|
24
|
+
import type { CustomTool } from "$c/extensibility/custom-tools/types";
|
|
25
|
+
import { type LspToolDetails, lspSchema } from "$c/lsp/types";
|
|
26
|
+
import lspDescription from "$c/prompts/tools/lsp.md" with { type: "text" };
|
|
27
|
+
import { createAgentSession, discoverAuthStorage, discoverModels } from "$c/sdk";
|
|
28
|
+
import type { AgentSessionEvent } from "$c/session/agent-session";
|
|
29
|
+
import { AuthStorage } from "$c/session/auth-storage";
|
|
30
|
+
import { SessionManager } from "$c/session/session-manager";
|
|
31
|
+
import { getPythonToolDescription, type PythonToolDetails, type PythonToolParams, pythonSchema } from "$c/tools/python";
|
|
32
|
+
import { ToolAbortError } from "$c/tools/tool-errors";
|
|
32
33
|
import type {
|
|
33
34
|
LspToolCallResponse,
|
|
34
35
|
MCPToolCallResponse,
|
|
@@ -88,7 +89,8 @@ function generateLspCallId(): string {
|
|
|
88
89
|
}
|
|
89
90
|
|
|
90
91
|
function callMCPToolViaParent(
|
|
91
|
-
|
|
92
|
+
serverName: string,
|
|
93
|
+
mcpToolName: string,
|
|
92
94
|
params: Record<string, unknown>,
|
|
93
95
|
signal?: AbortSignal,
|
|
94
96
|
timeoutMs = MCP_CALL_TIMEOUT_MS,
|
|
@@ -99,7 +101,7 @@ function callMCPToolViaParent(
|
|
|
99
101
|
}>();
|
|
100
102
|
const callId = generateMCPCallId();
|
|
101
103
|
if (signal?.aborted) {
|
|
102
|
-
reject(new
|
|
104
|
+
reject(new ToolAbortError());
|
|
103
105
|
return promise;
|
|
104
106
|
}
|
|
105
107
|
|
|
@@ -118,7 +120,7 @@ function callMCPToolViaParent(
|
|
|
118
120
|
"abort",
|
|
119
121
|
() => {
|
|
120
122
|
cleanup();
|
|
121
|
-
reject(new
|
|
123
|
+
reject(new ToolAbortError());
|
|
122
124
|
},
|
|
123
125
|
{ once: true },
|
|
124
126
|
);
|
|
@@ -139,7 +141,8 @@ function callMCPToolViaParent(
|
|
|
139
141
|
postMessageSafe({
|
|
140
142
|
type: "mcp_tool_call",
|
|
141
143
|
callId,
|
|
142
|
-
|
|
144
|
+
serverName,
|
|
145
|
+
mcpToolName,
|
|
143
146
|
params,
|
|
144
147
|
timeoutMs,
|
|
145
148
|
} as SubagentWorkerResponse);
|
|
@@ -155,7 +158,7 @@ function callPythonToolViaParent(
|
|
|
155
158
|
const { promise, resolve, reject } = Promise.withResolvers<PythonToolCallResponse["result"]>();
|
|
156
159
|
const callId = generatePythonCallId();
|
|
157
160
|
if (signal?.aborted) {
|
|
158
|
-
reject(new
|
|
161
|
+
reject(new ToolAbortError());
|
|
159
162
|
return promise;
|
|
160
163
|
}
|
|
161
164
|
|
|
@@ -185,7 +188,7 @@ function callPythonToolViaParent(
|
|
|
185
188
|
() => {
|
|
186
189
|
cleanup();
|
|
187
190
|
sendCancel("Aborted");
|
|
188
|
-
reject(new
|
|
191
|
+
reject(new ToolAbortError());
|
|
189
192
|
},
|
|
190
193
|
{ once: true },
|
|
191
194
|
);
|
|
@@ -221,7 +224,7 @@ function callLspToolViaParent(
|
|
|
221
224
|
const { promise, resolve, reject } = Promise.withResolvers<LspToolCallResponse["result"]>();
|
|
222
225
|
const callId = generateLspCallId();
|
|
223
226
|
if (signal?.aborted) {
|
|
224
|
-
reject(new
|
|
227
|
+
reject(new ToolAbortError());
|
|
225
228
|
return promise;
|
|
226
229
|
}
|
|
227
230
|
|
|
@@ -245,7 +248,7 @@ function callLspToolViaParent(
|
|
|
245
248
|
"abort",
|
|
246
249
|
() => {
|
|
247
250
|
cleanup();
|
|
248
|
-
reject(new
|
|
251
|
+
reject(new ToolAbortError());
|
|
249
252
|
},
|
|
250
253
|
{ once: true },
|
|
251
254
|
);
|
|
@@ -334,7 +337,8 @@ function createMCPProxyTool(metadata: MCPToolMetadata): CustomTool<TSchema> {
|
|
|
334
337
|
execute: async (_toolCallId, params, _onUpdate, _ctx, signal) => {
|
|
335
338
|
try {
|
|
336
339
|
const result = await callMCPToolViaParent(
|
|
337
|
-
metadata.
|
|
340
|
+
metadata.serverName,
|
|
341
|
+
metadata.mcpToolName,
|
|
338
342
|
params as Record<string, unknown>,
|
|
339
343
|
signal,
|
|
340
344
|
metadata.timeoutMs,
|
|
@@ -363,7 +367,7 @@ function createMCPProxyTool(metadata: MCPToolMetadata): CustomTool<TSchema> {
|
|
|
363
367
|
}
|
|
364
368
|
|
|
365
369
|
function getPythonCallTimeoutMs(params: PythonToolParams): number | undefined {
|
|
366
|
-
const timeout = params.
|
|
370
|
+
const timeout = params.timeout;
|
|
367
371
|
if (typeof timeout === "number" && Number.isFinite(timeout) && timeout > 0) {
|
|
368
372
|
return Math.max(1000, Math.round(timeout * 1000) + 1000);
|
|
369
373
|
}
|
|
@@ -530,7 +534,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
530
534
|
if (signal.aborted) {
|
|
531
535
|
aborted = true;
|
|
532
536
|
exitCode = 1;
|
|
533
|
-
throw new
|
|
537
|
+
throw new ToolAbortError();
|
|
534
538
|
}
|
|
535
539
|
};
|
|
536
540
|
|
|
@@ -538,9 +542,6 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
538
542
|
// Check for pre-start abort
|
|
539
543
|
checkAbort();
|
|
540
544
|
|
|
541
|
-
// Set working directory (CLI does this implicitly)
|
|
542
|
-
process.chdir(payload.cwd);
|
|
543
|
-
|
|
544
545
|
// Use serialized auth/models if provided, otherwise discover from disk
|
|
545
546
|
let authStorage: AuthStorage;
|
|
546
547
|
let modelRegistry: ModelRegistry;
|
|
@@ -574,7 +575,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
574
575
|
// Create session manager (equivalent to CLI's --session or --no-session)
|
|
575
576
|
const sessionManager = payload.sessionFile
|
|
576
577
|
? await SessionManager.open(payload.sessionFile)
|
|
577
|
-
: SessionManager.inMemory(payload.cwd);
|
|
578
|
+
: SessionManager.inMemory(payload.worktree ?? payload.cwd);
|
|
578
579
|
checkAbort();
|
|
579
580
|
|
|
580
581
|
// Use serialized settings if provided, otherwise use empty in-memory settings
|
|
@@ -585,9 +586,12 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
585
586
|
// Note: hasUI: false disables interactive features
|
|
586
587
|
const completionInstruction =
|
|
587
588
|
"When finished, call the complete tool exactly once. Do not end with a plain-text final answer.";
|
|
589
|
+
const worktreeNotice = payload.worktree
|
|
590
|
+
? `You will work under this working tree: ${payload.worktree}. CRITICAL: Do not touch the original repository; only make changes inside this worktree.`
|
|
591
|
+
: "";
|
|
588
592
|
|
|
589
593
|
const { session } = await createAgentSession({
|
|
590
|
-
cwd: payload.cwd,
|
|
594
|
+
cwd: payload.worktree ?? payload.cwd,
|
|
591
595
|
authStorage,
|
|
592
596
|
modelRegistry,
|
|
593
597
|
settingsManager,
|
|
@@ -597,7 +601,8 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
597
601
|
outputSchema: payload.outputSchema,
|
|
598
602
|
requireCompleteTool: true,
|
|
599
603
|
// Append system prompt (equivalent to CLI's --append-system-prompt)
|
|
600
|
-
systemPrompt: (defaultPrompt) =>
|
|
604
|
+
systemPrompt: (defaultPrompt) =>
|
|
605
|
+
`${defaultPrompt}\n\n${payload.systemPrompt}\n\n${worktreeNotice}\n\n${completionInstruction}`,
|
|
601
606
|
sessionManager,
|
|
602
607
|
hasUI: false,
|
|
603
608
|
// Pass spawn restrictions to nested tasks
|