@oh-my-pi/pi-coding-agent 8.0.20 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -0
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +54 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +3 -4
- package/src/capability/extension-module.ts +3 -4
- package/src/capability/extension.ts +3 -4
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +3 -4
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +3 -4
- package/src/capability/mcp.ts +3 -4
- package/src/capability/prompt.ts +3 -4
- package/src/capability/rule.ts +3 -4
- package/src/capability/settings.ts +2 -3
- package/src/capability/skill.ts +3 -4
- package/src/capability/slash-command.ts +3 -4
- package/src/capability/ssh.ts +3 -4
- package/src/capability/system-prompt.ts +3 -4
- package/src/capability/tool.ts +3 -4
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -25
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +307 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +351 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +26 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +40 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +131 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +36 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +233 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +11 -0
- package/src/commit/git/index.ts +212 -0
- package/src/commit/git/operations.ts +53 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +63 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +80 -0
- package/src/commit/pipeline.ts +240 -0
- package/src/commit/prompts/analysis-system.md +155 -0
- package/src/commit/prompts/analysis-user.md +41 -0
- package/src/commit/prompts/changelog-system.md +56 -0
- package/src/commit/prompts/changelog-user.md +19 -0
- package/src/commit/prompts/file-observer-system.md +26 -0
- package/src/commit/prompts/file-observer-user.md +9 -0
- package/src/commit/prompts/reduce-system.md +60 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +4 -0
- package/src/commit/prompts/summary-system.md +52 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +65 -38
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +141 -50
- package/src/config.ts +64 -66
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +22 -24
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +18 -15
- package/src/extensibility/custom-commands/types.ts +2 -3
- package/src/extensibility/custom-tools/loader.ts +11 -12
- package/src/extensibility/custom-tools/types.ts +7 -8
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +76 -54
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +20 -27
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +9 -10
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +11 -18
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +54 -54
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +109 -9
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +99 -61
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +71 -37
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +6 -7
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +63 -52
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +33 -5
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +16 -19
- package/src/modes/components/tree-selector.ts +12 -12
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +31 -31
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -28
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +89 -0
- package/src/modes/theme/theme.ts +130 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +11 -18
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +43 -16
- package/src/prompts/tools/task.md +2 -0
- package/src/sdk.ts +100 -65
- package/src/session/agent-session.ts +84 -85
- package/src/session/agent-storage.ts +43 -39
- package/src/session/artifacts.ts +32 -10
- package/src/session/auth-storage.ts +50 -39
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +14 -56
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +28 -35
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +40 -34
- package/src/task/output-manager.ts +93 -0
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +24 -30
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +33 -39
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +41 -20
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +91 -97
- package/src/tools/calculator.ts +49 -47
- package/src/tools/complete.ts +4 -5
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +84 -124
- package/src/tools/find.ts +94 -98
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +100 -116
- package/src/tools/index.ts +80 -55
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +44 -70
- package/src/tools/notebook.ts +51 -67
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +104 -217
- package/src/tools/read.ts +92 -33
- package/src/tools/render-utils.ts +8 -23
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +69 -49
- package/src/tools/todo-write.ts +37 -25
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +99 -75
- package/src/tui/code-cell.ts +109 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +72 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +55 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +48 -0
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +5 -10
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +129 -175
- package/tsconfig.json +0 -42
|
@@ -4,19 +4,18 @@
|
|
|
4
4
|
* Dependencies (@sinclair/typebox and pi-coding-agent) are injected via the CustomToolAPI
|
|
5
5
|
* to avoid import resolution issues with custom tools loaded from user directories.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import * as path from "node:path";
|
|
9
|
-
import
|
|
10
|
-
import { type CustomTool, loadCapability } from "@oh-my-pi/pi-coding-agent/discovery";
|
|
11
|
-
import { expandPath } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
|
|
12
|
-
import type { ExecOptions } from "@oh-my-pi/pi-coding-agent/exec/exec";
|
|
13
|
-
import { execCommand } from "@oh-my-pi/pi-coding-agent/exec/exec";
|
|
14
|
-
import type { HookUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
|
|
15
|
-
import { getAllPluginToolPaths } from "@oh-my-pi/pi-coding-agent/extensibility/plugins/loader";
|
|
16
|
-
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
|
|
17
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
8
|
+
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
|
|
18
9
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
19
10
|
import * as typebox from "@sinclair/typebox";
|
|
11
|
+
import { toolCapability } from "../../capability/tool";
|
|
12
|
+
import { type CustomTool, loadCapability } from "../../discovery";
|
|
13
|
+
import { expandPath } from "../../discovery/helpers";
|
|
14
|
+
import type { ExecOptions } from "../../exec/exec";
|
|
15
|
+
import { execCommand } from "../../exec/exec";
|
|
16
|
+
import type { HookUIContext } from "../../extensibility/hooks/types";
|
|
17
|
+
import { getAllPluginToolPaths } from "../../extensibility/plugins/loader";
|
|
18
|
+
import { theme } from "../../modes/theme/theme";
|
|
20
19
|
import type { CustomToolAPI, CustomToolFactory, LoadedCustomTool, ToolLoadError } from "./types";
|
|
21
20
|
|
|
22
21
|
/**
|
|
@@ -90,7 +89,7 @@ async function loadTool(
|
|
|
90
89
|
const toolResult = await factory(sharedApi);
|
|
91
90
|
const toolsArray = Array.isArray(toolResult) ? toolResult : [toolResult];
|
|
92
91
|
|
|
93
|
-
const loadedTools: LoadedCustomTool[] = toolsArray.map(
|
|
92
|
+
const loadedTools: LoadedCustomTool[] = toolsArray.map(tool => ({
|
|
94
93
|
path: toolPath,
|
|
95
94
|
resolvedPath,
|
|
96
95
|
tool,
|
|
@@ -223,7 +222,7 @@ export async function discoverAndLoadCustomTools(configuredPaths: string[], cwd:
|
|
|
223
222
|
}
|
|
224
223
|
|
|
225
224
|
// 2. Plugin tools: ~/.omp/plugins/node_modules/*/
|
|
226
|
-
for (const pluginPath of getAllPluginToolPaths(cwd)) {
|
|
225
|
+
for (const pluginPath of await getAllPluginToolPaths(cwd)) {
|
|
227
226
|
addPath(pluginPath, { provider: "plugin", providerName: "Plugin", level: "user" });
|
|
228
227
|
}
|
|
229
228
|
|
|
@@ -4,16 +4,15 @@
|
|
|
4
4
|
* Custom tools are TypeScript modules that define additional tools for the agent.
|
|
5
5
|
* They can provide custom rendering for tool calls and results in the TUI.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { Model } from "@oh-my-pi/pi-ai";
|
|
10
|
-
import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
|
|
11
|
-
import type { ExecOptions, ExecResult } from "@oh-my-pi/pi-coding-agent/exec/exec";
|
|
12
|
-
import type { HookUIContext } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
|
|
13
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
14
|
-
import type { ReadonlySessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
15
9
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
16
10
|
import type { Static, TSchema } from "@sinclair/typebox";
|
|
11
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
12
|
+
import type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
13
|
+
import type { HookUIContext } from "../../extensibility/hooks/types";
|
|
14
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
15
|
+
import type { ReadonlySessionManager } from "../../session/session-manager";
|
|
17
16
|
|
|
18
17
|
/** Alias for clarity */
|
|
19
18
|
export type CustomToolUIContext = HookUIContext;
|
|
@@ -22,7 +21,7 @@ export type CustomToolUIContext = HookUIContext;
|
|
|
22
21
|
export type { AgentToolResult, AgentToolUpdateCallback };
|
|
23
22
|
|
|
24
23
|
// Re-export for backward compatibility
|
|
25
|
-
export type { ExecOptions, ExecResult } from "
|
|
24
|
+
export type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
26
25
|
|
|
27
26
|
/** API passed to custom tool factory (stable across session changes) */
|
|
28
27
|
export interface CustomToolAPI {
|
|
@@ -39,7 +38,7 @@ export interface CustomToolAPI {
|
|
|
39
38
|
/** Injected @sinclair/typebox module */
|
|
40
39
|
typebox: typeof import("@sinclair/typebox");
|
|
41
40
|
/** Injected pi-coding-agent exports */
|
|
42
|
-
pi: typeof import("
|
|
41
|
+
pi: typeof import("../..");
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
/**
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CustomToolAdapter wraps CustomTool instances into AgentTool for use with the agent.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { AgentTool, AgentToolResult, AgentToolUpdateCallback, RenderResultOptions } from "@oh-my-pi/pi-agent-core";
|
|
6
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
7
5
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
8
6
|
import type { Static, TSchema } from "@sinclair/typebox";
|
|
7
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
9
8
|
import type { CustomTool, CustomToolContext, LoadedCustomTool } from "./types";
|
|
10
9
|
|
|
11
10
|
export class CustomToolAdapter<TParams extends TSchema = TSchema, TDetails = any, TTheme extends Theme = Theme>
|
|
@@ -64,6 +63,6 @@ export class CustomToolAdapter<TParams extends TSchema = TSchema, TDetails = any
|
|
|
64
63
|
loadedTools: LoadedCustomTool<TParams, TDetails>[],
|
|
65
64
|
getContext: () => CustomToolContext,
|
|
66
65
|
): AgentTool<TParams, TDetails, TTheme>[] {
|
|
67
|
-
return loadedTools.map(
|
|
66
|
+
return loadedTools.map(lt => CustomToolAdapter.wrap(lt.tool, getContext));
|
|
68
67
|
}
|
|
69
68
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extension loader - loads TypeScript extension modules using native Bun import.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import
|
|
4
|
+
import type * as fs1 from "node:fs";
|
|
5
|
+
import * as fs from "node:fs/promises";
|
|
6
6
|
import * as path from "node:path";
|
|
7
7
|
import type { ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
8
8
|
import type { ImageContent, Model, TextContent } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import
|
|
10
|
-
import { loadCapability } from "@oh-my-pi/pi-coding-agent/discovery";
|
|
11
|
-
import { expandPath, getExtensionNameFromPath } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
|
|
12
|
-
import type { ExecOptions } from "@oh-my-pi/pi-coding-agent/exec/exec";
|
|
13
|
-
import { execCommand } from "@oh-my-pi/pi-coding-agent/exec/exec";
|
|
14
|
-
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
|
|
15
|
-
import type { CustomMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
|
|
16
|
-
import { EventBus } from "@oh-my-pi/pi-coding-agent/utils/event-bus";
|
|
9
|
+
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
|
|
17
10
|
import type { KeyId } from "@oh-my-pi/pi-tui";
|
|
18
|
-
import { logger } from "@oh-my-pi/pi-utils";
|
|
11
|
+
import { hasFsCode, isEacces, isEnoent, logger } from "@oh-my-pi/pi-utils";
|
|
19
12
|
import type { TSchema } from "@sinclair/typebox";
|
|
20
13
|
import * as TypeBox from "@sinclair/typebox";
|
|
14
|
+
import { type ExtensionModule, extensionModuleCapability } from "../../capability/extension-module";
|
|
15
|
+
import { loadCapability } from "../../discovery";
|
|
16
|
+
import { expandPath, getExtensionNameFromPath } from "../../discovery/helpers";
|
|
17
|
+
import type { ExecOptions } from "../../exec/exec";
|
|
18
|
+
import { execCommand } from "../../exec/exec";
|
|
19
|
+
import type { CustomMessage } from "../../session/messages";
|
|
20
|
+
import { EventBus } from "../../utils/event-bus";
|
|
21
21
|
import type {
|
|
22
22
|
Extension,
|
|
23
23
|
ExtensionAPI,
|
|
@@ -316,16 +316,18 @@ interface ExtensionManifest {
|
|
|
316
316
|
skills?: string[];
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
function readExtensionManifest(packageJsonPath: string): ExtensionManifest | null {
|
|
319
|
+
async function readExtensionManifest(packageJsonPath: string): Promise<ExtensionManifest | null> {
|
|
320
320
|
try {
|
|
321
|
-
const
|
|
322
|
-
const pkg = JSON.parse(content) as { omp?: ExtensionManifest; pi?: ExtensionManifest };
|
|
321
|
+
const pkg = (await Bun.file(packageJsonPath).json()) as { omp?: ExtensionManifest; pi?: ExtensionManifest };
|
|
323
322
|
const manifest = pkg.omp ?? pkg.pi;
|
|
324
323
|
if (manifest && typeof manifest === "object") {
|
|
325
324
|
return manifest;
|
|
326
325
|
}
|
|
327
326
|
return null;
|
|
328
327
|
} catch (error) {
|
|
328
|
+
if (isEnoent(error) || isEacces(error) || hasFsCode(error, "EPERM")) {
|
|
329
|
+
return null;
|
|
330
|
+
}
|
|
329
331
|
logger.warn("Failed to read extension manifest", { path: packageJsonPath, error: String(error) });
|
|
330
332
|
return null;
|
|
331
333
|
}
|
|
@@ -338,31 +340,47 @@ function isExtensionFile(name: string): boolean {
|
|
|
338
340
|
/**
|
|
339
341
|
* Resolve extension entry points from a directory.
|
|
340
342
|
*/
|
|
341
|
-
function resolveExtensionEntries(dir: string): string[] | null {
|
|
343
|
+
async function resolveExtensionEntries(dir: string): Promise<string[] | null> {
|
|
342
344
|
const packageJsonPath = path.join(dir, "package.json");
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
return entries;
|
|
345
|
+
const manifest = await readExtensionManifest(packageJsonPath);
|
|
346
|
+
if (manifest?.extensions?.length) {
|
|
347
|
+
const entries: string[] = [];
|
|
348
|
+
for (const extPath of manifest.extensions) {
|
|
349
|
+
const resolvedExtPath = path.resolve(dir, extPath);
|
|
350
|
+
try {
|
|
351
|
+
await fs.stat(resolvedExtPath);
|
|
352
|
+
entries.push(resolvedExtPath);
|
|
353
|
+
} catch (err) {
|
|
354
|
+
if (isEnoent(err) || isEacces(err) || hasFsCode(err, "EPERM")) continue;
|
|
355
|
+
throw err;
|
|
355
356
|
}
|
|
356
357
|
}
|
|
358
|
+
if (entries.length > 0) {
|
|
359
|
+
return entries;
|
|
360
|
+
}
|
|
357
361
|
}
|
|
358
362
|
|
|
359
363
|
const indexTs = path.join(dir, "index.ts");
|
|
360
364
|
const indexJs = path.join(dir, "index.js");
|
|
361
|
-
|
|
365
|
+
try {
|
|
366
|
+
await fs.stat(indexTs);
|
|
362
367
|
return [indexTs];
|
|
368
|
+
} catch (err) {
|
|
369
|
+
if (isEnoent(err) || isEacces(err) || hasFsCode(err, "EPERM")) {
|
|
370
|
+
// Ignore
|
|
371
|
+
} else {
|
|
372
|
+
throw err;
|
|
373
|
+
}
|
|
363
374
|
}
|
|
364
|
-
|
|
375
|
+
try {
|
|
376
|
+
await fs.stat(indexJs);
|
|
365
377
|
return [indexJs];
|
|
378
|
+
} catch (err) {
|
|
379
|
+
if (isEnoent(err) || isEacces(err) || hasFsCode(err, "EPERM")) {
|
|
380
|
+
// Ignore
|
|
381
|
+
} else {
|
|
382
|
+
throw err;
|
|
383
|
+
}
|
|
366
384
|
}
|
|
367
385
|
|
|
368
386
|
return null;
|
|
@@ -378,36 +396,32 @@ function resolveExtensionEntries(dir: string): string[] | null {
|
|
|
378
396
|
*
|
|
379
397
|
* No recursion beyond one level. Complex packages must use package.json manifest.
|
|
380
398
|
*/
|
|
381
|
-
function discoverExtensionsInDir(dir: string): string[] {
|
|
382
|
-
if (!existsSync(dir)) {
|
|
383
|
-
return [];
|
|
384
|
-
}
|
|
385
|
-
|
|
399
|
+
async function discoverExtensionsInDir(dir: string): Promise<string[]> {
|
|
386
400
|
const discovered: string[] = [];
|
|
387
401
|
|
|
402
|
+
let entries: fs1.Dirent[];
|
|
388
403
|
try {
|
|
389
|
-
|
|
404
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
405
|
+
} catch (err) {
|
|
406
|
+
if (isEnoent(err)) return [];
|
|
407
|
+
logger.warn("Failed to discover extensions in directory", { path: dir, error: String(err) });
|
|
408
|
+
return [];
|
|
409
|
+
}
|
|
390
410
|
|
|
391
|
-
|
|
392
|
-
|
|
411
|
+
for (const entry of entries) {
|
|
412
|
+
const entryPath = path.join(dir, entry.name);
|
|
393
413
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
414
|
+
if ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {
|
|
415
|
+
discovered.push(entryPath);
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
399
418
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
discovered.push(...entries);
|
|
405
|
-
}
|
|
419
|
+
if (entry.isDirectory() || entry.isSymbolicLink()) {
|
|
420
|
+
const resolved = await resolveExtensionEntries(entryPath);
|
|
421
|
+
if (resolved) {
|
|
422
|
+
discovered.push(...resolved);
|
|
406
423
|
}
|
|
407
424
|
}
|
|
408
|
-
} catch (error) {
|
|
409
|
-
logger.warn("Failed to discover extensions in directory", { path: dir, error: String(error) });
|
|
410
|
-
return [];
|
|
411
425
|
}
|
|
412
426
|
|
|
413
427
|
return discovered;
|
|
@@ -454,14 +468,22 @@ export async function discoverAndLoadExtensions(
|
|
|
454
468
|
// 2. Explicitly configured paths
|
|
455
469
|
for (const configuredPath of configuredPaths) {
|
|
456
470
|
const resolved = resolvePath(configuredPath, cwd);
|
|
457
|
-
|
|
458
|
-
|
|
471
|
+
|
|
472
|
+
let stat: fs1.Stats | null = null;
|
|
473
|
+
try {
|
|
474
|
+
stat = await fs.stat(resolved);
|
|
475
|
+
} catch (err) {
|
|
476
|
+
if (!isEnoent(err)) throw err;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (stat?.isDirectory()) {
|
|
480
|
+
const entries = await resolveExtensionEntries(resolved);
|
|
459
481
|
if (entries) {
|
|
460
482
|
addPaths(entries);
|
|
461
483
|
continue;
|
|
462
484
|
}
|
|
463
485
|
|
|
464
|
-
const discovered = discoverExtensionsInDir(resolved);
|
|
486
|
+
const discovered = await discoverExtensionsInDir(resolved);
|
|
465
487
|
if (discovered.length > 0) {
|
|
466
488
|
addPaths(discovered);
|
|
467
489
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extension runner - executes extensions and manages their lifecycle.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
6
5
|
import type { ImageContent, Model } from "@oh-my-pi/pi-ai";
|
|
7
|
-
import type { ModelRegistry } from "@oh-my-pi/pi-coding-agent/config/model-registry";
|
|
8
|
-
import { type Theme, theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
9
|
-
import type { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
10
6
|
import type { KeyId } from "@oh-my-pi/pi-tui";
|
|
11
7
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
8
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
9
|
+
import { type Theme, theme } from "../../modes/theme/theme";
|
|
10
|
+
import type { SessionManager } from "../../session/session-manager";
|
|
12
11
|
import type {
|
|
13
12
|
BeforeAgentStartEvent,
|
|
14
13
|
BeforeAgentStartEventResult,
|
|
@@ -98,9 +97,9 @@ const noOpUIContext: ExtensionUIContext = {
|
|
|
98
97
|
get theme() {
|
|
99
98
|
return theme;
|
|
100
99
|
},
|
|
101
|
-
getAllThemes: () => [],
|
|
102
|
-
getTheme: () => undefined,
|
|
103
|
-
setTheme: (_theme: string | Theme) => ({ success: false, error: "UI not available" }),
|
|
100
|
+
getAllThemes: () => Promise.resolve([]),
|
|
101
|
+
getTheme: () => Promise.resolve(undefined),
|
|
102
|
+
setTheme: (_theme: string | Theme) => Promise.resolve({ success: false, error: "UI not available" }),
|
|
104
103
|
};
|
|
105
104
|
|
|
106
105
|
export class ExtensionRunner {
|
|
@@ -184,7 +183,7 @@ export class ExtensionRunner {
|
|
|
184
183
|
}
|
|
185
184
|
|
|
186
185
|
getExtensionPaths(): string[] {
|
|
187
|
-
return this.extensions.map(
|
|
186
|
+
return this.extensions.map(e => e.path);
|
|
188
187
|
}
|
|
189
188
|
|
|
190
189
|
/** Get all registered tools from all extensions. */
|
|
@@ -313,7 +312,7 @@ export class ExtensionRunner {
|
|
|
313
312
|
return {
|
|
314
313
|
ui: this.uiContext,
|
|
315
314
|
getContextUsage: () => this.getContextUsageFn(),
|
|
316
|
-
compact:
|
|
315
|
+
compact: instructionsOrOptions => this.compactFn(instructionsOrOptions),
|
|
317
316
|
hasUI: this.hasUI(),
|
|
318
317
|
cwd: this.cwd,
|
|
319
318
|
sessionManager: this.sessionManager,
|
|
@@ -341,10 +340,10 @@ export class ExtensionRunner {
|
|
|
341
340
|
...this.createContext(),
|
|
342
341
|
getContextUsage: () => this.getContextUsageFn(),
|
|
343
342
|
waitForIdle: () => this.waitForIdleFn(),
|
|
344
|
-
newSession:
|
|
345
|
-
branch:
|
|
343
|
+
newSession: options => this.newSessionHandler(options),
|
|
344
|
+
branch: entryId => this.branchHandler(entryId),
|
|
346
345
|
navigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),
|
|
347
|
-
compact:
|
|
346
|
+
compact: instructionsOrOptions => this.compactFn(instructionsOrOptions),
|
|
348
347
|
};
|
|
349
348
|
}
|
|
350
349
|
|
|
@@ -7,39 +7,32 @@
|
|
|
7
7
|
* - Register commands, keyboard shortcuts, and CLI flags
|
|
8
8
|
* - Interact with the user via UI primitives
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
10
|
import type { AgentMessage, AgentToolResult, AgentToolUpdateCallback, ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
12
11
|
import type { ImageContent, Model, TextContent, ToolResultMessage } from "@oh-my-pi/pi-ai";
|
|
13
|
-
import type
|
|
14
|
-
import type {
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
17
|
-
import type
|
|
18
|
-
import type {
|
|
19
|
-
import type {
|
|
20
|
-
import type {
|
|
21
|
-
import type {
|
|
22
|
-
import type {
|
|
12
|
+
import type * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
|
|
13
|
+
import type { AutocompleteItem, Component, EditorComponent, EditorTheme, KeyId, TUI } from "@oh-my-pi/pi-tui";
|
|
14
|
+
import type { Static, TSchema } from "@sinclair/typebox";
|
|
15
|
+
import type { KeybindingsManager } from "../../config/keybindings";
|
|
16
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
17
|
+
import type { BashResult } from "../../exec/bash-executor";
|
|
18
|
+
import type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
19
|
+
import type { PythonResult } from "../../ipy/executor";
|
|
20
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
21
|
+
import type { EditToolDetails } from "../../patch";
|
|
22
|
+
import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
|
|
23
|
+
import type { CustomMessage } from "../../session/messages";
|
|
23
24
|
import type {
|
|
24
25
|
BranchSummaryEntry,
|
|
25
26
|
CompactionEntry,
|
|
26
27
|
ReadonlySessionManager,
|
|
27
28
|
SessionEntry,
|
|
28
29
|
SessionManager,
|
|
29
|
-
} from "
|
|
30
|
-
import type {
|
|
31
|
-
|
|
32
|
-
FindToolDetails,
|
|
33
|
-
GrepToolDetails,
|
|
34
|
-
LsToolDetails,
|
|
35
|
-
ReadToolDetails,
|
|
36
|
-
} from "@oh-my-pi/pi-coding-agent/tools";
|
|
37
|
-
import type { EventBus } from "@oh-my-pi/pi-coding-agent/utils/event-bus";
|
|
38
|
-
import type { AutocompleteItem, Component, EditorComponent, EditorTheme, KeyId, TUI } from "@oh-my-pi/pi-tui";
|
|
39
|
-
import type { Static, TSchema } from "@sinclair/typebox";
|
|
30
|
+
} from "../../session/session-manager";
|
|
31
|
+
import type { BashToolDetails, FindToolDetails, GrepToolDetails, LsToolDetails, ReadToolDetails } from "../../tools";
|
|
32
|
+
import type { EventBus } from "../../utils/event-bus";
|
|
40
33
|
|
|
41
|
-
export type { AppAction, KeybindingsManager } from "
|
|
42
|
-
export type { ExecOptions, ExecResult } from "
|
|
34
|
+
export type { AppAction, KeybindingsManager } from "../../config/keybindings";
|
|
35
|
+
export type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
43
36
|
export type { AgentToolResult, AgentToolUpdateCallback };
|
|
44
37
|
|
|
45
38
|
// ============================================================================
|
|
@@ -118,13 +111,13 @@ export interface ExtensionUIContext {
|
|
|
118
111
|
readonly theme: Theme;
|
|
119
112
|
|
|
120
113
|
/** Get all available themes with names and paths. */
|
|
121
|
-
getAllThemes(): { name: string; path: string | undefined }[]
|
|
114
|
+
getAllThemes(): Promise<{ name: string; path: string | undefined }[]>;
|
|
122
115
|
|
|
123
116
|
/** Load a theme by name without switching to it. */
|
|
124
|
-
getTheme(name: string): Theme | undefined
|
|
117
|
+
getTheme(name: string): Promise<Theme | undefined>;
|
|
125
118
|
|
|
126
119
|
/** Set the current theme by name or Theme object. */
|
|
127
|
-
setTheme(theme: string | Theme): { success: boolean; error?: string }
|
|
120
|
+
setTheme(theme: string | Theme): Promise<{ success: boolean; error?: string }>;
|
|
128
121
|
}
|
|
129
122
|
|
|
130
123
|
// ============================================================================
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool wrappers for extensions.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { AgentTool, AgentToolContext, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
6
5
|
import type { ImageContent, TextContent } from "@oh-my-pi/pi-ai";
|
|
7
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
8
6
|
import type { Static, TSchema } from "@sinclair/typebox";
|
|
7
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
9
8
|
import type { ExtensionRunner } from "./runner";
|
|
10
9
|
import type { RegisteredTool, ToolCallEventResult, ToolResultEventResult } from "./types";
|
|
11
10
|
|
|
@@ -63,7 +62,7 @@ export function wrapRegisteredTool(registeredTool: RegisteredTool, runner: Exten
|
|
|
63
62
|
* Wrap all registered tools into AgentTools.
|
|
64
63
|
*/
|
|
65
64
|
export function wrapRegisteredTools(registeredTools: RegisteredTool[], runner: ExtensionRunner): AgentTool[] {
|
|
66
|
-
return registeredTools.map(
|
|
65
|
+
return registeredTools.map(rt => wrapRegisteredTool(rt, runner));
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
/**
|
|
@@ -156,7 +155,7 @@ export class ExtensionToolWrapper<TParameters extends TSchema = TSchema, TDetail
|
|
|
156
155
|
if (resultResult.isError === true && !executionError) {
|
|
157
156
|
// Extension marks a successful result as error
|
|
158
157
|
const textBlocks = (modifiedContent ?? []).filter((c): c is TextContent => c.type === "text");
|
|
159
|
-
const errorText = textBlocks.map(
|
|
158
|
+
const errorText = textBlocks.map(t => t.text).join("\n") || "Tool result marked as error by extension";
|
|
160
159
|
throw new Error(errorText);
|
|
161
160
|
}
|
|
162
161
|
if (resultResult.isError === false && executionError) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// biome-ignore assist/source/organizeImports: biome is not smart
|
|
2
|
-
export type { ReadonlySessionManager, UsageStatistics } from "
|
|
2
|
+
export type { ReadonlySessionManager, UsageStatistics } from "../../session/session-manager";
|
|
3
3
|
export {
|
|
4
4
|
discoverAndLoadHooks,
|
|
5
5
|
loadHooks,
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hook loader - loads TypeScript hook modules using native Bun import.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import * as path from "node:path";
|
|
6
|
-
import
|
|
7
|
-
import type { Hook } from "@oh-my-pi/pi-coding-agent/discovery";
|
|
8
|
-
import { loadCapability } from "@oh-my-pi/pi-coding-agent/discovery";
|
|
9
|
-
import { expandPath } from "@oh-my-pi/pi-coding-agent/discovery/helpers";
|
|
10
|
-
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
|
|
11
|
-
import type { HookMessage } from "@oh-my-pi/pi-coding-agent/session/messages";
|
|
12
|
-
import type { SessionManager } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
5
|
+
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
|
|
13
6
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
14
7
|
import * as typebox from "@sinclair/typebox";
|
|
8
|
+
import { hookCapability } from "../../capability/hook";
|
|
9
|
+
import type { Hook } from "../../discovery";
|
|
10
|
+
import { loadCapability } from "../../discovery";
|
|
11
|
+
import { expandPath } from "../../discovery/helpers";
|
|
12
|
+
import type { HookMessage } from "../../session/messages";
|
|
13
|
+
import type { SessionManager } from "../../session/session-manager";
|
|
15
14
|
import { execCommand } from "./runner";
|
|
16
15
|
import type { ExecOptions, HookAPI, HookFactory, HookMessageRenderer, RegisteredCommand } from "./types";
|
|
17
16
|
|
|
@@ -265,10 +264,10 @@ export async function discoverAndLoadHooks(configuredPaths: string[], cwd: strin
|
|
|
265
264
|
|
|
266
265
|
// 1. Discover hooks via capability API
|
|
267
266
|
const discovered = await loadCapability<Hook>(hookCapability.id, { cwd });
|
|
268
|
-
addPaths(discovered.items.map(
|
|
267
|
+
addPaths(discovered.items.map(hook => hook.path));
|
|
269
268
|
|
|
270
269
|
// 2. Explicitly configured paths (can override/add)
|
|
271
|
-
addPaths(configuredPaths.map(
|
|
270
|
+
addPaths(configuredPaths.map(p => resolveHookPath(p, cwd)));
|
|
272
271
|
|
|
273
272
|
return loadHooks(allPaths, cwd);
|
|
274
273
|
}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hook runner - executes hooks and manages their lifecycle.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
6
5
|
import type { Model } from "@oh-my-pi/pi-ai";
|
|
7
|
-
import type { ModelRegistry } from "
|
|
8
|
-
import { theme } from "
|
|
9
|
-
import type { SessionManager } from "
|
|
6
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
7
|
+
import { theme } from "../../modes/theme/theme";
|
|
8
|
+
import type { SessionManager } from "../../session/session-manager";
|
|
10
9
|
import type {
|
|
11
10
|
AppendEntryHandler,
|
|
12
11
|
BranchHandler,
|
|
@@ -40,7 +39,7 @@ import type {
|
|
|
40
39
|
export type HookErrorListener = (error: HookError) => void;
|
|
41
40
|
|
|
42
41
|
// Re-export execCommand for backward compatibility
|
|
43
|
-
export { execCommand } from "
|
|
42
|
+
export { execCommand } from "../../exec/exec";
|
|
44
43
|
|
|
45
44
|
/** No-op UI context used when no UI is available */
|
|
46
45
|
const noOpUIContext: HookUIContext = {
|
|
@@ -159,7 +158,7 @@ export class HookRunner {
|
|
|
159
158
|
* Get the paths of all loaded hooks.
|
|
160
159
|
*/
|
|
161
160
|
getHookPaths(): string[] {
|
|
162
|
-
return this.hooks.map(
|
|
161
|
+
return this.hooks.map(h => h.path);
|
|
163
162
|
}
|
|
164
163
|
|
|
165
164
|
/**
|
|
@@ -262,8 +261,8 @@ export class HookRunner {
|
|
|
262
261
|
return {
|
|
263
262
|
...this.createContext(),
|
|
264
263
|
waitForIdle: () => this.waitForIdleFn(),
|
|
265
|
-
newSession:
|
|
266
|
-
branch:
|
|
264
|
+
newSession: options => this.newSessionHandler(options),
|
|
265
|
+
branch: entryId => this.branchHandler(entryId),
|
|
267
266
|
navigateTree: (targetId, options) => this.navigateTreeHandler(targetId, options),
|
|
268
267
|
};
|
|
269
268
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool wrapper - wraps tools with hook callbacks for interception.
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { AgentTool, AgentToolContext, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
6
5
|
import type { Static, TSchema } from "@sinclair/typebox";
|
|
7
6
|
import type { HookRunner } from "./runner";
|
|
@@ -4,33 +4,26 @@
|
|
|
4
4
|
* Hooks are TypeScript modules that can subscribe to agent lifecycle events
|
|
5
5
|
* and interact with the user via UI primitives.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { AgentMessage } from "@oh-my-pi/pi-agent-core";
|
|
9
8
|
import type { ImageContent, Message, Model, TextContent, ToolResultMessage } from "@oh-my-pi/pi-ai";
|
|
10
|
-
import type {
|
|
11
|
-
import type {
|
|
12
|
-
import type {
|
|
13
|
-
import type {
|
|
14
|
-
import type {
|
|
15
|
-
import type {
|
|
9
|
+
import type { Component, TUI } from "@oh-my-pi/pi-tui";
|
|
10
|
+
import type { ModelRegistry } from "../../config/model-registry";
|
|
11
|
+
import type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
12
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
13
|
+
import type { EditToolDetails } from "../../patch";
|
|
14
|
+
import type { CompactionPreparation, CompactionResult } from "../../session/compaction";
|
|
15
|
+
import type { HookMessage } from "../../session/messages";
|
|
16
16
|
import type {
|
|
17
17
|
BranchSummaryEntry,
|
|
18
18
|
CompactionEntry,
|
|
19
19
|
ReadonlySessionManager,
|
|
20
20
|
SessionEntry,
|
|
21
21
|
SessionManager,
|
|
22
|
-
} from "
|
|
23
|
-
import type {
|
|
24
|
-
BashToolDetails,
|
|
25
|
-
FindToolDetails,
|
|
26
|
-
GrepToolDetails,
|
|
27
|
-
LsToolDetails,
|
|
28
|
-
ReadToolDetails,
|
|
29
|
-
} from "@oh-my-pi/pi-coding-agent/tools/index";
|
|
30
|
-
import type { Component, TUI } from "@oh-my-pi/pi-tui";
|
|
22
|
+
} from "../../session/session-manager";
|
|
23
|
+
import type { BashToolDetails, FindToolDetails, GrepToolDetails, LsToolDetails, ReadToolDetails } from "../../tools";
|
|
31
24
|
|
|
32
25
|
// Re-export for backward compatibility
|
|
33
|
-
export type { ExecOptions, ExecResult } from "
|
|
26
|
+
export type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
34
27
|
|
|
35
28
|
/**
|
|
36
29
|
* UI context for hooks to request interactive UI from the harness.
|
|
@@ -752,7 +745,7 @@ export interface HookAPI {
|
|
|
752
745
|
/** Injected @sinclair/typebox module */
|
|
753
746
|
typebox: typeof import("@sinclair/typebox");
|
|
754
747
|
/** Injected pi-coding-agent exports */
|
|
755
|
-
pi: typeof import("
|
|
748
|
+
pi: typeof import("../..");
|
|
756
749
|
}
|
|
757
750
|
|
|
758
751
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { theme } from "
|
|
1
|
+
import { theme } from "../../modes/theme/theme";
|
|
2
2
|
import type { DoctorCheck } from "./types";
|
|
3
3
|
|
|
4
4
|
export async function runDoctorChecks(): Promise<DoctorCheck[]> {
|
|
@@ -57,8 +57,8 @@ export function formatDoctorResults(checks: DoctorCheck[]): string {
|
|
|
57
57
|
lines.push(`${icon} ${check.name}: ${check.message}`);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
const errors = checks.filter(
|
|
61
|
-
const warnings = checks.filter(
|
|
60
|
+
const errors = checks.filter(c => c.status === "error").length;
|
|
61
|
+
const warnings = checks.filter(c => c.status === "warning").length;
|
|
62
62
|
|
|
63
63
|
lines.push("");
|
|
64
64
|
lines.push(`Summary: ${checks.length - errors - warnings} ok, ${warnings} warnings, ${errors} errors`);
|