@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
package/src/utils/shell.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { access } from "node:fs/promises";
|
|
3
3
|
import { $ } from "bun";
|
|
4
|
-
import { SettingsManager } from "
|
|
4
|
+
import { SettingsManager } from "$c/config/settings-manager";
|
|
5
5
|
|
|
6
6
|
export interface ShellConfig {
|
|
7
7
|
shell: string;
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
import type { Api, Model } from "@oh-my-pi/pi-ai";
|
|
6
6
|
import { completeSimple } from "@oh-my-pi/pi-ai";
|
|
7
7
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
8
|
+
import type { ModelRegistry } from "$c/config/model-registry";
|
|
9
|
+
import { parseModelString, SMOL_MODEL_PRIORITY } from "$c/config/model-resolver";
|
|
10
|
+
import { renderPromptTemplate } from "$c/config/prompt-templates";
|
|
11
|
+
import titleSystemPrompt from "$c/prompts/system/title-system.md" with { type: "text" };
|
|
12
12
|
|
|
13
13
|
const TITLE_SYSTEM_PROMPT = renderPromptTemplate(titleSystemPrompt);
|
|
14
14
|
|
|
@@ -3,7 +3,7 @@ import { arch, platform } from "node:os";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { createTempDir, logger } from "@oh-my-pi/pi-utils";
|
|
5
5
|
import { $ } from "bun";
|
|
6
|
-
import { APP_NAME, getBinDir } from "
|
|
6
|
+
import { APP_NAME, getBinDir } from "$c/config";
|
|
7
7
|
|
|
8
8
|
const TOOLS_DIR = getBinDir();
|
|
9
9
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { parse as parseHtml } from "node-html-parser";
|
|
2
|
+
import { ToolAbortError } from "$c/tools/tool-errors";
|
|
2
3
|
import type { RenderResult, SpecialHandler } from "./types";
|
|
3
4
|
import { finalizeOutput, loadPage } from "./types";
|
|
4
5
|
|
|
@@ -73,12 +74,12 @@ export const handleTwitter: SpecialHandler = async (
|
|
|
73
74
|
}
|
|
74
75
|
} catch {
|
|
75
76
|
if (signal?.aborted) {
|
|
76
|
-
|
|
77
|
+
throw new ToolAbortError();
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
if (signal?.aborted) {
|
|
81
|
-
|
|
82
|
+
throw new ToolAbortError();
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
// X.com blocks all bots - return a helpful error instead of falling through
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Shared types and utilities for web-fetch handlers
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
import { ToolAbortError } from "$c/tools/tool-errors";
|
|
6
|
+
|
|
5
7
|
export interface RenderResult {
|
|
6
8
|
url: string;
|
|
7
9
|
finalUrl: string;
|
|
@@ -109,7 +111,7 @@ export async function loadPage(url: string, options: LoadPageOptions = {}): Prom
|
|
|
109
111
|
|
|
110
112
|
for (let attempt = 0; attempt < USER_AGENTS.length; attempt++) {
|
|
111
113
|
if (signal?.aborted) {
|
|
112
|
-
|
|
114
|
+
throw new ToolAbortError();
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
const userAgent = USER_AGENTS[attempt];
|
|
@@ -170,7 +172,7 @@ export async function loadPage(url: string, options: LoadPageOptions = {}): Prom
|
|
|
170
172
|
return { content, contentType, finalUrl, ok: true, status: response.status };
|
|
171
173
|
} catch {
|
|
172
174
|
if (signal?.aborted) {
|
|
173
|
-
|
|
175
|
+
throw new ToolAbortError();
|
|
174
176
|
}
|
|
175
177
|
if (attempt === USER_AGENTS.length - 1) {
|
|
176
178
|
return { content: "", contentType: "", finalUrl: url, ok: false };
|
|
@@ -3,7 +3,7 @@ import { tmpdir } from "node:os";
|
|
|
3
3
|
import * as path from "node:path";
|
|
4
4
|
import { ptree } from "@oh-my-pi/pi-utils";
|
|
5
5
|
import { nanoid } from "nanoid";
|
|
6
|
-
import { ensureTool } from "
|
|
6
|
+
import { ensureTool } from "$c/utils/tools-manager";
|
|
7
7
|
import { createRequestSignal } from "./types";
|
|
8
8
|
|
|
9
9
|
const MAX_BYTES = 50 * 1024 * 1024; // 50MB for binary files
|
|
@@ -3,7 +3,8 @@ import { tmpdir } from "node:os";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { cspawn } from "@oh-my-pi/pi-utils";
|
|
5
5
|
import { nanoid } from "nanoid";
|
|
6
|
-
import {
|
|
6
|
+
import { throwIfAborted } from "$c/tools/tool-errors";
|
|
7
|
+
import { ensureTool } from "$c/utils/tools-manager";
|
|
7
8
|
import type { RenderResult, SpecialHandler } from "./types";
|
|
8
9
|
import { finalizeOutput } from "./types";
|
|
9
10
|
|
|
@@ -139,13 +140,13 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
139
140
|
timeout: number,
|
|
140
141
|
signal?: AbortSignal,
|
|
141
142
|
): Promise<RenderResult | null> => {
|
|
142
|
-
|
|
143
|
+
throwIfAborted(signal);
|
|
143
144
|
const yt = parseYouTubeUrl(url);
|
|
144
145
|
if (!yt) return null;
|
|
145
146
|
|
|
146
147
|
// Ensure yt-dlp is available (auto-download if missing)
|
|
147
148
|
const ytdlp = await ensureTool("yt-dlp", true);
|
|
148
|
-
|
|
149
|
+
throwIfAborted(signal);
|
|
149
150
|
if (!ytdlp) {
|
|
150
151
|
return {
|
|
151
152
|
url,
|
|
@@ -164,7 +165,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
164
165
|
const videoUrl = `https://www.youtube.com/watch?v=${yt.videoId}`;
|
|
165
166
|
|
|
166
167
|
// Fetch video metadata
|
|
167
|
-
|
|
168
|
+
throwIfAborted(signal);
|
|
168
169
|
const metaResult = await exec(
|
|
169
170
|
ytdlp,
|
|
170
171
|
["--dump-json", "--no-warnings", "--no-playlist", "--skip-download", videoUrl],
|
|
@@ -173,7 +174,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
173
174
|
signal,
|
|
174
175
|
},
|
|
175
176
|
);
|
|
176
|
-
|
|
177
|
+
throwIfAborted(signal);
|
|
177
178
|
|
|
178
179
|
let title = "YouTube Video";
|
|
179
180
|
let channel = "";
|
|
@@ -213,7 +214,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
213
214
|
let transcriptSource = "";
|
|
214
215
|
|
|
215
216
|
// First, list available subtitles
|
|
216
|
-
|
|
217
|
+
throwIfAborted(signal);
|
|
217
218
|
const listResult = await exec(
|
|
218
219
|
ytdlp,
|
|
219
220
|
["--list-subs", "--no-warnings", "--no-playlist", "--skip-download", videoUrl],
|
|
@@ -222,7 +223,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
222
223
|
signal,
|
|
223
224
|
},
|
|
224
225
|
);
|
|
225
|
-
|
|
226
|
+
throwIfAborted(signal);
|
|
226
227
|
|
|
227
228
|
const hasManualSubs = listResult.stdout.includes("[info] Available subtitles");
|
|
228
229
|
const hasAutoSubs = listResult.stdout.includes("[info] Available automatic captions");
|
|
@@ -234,7 +235,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
234
235
|
try {
|
|
235
236
|
// Try manual subtitles first (English preferred)
|
|
236
237
|
if (hasManualSubs) {
|
|
237
|
-
|
|
238
|
+
throwIfAborted(signal);
|
|
238
239
|
const subResult = await exec(
|
|
239
240
|
ytdlp,
|
|
240
241
|
[
|
|
@@ -255,10 +256,10 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
255
256
|
|
|
256
257
|
if (subResult.ok) {
|
|
257
258
|
// Find the downloaded subtitle file using glob
|
|
258
|
-
|
|
259
|
+
throwIfAborted(signal);
|
|
259
260
|
const subFiles = await Array.fromAsync(new Bun.Glob(`${tmpBase}*.vtt`).scan({ absolute: true }));
|
|
260
261
|
if (subFiles.length > 0) {
|
|
261
|
-
|
|
262
|
+
throwIfAborted(signal);
|
|
262
263
|
const vttContent = await Bun.file(subFiles[0]).text();
|
|
263
264
|
transcript = cleanVttToText(vttContent);
|
|
264
265
|
transcriptSource = "manual";
|
|
@@ -269,7 +270,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
269
270
|
|
|
270
271
|
// Fall back to auto-generated captions
|
|
271
272
|
if (!transcript && hasAutoSubs) {
|
|
272
|
-
|
|
273
|
+
throwIfAborted(signal);
|
|
273
274
|
const autoResult = await exec(
|
|
274
275
|
ytdlp,
|
|
275
276
|
[
|
|
@@ -289,10 +290,10 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
289
290
|
);
|
|
290
291
|
|
|
291
292
|
if (autoResult.ok) {
|
|
292
|
-
|
|
293
|
+
throwIfAborted(signal);
|
|
293
294
|
const subFiles = await Array.fromAsync(new Bun.Glob(`${tmpBase}*.vtt`).scan({ absolute: true }));
|
|
294
295
|
if (subFiles.length > 0) {
|
|
295
|
-
|
|
296
|
+
throwIfAborted(signal);
|
|
296
297
|
const vttContent = await Bun.file(subFiles[0]).text();
|
|
297
298
|
transcript = cleanVttToText(vttContent);
|
|
298
299
|
transcriptSource = "auto-generated";
|
|
@@ -12,10 +12,10 @@ import * as os from "node:os";
|
|
|
12
12
|
import * as path from "node:path";
|
|
13
13
|
import { buildAnthropicHeaders as buildProviderAnthropicHeaders } from "@oh-my-pi/pi-ai";
|
|
14
14
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
15
|
-
import { getAgentDbPath, getConfigDirPaths } from "
|
|
16
|
-
import { AgentStorage } from "
|
|
17
|
-
import type { AuthCredential, AuthCredentialEntry, AuthStorageData } from "
|
|
18
|
-
import { migrateJsonStorage } from "
|
|
15
|
+
import { getAgentDbPath, getConfigDirPaths } from "$c/config";
|
|
16
|
+
import { AgentStorage } from "$c/session/agent-storage";
|
|
17
|
+
import type { AuthCredential, AuthCredentialEntry, AuthStorageData } from "$c/session/auth-storage";
|
|
18
|
+
import { migrateJsonStorage } from "$c/session/storage-migration";
|
|
19
19
|
import type { AnthropicAuthConfig, AnthropicOAuthCredential, ModelsJson } from "./types";
|
|
20
20
|
|
|
21
21
|
const DEFAULT_BASE_URL = "https://api.anthropic.com";
|
|
@@ -15,15 +15,16 @@
|
|
|
15
15
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
16
16
|
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
17
17
|
import { Type } from "@sinclair/typebox";
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import
|
|
25
|
-
import
|
|
26
|
-
import {
|
|
18
|
+
import { renderPromptTemplate } from "$c/config/prompt-templates";
|
|
19
|
+
import { callExaTool, findApiKey as findExaKey, formatSearchResults, isSearchResponse } from "$c/exa/mcp-client";
|
|
20
|
+
import { renderExaCall, renderExaResult } from "$c/exa/render";
|
|
21
|
+
import type { ExaRenderDetails } from "$c/exa/types";
|
|
22
|
+
import type { CustomTool, CustomToolContext, RenderResultOptions } from "$c/extensibility/custom-tools/types";
|
|
23
|
+
import type { Theme } from "$c/modes/theme/theme";
|
|
24
|
+
import webSearchSystemPrompt from "$c/prompts/system/web-search.md" with { type: "text" };
|
|
25
|
+
import webSearchDescription from "$c/prompts/tools/web-search.md" with { type: "text" };
|
|
26
|
+
import type { ToolSession } from "$c/tools/index";
|
|
27
|
+
import { formatAge } from "$c/tools/render-utils";
|
|
27
28
|
import { findAnthropicAuth } from "./auth";
|
|
28
29
|
import { searchAnthropic } from "./providers/anthropic";
|
|
29
30
|
import { searchExa } from "./providers/exa";
|
|
@@ -34,70 +35,25 @@ import { WebSearchProviderError } from "./types";
|
|
|
34
35
|
|
|
35
36
|
/** Web search parameters schema */
|
|
36
37
|
export const webSearchSchema = Type.Object({
|
|
37
|
-
// Common
|
|
38
38
|
query: Type.String({ description: "Search query" }),
|
|
39
39
|
provider: Type.Optional(
|
|
40
40
|
StringEnum(["auto", "exa", "anthropic", "perplexity"], {
|
|
41
|
-
description: "Search provider (
|
|
41
|
+
description: "Search provider (default: auto)",
|
|
42
42
|
}),
|
|
43
43
|
),
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// Common (Anthropic & Perplexity)
|
|
47
|
-
system_prompt: Type.Optional(
|
|
48
|
-
Type.String({
|
|
49
|
-
description: "System prompt to guide response style",
|
|
50
|
-
}),
|
|
51
|
-
),
|
|
52
|
-
max_tokens: Type.Optional(
|
|
53
|
-
Type.Number({
|
|
54
|
-
description: "Maximum tokens in response, 1-16384, default 4096 (Anthropic only)",
|
|
55
|
-
minimum: 1,
|
|
56
|
-
maximum: 16384,
|
|
57
|
-
}),
|
|
58
|
-
),
|
|
59
|
-
|
|
60
|
-
// Perplexity-specific
|
|
61
|
-
model: Type.Optional(
|
|
62
|
-
StringEnum(["sonar", "sonar-pro"], {
|
|
63
|
-
description: "Perplexity model - sonar (fast) or sonar-pro (comprehensive research)",
|
|
64
|
-
}),
|
|
65
|
-
),
|
|
66
|
-
search_recency_filter: Type.Optional(
|
|
44
|
+
recency: Type.Optional(
|
|
67
45
|
StringEnum(["day", "week", "month", "year"], {
|
|
68
|
-
description: "
|
|
69
|
-
}),
|
|
70
|
-
),
|
|
71
|
-
search_domain_filter: Type.Optional(
|
|
72
|
-
Type.Array(Type.String(), {
|
|
73
|
-
description: "Domain filter - include domains, prefix with - to exclude (Perplexity only)",
|
|
74
|
-
}),
|
|
75
|
-
),
|
|
76
|
-
search_context_size: Type.Optional(
|
|
77
|
-
StringEnum(["low", "medium", "high"], {
|
|
78
|
-
description: "Context size for cost control (Perplexity only)",
|
|
79
|
-
}),
|
|
80
|
-
),
|
|
81
|
-
return_related_questions: Type.Optional(
|
|
82
|
-
Type.Boolean({
|
|
83
|
-
description: "Include follow-up question suggestions, default true (Perplexity only)",
|
|
46
|
+
description: "Recency filter (Perplexity)",
|
|
84
47
|
}),
|
|
85
48
|
),
|
|
49
|
+
limit: Type.Optional(Type.Number({ description: "Max results to return" })),
|
|
86
50
|
});
|
|
87
51
|
|
|
88
52
|
export type WebSearchParams = {
|
|
89
53
|
query: string;
|
|
90
54
|
provider?: "auto" | "exa" | "anthropic" | "perplexity";
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
system_prompt?: string;
|
|
94
|
-
max_tokens?: number;
|
|
95
|
-
// Perplexity
|
|
96
|
-
model?: "sonar" | "sonar-pro";
|
|
97
|
-
search_recency_filter?: "day" | "week" | "month" | "year";
|
|
98
|
-
search_domain_filter?: string[];
|
|
99
|
-
search_context_size?: "low" | "medium" | "high";
|
|
100
|
-
return_related_questions?: boolean;
|
|
55
|
+
recency?: "day" | "week" | "month" | "year";
|
|
56
|
+
limit?: number;
|
|
101
57
|
};
|
|
102
58
|
|
|
103
59
|
/** Preferred provider set via settings (default: auto) */
|
|
@@ -284,25 +240,20 @@ async function executeWebSearch(
|
|
|
284
240
|
if (provider === "exa") {
|
|
285
241
|
response = await searchExa({
|
|
286
242
|
query: params.query,
|
|
287
|
-
num_results: params.
|
|
243
|
+
num_results: params.limit,
|
|
288
244
|
});
|
|
289
245
|
} else if (provider === "anthropic") {
|
|
290
246
|
response = await searchAnthropic({
|
|
291
247
|
query: params.query,
|
|
292
|
-
system_prompt:
|
|
293
|
-
|
|
294
|
-
num_results: params.num_results,
|
|
248
|
+
system_prompt: webSearchSystemPrompt,
|
|
249
|
+
num_results: params.limit,
|
|
295
250
|
});
|
|
296
251
|
} else {
|
|
297
252
|
response = await searchPerplexity({
|
|
298
253
|
query: params.query,
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
search_domain_filter: params.search_domain_filter,
|
|
303
|
-
search_context_size: params.search_context_size,
|
|
304
|
-
return_related_questions: params.return_related_questions,
|
|
305
|
-
num_results: params.num_results,
|
|
254
|
+
system_prompt: webSearchSystemPrompt,
|
|
255
|
+
search_recency_filter: params.recency,
|
|
256
|
+
num_results: params.limit,
|
|
306
257
|
});
|
|
307
258
|
}
|
|
308
259
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { applyClaudeToolPrefix, buildAnthropicSystemBlocks, stripClaudeToolPrefix } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import { buildAnthropicHeaders, buildAnthropicUrl, findAnthropicAuth, getEnv } from "
|
|
9
|
+
import { buildAnthropicHeaders, buildAnthropicUrl, findAnthropicAuth, getEnv } from "$c/web/search/auth";
|
|
10
10
|
import type {
|
|
11
11
|
AnthropicApiResponse,
|
|
12
12
|
AnthropicAuthConfig,
|
|
@@ -14,8 +14,8 @@ import type {
|
|
|
14
14
|
WebSearchCitation,
|
|
15
15
|
WebSearchResponse,
|
|
16
16
|
WebSearchSource,
|
|
17
|
-
} from "
|
|
18
|
-
import { WebSearchProviderError } from "
|
|
17
|
+
} from "$c/web/search/types";
|
|
18
|
+
import { WebSearchProviderError } from "$c/web/search/types";
|
|
19
19
|
|
|
20
20
|
const DEFAULT_MODEL = "claude-haiku-4-5";
|
|
21
21
|
const DEFAULT_MAX_TOKENS = 4096;
|
|
@@ -35,7 +35,6 @@ const applySearchToolPrefix = (name: string, isOAuth: boolean): string => {
|
|
|
35
35
|
export interface AnthropicSearchParams {
|
|
36
36
|
query: string;
|
|
37
37
|
system_prompt?: string;
|
|
38
|
-
max_tokens?: number;
|
|
39
38
|
num_results?: number;
|
|
40
39
|
}
|
|
41
40
|
|
|
@@ -51,7 +50,7 @@ async function getModel(): Promise<string> {
|
|
|
51
50
|
* Builds system instruction blocks for the Anthropic API request.
|
|
52
51
|
* @param auth - Authentication configuration
|
|
53
52
|
* @param model - Model identifier (affects whether Claude Code instruction is included)
|
|
54
|
-
* @param systemPrompt - Optional
|
|
53
|
+
* @param systemPrompt - Optional system prompt for guiding response style
|
|
55
54
|
* @returns Array of system blocks for the API request
|
|
56
55
|
*/
|
|
57
56
|
function buildSystemBlocks(
|
|
@@ -73,8 +72,7 @@ function buildSystemBlocks(
|
|
|
73
72
|
* @param auth - Authentication configuration (API key or OAuth)
|
|
74
73
|
* @param model - Model identifier to use
|
|
75
74
|
* @param query - Search query from the user
|
|
76
|
-
* @param systemPrompt - Optional
|
|
77
|
-
* @param maxTokens - Maximum tokens for the response
|
|
75
|
+
* @param systemPrompt - Optional system prompt for guiding response style
|
|
78
76
|
* @returns Raw API response from Anthropic
|
|
79
77
|
* @throws {WebSearchProviderError} If the API request fails
|
|
80
78
|
*/
|
|
@@ -83,7 +81,6 @@ async function callWebSearch(
|
|
|
83
81
|
model: string,
|
|
84
82
|
query: string,
|
|
85
83
|
systemPrompt?: string,
|
|
86
|
-
maxTokens?: number,
|
|
87
84
|
): Promise<AnthropicApiResponse> {
|
|
88
85
|
const url = buildAnthropicUrl(auth);
|
|
89
86
|
const headers = buildAnthropicHeaders(auth);
|
|
@@ -92,7 +89,7 @@ async function callWebSearch(
|
|
|
92
89
|
|
|
93
90
|
const body: Record<string, unknown> = {
|
|
94
91
|
model,
|
|
95
|
-
max_tokens:
|
|
92
|
+
max_tokens: DEFAULT_MAX_TOKENS,
|
|
96
93
|
messages: [{ role: "user", content: query }],
|
|
97
94
|
tools: [
|
|
98
95
|
{
|
|
@@ -240,7 +237,7 @@ export async function searchAnthropic(params: AnthropicSearchParams): Promise<We
|
|
|
240
237
|
}
|
|
241
238
|
|
|
242
239
|
const model = await getModel();
|
|
243
|
-
const response = await callWebSearch(auth, model, params.query, params.system_prompt
|
|
240
|
+
const response = await callWebSearch(auth, model, params.query, params.system_prompt);
|
|
244
241
|
|
|
245
242
|
const result = parseResponse(response);
|
|
246
243
|
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
|
|
8
8
|
import { existsSync, readFileSync } from "node:fs";
|
|
9
9
|
import { homedir } from "node:os";
|
|
10
|
-
import type { WebSearchResponse, WebSearchSource } from "
|
|
11
|
-
import { WebSearchProviderError } from "
|
|
10
|
+
import type { WebSearchResponse, WebSearchSource } from "$c/web/search/types";
|
|
11
|
+
import { WebSearchProviderError } from "$c/web/search/types";
|
|
12
12
|
|
|
13
13
|
const EXA_API_URL = "https://api.exa.ai/search";
|
|
14
14
|
|
|
@@ -12,19 +12,15 @@ import type {
|
|
|
12
12
|
WebSearchCitation,
|
|
13
13
|
WebSearchResponse,
|
|
14
14
|
WebSearchSource,
|
|
15
|
-
} from "
|
|
16
|
-
import { WebSearchProviderError } from "
|
|
15
|
+
} from "$c/web/search/types";
|
|
16
|
+
import { WebSearchProviderError } from "$c/web/search/types";
|
|
17
17
|
|
|
18
18
|
const PERPLEXITY_API_URL = "https://api.perplexity.ai/chat/completions";
|
|
19
19
|
|
|
20
20
|
export interface PerplexitySearchParams {
|
|
21
21
|
query: string;
|
|
22
|
-
model?: "sonar" | "sonar-pro";
|
|
23
22
|
system_prompt?: string;
|
|
24
23
|
search_recency_filter?: "day" | "week" | "month" | "year";
|
|
25
|
-
search_domain_filter?: string[];
|
|
26
|
-
search_context_size?: "low" | "medium" | "high";
|
|
27
|
-
return_related_questions?: boolean;
|
|
28
24
|
num_results?: number;
|
|
29
25
|
}
|
|
30
26
|
|
|
@@ -171,22 +167,14 @@ export async function searchPerplexity(params: PerplexitySearchParams): Promise<
|
|
|
171
167
|
messages.push({ role: "user", content: params.query });
|
|
172
168
|
|
|
173
169
|
const request: PerplexityRequest = {
|
|
174
|
-
model:
|
|
170
|
+
model: "sonar",
|
|
175
171
|
messages,
|
|
176
|
-
|
|
177
|
-
return_related_questions: params.return_related_questions ?? true,
|
|
172
|
+
return_related_questions: true,
|
|
178
173
|
};
|
|
179
174
|
|
|
180
|
-
// Add optional parameters
|
|
181
175
|
if (params.search_recency_filter) {
|
|
182
176
|
request.search_recency_filter = params.search_recency_filter;
|
|
183
177
|
}
|
|
184
|
-
if (params.search_domain_filter && params.search_domain_filter.length > 0) {
|
|
185
|
-
request.search_domain_filter = params.search_domain_filter;
|
|
186
|
-
}
|
|
187
|
-
if (params.search_context_size) {
|
|
188
|
-
request.search_context_size = params.search_context_size;
|
|
189
|
-
}
|
|
190
178
|
|
|
191
179
|
const response = await callPerplexity(apiKey, request);
|
|
192
180
|
const result = parseResponse(response);
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
8
8
|
import { Text } from "@oh-my-pi/pi-tui";
|
|
9
|
-
import type {
|
|
10
|
-
import type {
|
|
9
|
+
import type { RenderResultOptions } from "$c/extensibility/custom-tools/types";
|
|
10
|
+
import type { Theme } from "$c/modes/theme/theme";
|
|
11
11
|
import {
|
|
12
12
|
formatAge,
|
|
13
13
|
formatCount,
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
PREVIEW_LIMITS,
|
|
20
20
|
TRUNCATE_LENGTHS,
|
|
21
21
|
truncate,
|
|
22
|
-
} from "
|
|
22
|
+
} from "$c/tools/render-utils";
|
|
23
23
|
import type { WebSearchResponse } from "./types";
|
|
24
24
|
|
|
25
25
|
const MAX_COLLAPSED_ANSWER_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
#
|
|
3
|
-
# Migrate sessions from ~/.omp/agent/*.jsonl to proper session directories.
|
|
4
|
-
# This fixes sessions created by the bug in v0.30.0 where sessions were
|
|
5
|
-
# saved to ~/.omp/agent/ instead of ~/.omp/agent/sessions/<encoded-cwd>/.
|
|
6
|
-
#
|
|
7
|
-
# Usage: ./migrate-sessions.sh [--dry-run]
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
set -e
|
|
11
|
-
|
|
12
|
-
AGENT_DIR="${OMP_AGENT_DIR:-$HOME/.omp/agent}"
|
|
13
|
-
DRY_RUN=false
|
|
14
|
-
|
|
15
|
-
if [[ "$1" == "--dry-run" ]]; then
|
|
16
|
-
DRY_RUN=true
|
|
17
|
-
echo "Dry run mode - no files will be moved"
|
|
18
|
-
echo
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
# Find all .jsonl files directly in agent dir (not in subdirectories)
|
|
22
|
-
shopt -s nullglob
|
|
23
|
-
files=("$AGENT_DIR"/*.jsonl)
|
|
24
|
-
shopt -u nullglob
|
|
25
|
-
|
|
26
|
-
if [[ ${#files[@]} -eq 0 ]]; then
|
|
27
|
-
echo "No session files found in $AGENT_DIR"
|
|
28
|
-
exit 0
|
|
29
|
-
fi
|
|
30
|
-
|
|
31
|
-
echo "Found ${#files[@]} session file(s) to migrate"
|
|
32
|
-
echo
|
|
33
|
-
|
|
34
|
-
migrated=0
|
|
35
|
-
failed=0
|
|
36
|
-
|
|
37
|
-
for file in "${files[@]}"; do
|
|
38
|
-
filename=$(basename "$file")
|
|
39
|
-
|
|
40
|
-
# Read first line and extract cwd using jq
|
|
41
|
-
if ! first_line=$(head -1 "$file" 2>/dev/null); then
|
|
42
|
-
echo "SKIP: $filename - cannot read file"
|
|
43
|
-
((failed++))
|
|
44
|
-
continue
|
|
45
|
-
fi
|
|
46
|
-
|
|
47
|
-
# Parse JSON and extract cwd
|
|
48
|
-
if ! cwd=$(echo "$first_line" | jq -r '.cwd // empty' 2>/dev/null); then
|
|
49
|
-
echo "SKIP: $filename - invalid JSON"
|
|
50
|
-
((failed++))
|
|
51
|
-
continue
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
if [[ -z "$cwd" ]]; then
|
|
55
|
-
echo "SKIP: $filename - no cwd in session header"
|
|
56
|
-
((failed++))
|
|
57
|
-
continue
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
# Encode cwd: remove leading slash, replace slashes with dashes, wrap with --
|
|
61
|
-
encoded=$(echo "$cwd" | sed 's|^/||' | sed 's|[/:\\]|-|g')
|
|
62
|
-
encoded="--${encoded}--"
|
|
63
|
-
|
|
64
|
-
target_dir="$AGENT_DIR/sessions/$encoded"
|
|
65
|
-
target_file="$target_dir/$filename"
|
|
66
|
-
|
|
67
|
-
if [[ -e "$target_file" ]]; then
|
|
68
|
-
echo "SKIP: $filename - target already exists"
|
|
69
|
-
((failed++))
|
|
70
|
-
continue
|
|
71
|
-
fi
|
|
72
|
-
|
|
73
|
-
echo "MIGRATE: $filename"
|
|
74
|
-
echo " cwd: $cwd"
|
|
75
|
-
echo " to: $target_dir/"
|
|
76
|
-
|
|
77
|
-
if [[ "$DRY_RUN" == false ]]; then
|
|
78
|
-
mkdir -p "$target_dir"
|
|
79
|
-
mv "$file" "$target_file"
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
((migrated++))
|
|
83
|
-
echo
|
|
84
|
-
done
|
|
85
|
-
|
|
86
|
-
echo "---"
|
|
87
|
-
echo "Migrated: $migrated"
|
|
88
|
-
echo "Skipped: $failed"
|
|
89
|
-
|
|
90
|
-
if [[ "$DRY_RUN" == true && $migrated -gt 0 ]]; then
|
|
91
|
-
echo
|
|
92
|
-
echo "Run without --dry-run to perform the migration"
|
|
93
|
-
fi
|
package/src/core/index.ts
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core modules shared between all run modes.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
AgentSession,
|
|
7
|
-
type AgentSessionConfig,
|
|
8
|
-
type AgentSessionEvent,
|
|
9
|
-
type AgentSessionEventListener,
|
|
10
|
-
type ModelCycleResult,
|
|
11
|
-
type PromptOptions,
|
|
12
|
-
type SessionStats,
|
|
13
|
-
} from "./agent-session";
|
|
14
|
-
export { type BashExecutorOptions, type BashResult, executeBash } from "./bash-executor";
|
|
15
|
-
export type { CompactionResult } from "./compaction/index";
|
|
16
|
-
export {
|
|
17
|
-
discoverAndLoadExtensions,
|
|
18
|
-
type ExtensionAPI,
|
|
19
|
-
type ExtensionCommandContext,
|
|
20
|
-
type ExtensionContext,
|
|
21
|
-
type ExtensionFactory,
|
|
22
|
-
ExtensionRunner,
|
|
23
|
-
type ExtensionUIContext,
|
|
24
|
-
type ExtensionUIDialogOptions,
|
|
25
|
-
loadExtensionFromFactory,
|
|
26
|
-
type ToolDefinition,
|
|
27
|
-
} from "./extensions/index";
|
|
28
|
-
export { HistoryStorage } from "./history-storage";
|
|
29
|
-
export {
|
|
30
|
-
createMCPManager,
|
|
31
|
-
discoverAndLoadMCPTools,
|
|
32
|
-
loadAllMCPConfigs,
|
|
33
|
-
type MCPConfigFile,
|
|
34
|
-
type MCPLoadResult,
|
|
35
|
-
MCPManager,
|
|
36
|
-
type MCPServerConfig,
|
|
37
|
-
type MCPServerConnection,
|
|
38
|
-
MCPToolCache,
|
|
39
|
-
type MCPToolDefinition,
|
|
40
|
-
type MCPToolDetails,
|
|
41
|
-
type MCPToolsLoadResult,
|
|
42
|
-
type MCPTransport,
|
|
43
|
-
} from "./mcp/index";
|
|
44
|
-
export {
|
|
45
|
-
buildRemoteCommand,
|
|
46
|
-
closeAllConnections,
|
|
47
|
-
closeConnection,
|
|
48
|
-
ensureConnection,
|
|
49
|
-
getControlDir,
|
|
50
|
-
getControlPathTemplate,
|
|
51
|
-
type SSHConnectionTarget,
|
|
52
|
-
} from "./ssh/connection-manager";
|
|
53
|
-
export { executeSSH, type SSHExecutorOptions, type SSHResult } from "./ssh/ssh-executor";
|
|
54
|
-
export { hasSshfs, isMounted, mountRemote, unmountAll, unmountRemote } from "./ssh/sshfs-mount";
|
|
55
|
-
|
|
56
|
-
export * as utils from "./utils";
|