@oh-my-pi/pi-coding-agent 7.0.0 → 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 +87 -0
- package/README.md +1 -1
- package/docs/hooks.md +2 -2
- package/docs/sdk.md +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 +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/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/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
|
@@ -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
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { cp, mkdir, rm } from "node:fs/promises";
|
|
3
|
+
import { homedir, tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { $ } from "bun";
|
|
6
|
+
|
|
7
|
+
export interface WorktreeBaseline {
|
|
8
|
+
repoRoot: string;
|
|
9
|
+
staged: string;
|
|
10
|
+
unstaged: string;
|
|
11
|
+
untracked: string[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function getEncodedProjectName(cwd: string): string {
|
|
15
|
+
return `--${cwd.replace(/^[/\\]/, "").replace(/[/\\:]/g, "-")}--`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function getRepoRoot(cwd: string): Promise<string> {
|
|
19
|
+
const result = await $`git rev-parse --show-toplevel`.cwd(cwd).quiet().nothrow();
|
|
20
|
+
if (result.exitCode !== 0) {
|
|
21
|
+
throw new Error("Git repository not found for isolated task execution.");
|
|
22
|
+
}
|
|
23
|
+
const repoRoot = result.text().trim();
|
|
24
|
+
if (!repoRoot) {
|
|
25
|
+
throw new Error("Git repository root could not be resolved for isolated task execution.");
|
|
26
|
+
}
|
|
27
|
+
return repoRoot;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function ensureWorktree(baseCwd: string, id: string): Promise<string> {
|
|
31
|
+
const repoRoot = await getRepoRoot(baseCwd);
|
|
32
|
+
const encodedProject = getEncodedProjectName(repoRoot);
|
|
33
|
+
const worktreeDir = path.join(homedir(), ".omp", "wt", encodedProject, id);
|
|
34
|
+
await mkdir(path.dirname(worktreeDir), { recursive: true });
|
|
35
|
+
await $`git worktree remove -f ${worktreeDir}`.cwd(repoRoot).quiet().nothrow();
|
|
36
|
+
await rm(worktreeDir, { recursive: true, force: true });
|
|
37
|
+
await $`git worktree add --detach ${worktreeDir} HEAD`.cwd(repoRoot).quiet();
|
|
38
|
+
return worktreeDir;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function captureBaseline(repoRoot: string): Promise<WorktreeBaseline> {
|
|
42
|
+
const staged = await $`git diff --cached --binary`.cwd(repoRoot).quiet().text();
|
|
43
|
+
const unstaged = await $`git diff --binary`.cwd(repoRoot).quiet().text();
|
|
44
|
+
const untrackedRaw = await $`git ls-files --others --exclude-standard`.cwd(repoRoot).quiet().text();
|
|
45
|
+
const untracked = untrackedRaw
|
|
46
|
+
.split("\n")
|
|
47
|
+
.map((line) => line.trim())
|
|
48
|
+
.filter((line) => line.length > 0);
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
repoRoot,
|
|
52
|
+
staged,
|
|
53
|
+
unstaged,
|
|
54
|
+
untracked,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function writeTempPatchFile(patch: string): Promise<string> {
|
|
59
|
+
const tempPath = path.join(tmpdir(), `omp-task-patch-${randomUUID()}.patch`);
|
|
60
|
+
await Bun.write(tempPath, patch);
|
|
61
|
+
return tempPath;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function applyPatch(
|
|
65
|
+
cwd: string,
|
|
66
|
+
patch: string,
|
|
67
|
+
options?: { cached?: boolean; env?: Record<string, string> },
|
|
68
|
+
): Promise<void> {
|
|
69
|
+
if (!patch.trim()) return;
|
|
70
|
+
const tempPath = await writeTempPatchFile(patch);
|
|
71
|
+
try {
|
|
72
|
+
const command = options?.cached ? $`git apply --cached --binary ${tempPath}` : $`git apply --binary ${tempPath}`;
|
|
73
|
+
let runner = command.cwd(cwd).quiet();
|
|
74
|
+
if (options?.env) {
|
|
75
|
+
runner = runner.env(options.env);
|
|
76
|
+
}
|
|
77
|
+
await runner;
|
|
78
|
+
} finally {
|
|
79
|
+
await rm(tempPath, { force: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function applyBaseline(worktreeDir: string, baseline: WorktreeBaseline): Promise<void> {
|
|
84
|
+
await applyPatch(worktreeDir, baseline.staged, { cached: true });
|
|
85
|
+
await applyPatch(worktreeDir, baseline.staged);
|
|
86
|
+
await applyPatch(worktreeDir, baseline.unstaged);
|
|
87
|
+
|
|
88
|
+
for (const entry of baseline.untracked) {
|
|
89
|
+
const source = path.join(baseline.repoRoot, entry);
|
|
90
|
+
const destination = path.join(worktreeDir, entry);
|
|
91
|
+
const exists = await Bun.file(source).exists();
|
|
92
|
+
if (!exists) continue;
|
|
93
|
+
await mkdir(path.dirname(destination), { recursive: true });
|
|
94
|
+
await cp(source, destination, { recursive: true });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function applyPatchToIndex(cwd: string, patch: string, indexFile: string): Promise<void> {
|
|
99
|
+
if (!patch.trim()) return;
|
|
100
|
+
const tempPath = await writeTempPatchFile(patch);
|
|
101
|
+
try {
|
|
102
|
+
await $`git apply --cached --binary ${tempPath}`
|
|
103
|
+
.cwd(cwd)
|
|
104
|
+
.env({
|
|
105
|
+
GIT_INDEX_FILE: indexFile,
|
|
106
|
+
})
|
|
107
|
+
.quiet();
|
|
108
|
+
} finally {
|
|
109
|
+
await rm(tempPath, { force: true });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function listUntracked(cwd: string): Promise<string[]> {
|
|
114
|
+
const raw = await $`git ls-files --others --exclude-standard`.cwd(cwd).quiet().text();
|
|
115
|
+
return raw
|
|
116
|
+
.split("\n")
|
|
117
|
+
.map((line) => line.trim())
|
|
118
|
+
.filter((line) => line.length > 0);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function captureDeltaPatch(worktreeDir: string, baseline: WorktreeBaseline): Promise<string> {
|
|
122
|
+
const tempIndex = path.join(tmpdir(), `omp-task-index-${randomUUID()}`);
|
|
123
|
+
try {
|
|
124
|
+
await $`git read-tree HEAD`.cwd(worktreeDir).env({
|
|
125
|
+
GIT_INDEX_FILE: tempIndex,
|
|
126
|
+
});
|
|
127
|
+
await applyPatchToIndex(worktreeDir, baseline.staged, tempIndex);
|
|
128
|
+
await applyPatchToIndex(worktreeDir, baseline.unstaged, tempIndex);
|
|
129
|
+
const diff = await $`git diff --binary`
|
|
130
|
+
.cwd(worktreeDir)
|
|
131
|
+
.env({
|
|
132
|
+
GIT_INDEX_FILE: tempIndex,
|
|
133
|
+
})
|
|
134
|
+
.quiet()
|
|
135
|
+
.text();
|
|
136
|
+
|
|
137
|
+
const currentUntracked = await listUntracked(worktreeDir);
|
|
138
|
+
const baselineUntracked = new Set(baseline.untracked);
|
|
139
|
+
const newUntracked = currentUntracked.filter((entry) => !baselineUntracked.has(entry));
|
|
140
|
+
|
|
141
|
+
if (newUntracked.length === 0) return diff;
|
|
142
|
+
|
|
143
|
+
const untrackedDiffs = await Promise.all(
|
|
144
|
+
newUntracked.map((entry) =>
|
|
145
|
+
$`git diff --binary --no-index /dev/null ${entry}`.cwd(worktreeDir).quiet().nothrow().text(),
|
|
146
|
+
),
|
|
147
|
+
);
|
|
148
|
+
return `${diff}${diff && !diff.endsWith("\n") ? "\n" : ""}${untrackedDiffs.join("\n")}`;
|
|
149
|
+
} finally {
|
|
150
|
+
await rm(tempIndex, { force: true });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function cleanupWorktree(dir: string): Promise<void> {
|
|
155
|
+
try {
|
|
156
|
+
const commonDirRaw = await $`git rev-parse --git-common-dir`.cwd(dir).quiet().nothrow().text();
|
|
157
|
+
const commonDir = commonDirRaw.trim();
|
|
158
|
+
if (commonDir) {
|
|
159
|
+
const resolvedCommon = path.resolve(dir, commonDir);
|
|
160
|
+
const repoRoot = path.dirname(resolvedCommon);
|
|
161
|
+
await $`git worktree remove -f ${dir}`.cwd(repoRoot).quiet().nothrow();
|
|
162
|
+
}
|
|
163
|
+
} finally {
|
|
164
|
+
await rm(dir, { recursive: true, force: true });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
@@ -19,10 +19,10 @@ import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallb
|
|
|
19
19
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
20
20
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
21
21
|
import { Type } from "@sinclair/typebox";
|
|
22
|
-
import {
|
|
23
|
-
import
|
|
24
|
-
import type
|
|
25
|
-
import
|
|
22
|
+
import { renderPromptTemplate } from "$c/config/prompt-templates";
|
|
23
|
+
import type { RenderResultOptions } from "$c/extensibility/custom-tools/types";
|
|
24
|
+
import { type Theme, theme } from "$c/modes/theme/theme";
|
|
25
|
+
import askDescription from "$c/prompts/tools/ask.md" with { type: "text" };
|
|
26
26
|
import type { ToolSession } from "./index";
|
|
27
27
|
import { ToolUIKit } from "./render-utils";
|
|
28
28
|
|
|
@@ -31,29 +31,21 @@ import { ToolUIKit } from "./render-utils";
|
|
|
31
31
|
// =============================================================================
|
|
32
32
|
|
|
33
33
|
const OptionItem = Type.Object({
|
|
34
|
-
label: Type.String({ description: "Display label
|
|
34
|
+
label: Type.String({ description: "Display label" }),
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
const QuestionItem = Type.Object({
|
|
38
|
-
id: Type.String({ description: "
|
|
39
|
-
question: Type.String({ description: "
|
|
40
|
-
options: Type.Array(OptionItem, { description: "
|
|
41
|
-
multi: Type.Optional(Type.Boolean({ description: "Allow multiple selections
|
|
38
|
+
id: Type.String({ description: "Question ID, e.g. 'auth', 'cache'" }),
|
|
39
|
+
question: Type.String({ description: "Question text" }),
|
|
40
|
+
options: Type.Array(OptionItem, { description: "Available options" }),
|
|
41
|
+
multi: Type.Optional(Type.Boolean({ description: "Allow multiple selections" })),
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
const askSchema = Type.Object({
|
|
45
|
-
question: Type.Optional(Type.String({ description: "
|
|
46
|
-
options: Type.Optional(Type.Array(OptionItem, { description: "Available options
|
|
47
|
-
multi: Type.Optional(
|
|
48
|
-
|
|
49
|
-
description: "Allow multiple options to be selected (default: false)",
|
|
50
|
-
}),
|
|
51
|
-
),
|
|
52
|
-
questions: Type.Optional(
|
|
53
|
-
Type.Array(QuestionItem, {
|
|
54
|
-
description: "Multiple questions to ask in sequence, each with their own options",
|
|
55
|
-
}),
|
|
56
|
-
),
|
|
45
|
+
question: Type.Optional(Type.String({ description: "Question to ask" })),
|
|
46
|
+
options: Type.Optional(Type.Array(OptionItem, { description: "Available options" })),
|
|
47
|
+
multi: Type.Optional(Type.Boolean({ description: "Allow multiple selections (default: false)" })),
|
|
48
|
+
questions: Type.Optional(Type.Array(QuestionItem, { description: "Multiple questions in sequence" })),
|
|
57
49
|
});
|
|
58
50
|
|
|
59
51
|
/** Result for a single question */
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* the specialized tools instead.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { type BashInterceptorRule, DEFAULT_BASH_INTERCEPTOR_RULES } from "
|
|
9
|
+
import { type BashInterceptorRule, DEFAULT_BASH_INTERCEPTOR_RULES } from "$c/config/settings-manager";
|
|
10
10
|
|
|
11
11
|
export interface InterceptionResult {
|
|
12
12
|
/** If true, the bash command should be blocked */
|