@oh-my-pi/pi-coding-agent 7.0.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -0
- package/README.md +1 -1
- package/docs/hooks.md +2 -2
- package/docs/sdk.md +1 -1
- package/package.json +10 -10
- package/scripts/format-prompts.ts +143 -0
- package/scripts/generate-template.ts +1 -1
- package/src/cli/args.ts +3 -3
- package/src/cli/config-cli.ts +4 -4
- package/src/cli/file-processor.ts +3 -3
- package/src/cli/list-models.ts +2 -2
- package/src/cli/plugin-cli.ts +3 -3
- package/src/cli/session-picker.ts +2 -2
- package/src/cli/setup-cli.ts +2 -2
- package/src/cli/stats-cli.ts +1 -1
- package/src/cli/update-cli.ts +2 -2
- package/src/{core → config}/keybindings.ts +1 -1
- package/src/{core → config}/model-registry.ts +1 -1
- package/src/{core → config}/model-resolver.ts +3 -3
- package/src/{core → config}/prompt-templates.ts +2 -2
- package/src/{core → config}/settings-manager.ts +6 -6
- package/src/{core/cursor/exec-bridge.ts → cursor.ts} +4 -4
- package/src/discovery/agents-md.ts +4 -4
- package/src/discovery/builtin.ts +17 -17
- package/src/discovery/claude.ts +12 -12
- package/src/discovery/cline.ts +6 -6
- package/src/discovery/codex.ts +21 -21
- package/src/discovery/cursor.ts +9 -9
- package/src/discovery/gemini.ts +9 -9
- package/src/discovery/github.ts +6 -6
- package/src/discovery/helpers.ts +4 -4
- package/src/discovery/index.ts +16 -16
- package/src/discovery/mcp-json.ts +4 -4
- package/src/discovery/ssh.ts +4 -4
- package/src/discovery/vscode.ts +4 -4
- package/src/discovery/windsurf.ts +6 -6
- package/src/{core/tools/exa → exa}/company.ts +2 -3
- package/src/{core/tools/exa → exa}/index.ts +2 -2
- package/src/{core/tools/exa → exa}/linkedin.ts +2 -3
- package/src/{core/tools/exa → exa}/mcp-client.ts +2 -2
- package/src/{core/tools/exa → exa}/render.ts +3 -3
- package/src/{core/tools/exa → exa}/researcher.ts +1 -1
- package/src/{core/tools/exa → exa}/search.ts +2 -10
- package/src/{core/tools/exa → exa}/websets.ts +1 -1
- package/src/{core → exec}/bash-executor.ts +22 -6
- package/src/{core → export}/custom-share.ts +1 -1
- package/src/{core/export-html → export/html}/index.ts +3 -3
- package/src/{core → export}/ttsr.ts +2 -2
- package/src/{core → extensibility}/custom-commands/bundled/review/index.ts +4 -4
- package/src/{core → extensibility}/custom-commands/loader.ts +3 -3
- package/src/{core → extensibility}/custom-commands/types.ts +1 -1
- package/src/{core → extensibility}/custom-tools/loader.ts +9 -9
- package/src/{core → extensibility}/custom-tools/types.ts +6 -6
- package/src/{core → extensibility}/custom-tools/wrapper.ts +1 -1
- package/src/{core → extensibility}/extensions/loader.ts +8 -8
- package/src/{core → extensibility}/extensions/runner.ts +3 -3
- package/src/{core → extensibility}/extensions/types.ts +15 -15
- package/src/{core → extensibility}/extensions/wrapper.ts +1 -1
- package/src/{core → extensibility}/hooks/index.ts +1 -1
- package/src/{core → extensibility}/hooks/loader.ts +7 -7
- package/src/{core → extensibility}/hooks/runner.ts +4 -4
- package/src/{core → extensibility}/hooks/types.ts +9 -9
- package/src/{core → extensibility}/plugins/doctor.ts +1 -1
- package/src/{core → extensibility}/plugins/installer.ts +2 -3
- package/src/{core → extensibility}/plugins/paths.ts +1 -1
- package/src/{core → extensibility}/skills.ts +8 -48
- package/src/{core → extensibility}/slash-commands.ts +6 -6
- package/src/index.ts +127 -128
- package/src/internal-urls/agent-protocol.ts +126 -0
- package/src/internal-urls/artifact-protocol.ts +93 -0
- package/src/internal-urls/index.ts +28 -0
- package/src/internal-urls/json-query.ts +126 -0
- package/src/internal-urls/router.ts +69 -0
- package/src/internal-urls/rule-protocol.ts +56 -0
- package/src/internal-urls/skill-protocol.ts +112 -0
- package/src/internal-urls/types.ts +48 -0
- package/src/{core/python-executor.ts → ipy/executor.ts} +51 -11
- package/src/{core/python-gateway-coordinator.ts → ipy/gateway-coordinator.ts} +41 -325
- package/src/{core/python-kernel.ts → ipy/kernel.ts} +38 -10
- package/src/ipy/prelude.ts +3 -0
- package/src/{core/tools/lsp → lsp}/client.ts +7 -6
- package/src/{core/tools/lsp → lsp}/clients/biome-client.ts +1 -1
- package/src/{core/tools/lsp → lsp}/clients/index.ts +1 -1
- package/src/{core/tools/lsp → lsp}/clients/lsp-linter-client.ts +4 -4
- package/src/{core/tools/lsp → lsp}/config.ts +1 -1
- package/src/{core/tools/lsp → lsp}/index.ts +16 -15
- package/src/{core/tools/lsp → lsp}/render.ts +2 -2
- package/src/{core/tools/lsp → lsp}/types.ts +14 -16
- package/src/{core/tools/lsp → lsp}/utils.ts +1 -1
- package/src/main.ts +12 -12
- package/src/{core/mcp → mcp}/config.ts +8 -8
- package/src/{core/mcp → mcp}/loader.ts +5 -6
- package/src/{core/mcp → mcp}/manager.ts +2 -2
- package/src/{core/mcp → mcp}/tool-bridge.ts +35 -6
- package/src/{core/mcp → mcp}/tool-cache.ts +1 -1
- package/src/{core/mcp → mcp}/transports/http.ts +7 -1
- package/src/{core/mcp → mcp}/transports/stdio.ts +1 -1
- package/src/{core/mcp → mcp}/types.ts +1 -1
- package/src/migrations.ts +2 -2
- package/src/modes/{interactive/components → components}/armin.ts +1 -1
- package/src/modes/{interactive/components → components}/assistant-message.ts +1 -1
- package/src/modes/{interactive/components → components}/bash-execution.ts +37 -29
- package/src/modes/{interactive/components → components}/bordered-loader.ts +1 -1
- package/src/modes/{interactive/components → components}/branch-summary-message.ts +2 -2
- package/src/modes/{interactive/components → components}/compaction-summary-message.ts +2 -2
- package/src/modes/{interactive/components → components}/custom-message.ts +3 -3
- package/src/modes/{interactive/components → components}/diff.ts +1 -1
- package/src/modes/{interactive/components → components}/dynamic-border.ts +1 -1
- package/src/modes/{interactive/components → components}/extensions/extension-dashboard.ts +3 -3
- package/src/modes/{interactive/components → components}/extensions/extension-list.ts +2 -2
- package/src/modes/{interactive/components → components}/extensions/inspector-panel.ts +1 -1
- package/src/modes/{interactive/components → components}/extensions/state-manager.ts +11 -17
- package/src/modes/{interactive/components → components}/extensions/types.ts +1 -1
- package/src/modes/{interactive/components → components}/footer.ts +3 -3
- package/src/modes/{interactive/components → components}/history-search.ts +2 -2
- package/src/modes/{interactive/components → components}/hook-editor.ts +1 -1
- package/src/modes/{interactive/components → components}/hook-input.ts +1 -1
- package/src/modes/{interactive/components → components}/hook-message.ts +3 -3
- package/src/modes/{interactive/components → components}/hook-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/keybinding-hints.ts +2 -2
- package/src/modes/{interactive/components → components}/login-dialog.ts +1 -1
- package/src/modes/{interactive/components → components}/model-selector.ts +5 -5
- package/src/modes/{interactive/components → components}/oauth-selector.ts +2 -2
- package/src/modes/{interactive/components → components}/plugin-settings.ts +3 -3
- package/src/modes/{interactive/components → components}/python-execution.ts +35 -24
- package/src/modes/{interactive/components → components}/queue-mode-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/read-tool-group.ts +2 -2
- package/src/modes/{interactive/components → components}/session-selector.ts +3 -3
- package/src/modes/{interactive/components → components}/settings-defs.ts +2 -2
- package/src/modes/{interactive/components → components}/settings-selector.ts +2 -2
- package/src/modes/{interactive/components → components}/show-images-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/status-line/segments.ts +2 -2
- package/src/modes/{interactive/components → components}/status-line/separators.ts +1 -1
- package/src/modes/{interactive/components → components}/status-line/types.ts +2 -2
- package/src/modes/{interactive/components → components}/status-line-segment-editor.ts +2 -2
- package/src/modes/{interactive/components → components}/status-line.ts +3 -3
- package/src/modes/{interactive/components → components}/theme-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/thinking-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/todo-display.ts +3 -4
- package/src/modes/{interactive/components → components}/todo-reminder.ts +2 -2
- package/src/modes/{interactive/components → components}/tool-execution.ts +8 -8
- package/src/modes/{interactive/components → components}/tree-selector.ts +3 -3
- package/src/modes/{interactive/components → components}/ttsr-notification.ts +2 -2
- package/src/modes/{interactive/components → components}/user-message-selector.ts +1 -1
- package/src/modes/{interactive/components → components}/user-message.ts +1 -1
- package/src/modes/{interactive/components → components}/welcome.ts +2 -2
- package/src/modes/{interactive/controllers → controllers}/command-controller.ts +32 -30
- package/src/modes/{interactive/controllers → controllers}/event-controller.ts +9 -9
- package/src/modes/{interactive/controllers → controllers}/extension-ui-controller.ts +8 -8
- package/src/modes/{interactive/controllers → controllers}/input-controller.ts +6 -6
- package/src/modes/{interactive/controllers → controllers}/selector-controller.ts +16 -16
- package/src/modes/index.ts +1 -1
- package/src/modes/{interactive/interactive-mode.ts → interactive-mode.ts} +14 -14
- package/src/modes/print-mode.ts +1 -1
- package/src/modes/rpc/rpc-client.ts +3 -3
- package/src/modes/rpc/rpc-mode.ts +3 -3
- package/src/modes/rpc/rpc-types.ts +3 -3
- package/src/modes/{interactive/theme → theme}/theme.ts +1 -1
- package/src/modes/{interactive/types.ts → types.ts} +8 -9
- package/src/modes/{interactive/utils → utils}/ui-helpers.ts +20 -27
- package/src/{core/tools/patch → patch}/applicator.ts +1 -1
- package/src/{core/tools/patch → patch}/diff.ts +1 -1
- package/src/{core/tools/patch → patch}/index.ts +31 -36
- package/src/{core/tools/patch → patch}/shared.ts +9 -6
- package/src/prompts/agents/explore.md +83 -46
- package/src/prompts/agents/init.md +9 -4
- package/src/prompts/agents/plan.md +8 -7
- package/src/prompts/agents/reviewer.md +36 -18
- package/src/prompts/agents/task.md +4 -4
- package/src/prompts/compaction/branch-summary-preamble.md +0 -1
- package/src/prompts/review-request.md +0 -1
- package/src/prompts/system/custom-system-prompt.md +2 -14
- package/src/prompts/system/file-operations.md +0 -2
- package/src/prompts/system/system-prompt.md +147 -138
- package/src/prompts/system/web-search.md +26 -0
- package/src/prompts/tools/ask.md +31 -24
- package/src/prompts/tools/bash.md +20 -17
- package/src/prompts/tools/calculator.md +9 -5
- package/src/prompts/tools/fetch.md +16 -0
- package/src/prompts/tools/find.md +15 -5
- package/src/prompts/tools/gemini-image.md +21 -6
- package/src/prompts/tools/grep.md +28 -12
- package/src/prompts/tools/lsp.md +35 -14
- package/src/prompts/tools/patch.md +39 -41
- package/src/prompts/tools/python.md +59 -76
- package/src/prompts/tools/read.md +23 -22
- package/src/prompts/tools/replace.md +19 -12
- package/src/prompts/tools/ssh.md +21 -28
- package/src/prompts/tools/task.md +54 -44
- package/src/prompts/tools/todo-write.md +52 -163
- package/src/prompts/tools/web-search.md +16 -9
- package/src/prompts/tools/write.md +13 -2
- package/src/{core/sdk.ts → sdk.ts} +65 -34
- package/src/{core → session}/agent-session.ts +45 -37
- package/src/{core → session}/agent-storage.ts +2 -2
- package/src/session/artifacts.ts +110 -0
- package/src/{core → session}/auth-storage.ts +1 -1
- package/src/{core → session}/compaction/branch-summarization.ts +5 -5
- package/src/{core → session}/compaction/compaction.ts +6 -6
- package/src/{core → session}/compaction/utils.ts +3 -3
- package/src/{core → session}/history-storage.ts +1 -1
- package/src/{core → session}/messages.ts +6 -8
- package/src/{core → session}/session-manager.ts +2 -2
- package/src/{core → session}/storage-migration.ts +2 -2
- package/src/session/streaming-output.ts +177 -0
- package/src/{core/ssh → ssh}/connection-manager.ts +1 -1
- package/src/{core/ssh → ssh}/ssh-executor.ts +19 -4
- package/src/{core/ssh → ssh}/sshfs-mount.ts +1 -1
- package/src/{core/system-prompt.ts → system-prompt.ts} +8 -37
- package/src/{core/tools/task → task}/agents.ts +8 -8
- package/src/{core/tools/task → task}/commands.ts +5 -6
- package/src/{core/tools/task → task}/discovery.ts +3 -3
- package/src/{core/tools/task → task}/executor.ts +34 -44
- package/src/{core/tools/task → task}/index.ts +206 -50
- package/src/{core/tools/task → task}/render.ts +80 -23
- package/src/{core/tools/task → task}/subprocess-tool-registry.ts +1 -1
- package/src/task/template.ts +47 -0
- package/src/{core/tools/task → task}/types.ts +19 -27
- package/src/{core/tools/task → task}/worker-protocol.ts +8 -4
- package/src/{core/tools/task → task}/worker.ts +34 -29
- package/src/task/worktree.ts +166 -0
- package/src/{core/tools → tools}/ask.ts +13 -21
- package/src/{core/tools → tools}/bash-interceptor.ts +1 -1
- package/src/{core/tools → tools}/bash.ts +61 -63
- package/src/{core/tools → tools}/calculator.ts +4 -4
- package/src/{core/tools → tools}/complete.ts +1 -1
- package/src/{core/tools → tools}/context.ts +2 -2
- package/src/{core/tools/web-fetch.ts → tools/fetch.ts} +97 -76
- package/src/{core/tools → tools}/find.ts +80 -104
- package/src/{core/tools → tools}/gemini-image.ts +420 -29
- package/src/{core/tools → tools}/grep.ts +155 -164
- package/src/{core/tools → tools}/index.ts +63 -56
- package/src/tools/list-limit.ts +40 -0
- package/src/{core/tools → tools}/ls.ts +44 -35
- package/src/{core/tools → tools}/notebook.ts +3 -3
- package/src/tools/output-meta.ts +443 -0
- package/src/tools/output-utils.ts +63 -0
- package/src/{core/tools → tools}/python.ts +105 -89
- package/src/tools/read.ts +882 -0
- package/src/{core/tools → tools}/render-utils.ts +1 -1
- package/src/{core/tools → tools}/renderers.ts +8 -10
- package/src/{core/tools → tools}/review.ts +2 -2
- package/src/{core/tools → tools}/ssh.ts +56 -59
- package/src/{core/tools → tools}/todo-write.ts +12 -23
- package/src/tools/tool-errors.ts +95 -0
- package/src/tools/tool-result.ts +92 -0
- package/src/{core/tools → tools}/truncate.ts +2 -2
- package/src/{core/tools → tools}/write.ts +15 -13
- package/src/utils/changelog.ts +1 -1
- package/src/{core → utils}/file-mentions.ts +4 -4
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/shell.ts +1 -1
- package/src/{core → utils}/title-generator.ts +4 -4
- package/src/utils/tools-manager.ts +1 -1
- package/src/{core/tools/web-scrapers → web/scrapers}/choosealicense.ts +1 -1
- package/src/{core/tools/web-scrapers → web/scrapers}/twitter.ts +3 -2
- package/src/{core/tools/web-scrapers → web/scrapers}/types.ts +4 -2
- package/src/{core/tools/web-scrapers → web/scrapers}/utils.ts +1 -1
- package/src/{core/tools/web-scrapers → web/scrapers}/youtube.ts +14 -13
- package/src/{core/tools/web-search → web/search}/auth.ts +4 -4
- package/src/{core/tools/web-search → web/search}/index.ts +22 -71
- package/src/{core/tools/web-search → web/search}/providers/anthropic.ts +7 -10
- package/src/{core/tools/web-search → web/search}/providers/exa.ts +2 -2
- package/src/{core/tools/web-search → web/search}/providers/perplexity.ts +4 -16
- package/src/{core/tools/web-search → web/search}/render.ts +3 -3
- package/scripts/migrate-sessions.sh +0 -93
- package/src/core/index.ts +0 -56
- package/src/core/python-prelude.ts +0 -3
- package/src/core/ssh-executor.ts +0 -5
- package/src/core/streaming-output.ts +0 -115
- package/src/core/tools/output.ts +0 -519
- package/src/core/tools/read.ts +0 -717
- package/src/core/tools/task/template.ts +0 -37
- package/src/prompts/tools/output.md +0 -47
- package/src/prompts/tools/web-fetch.md +0 -9
- /package/src/{core/tools/exa → exa}/types.ts +0 -0
- /package/src/{core → exec}/exec.ts +0 -0
- /package/src/{core/export-html → export/html}/template.css +0 -0
- /package/src/{core/export-html → export/html}/template.generated.ts +0 -0
- /package/src/{core/export-html → export/html}/template.html +0 -0
- /package/src/{core/export-html → export/html}/template.js +0 -0
- /package/src/{core/export-html → export/html}/template.macro.ts +0 -0
- /package/src/{core/export-html → export/html}/vendor/highlight.min.js +0 -0
- /package/src/{core/export-html → export/html}/vendor/marked.min.js +0 -0
- /package/src/{core → extensibility}/custom-commands/index.ts +0 -0
- /package/src/{core → extensibility}/custom-tools/index.ts +0 -0
- /package/src/{core → extensibility}/extensions/index.ts +0 -0
- /package/src/{core → extensibility}/hooks/tool-wrapper.ts +0 -0
- /package/src/{core → extensibility}/plugins/index.ts +0 -0
- /package/src/{core → extensibility}/plugins/loader.ts +0 -0
- /package/src/{core → extensibility}/plugins/manager.ts +0 -0
- /package/src/{core → extensibility}/plugins/parser.ts +0 -0
- /package/src/{core → extensibility}/plugins/types.ts +0 -0
- /package/src/{core/python-modules.ts → ipy/modules.ts} +0 -0
- /package/src/{core/python-prelude.py → ipy/prelude.py} +0 -0
- /package/src/{core/tools/lsp → lsp}/defaults.json +0 -0
- /package/src/{core/tools/lsp → lsp}/edits.ts +0 -0
- /package/src/{core/tools/lsp → lsp}/lspmux.ts +0 -0
- /package/src/{core/tools/lsp → lsp}/rust-analyzer.ts +0 -0
- /package/src/{core/mcp → mcp}/client.ts +0 -0
- /package/src/{core/mcp → mcp}/index.ts +0 -0
- /package/src/{core/mcp → mcp}/json-rpc.ts +0 -0
- /package/src/{core/mcp → mcp}/transports/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/countdown-timer.ts +0 -0
- /package/src/modes/{interactive/components → components}/custom-editor.ts +0 -0
- /package/src/modes/{interactive/components → components}/extensions/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/status-line/index.ts +0 -0
- /package/src/modes/{interactive/components → components}/status-line/presets.ts +0 -0
- /package/src/modes/{interactive/components → components}/visual-truncate.ts +0 -0
- /package/src/modes/{interactive/theme → theme}/dark.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/alabaster.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/amethyst.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/anthracite.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/basalt.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/birch.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-abyss.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-arctic.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-aurora.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-catppuccin.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-cavern.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-copper.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-cosmos.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-cyberpunk.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-dracula.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-eclipse.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-ember.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-equinox.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-forest.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-github.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-gruvbox.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-lavender.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-lunar.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-midnight.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-monochrome.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-monokai.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-nebula.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-nord.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-ocean.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-one.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-rainforest.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-reef.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-retro.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-rose-pine.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-sakura.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-slate.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-solarized.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-solstice.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-starfall.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-sunset.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-swamp.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-synthwave.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-taiga.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-terminal.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-tokyo-night.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-tundra.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-twilight.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/dark-volcanic.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/graphite.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/index.ts +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-arctic.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-aurora-day.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-canyon.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-catppuccin.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-cirrus.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-coral.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-cyberpunk.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-dawn.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-dunes.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-eucalyptus.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-forest.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-frost.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-github.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-glacier.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-gruvbox.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-haze.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-honeycomb.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-lagoon.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-lavender.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-meadow.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-mint.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-monochrome.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-ocean.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-one.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-opal.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-orchard.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-paper.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-prism.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-retro.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-sand.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-savanna.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-solarized.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-soleil.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-sunset.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-synthwave.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-tokyo-night.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-wetland.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/light-zenith.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/limestone.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/mahogany.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/marble.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/obsidian.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/onyx.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/pearl.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/porcelain.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/quartz.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/sandstone.json +0 -0
- /package/src/modes/{interactive/theme → theme}/defaults/titanium.json +0 -0
- /package/src/modes/{interactive/theme → theme}/light.json +0 -0
- /package/src/modes/{interactive/theme → theme}/theme-schema.json +0 -0
- /package/src/{core/tools/patch → patch}/fuzzy.ts +0 -0
- /package/src/{core/tools/patch → patch}/normalize.ts +0 -0
- /package/src/{core/tools/patch → patch}/normative.ts +0 -0
- /package/src/{core/tools/patch → patch}/parser.ts +0 -0
- /package/src/{core/tools/patch → patch}/types.ts +0 -0
- /package/src/{core → session}/compaction/index.ts +0 -0
- /package/src/{core → session}/session-storage.ts +0 -0
- /package/src/{core/tools/task → task}/name-generator.ts +0 -0
- /package/src/{core/tools/task → task}/omp-command.ts +0 -0
- /package/src/{core/tools/task → task}/parallel.ts +0 -0
- /package/src/{core/tools → tools}/jtd-to-json-schema.ts +0 -0
- /package/src/{core/tools → tools}/path-utils.ts +0 -0
- /package/src/{core → utils}/event-bus.ts +0 -0
- /package/src/{core → utils}/frontmatter.ts +0 -0
- /package/src/{core → utils}/terminal-notify.ts +0 -0
- /package/src/{core → utils}/timings.ts +0 -0
- /package/src/{core → utils}/utils.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/artifacthub.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/arxiv.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/aur.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/biorxiv.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/bluesky.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/brew.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/cheatsh.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/chocolatey.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/cisa-kev.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/clojars.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/coingecko.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/crates-io.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/crossref.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/devto.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/discogs.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/discourse.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/dockerhub.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/fdroid.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/firefox-addons.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/flathub.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/github-gist.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/github.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/gitlab.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/go-pkg.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/hackage.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/hackernews.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/hex.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/huggingface.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/iacr.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/index.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/jetbrains-marketplace.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/lemmy.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/lobsters.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/mastodon.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/maven.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/mdn.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/metacpan.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/musicbrainz.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/npm.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/nuget.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/nvd.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/ollama.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/open-vsx.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/opencorporates.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/openlibrary.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/orcid.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/osv.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/packagist.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/pub-dev.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/pubmed.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/pypi.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/rawg.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/readthedocs.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/reddit.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/repology.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/rfc.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/rubygems.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/searchcode.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/sec-edgar.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/semantic-scholar.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/snapcraft.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/sourcegraph.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/spdx.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/spotify.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/stackoverflow.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/terraform.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/tldr.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/vimeo.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/vscode-marketplace.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/w3c.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/wikidata.ts +0 -0
- /package/src/{core/tools/web-scrapers → web/scrapers}/wikipedia.ts +0 -0
- /package/src/{core/tools/web-search → web/search}/types.ts +0 -0
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
export { AskTool, type AskToolDetails } from "./ask";
|
|
2
|
-
export { BashTool, type BashToolDetails, type BashToolOptions } from "./bash";
|
|
3
|
-
export { CalculatorTool, type CalculatorToolDetails } from "./calculator";
|
|
4
|
-
export { CompleteTool } from "./complete";
|
|
5
1
|
// Exa MCP tools (22 tools)
|
|
6
|
-
export { exaTools } from "
|
|
7
|
-
export type { ExaRenderDetails, ExaSearchResponse, ExaSearchResult } from "
|
|
8
|
-
export { type FindOperations, FindTool, type FindToolDetails, type FindToolOptions } from "./find";
|
|
9
|
-
export { setPreferredImageProvider } from "./gemini-image";
|
|
10
|
-
export { type GrepOperations, GrepTool, type GrepToolDetails, type GrepToolOptions } from "./grep";
|
|
11
|
-
export { type LsOperations, LsTool, type LsToolDetails, type LsToolOptions } from "./ls";
|
|
2
|
+
export { exaTools } from "$c/exa/index";
|
|
3
|
+
export type { ExaRenderDetails, ExaSearchResponse, ExaSearchResult } from "$c/exa/types";
|
|
12
4
|
export {
|
|
13
5
|
type FileDiagnosticsResult,
|
|
14
6
|
type FileFormatResult,
|
|
@@ -19,27 +11,9 @@ export {
|
|
|
19
11
|
type LspWarmupOptions,
|
|
20
12
|
type LspWarmupResult,
|
|
21
13
|
warmupLspServers,
|
|
22
|
-
} from "
|
|
23
|
-
export {
|
|
24
|
-
export {
|
|
25
|
-
export { EditTool, type EditToolDetails } from "./patch";
|
|
26
|
-
export { PythonTool, type PythonToolDetails, type PythonToolOptions } from "./python";
|
|
27
|
-
export { ReadTool, type ReadToolDetails } from "./read";
|
|
28
|
-
export { reportFindingTool, type SubmitReviewDetails } from "./review";
|
|
29
|
-
export { loadSshTool, type SSHToolDetails, SshTool } from "./ssh";
|
|
30
|
-
export { BUNDLED_AGENTS, TaskTool } from "./task/index";
|
|
31
|
-
export { type TodoItem, TodoWriteTool, type TodoWriteToolDetails } from "./todo-write";
|
|
32
|
-
export {
|
|
33
|
-
DEFAULT_MAX_BYTES,
|
|
34
|
-
DEFAULT_MAX_LINES,
|
|
35
|
-
formatSize,
|
|
36
|
-
type TruncationOptions,
|
|
37
|
-
type TruncationResult,
|
|
38
|
-
truncateHead,
|
|
39
|
-
truncateLine,
|
|
40
|
-
truncateTail,
|
|
41
|
-
} from "./truncate";
|
|
42
|
-
export { WebFetchTool, type WebFetchToolDetails } from "./web-fetch";
|
|
14
|
+
} from "$c/lsp/index";
|
|
15
|
+
export { EditTool, type EditToolDetails } from "$c/patch";
|
|
16
|
+
export { BUNDLED_AGENTS, TaskTool } from "$c/task/index";
|
|
43
17
|
export {
|
|
44
18
|
companyWebSearchTools,
|
|
45
19
|
exaWebSearchTools,
|
|
@@ -57,34 +31,61 @@ export {
|
|
|
57
31
|
webSearchCustomTool,
|
|
58
32
|
webSearchDeepTool,
|
|
59
33
|
webSearchLinkedinTool,
|
|
60
|
-
} from "
|
|
34
|
+
} from "$c/web/search/index";
|
|
35
|
+
export { AskTool, type AskToolDetails } from "./ask";
|
|
36
|
+
export { BashTool, type BashToolDetails, type BashToolOptions } from "./bash";
|
|
37
|
+
export { CalculatorTool, type CalculatorToolDetails } from "./calculator";
|
|
38
|
+
export { CompleteTool } from "./complete";
|
|
39
|
+
export { FetchTool, type FetchToolDetails } from "./fetch";
|
|
40
|
+
export { type FindOperations, FindTool, type FindToolDetails, type FindToolOptions } from "./find";
|
|
41
|
+
export { setPreferredImageProvider } from "./gemini-image";
|
|
42
|
+
export { type GrepOperations, GrepTool, type GrepToolDetails, type GrepToolOptions } from "./grep";
|
|
43
|
+
export { type LsOperations, LsTool, type LsToolDetails, type LsToolOptions } from "./ls";
|
|
44
|
+
export { NotebookTool, type NotebookToolDetails } from "./notebook";
|
|
45
|
+
export { PythonTool, type PythonToolDetails, type PythonToolOptions } from "./python";
|
|
46
|
+
export { ReadTool, type ReadToolDetails } from "./read";
|
|
47
|
+
export { reportFindingTool, type SubmitReviewDetails } from "./review";
|
|
48
|
+
export { loadSshTool, type SSHToolDetails, SshTool } from "./ssh";
|
|
49
|
+
export { type TodoItem, TodoWriteTool, type TodoWriteToolDetails } from "./todo-write";
|
|
50
|
+
export {
|
|
51
|
+
DEFAULT_MAX_BYTES,
|
|
52
|
+
DEFAULT_MAX_LINES,
|
|
53
|
+
formatSize,
|
|
54
|
+
type TruncationOptions,
|
|
55
|
+
type TruncationResult,
|
|
56
|
+
truncateHead,
|
|
57
|
+
truncateLine,
|
|
58
|
+
truncateTail,
|
|
59
|
+
} from "./truncate";
|
|
61
60
|
export { WriteTool, type WriteToolDetails } from "./write";
|
|
62
61
|
|
|
63
62
|
import type { AgentTool } from "@oh-my-pi/pi-agent-core";
|
|
64
63
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
65
|
-
import type {
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
import
|
|
64
|
+
import type { BashInterceptorRule } from "$c/config/settings-manager";
|
|
65
|
+
import type { InternalUrlRouter } from "$c/internal-urls";
|
|
66
|
+
import { getPreludeDocs, warmPythonEnvironment } from "$c/ipy/executor";
|
|
67
|
+
import { checkPythonKernelAvailability } from "$c/ipy/kernel";
|
|
68
|
+
import { LspTool } from "$c/lsp/index";
|
|
69
|
+
import { EditTool } from "$c/patch";
|
|
70
|
+
import type { ArtifactManager } from "$c/session/artifacts";
|
|
71
|
+
import { TaskTool } from "$c/task/index";
|
|
72
|
+
import type { EventBus } from "$c/utils/event-bus";
|
|
73
|
+
import { WebSearchTool } from "$c/web/search/index";
|
|
69
74
|
import { AskTool } from "./ask";
|
|
70
75
|
import { BashTool } from "./bash";
|
|
71
76
|
import { CalculatorTool } from "./calculator";
|
|
72
77
|
import { CompleteTool } from "./complete";
|
|
78
|
+
import { FetchTool } from "./fetch";
|
|
73
79
|
import { FindTool } from "./find";
|
|
74
80
|
import { GrepTool } from "./grep";
|
|
75
81
|
import { LsTool } from "./ls";
|
|
76
|
-
import { LspTool } from "./lsp/index";
|
|
77
82
|
import { NotebookTool } from "./notebook";
|
|
78
|
-
import {
|
|
79
|
-
import { EditTool } from "./patch";
|
|
83
|
+
import { wrapToolsWithMetaNotice } from "./output-meta";
|
|
80
84
|
import { PythonTool } from "./python";
|
|
81
85
|
import { ReadTool } from "./read";
|
|
82
86
|
import { reportFindingTool } from "./review";
|
|
83
87
|
import { loadSshTool } from "./ssh";
|
|
84
|
-
import { TaskTool } from "./task/index";
|
|
85
88
|
import { TodoWriteTool } from "./todo-write";
|
|
86
|
-
import { WebFetchTool } from "./web-fetch";
|
|
87
|
-
import { WebSearchTool } from "./web-search/index";
|
|
88
89
|
import { WriteTool } from "./write";
|
|
89
90
|
|
|
90
91
|
/** Tool type (AgentTool from pi-ai) */
|
|
@@ -106,6 +107,10 @@ export interface ToolSession {
|
|
|
106
107
|
requireCompleteTool?: boolean;
|
|
107
108
|
/** Get session file */
|
|
108
109
|
getSessionFile: () => string | null;
|
|
110
|
+
/** Cached artifact manager (allocated per ToolSession) */
|
|
111
|
+
artifactManager?: ArtifactManager;
|
|
112
|
+
/** Get artifacts directory for artifact:// URLs and $ARTIFACTS env var */
|
|
113
|
+
getArtifactsDir?: () => string | null;
|
|
109
114
|
/** Get session spawns */
|
|
110
115
|
getSessionSpawns: () => string | null;
|
|
111
116
|
/** Get resolved model string if explicitly set for this session */
|
|
@@ -113,13 +118,15 @@ export interface ToolSession {
|
|
|
113
118
|
/** Get the current session model string, regardless of how it was chosen */
|
|
114
119
|
getActiveModelString?: () => string | undefined;
|
|
115
120
|
/** Auth storage for passing to subagents (avoids re-discovery) */
|
|
116
|
-
authStorage?: import("
|
|
121
|
+
authStorage?: import("$c/session/auth-storage").AuthStorage;
|
|
117
122
|
/** Model registry for passing to subagents (avoids re-discovery) */
|
|
118
|
-
modelRegistry?: import("
|
|
123
|
+
modelRegistry?: import("$c/config/model-registry").ModelRegistry;
|
|
119
124
|
/** MCP manager for proxying MCP calls through parent */
|
|
120
125
|
mcpManager?: import("../mcp/manager").MCPManager;
|
|
126
|
+
/** Internal URL router for agent:// and skill:// URLs */
|
|
127
|
+
internalRouter?: InternalUrlRouter;
|
|
121
128
|
/** Settings manager for passing to subagents (avoids SQLite access in workers) */
|
|
122
|
-
settingsManager?: { serialize: () => import("
|
|
129
|
+
settingsManager?: { serialize: () => import("$c/config/settings-manager").Settings };
|
|
123
130
|
/** Settings manager (optional) */
|
|
124
131
|
settings?: {
|
|
125
132
|
getImageAutoResize(): boolean;
|
|
@@ -153,11 +160,10 @@ export const BUILTIN_TOOLS: Record<string, ToolFactory> = {
|
|
|
153
160
|
ls: (s) => new LsTool(s),
|
|
154
161
|
lsp: LspTool.createIf,
|
|
155
162
|
notebook: (s) => new NotebookTool(s),
|
|
156
|
-
output: (s) => new OutputTool(s),
|
|
157
163
|
read: (s) => new ReadTool(s),
|
|
158
164
|
task: TaskTool.create,
|
|
159
165
|
todo_write: (s) => new TodoWriteTool(s),
|
|
160
|
-
|
|
166
|
+
fetch: (s) => new FetchTool(s),
|
|
161
167
|
web_search: (s) => new WebSearchTool(s),
|
|
162
168
|
write: (s) => new WriteTool(s),
|
|
163
169
|
};
|
|
@@ -222,13 +228,13 @@ export async function createTools(session: ToolSession, toolNames?: string[]): P
|
|
|
222
228
|
} else if (!isTestEnv && getPreludeDocs().length === 0) {
|
|
223
229
|
const sessionFile = session.getSessionFile?.() ?? undefined;
|
|
224
230
|
const warmSessionId = sessionFile ? `session:${sessionFile}:cwd:${session.cwd}` : `cwd:${session.cwd}`;
|
|
225
|
-
|
|
226
|
-
(
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
}
|
|
231
|
-
|
|
231
|
+
try {
|
|
232
|
+
await warmPythonEnvironment(session.cwd, warmSessionId, session.settings?.getPythonSharedGateway?.());
|
|
233
|
+
} catch (err) {
|
|
234
|
+
logger.warn("Failed to warm Python environment", {
|
|
235
|
+
error: err instanceof Error ? err.message : String(err),
|
|
236
|
+
});
|
|
237
|
+
}
|
|
232
238
|
}
|
|
233
239
|
}
|
|
234
240
|
|
|
@@ -266,11 +272,12 @@ export async function createTools(session: ToolSession, toolNames?: string[]): P
|
|
|
266
272
|
];
|
|
267
273
|
const results = await Promise.all(entries.map(([, factory]) => factory(session)));
|
|
268
274
|
const tools = results.filter((t): t is Tool => t !== null);
|
|
275
|
+
const wrappedTools = wrapToolsWithMetaNotice(tools);
|
|
269
276
|
|
|
270
277
|
if (filteredRequestedTools !== undefined) {
|
|
271
278
|
const allowed = new Set(filteredRequestedTools);
|
|
272
|
-
return
|
|
279
|
+
return wrappedTools.filter((tool) => allowed.has(tool.name));
|
|
273
280
|
}
|
|
274
281
|
|
|
275
|
-
return
|
|
282
|
+
return wrappedTools;
|
|
276
283
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LimitsMeta } from "$c/tools/output-meta";
|
|
2
|
+
|
|
3
|
+
export interface ListLimitResult<T> {
|
|
4
|
+
items: T[];
|
|
5
|
+
limitReached?: number;
|
|
6
|
+
meta: Partial<LimitsMeta>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface ListLimitOptions {
|
|
10
|
+
limit?: number;
|
|
11
|
+
headLimit?: number;
|
|
12
|
+
limitType?: "match" | "result";
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function applyListLimit<T>(items: T[], options: ListLimitOptions): ListLimitResult<T> {
|
|
16
|
+
const meta: Partial<LimitsMeta> = {};
|
|
17
|
+
const limitType = options.limitType ?? "result";
|
|
18
|
+
const effectiveLimit = options.limit !== undefined && options.limit > 0 ? options.limit : undefined;
|
|
19
|
+
const effectiveHeadLimit = options.headLimit !== undefined && options.headLimit > 0 ? options.headLimit : undefined;
|
|
20
|
+
let limited = items;
|
|
21
|
+
let limitReached: number | undefined;
|
|
22
|
+
|
|
23
|
+
if (effectiveLimit !== undefined && items.length >= effectiveLimit) {
|
|
24
|
+
limited = items.slice(0, effectiveLimit);
|
|
25
|
+
limitReached = effectiveLimit;
|
|
26
|
+
const suggestion = effectiveLimit * 2;
|
|
27
|
+
if (limitType === "match") {
|
|
28
|
+
meta.matchLimit = { reached: effectiveLimit, suggestion };
|
|
29
|
+
} else {
|
|
30
|
+
meta.resultLimit = { reached: effectiveLimit, suggestion };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (effectiveHeadLimit !== undefined && limited.length > effectiveHeadLimit) {
|
|
35
|
+
limited = limited.slice(0, effectiveHeadLimit);
|
|
36
|
+
meta.headLimit = { reached: effectiveHeadLimit, suggestion: effectiveHeadLimit * 2 };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return { items: limited, limitReached, meta };
|
|
40
|
+
}
|
|
@@ -3,9 +3,12 @@ import type { AgentTool, AgentToolResult } from "@oh-my-pi/pi-agent-core";
|
|
|
3
3
|
import { type Component, Text } from "@oh-my-pi/pi-tui";
|
|
4
4
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
|
-
import {
|
|
7
|
-
import type
|
|
6
|
+
import type { RenderResultOptions } from "$c/extensibility/custom-tools/types";
|
|
7
|
+
import { getLanguageFromPath, type Theme } from "$c/modes/theme/theme";
|
|
8
|
+
import type { OutputMeta } from "$c/tools/output-meta";
|
|
9
|
+
import { ToolError, throwIfAborted } from "$c/tools/tool-errors";
|
|
8
10
|
import type { ToolSession } from "./index";
|
|
11
|
+
import { applyListLimit } from "./list-limit";
|
|
9
12
|
import { resolveToCwd } from "./path-utils";
|
|
10
13
|
import {
|
|
11
14
|
formatAge,
|
|
@@ -19,7 +22,8 @@ import {
|
|
|
19
22
|
formatTruncationSuffix,
|
|
20
23
|
PREVIEW_LIMITS,
|
|
21
24
|
} from "./render-utils";
|
|
22
|
-
import {
|
|
25
|
+
import { toolResult } from "./tool-result";
|
|
26
|
+
import { type TruncationResult, truncateHead } from "./truncate";
|
|
23
27
|
|
|
24
28
|
const lsSchema = Type.Object({
|
|
25
29
|
path: Type.Optional(Type.String({ description: "Directory to list (default: current directory)" })),
|
|
@@ -46,11 +50,14 @@ export interface LsToolOptions {
|
|
|
46
50
|
|
|
47
51
|
export interface LsToolDetails {
|
|
48
52
|
entries?: string[];
|
|
53
|
+
/** Raw entry names (with / suffix for dirs) without age suffix, for icon detection */
|
|
54
|
+
rawEntries?: string[];
|
|
49
55
|
dirCount?: number;
|
|
50
56
|
fileCount?: number;
|
|
51
57
|
truncation?: TruncationResult;
|
|
52
58
|
truncationReasons?: Array<"entryLimit" | "byteLimit">;
|
|
53
59
|
entryLimitReached?: number;
|
|
60
|
+
meta?: OutputMeta;
|
|
54
61
|
}
|
|
55
62
|
|
|
56
63
|
/** Default operations using Bun APIs */
|
|
@@ -95,11 +102,11 @@ export class LsTool implements AgentTool<typeof lsSchema, LsToolDetails> {
|
|
|
95
102
|
// Check if path exists and is a directory
|
|
96
103
|
const dirStat = await this.ops.stat(dirPath);
|
|
97
104
|
if (!dirStat) {
|
|
98
|
-
throw new
|
|
105
|
+
throw new ToolError(`Path not found: ${dirPath}`);
|
|
99
106
|
}
|
|
100
107
|
|
|
101
108
|
if (!dirStat.isDirectory()) {
|
|
102
|
-
throw new
|
|
109
|
+
throw new ToolError(`Not a directory: ${dirPath}`);
|
|
103
110
|
}
|
|
104
111
|
|
|
105
112
|
// Read directory entries
|
|
@@ -108,25 +115,24 @@ export class LsTool implements AgentTool<typeof lsSchema, LsToolDetails> {
|
|
|
108
115
|
entries = await this.ops.readdir(dirPath);
|
|
109
116
|
} catch (error) {
|
|
110
117
|
const message = error instanceof Error ? error.message : String(error);
|
|
111
|
-
throw new
|
|
118
|
+
throw new ToolError(`Cannot read directory: ${message}`);
|
|
112
119
|
}
|
|
113
120
|
|
|
114
121
|
// Sort alphabetically (case-insensitive)
|
|
115
122
|
entries.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
|
|
116
123
|
|
|
124
|
+
const listLimit = applyListLimit(entries, { limit: effectiveLimit });
|
|
125
|
+
const limitedEntries = listLimit.items;
|
|
126
|
+
const limitMeta = listLimit.meta;
|
|
127
|
+
|
|
117
128
|
// Format entries with directory indicators
|
|
118
129
|
const results: string[] = [];
|
|
119
|
-
|
|
130
|
+
const rawResults: string[] = [];
|
|
120
131
|
let dirCount = 0;
|
|
121
132
|
let fileCount = 0;
|
|
122
133
|
|
|
123
|
-
for (const entry of
|
|
124
|
-
|
|
125
|
-
if (results.length >= effectiveLimit) {
|
|
126
|
-
entryLimitReached = true;
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
|
|
134
|
+
for (const entry of limitedEntries) {
|
|
135
|
+
throwIfAborted(signal);
|
|
130
136
|
const fullPath = nodePath.join(dirPath, entry);
|
|
131
137
|
let suffix = "";
|
|
132
138
|
let age = "";
|
|
@@ -150,6 +156,7 @@ export class LsTool implements AgentTool<typeof lsSchema, LsToolDetails> {
|
|
|
150
156
|
// Format: "name/ (2d ago)" or "name (just now)"
|
|
151
157
|
const line = age ? `${entry}${suffix} (${age})` : entry + suffix;
|
|
152
158
|
results.push(line);
|
|
159
|
+
rawResults.push(entry + suffix);
|
|
153
160
|
}
|
|
154
161
|
|
|
155
162
|
if (results.length === 0) {
|
|
@@ -160,25 +167,21 @@ export class LsTool implements AgentTool<typeof lsSchema, LsToolDetails> {
|
|
|
160
167
|
const rawOutput = results.join("\n");
|
|
161
168
|
const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
|
|
162
169
|
|
|
163
|
-
|
|
170
|
+
const output = truncation.content;
|
|
164
171
|
const details: LsToolDetails = {
|
|
165
172
|
entries: results,
|
|
173
|
+
rawEntries: rawResults,
|
|
166
174
|
dirCount,
|
|
167
175
|
fileCount,
|
|
168
176
|
};
|
|
169
177
|
const truncationReasons: Array<"entryLimit" | "byteLimit"> = [];
|
|
170
178
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if (entryLimitReached) {
|
|
175
|
-
notices.push(`${effectiveLimit} entries limit reached. Use limit=${effectiveLimit * 2} for more`);
|
|
176
|
-
details.entryLimitReached = effectiveLimit;
|
|
179
|
+
if (limitMeta.resultLimit) {
|
|
180
|
+
details.entryLimitReached = limitMeta.resultLimit.reached;
|
|
177
181
|
truncationReasons.push("entryLimit");
|
|
178
182
|
}
|
|
179
183
|
|
|
180
184
|
if (truncation.truncated) {
|
|
181
|
-
notices.push(`${formatSize(DEFAULT_MAX_BYTES)} limit reached`);
|
|
182
185
|
details.truncation = truncation;
|
|
183
186
|
truncationReasons.push("byteLimit");
|
|
184
187
|
}
|
|
@@ -187,14 +190,12 @@ export class LsTool implements AgentTool<typeof lsSchema, LsToolDetails> {
|
|
|
187
190
|
details.truncationReasons = truncationReasons;
|
|
188
191
|
}
|
|
189
192
|
|
|
190
|
-
|
|
191
|
-
|
|
193
|
+
const resultBuilder = toolResult(details).text(output).limits({ resultLimit: limitMeta.resultLimit?.reached });
|
|
194
|
+
if (truncation.truncated) {
|
|
195
|
+
resultBuilder.truncation(truncation, { direction: "head" });
|
|
192
196
|
}
|
|
193
197
|
|
|
194
|
-
return
|
|
195
|
-
content: [{ type: "text", text: output }],
|
|
196
|
-
details,
|
|
197
|
-
};
|
|
198
|
+
return resultBuilder.done();
|
|
198
199
|
});
|
|
199
200
|
}
|
|
200
201
|
}
|
|
@@ -243,9 +244,11 @@ export const lsToolRenderer = {
|
|
|
243
244
|
}
|
|
244
245
|
|
|
245
246
|
let entries: string[] = details?.entries ? [...details.entries] : [];
|
|
247
|
+
let rawEntries: string[] | undefined = details?.rawEntries;
|
|
246
248
|
if (entries.length === 0) {
|
|
247
249
|
const rawLines = textContent.split("\n").filter((l: string) => l.trim());
|
|
248
250
|
entries = rawLines.filter((line) => !/^\[.*\]$/.test(line.trim()));
|
|
251
|
+
rawEntries = undefined; // Can't reliably extract raw paths from text
|
|
249
252
|
}
|
|
250
253
|
|
|
251
254
|
if (entries.length === 0) {
|
|
@@ -266,7 +269,9 @@ export const lsToolRenderer = {
|
|
|
266
269
|
}
|
|
267
270
|
}
|
|
268
271
|
|
|
269
|
-
const
|
|
272
|
+
const truncation = details?.meta?.truncation;
|
|
273
|
+
const limits = details?.meta?.limits;
|
|
274
|
+
const truncated = Boolean(details?.entryLimitReached || truncation || limits?.resultLimit || limits?.headLimit);
|
|
270
275
|
const icon = truncated
|
|
271
276
|
? uiTheme.styledSymbol("status.warning", "warning")
|
|
272
277
|
: uiTheme.styledSymbol("status.success", "success");
|
|
@@ -281,21 +286,25 @@ export const lsToolRenderer = {
|
|
|
281
286
|
let text = ` ${icon} ${uiTheme.fg("dim", summaryText)}${formatTruncationSuffix(truncated, uiTheme)}${expandHint}`;
|
|
282
287
|
|
|
283
288
|
const truncationReasons: string[] = [];
|
|
284
|
-
if (
|
|
285
|
-
truncationReasons.push(`entry limit ${
|
|
289
|
+
if (limits?.resultLimit) {
|
|
290
|
+
truncationReasons.push(`entry limit ${limits.resultLimit.reached}`);
|
|
291
|
+
}
|
|
292
|
+
if (truncation) {
|
|
293
|
+
truncationReasons.push(`output cap ${formatBytes(truncation.outputBytes)}`);
|
|
286
294
|
}
|
|
287
|
-
if (
|
|
288
|
-
truncationReasons.push(`output
|
|
295
|
+
if (truncation?.artifactId) {
|
|
296
|
+
truncationReasons.push(`full output: artifact://${truncation.artifactId}`);
|
|
289
297
|
}
|
|
290
298
|
|
|
291
299
|
const hasTruncation = truncationReasons.length > 0;
|
|
292
300
|
|
|
293
301
|
for (let i = 0; i < maxEntries; i++) {
|
|
294
302
|
const entry = entries[i];
|
|
303
|
+
const rawEntry = rawEntries?.[i] ?? entry;
|
|
295
304
|
const isLast = i === maxEntries - 1 && !hasMoreEntries && !hasTruncation;
|
|
296
305
|
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
297
|
-
const isDir =
|
|
298
|
-
const entryPath = isDir ?
|
|
306
|
+
const isDir = rawEntry.endsWith("/");
|
|
307
|
+
const entryPath = isDir ? rawEntry.slice(0, -1) : rawEntry;
|
|
299
308
|
const lang = isDir ? undefined : getLanguageFromPath(entryPath);
|
|
300
309
|
const entryIcon = isDir
|
|
301
310
|
? uiTheme.fg("accent", uiTheme.icon.folder)
|
|
@@ -4,9 +4,9 @@ import type { Component } from "@oh-my-pi/pi-tui";
|
|
|
4
4
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
5
5
|
import { untilAborted } from "@oh-my-pi/pi-utils";
|
|
6
6
|
import { type Static, Type } from "@sinclair/typebox";
|
|
7
|
-
import type {
|
|
8
|
-
import type {
|
|
9
|
-
import type { ToolSession } from "
|
|
7
|
+
import type { RenderResultOptions } from "$c/extensibility/custom-tools/types";
|
|
8
|
+
import type { Theme } from "$c/modes/theme/theme";
|
|
9
|
+
import type { ToolSession } from "$c/sdk";
|
|
10
10
|
import { resolveToCwd } from "./path-utils";
|
|
11
11
|
import {
|
|
12
12
|
formatCount,
|