@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +51 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +2 -3
- package/src/capability/extension-module.ts +2 -3
- package/src/capability/extension.ts +2 -3
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +2 -3
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +2 -3
- package/src/capability/mcp.ts +2 -3
- package/src/capability/prompt.ts +2 -3
- package/src/capability/rule.ts +2 -3
- package/src/capability/settings.ts +1 -2
- package/src/capability/skill.ts +2 -3
- package/src/capability/slash-command.ts +2 -3
- package/src/capability/ssh.ts +2 -3
- package/src/capability/system-prompt.ts +2 -3
- package/src/capability/tool.ts +2 -3
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -21
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +21 -23
- package/src/commit/agentic/fallback.ts +9 -9
- package/src/commit/agentic/index.ts +30 -38
- package/src/commit/agentic/state.ts +1 -6
- package/src/commit/agentic/tools/analyze-file.ts +15 -15
- package/src/commit/agentic/tools/git-file-diff.ts +3 -3
- package/src/commit/agentic/tools/git-hunk.ts +7 -7
- package/src/commit/agentic/tools/git-overview.ts +5 -5
- package/src/commit/agentic/tools/index.ts +14 -14
- package/src/commit/agentic/tools/propose-changelog.ts +6 -6
- package/src/commit/agentic/tools/propose-commit.ts +8 -8
- package/src/commit/agentic/tools/recent-commits.ts +2 -2
- package/src/commit/agentic/tools/split-commit.ts +19 -23
- package/src/commit/agentic/topo-sort.ts +1 -1
- package/src/commit/agentic/trivial.ts +3 -3
- package/src/commit/agentic/validation.ts +12 -12
- package/src/commit/analysis/conventional.ts +7 -11
- package/src/commit/analysis/index.ts +4 -4
- package/src/commit/analysis/scope.ts +4 -4
- package/src/commit/analysis/summary.ts +7 -9
- package/src/commit/analysis/validation.ts +1 -1
- package/src/commit/changelog/detect.ts +6 -6
- package/src/commit/changelog/generate.ts +7 -9
- package/src/commit/changelog/index.ts +13 -13
- package/src/commit/changelog/parse.ts +2 -2
- package/src/commit/cli.ts +1 -1
- package/src/commit/git/diff.ts +3 -3
- package/src/commit/git/index.ts +19 -24
- package/src/commit/index.ts +1 -1
- package/src/commit/map-reduce/index.ts +9 -9
- package/src/commit/map-reduce/map-phase.ts +19 -34
- package/src/commit/map-reduce/reduce-phase.ts +9 -11
- package/src/commit/message.ts +2 -2
- package/src/commit/model-selection.ts +3 -7
- package/src/commit/pipeline.ts +20 -22
- package/src/commit/utils/exclusions.ts +3 -3
- package/src/config/file-lock.ts +17 -7
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +55 -37
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +50 -34
- package/src/config.ts +60 -62
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +16 -18
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +17 -14
- package/src/extensibility/custom-commands/types.ts +1 -2
- package/src/extensibility/custom-tools/loader.ts +10 -11
- package/src/extensibility/custom-tools/types.ts +6 -7
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +75 -53
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +19 -26
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +8 -9
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +10 -17
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +46 -46
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +14 -10
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +10 -16
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +55 -34
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +3 -4
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +60 -49
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +6 -6
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +11 -16
- package/src/modes/components/tree-selector.ts +11 -11
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +27 -29
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -25
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +2 -2
- package/src/modes/theme/theme.ts +128 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +10 -11
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +12 -13
- package/src/sdk.ts +60 -63
- package/src/session/agent-session.ts +83 -84
- package/src/session/agent-storage.ts +11 -11
- package/src/session/artifacts.ts +8 -9
- package/src/session/auth-storage.ts +25 -29
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +2 -3
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +27 -34
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +33 -36
- package/src/task/output-manager.ts +3 -4
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +19 -20
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +32 -38
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +8 -9
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +19 -18
- package/src/tools/calculator.ts +12 -12
- package/src/tools/complete.ts +3 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +23 -26
- package/src/tools/find.ts +15 -16
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +27 -27
- package/src/tools/index.ts +78 -56
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +7 -7
- package/src/tools/notebook.ts +5 -5
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +1 -1
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +36 -37
- package/src/tools/read.ts +23 -23
- package/src/tools/render-utils.ts +8 -9
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +31 -30
- package/src/tools/todo-write.ts +13 -13
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +11 -16
- package/src/tui/code-cell.ts +3 -9
- package/src/tui/file-list.ts +3 -4
- package/src/tui/output-block.ts +1 -2
- package/src/tui/status-line.ts +2 -3
- package/src/tui/tree-list.ts +2 -3
- package/src/tui/types.ts +1 -2
- package/src/tui/utils.ts +2 -3
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +4 -9
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +16 -18
- package/scripts/generate-wasm-b64.ts +0 -24
- package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
- package/src/task/.executor.ts.kate-swp +0 -0
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
package/src/task/worker.ts
CHANGED
|
@@ -12,29 +12,23 @@
|
|
|
12
12
|
* 4. Worker sends { type: "done", exitCode, ... } on completion
|
|
13
13
|
* 5. Parent can send { type: "abort" } to request cancellation
|
|
14
14
|
*/
|
|
15
|
-
|
|
16
15
|
import type { AgentEvent, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
17
16
|
import type { Api, Model } from "@oh-my-pi/pi-ai";
|
|
18
|
-
import { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
|
|
19
|
-
import { parseModelPattern, parseModelString } from "@oh-my-pi/pi-coding-agent/config/model-resolver";
|
|
20
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
21
|
-
import { SettingsManager } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
22
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
23
|
-
import { type LspToolDetails, lspSchema } from "@oh-my-pi/pi-coding-agent/lsp/types";
|
|
24
|
-
import lspDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/lsp.md" with { type: "text" };
|
|
25
|
-
import { createAgentSession, discoverAuthStorage, discoverModels } from "@oh-my-pi/pi-coding-agent/sdk";
|
|
26
|
-
import type { AgentSessionEvent } from "@oh-my-pi/pi-coding-agent/session/agent-session";
|
|
27
|
-
import { AuthStorage } from "@oh-my-pi/pi-coding-agent/session/auth-storage";
|
|
28
|
-
import { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
29
|
-
import {
|
|
30
|
-
getPythonToolDescription,
|
|
31
|
-
type PythonToolDetails,
|
|
32
|
-
type PythonToolParams,
|
|
33
|
-
pythonSchema,
|
|
34
|
-
} from "@oh-my-pi/pi-coding-agent/tools/python";
|
|
35
|
-
import { ToolAbortError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
36
17
|
import { logger, postmortem, untilAborted } from "@oh-my-pi/pi-utils";
|
|
37
18
|
import type { TSchema } from "@sinclair/typebox";
|
|
19
|
+
import { ModelRegistry } from "../config/model-registry";
|
|
20
|
+
import { parseModelPattern, parseModelString } from "../config/model-resolver";
|
|
21
|
+
import { renderPromptTemplate } from "../config/prompt-templates";
|
|
22
|
+
import { SettingsManager } from "../config/settings-manager";
|
|
23
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
24
|
+
import { type LspToolDetails, lspSchema } from "../lsp/types";
|
|
25
|
+
import lspDescription from "../prompts/tools/lsp.md" with { type: "text" };
|
|
26
|
+
import { createAgentSession, discoverAuthStorage, discoverModels } from "../sdk";
|
|
27
|
+
import type { AgentSessionEvent } from "../session/agent-session";
|
|
28
|
+
import { AuthStorage } from "../session/auth-storage";
|
|
29
|
+
import { SessionManager } from "../session/session-manager";
|
|
30
|
+
import { getPythonToolDescription, type PythonToolDetails, type PythonToolParams, pythonSchema } from "../tools/python";
|
|
31
|
+
import { ToolAbortError } from "../tools/tool-errors";
|
|
38
32
|
import type {
|
|
39
33
|
LspToolCallResponse,
|
|
40
34
|
MCPToolCallResponse,
|
|
@@ -47,7 +41,7 @@ import type {
|
|
|
47
41
|
|
|
48
42
|
type PostMessageFn = (message: SubagentWorkerResponse) => void;
|
|
49
43
|
|
|
50
|
-
const postMessageSafe: PostMessageFn =
|
|
44
|
+
const postMessageSafe: PostMessageFn = message => {
|
|
51
45
|
try {
|
|
52
46
|
(globalThis as typeof globalThis & { postMessage: PostMessageFn }).postMessage(message);
|
|
53
47
|
} catch {
|
|
@@ -132,11 +126,11 @@ function callMCPToolViaParent(
|
|
|
132
126
|
}
|
|
133
127
|
|
|
134
128
|
pendingMCPCalls.set(callId, {
|
|
135
|
-
resolve:
|
|
129
|
+
resolve: result => {
|
|
136
130
|
cleanup();
|
|
137
131
|
resolve(result ?? { content: [] });
|
|
138
132
|
},
|
|
139
|
-
reject:
|
|
133
|
+
reject: error => {
|
|
140
134
|
cleanup();
|
|
141
135
|
reject(error);
|
|
142
136
|
},
|
|
@@ -200,11 +194,11 @@ function callPythonToolViaParent(
|
|
|
200
194
|
}
|
|
201
195
|
|
|
202
196
|
pendingPythonCalls.set(callId, {
|
|
203
|
-
resolve:
|
|
197
|
+
resolve: result => {
|
|
204
198
|
cleanup();
|
|
205
199
|
resolve(result ?? { content: [] });
|
|
206
200
|
},
|
|
207
|
-
reject:
|
|
201
|
+
reject: error => {
|
|
208
202
|
cleanup();
|
|
209
203
|
reject(error);
|
|
210
204
|
},
|
|
@@ -260,11 +254,11 @@ function callLspToolViaParent(
|
|
|
260
254
|
}
|
|
261
255
|
|
|
262
256
|
pendingLspCalls.set(callId, {
|
|
263
|
-
resolve:
|
|
257
|
+
resolve: result => {
|
|
264
258
|
cleanup();
|
|
265
259
|
resolve(result ?? { content: [] });
|
|
266
260
|
},
|
|
267
|
-
reject:
|
|
261
|
+
reject: error => {
|
|
268
262
|
cleanup();
|
|
269
263
|
reject(error);
|
|
270
264
|
},
|
|
@@ -349,7 +343,7 @@ function createMCPProxyTool(metadata: MCPToolMetadata): CustomTool<TSchema> {
|
|
|
349
343
|
metadata.timeoutMs,
|
|
350
344
|
);
|
|
351
345
|
return {
|
|
352
|
-
content: result.content.map(
|
|
346
|
+
content: result.content.map(c =>
|
|
353
347
|
c.type === "text"
|
|
354
348
|
? { type: "text" as const, text: c.text ?? "" }
|
|
355
349
|
: { type: "text" as const, text: JSON.stringify(c) },
|
|
@@ -391,7 +385,7 @@ function createPythonProxyTool(): CustomTool<typeof pythonSchema> {
|
|
|
391
385
|
const result = await callPythonToolViaParent(params as PythonToolParams, signal, timeoutMs);
|
|
392
386
|
return {
|
|
393
387
|
content:
|
|
394
|
-
result?.content?.map(
|
|
388
|
+
result?.content?.map(c =>
|
|
395
389
|
c.type === "text"
|
|
396
390
|
? { type: "text" as const, text: c.text ?? "" }
|
|
397
391
|
: { type: "text" as const, text: JSON.stringify(c) },
|
|
@@ -424,7 +418,7 @@ function createLspProxyTool(): CustomTool<typeof lspSchema> {
|
|
|
424
418
|
const result = await callLspToolViaParent(params as Record<string, unknown>, signal);
|
|
425
419
|
return {
|
|
426
420
|
content:
|
|
427
|
-
result?.content?.map(
|
|
421
|
+
result?.content?.map(c =>
|
|
428
422
|
c.type === "text"
|
|
429
423
|
? { type: "text" as const, text: c.text ?? "" }
|
|
430
424
|
: { type: "text" as const, text: JSON.stringify(c) },
|
|
@@ -606,7 +600,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
606
600
|
outputSchema: payload.outputSchema,
|
|
607
601
|
requireCompleteTool: true,
|
|
608
602
|
// Append system prompt (equivalent to CLI's --append-system-prompt)
|
|
609
|
-
systemPrompt:
|
|
603
|
+
systemPrompt: defaultPrompt =>
|
|
610
604
|
`${defaultPrompt}\n\n${payload.systemPrompt}\n\n${worktreeNotice}\n\n${completionInstruction}`,
|
|
611
605
|
sessionManager,
|
|
612
606
|
hasUI: false,
|
|
@@ -638,14 +632,14 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
638
632
|
// ExtensionActions
|
|
639
633
|
{
|
|
640
634
|
sendMessage: (message, options) => {
|
|
641
|
-
session.sendCustomMessage(message, options).catch(
|
|
635
|
+
session.sendCustomMessage(message, options).catch(e => {
|
|
642
636
|
logger.error("Extension sendMessage failed", {
|
|
643
637
|
error: e instanceof Error ? e.message : String(e),
|
|
644
638
|
});
|
|
645
639
|
});
|
|
646
640
|
},
|
|
647
641
|
sendUserMessage: (content, options) => {
|
|
648
|
-
session.sendUserMessage(content, options).catch(
|
|
642
|
+
session.sendUserMessage(content, options).catch(e => {
|
|
649
643
|
logger.error("Extension sendUserMessage failed", {
|
|
650
644
|
error: e instanceof Error ? e.message : String(e),
|
|
651
645
|
});
|
|
@@ -660,14 +654,14 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
660
654
|
getActiveTools: () => session.getActiveToolNames(),
|
|
661
655
|
getAllTools: () => session.getAllToolNames(),
|
|
662
656
|
setActiveTools: (toolNames: string[]) => session.setActiveToolsByName(toolNames),
|
|
663
|
-
setModel: async
|
|
657
|
+
setModel: async model => {
|
|
664
658
|
const key = await session.modelRegistry.getApiKey(model);
|
|
665
659
|
if (!key) return false;
|
|
666
660
|
await session.setModel(model);
|
|
667
661
|
return true;
|
|
668
662
|
},
|
|
669
663
|
getThinkingLevel: () => session.thinkingLevel,
|
|
670
|
-
setThinkingLevel:
|
|
664
|
+
setThinkingLevel: level => session.setThinkingLevel(level),
|
|
671
665
|
},
|
|
672
666
|
// ExtensionContextActions
|
|
673
667
|
{
|
|
@@ -677,7 +671,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
677
671
|
hasPendingMessages: () => session.queuedMessageCount > 0,
|
|
678
672
|
shutdown: () => {},
|
|
679
673
|
getContextUsage: () => session.getContextUsage(),
|
|
680
|
-
compact: async
|
|
674
|
+
compact: async instructionsOrOptions => {
|
|
681
675
|
const instructions = typeof instructionsOrOptions === "string" ? instructionsOrOptions : undefined;
|
|
682
676
|
const options =
|
|
683
677
|
instructionsOrOptions && typeof instructionsOrOptions === "object"
|
|
@@ -687,7 +681,7 @@ async function runTask(runState: RunState, payload: SubagentWorkerStartPayload):
|
|
|
687
681
|
},
|
|
688
682
|
},
|
|
689
683
|
);
|
|
690
|
-
extensionRunner.onError(
|
|
684
|
+
extensionRunner.onError(err => {
|
|
691
685
|
logger.error("Extension error", { path: err.extensionPath, error: err.error });
|
|
692
686
|
});
|
|
693
687
|
await extensionRunner.emit({ type: "session_start" });
|
|
@@ -844,11 +838,11 @@ declare const self: {
|
|
|
844
838
|
addEventListener(type: "messageerror", listener: (event: MessageEvent) => void): void;
|
|
845
839
|
};
|
|
846
840
|
|
|
847
|
-
self.addEventListener("error",
|
|
841
|
+
self.addEventListener("error", event => {
|
|
848
842
|
reportFatal(`Uncaught error: ${event.message || "Unknown error"}`);
|
|
849
843
|
});
|
|
850
844
|
|
|
851
|
-
self.addEventListener("unhandledrejection",
|
|
845
|
+
self.addEventListener("unhandledrejection", event => {
|
|
852
846
|
const reason = event.reason;
|
|
853
847
|
const message = reason instanceof Error ? reason.stack || reason.message : String(reason);
|
|
854
848
|
|
package/src/task/worktree.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import * as fs from "node:fs/promises";
|
|
3
|
+
import * as os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { $ } from "bun";
|
|
6
6
|
|
|
@@ -30,10 +30,10 @@ export async function getRepoRoot(cwd: string): Promise<string> {
|
|
|
30
30
|
export async function ensureWorktree(baseCwd: string, id: string): Promise<string> {
|
|
31
31
|
const repoRoot = await getRepoRoot(baseCwd);
|
|
32
32
|
const encodedProject = getEncodedProjectName(repoRoot);
|
|
33
|
-
const worktreeDir = path.join(homedir(), ".omp", "wt", encodedProject, id);
|
|
34
|
-
await mkdir(path.dirname(worktreeDir), { recursive: true });
|
|
33
|
+
const worktreeDir = path.join(os.homedir(), ".omp", "wt", encodedProject, id);
|
|
34
|
+
await fs.mkdir(path.dirname(worktreeDir), { recursive: true });
|
|
35
35
|
await $`git worktree remove -f ${worktreeDir}`.cwd(repoRoot).quiet().nothrow();
|
|
36
|
-
await rm(worktreeDir, { recursive: true, force: true });
|
|
36
|
+
await fs.rm(worktreeDir, { recursive: true, force: true });
|
|
37
37
|
await $`git worktree add --detach ${worktreeDir} HEAD`.cwd(repoRoot).quiet();
|
|
38
38
|
return worktreeDir;
|
|
39
39
|
}
|
|
@@ -44,8 +44,8 @@ export async function captureBaseline(repoRoot: string): Promise<WorktreeBaselin
|
|
|
44
44
|
const untrackedRaw = await $`git ls-files --others --exclude-standard`.cwd(repoRoot).quiet().text();
|
|
45
45
|
const untracked = untrackedRaw
|
|
46
46
|
.split("\n")
|
|
47
|
-
.map(
|
|
48
|
-
.filter(
|
|
47
|
+
.map(line => line.trim())
|
|
48
|
+
.filter(line => line.length > 0);
|
|
49
49
|
|
|
50
50
|
return {
|
|
51
51
|
repoRoot,
|
|
@@ -56,7 +56,7 @@ export async function captureBaseline(repoRoot: string): Promise<WorktreeBaselin
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
async function writeTempPatchFile(patch: string): Promise<string> {
|
|
59
|
-
const tempPath = path.join(tmpdir(), `omp-task-patch-${randomUUID()}.patch`);
|
|
59
|
+
const tempPath = path.join(os.tmpdir(), `omp-task-patch-${randomUUID()}.patch`);
|
|
60
60
|
await Bun.write(tempPath, patch);
|
|
61
61
|
return tempPath;
|
|
62
62
|
}
|
|
@@ -76,7 +76,7 @@ async function applyPatch(
|
|
|
76
76
|
}
|
|
77
77
|
await runner;
|
|
78
78
|
} finally {
|
|
79
|
-
await rm(tempPath, { force: true });
|
|
79
|
+
await fs.rm(tempPath, { force: true });
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -90,8 +90,8 @@ export async function applyBaseline(worktreeDir: string, baseline: WorktreeBasel
|
|
|
90
90
|
const destination = path.join(worktreeDir, entry);
|
|
91
91
|
const exists = await Bun.file(source).exists();
|
|
92
92
|
if (!exists) continue;
|
|
93
|
-
await mkdir(path.dirname(destination), { recursive: true });
|
|
94
|
-
await cp(source, destination, { recursive: true });
|
|
93
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
94
|
+
await fs.cp(source, destination, { recursive: true });
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -106,7 +106,7 @@ async function applyPatchToIndex(cwd: string, patch: string, indexFile: string):
|
|
|
106
106
|
})
|
|
107
107
|
.quiet();
|
|
108
108
|
} finally {
|
|
109
|
-
await rm(tempPath, { force: true });
|
|
109
|
+
await fs.rm(tempPath, { force: true });
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -114,12 +114,12 @@ async function listUntracked(cwd: string): Promise<string[]> {
|
|
|
114
114
|
const raw = await $`git ls-files --others --exclude-standard`.cwd(cwd).quiet().text();
|
|
115
115
|
return raw
|
|
116
116
|
.split("\n")
|
|
117
|
-
.map(
|
|
118
|
-
.filter(
|
|
117
|
+
.map(line => line.trim())
|
|
118
|
+
.filter(line => line.length > 0);
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
export async function captureDeltaPatch(worktreeDir: string, baseline: WorktreeBaseline): Promise<string> {
|
|
122
|
-
const tempIndex = path.join(tmpdir(), `omp-task-index-${randomUUID()}`);
|
|
122
|
+
const tempIndex = path.join(os.tmpdir(), `omp-task-index-${randomUUID()}`);
|
|
123
123
|
try {
|
|
124
124
|
await $`git read-tree HEAD`.cwd(worktreeDir).env({
|
|
125
125
|
GIT_INDEX_FILE: tempIndex,
|
|
@@ -136,18 +136,18 @@ export async function captureDeltaPatch(worktreeDir: string, baseline: WorktreeB
|
|
|
136
136
|
|
|
137
137
|
const currentUntracked = await listUntracked(worktreeDir);
|
|
138
138
|
const baselineUntracked = new Set(baseline.untracked);
|
|
139
|
-
const newUntracked = currentUntracked.filter(
|
|
139
|
+
const newUntracked = currentUntracked.filter(entry => !baselineUntracked.has(entry));
|
|
140
140
|
|
|
141
141
|
if (newUntracked.length === 0) return diff;
|
|
142
142
|
|
|
143
143
|
const untrackedDiffs = await Promise.all(
|
|
144
|
-
newUntracked.map(
|
|
144
|
+
newUntracked.map(entry =>
|
|
145
145
|
$`git diff --binary --no-index /dev/null ${entry}`.cwd(worktreeDir).quiet().nothrow().text(),
|
|
146
146
|
),
|
|
147
147
|
);
|
|
148
148
|
return `${diff}${diff && !diff.endsWith("\n") ? "\n" : ""}${untrackedDiffs.join("\n")}`;
|
|
149
149
|
} finally {
|
|
150
|
-
await rm(tempIndex, { force: true });
|
|
150
|
+
await fs.rm(tempIndex, { force: true });
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -161,6 +161,6 @@ export async function cleanupWorktree(dir: string): Promise<void> {
|
|
|
161
161
|
await $`git worktree remove -f ${dir}`.cwd(repoRoot).quiet().nothrow();
|
|
162
162
|
}
|
|
163
163
|
} finally {
|
|
164
|
-
await rm(dir, { recursive: true, force: true });
|
|
164
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
165
165
|
}
|
|
166
166
|
}
|
package/src/tools/ask.ts
CHANGED
|
@@ -14,16 +14,15 @@
|
|
|
14
14
|
* - If you recommend a specific option, make that the first option in the list
|
|
15
15
|
* and add "(Recommended)" at the end of the label
|
|
16
16
|
*/
|
|
17
|
-
|
|
18
17
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
19
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
20
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
21
|
-
import { type Theme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
22
|
-
import askDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/ask.md" with { type: "text" };
|
|
23
|
-
import { renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
|
|
24
18
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
25
19
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
26
20
|
import { Type } from "@sinclair/typebox";
|
|
21
|
+
import { renderPromptTemplate } from "../config/prompt-templates";
|
|
22
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
23
|
+
import { type Theme, theme } from "../modes/theme/theme";
|
|
24
|
+
import askDescription from "../prompts/tools/ask.md" with { type: "text" };
|
|
25
|
+
import { renderStatusLine } from "../tui";
|
|
27
26
|
import type { ToolSession } from ".";
|
|
28
27
|
import { ToolUIKit } from "./render-utils";
|
|
29
28
|
|
|
@@ -238,7 +237,7 @@ export class AskTool implements AgentTool<typeof askSchema, AskToolDetails> {
|
|
|
238
237
|
const results: QuestionResult[] = [];
|
|
239
238
|
|
|
240
239
|
for (const q of params.questions) {
|
|
241
|
-
const optionLabels = q.options.map(
|
|
240
|
+
const optionLabels = q.options.map(o => o.label);
|
|
242
241
|
const { selectedOptions, customInput } = await askSingleQuestion(
|
|
243
242
|
ui,
|
|
244
243
|
q.question,
|
|
@@ -267,7 +266,7 @@ export class AskTool implements AgentTool<typeof askSchema, AskToolDetails> {
|
|
|
267
266
|
const question = params.question ?? "";
|
|
268
267
|
const options = params.options ?? [];
|
|
269
268
|
const multi = params.multi ?? false;
|
|
270
|
-
const optionLabels = options.map(
|
|
269
|
+
const optionLabels = options.map(o => o.label);
|
|
271
270
|
|
|
272
271
|
if (!question || optionLabels.length === 0) {
|
|
273
272
|
return {
|
|
@@ -391,7 +390,7 @@ export const askToolRenderer = {
|
|
|
391
390
|
if (details.results && details.results.length > 0) {
|
|
392
391
|
const lines: string[] = [];
|
|
393
392
|
const hasAnySelection = details.results.some(
|
|
394
|
-
|
|
393
|
+
r => r.customInput || (r.selectedOptions && r.selectedOptions.length > 0),
|
|
395
394
|
);
|
|
396
395
|
const header = renderStatusLine(
|
|
397
396
|
{
|
|
@@ -5,11 +5,7 @@
|
|
|
5
5
|
* this interceptor provides helpful error messages directing them to use
|
|
6
6
|
* the specialized tools instead.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
import {
|
|
10
|
-
type BashInterceptorRule,
|
|
11
|
-
DEFAULT_BASH_INTERCEPTOR_RULES,
|
|
12
|
-
} from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
8
|
+
import { type BashInterceptorRule, DEFAULT_BASH_INTERCEPTOR_RULES } from "../config/settings-manager";
|
|
13
9
|
|
|
14
10
|
export interface InterceptionResult {
|
|
15
11
|
/** If true, the bash command should be blocked */
|
package/src/tools/bash.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as path from "node:path";
|
|
2
2
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
3
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
4
|
-
import { type BashExecutorOptions, executeBash } from "@oh-my-pi/pi-coding-agent/exec/bash-executor";
|
|
5
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
6
|
-
import { truncateToVisualLines } from "@oh-my-pi/pi-coding-agent/modes/components/visual-truncate";
|
|
7
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
8
|
-
import bashDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/bash.md" with { type: "text" };
|
|
9
|
-
import type { OutputMeta } from "@oh-my-pi/pi-coding-agent/tools/output-meta";
|
|
10
|
-
import { ToolError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
11
|
-
import { renderOutputBlock, renderStatusLine } from "@oh-my-pi/pi-coding-agent/tui";
|
|
12
3
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
13
4
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
14
5
|
import { Type } from "@sinclair/typebox";
|
|
6
|
+
import { renderPromptTemplate } from "../config/prompt-templates";
|
|
7
|
+
import { type BashExecutorOptions, executeBash } from "../exec/bash-executor";
|
|
8
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
9
|
+
import { truncateToVisualLines } from "../modes/components/visual-truncate";
|
|
10
|
+
import type { Theme } from "../modes/theme/theme";
|
|
11
|
+
import bashDescription from "../prompts/tools/bash.md" with { type: "text" };
|
|
12
|
+
import { renderOutputBlock, renderStatusLine } from "../tui";
|
|
15
13
|
import type { ToolSession } from ".";
|
|
16
14
|
import { checkBashInterception, checkSimpleLsInterception } from "./bash-interceptor";
|
|
15
|
+
import type { OutputMeta } from "./output-meta";
|
|
17
16
|
import { allocateOutputArtifact, createTailBuffer } from "./output-utils";
|
|
18
17
|
import { resolveToCwd } from "./path-utils";
|
|
19
18
|
import { formatBytes, wrapBrackets } from "./render-utils";
|
|
19
|
+
import { ToolError } from "./tool-errors";
|
|
20
20
|
import { toolResult } from "./tool-result";
|
|
21
21
|
import { DEFAULT_MAX_BYTES } from "./truncate";
|
|
22
22
|
|
|
@@ -106,7 +106,7 @@ export class BashTool implements AgentTool<typeof bashSchema, BashToolDetails> {
|
|
|
106
106
|
env: extraEnv,
|
|
107
107
|
artifactPath,
|
|
108
108
|
artifactId,
|
|
109
|
-
onChunk:
|
|
109
|
+
onChunk: chunk => {
|
|
110
110
|
tailBuffer.append(chunk);
|
|
111
111
|
if (onUpdate) {
|
|
112
112
|
onUpdate({
|
|
@@ -165,13 +165,14 @@ function formatBashCommand(args: BashRenderArgs, uiTheme: Theme): string {
|
|
|
165
165
|
let displayWorkdir = args.cwd;
|
|
166
166
|
|
|
167
167
|
if (displayWorkdir) {
|
|
168
|
-
const resolvedCwd = resolve(cwd);
|
|
169
|
-
const resolvedWorkdir = resolve(displayWorkdir);
|
|
168
|
+
const resolvedCwd = path.resolve(cwd);
|
|
169
|
+
const resolvedWorkdir = path.resolve(displayWorkdir);
|
|
170
170
|
if (resolvedWorkdir === resolvedCwd) {
|
|
171
171
|
displayWorkdir = undefined;
|
|
172
172
|
} else {
|
|
173
|
-
const relativePath = relative(resolvedCwd, resolvedWorkdir);
|
|
174
|
-
const isWithinCwd =
|
|
173
|
+
const relativePath = path.relative(resolvedCwd, resolvedWorkdir);
|
|
174
|
+
const isWithinCwd =
|
|
175
|
+
relativePath && !relativePath.startsWith("..") && !relativePath.startsWith(`..${path.sep}`);
|
|
175
176
|
if (isWithinCwd) {
|
|
176
177
|
displayWorkdir = relativePath;
|
|
177
178
|
}
|
|
@@ -210,7 +211,7 @@ export const bashToolRenderer = {
|
|
|
210
211
|
const previewLines = renderContext?.previewLines ?? BASH_DEFAULT_PREVIEW_LINES;
|
|
211
212
|
|
|
212
213
|
// Get output from context (preferred) or fall back to result content
|
|
213
|
-
const output = renderContext?.output ?? result.content?.find(
|
|
214
|
+
const output = renderContext?.output ?? result.content?.find(c => c.type === "text")?.text ?? "";
|
|
214
215
|
const displayOutput = output.trimEnd();
|
|
215
216
|
const showingFullOutput = expanded && renderContext?.isFullOutput === true;
|
|
216
217
|
|
|
@@ -248,11 +249,11 @@ export const bashToolRenderer = {
|
|
|
248
249
|
const hasOutput = displayOutput.trim().length > 0;
|
|
249
250
|
if (hasOutput) {
|
|
250
251
|
if (expanded) {
|
|
251
|
-
outputLines.push(...displayOutput.split("\n").map(
|
|
252
|
+
outputLines.push(...displayOutput.split("\n").map(line => uiTheme.fg("toolOutput", line)));
|
|
252
253
|
} else {
|
|
253
254
|
const styledOutput = displayOutput
|
|
254
255
|
.split("\n")
|
|
255
|
-
.map(
|
|
256
|
+
.map(line => uiTheme.fg("toolOutput", line))
|
|
256
257
|
.join("\n");
|
|
257
258
|
const textContent = styledOutput;
|
|
258
259
|
const result = truncateToVisualLines(textContent, previewLines, width);
|
package/src/tools/calculator.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
|
|
2
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
3
|
-
import type { RenderResultOptions } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
4
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
5
|
-
import calculatorDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/calculator.md" with { type: "text" };
|
|
6
|
-
import { renderStatusLine, renderTreeList } from "@oh-my-pi/pi-coding-agent/tui";
|
|
7
2
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
8
3
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
9
4
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
10
5
|
import { Type } from "@sinclair/typebox";
|
|
6
|
+
import { renderPromptTemplate } from "../config/prompt-templates";
|
|
7
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
8
|
+
import type { Theme } from "../modes/theme/theme";
|
|
9
|
+
import calculatorDescription from "../prompts/tools/calculator.md" with { type: "text" };
|
|
10
|
+
import { renderStatusLine, renderTreeList } from "../tui";
|
|
11
11
|
import type { ToolSession } from ".";
|
|
12
12
|
import {
|
|
13
13
|
formatCount,
|
|
@@ -417,13 +417,13 @@ export class CalculatorTool implements AgentTool<typeof calculatorSchema, Calcul
|
|
|
417
417
|
signal?: AbortSignal,
|
|
418
418
|
): Promise<AgentToolResult<CalculatorToolDetails>> {
|
|
419
419
|
return untilAborted(signal, async () => {
|
|
420
|
-
const results = calculations.map(
|
|
420
|
+
const results = calculations.map(calc => {
|
|
421
421
|
const value = evaluateExpression(calc.expression);
|
|
422
422
|
const output = `${calc.prefix}${formatResult(value)}${calc.suffix}`;
|
|
423
423
|
return { expression: calc.expression, value, output };
|
|
424
424
|
});
|
|
425
425
|
|
|
426
|
-
const outputText = results.map(
|
|
426
|
+
const outputText = results.map(result => result.output).join("\n");
|
|
427
427
|
return {
|
|
428
428
|
content: [{ type: "text", text: outputText }],
|
|
429
429
|
details: { results },
|
|
@@ -471,17 +471,17 @@ export const calculatorToolRenderer = {
|
|
|
471
471
|
args?: CalculatorRenderArgs,
|
|
472
472
|
): Component {
|
|
473
473
|
const details = result.details;
|
|
474
|
-
const textContent = result.content?.find(
|
|
474
|
+
const textContent = result.content?.find(c => c.type === "text")?.text ?? "";
|
|
475
475
|
if (result.isError) {
|
|
476
476
|
const header = renderStatusLine({ icon: "error", title: "Calc" }, uiTheme);
|
|
477
477
|
return new Text([header, formatErrorMessage(textContent, uiTheme)].join("\n"), 0, 0);
|
|
478
478
|
}
|
|
479
479
|
|
|
480
480
|
// Prefer structured details; fall back to parsing text content
|
|
481
|
-
let outputs = details?.results?.map(
|
|
481
|
+
let outputs = details?.results?.map(entry => `${entry.expression} = ${entry.output}`) ?? [];
|
|
482
482
|
if (outputs.length === 0 && textContent.trim()) {
|
|
483
|
-
const rawOutputs = textContent.split("\n").filter(
|
|
484
|
-
const expressions = args?.calculations?.map(
|
|
483
|
+
const rawOutputs = textContent.split("\n").filter(line => line.trim().length > 0);
|
|
484
|
+
const expressions = args?.calculations?.map(calc => calc.expression) ?? [];
|
|
485
485
|
if (expressions.length === rawOutputs.length && expressions.length > 0) {
|
|
486
486
|
outputs = rawOutputs.map((output, index) => `${expressions[index]} = ${output}`);
|
|
487
487
|
} else {
|
|
@@ -507,7 +507,7 @@ export const calculatorToolRenderer = {
|
|
|
507
507
|
expanded,
|
|
508
508
|
maxCollapsed: COLLAPSED_LIST_LIMIT,
|
|
509
509
|
itemType: "result",
|
|
510
|
-
renderItem:
|
|
510
|
+
renderItem: output => uiTheme.fg("toolOutput", output),
|
|
511
511
|
},
|
|
512
512
|
uiTheme,
|
|
513
513
|
);
|
package/src/tools/complete.ts
CHANGED
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Subagents must call this tool to finish and return structured JSON output.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
6
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
8
7
|
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import { subprocessToolRegistry } from "@oh-my-pi/pi-coding-agent/task/subprocess-tool-registry";
|
|
10
8
|
import type { Static, TObject } from "@sinclair/typebox";
|
|
11
9
|
import { Type } from "@sinclair/typebox";
|
|
12
10
|
import Ajv, { type ErrorObject, type ValidateFunction } from "ajv";
|
|
11
|
+
import { subprocessToolRegistry } from "../task/subprocess-tool-registry";
|
|
13
12
|
import type { ToolSession } from ".";
|
|
14
13
|
import { jtdToJsonSchema } from "./jtd-to-json-schema";
|
|
15
14
|
|
|
@@ -46,7 +45,7 @@ function formatSchema(schema: unknown): string {
|
|
|
46
45
|
function formatAjvErrors(errors: ErrorObject[] | null | undefined): string {
|
|
47
46
|
if (!errors || errors.length === 0) return "Unknown schema validation error.";
|
|
48
47
|
return errors
|
|
49
|
-
.map(
|
|
48
|
+
.map(err => {
|
|
50
49
|
const path = err.instancePath ? `${err.instancePath}: ` : "";
|
|
51
50
|
return `${path}${err.message ?? "invalid"}`;
|
|
52
51
|
})
|
|
@@ -137,6 +136,6 @@ export class CompleteTool implements AgentTool<TObject, CompleteDetails> {
|
|
|
137
136
|
|
|
138
137
|
// Register subprocess tool handler for extraction + termination.
|
|
139
138
|
subprocessToolRegistry.register<CompleteDetails>("complete", {
|
|
140
|
-
extractData:
|
|
139
|
+
extractData: event => event.result?.details as CompleteDetails | undefined,
|
|
141
140
|
shouldTerminate: () => true,
|
|
142
141
|
});
|
package/src/tools/context.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentToolContext, ToolCallContext } from "@oh-my-pi/pi-agent-core";
|
|
2
|
-
import type { CustomToolContext } from "
|
|
3
|
-
import type { ExtensionUIContext } from "
|
|
2
|
+
import type { CustomToolContext } from "../extensibility/custom-tools/types";
|
|
3
|
+
import type { ExtensionUIContext } from "../extensibility/extensions/types";
|
|
4
4
|
|
|
5
5
|
declare module "@oh-my-pi/pi-agent-core" {
|
|
6
6
|
interface AgentToolContext extends CustomToolContext {
|