@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +51 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +2 -3
- package/src/capability/extension-module.ts +2 -3
- package/src/capability/extension.ts +2 -3
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +2 -3
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +2 -3
- package/src/capability/mcp.ts +2 -3
- package/src/capability/prompt.ts +2 -3
- package/src/capability/rule.ts +2 -3
- package/src/capability/settings.ts +1 -2
- package/src/capability/skill.ts +2 -3
- package/src/capability/slash-command.ts +2 -3
- package/src/capability/ssh.ts +2 -3
- package/src/capability/system-prompt.ts +2 -3
- package/src/capability/tool.ts +2 -3
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -21
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +21 -23
- package/src/commit/agentic/fallback.ts +9 -9
- package/src/commit/agentic/index.ts +30 -38
- package/src/commit/agentic/state.ts +1 -6
- package/src/commit/agentic/tools/analyze-file.ts +15 -15
- package/src/commit/agentic/tools/git-file-diff.ts +3 -3
- package/src/commit/agentic/tools/git-hunk.ts +7 -7
- package/src/commit/agentic/tools/git-overview.ts +5 -5
- package/src/commit/agentic/tools/index.ts +14 -14
- package/src/commit/agentic/tools/propose-changelog.ts +6 -6
- package/src/commit/agentic/tools/propose-commit.ts +8 -8
- package/src/commit/agentic/tools/recent-commits.ts +2 -2
- package/src/commit/agentic/tools/split-commit.ts +19 -23
- package/src/commit/agentic/topo-sort.ts +1 -1
- package/src/commit/agentic/trivial.ts +3 -3
- package/src/commit/agentic/validation.ts +12 -12
- package/src/commit/analysis/conventional.ts +7 -11
- package/src/commit/analysis/index.ts +4 -4
- package/src/commit/analysis/scope.ts +4 -4
- package/src/commit/analysis/summary.ts +7 -9
- package/src/commit/analysis/validation.ts +1 -1
- package/src/commit/changelog/detect.ts +6 -6
- package/src/commit/changelog/generate.ts +7 -9
- package/src/commit/changelog/index.ts +13 -13
- package/src/commit/changelog/parse.ts +2 -2
- package/src/commit/cli.ts +1 -1
- package/src/commit/git/diff.ts +3 -3
- package/src/commit/git/index.ts +19 -24
- package/src/commit/index.ts +1 -1
- package/src/commit/map-reduce/index.ts +9 -9
- package/src/commit/map-reduce/map-phase.ts +19 -34
- package/src/commit/map-reduce/reduce-phase.ts +9 -11
- package/src/commit/message.ts +2 -2
- package/src/commit/model-selection.ts +3 -7
- package/src/commit/pipeline.ts +20 -22
- package/src/commit/utils/exclusions.ts +3 -3
- package/src/config/file-lock.ts +17 -7
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +55 -37
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +50 -34
- package/src/config.ts +60 -62
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +16 -18
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +17 -14
- package/src/extensibility/custom-commands/types.ts +1 -2
- package/src/extensibility/custom-tools/loader.ts +10 -11
- package/src/extensibility/custom-tools/types.ts +6 -7
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +75 -53
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +19 -26
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +8 -9
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +10 -17
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +46 -46
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +14 -10
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +10 -16
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +55 -34
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +3 -4
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +60 -49
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +6 -6
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +11 -16
- package/src/modes/components/tree-selector.ts +11 -11
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +27 -29
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -25
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +2 -2
- package/src/modes/theme/theme.ts +128 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +10 -11
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +12 -13
- package/src/sdk.ts +60 -63
- package/src/session/agent-session.ts +83 -84
- package/src/session/agent-storage.ts +11 -11
- package/src/session/artifacts.ts +8 -9
- package/src/session/auth-storage.ts +25 -29
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +2 -3
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +27 -34
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +33 -36
- package/src/task/output-manager.ts +3 -4
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +19 -20
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +32 -38
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +8 -9
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +19 -18
- package/src/tools/calculator.ts +12 -12
- package/src/tools/complete.ts +3 -4
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +23 -26
- package/src/tools/find.ts +15 -16
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +27 -27
- package/src/tools/index.ts +78 -56
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +7 -7
- package/src/tools/notebook.ts +5 -5
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +1 -1
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +36 -37
- package/src/tools/read.ts +23 -23
- package/src/tools/render-utils.ts +8 -9
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +31 -30
- package/src/tools/todo-write.ts +13 -13
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +11 -16
- package/src/tui/code-cell.ts +3 -9
- package/src/tui/file-list.ts +3 -4
- package/src/tui/output-block.ts +1 -2
- package/src/tui/status-line.ts +2 -3
- package/src/tui/tree-list.ts +2 -3
- package/src/tui/types.ts +1 -2
- package/src/tui/utils.ts +2 -3
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +4 -9
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +16 -18
- package/scripts/generate-wasm-b64.ts +0 -24
- package/src/commit/map-reduce/.map-phase.ts.kate-swp +0 -0
- package/src/task/.executor.ts.kate-swp +0 -0
- package/src/vendor/photon/photon_rs_bg.wasm.b64.js +0 -1
package/src/web/scrapers/osv.ts
CHANGED
|
@@ -103,9 +103,9 @@ export const handleOsv: SpecialHandler = async (
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
// Severity
|
|
106
|
-
const severities = vuln.severity || vuln.affected?.flatMap(
|
|
106
|
+
const severities = vuln.severity || vuln.affected?.flatMap(a => a.severity || []) || [];
|
|
107
107
|
if (severities.length) {
|
|
108
|
-
const formatted = severities.map(
|
|
108
|
+
const formatted = severities.map(s => `${s.type}: ${s.score}`).join(", ");
|
|
109
109
|
md += `**Severity:** ${formatted}\n`;
|
|
110
110
|
}
|
|
111
111
|
md += "\n";
|
|
@@ -121,7 +121,7 @@ export const handlePackagist: SpecialHandler = async (
|
|
|
121
121
|
|
|
122
122
|
// Maintainers
|
|
123
123
|
if (pkg.maintainers?.length) {
|
|
124
|
-
md += `**Maintainers:** ${pkg.maintainers.map(
|
|
124
|
+
md += `**Maintainers:** ${pkg.maintainers.map(m => m.name).join(", ")}\n`;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
// Links
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PubMed handler for web-fetch
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { RenderResult, SpecialHandler } from "./types";
|
|
6
5
|
import { finalizeOutput, loadPage } from "./types";
|
|
7
6
|
|
|
@@ -100,7 +99,7 @@ export const handlePubMed: SpecialHandler = async (
|
|
|
100
99
|
|
|
101
100
|
// Authors
|
|
102
101
|
if (article.authors && article.authors.length > 0) {
|
|
103
|
-
const authorNames = article.authors.map(
|
|
102
|
+
const authorNames = article.authors.map(a => a.name).join(", ");
|
|
104
103
|
md += `**Authors:** ${authorNames}\n`;
|
|
105
104
|
}
|
|
106
105
|
|
package/src/web/scrapers/rawg.ts
CHANGED
|
@@ -58,10 +58,10 @@ export const handleRawg: SpecialHandler = async (
|
|
|
58
58
|
md += `**Rating:** ${game.rating.toFixed(2)} / 5\n`;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
const platforms = collectNames(game.platforms?.map(
|
|
61
|
+
const platforms = collectNames(game.platforms?.map(entry => entry.platform?.name));
|
|
62
62
|
if (platforms.length) md += `**Platforms:** ${platforms.join(", ")}\n`;
|
|
63
63
|
|
|
64
|
-
const genres = collectNames(game.genres?.map(
|
|
64
|
+
const genres = collectNames(game.genres?.map(entry => entry.name));
|
|
65
65
|
if (genres.length) md += `**Genres:** ${genres.join(", ")}\n`;
|
|
66
66
|
|
|
67
67
|
md += `**RAWG:** https://rawg.io/games/${encodeURIComponent(slug)}\n`;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Read the Docs handler for web-fetch
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import { parse as parseHtml } from "node-html-parser";
|
|
6
5
|
import type { RenderResult, SpecialHandler } from "./types";
|
|
7
6
|
import { finalizeOutput, htmlToBasicMarkdown, loadPage } from "./types";
|
|
@@ -62,7 +61,7 @@ export const handleReadTheDocs: SpecialHandler = async (
|
|
|
62
61
|
?.querySelectorAll(
|
|
63
62
|
".headerlink, .viewcode-link, nav, .sidebar, footer, .related, .sphinxsidebar, .toctree-wrapper",
|
|
64
63
|
)
|
|
65
|
-
.forEach(
|
|
64
|
+
.forEach(el => {
|
|
66
65
|
el.remove();
|
|
67
66
|
});
|
|
68
67
|
|
|
@@ -95,7 +95,7 @@ function prettifyRepo(repo: string): string {
|
|
|
95
95
|
// Fallback: titlecase with underscores replaced
|
|
96
96
|
return repo
|
|
97
97
|
.split("_")
|
|
98
|
-
.map(
|
|
98
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
99
99
|
.join(" ");
|
|
100
100
|
}
|
|
101
101
|
|
|
@@ -157,7 +157,7 @@ export const handleRepology: SpecialHandler = async (
|
|
|
157
157
|
|
|
158
158
|
// If no newest found, find the highest version
|
|
159
159
|
if (newestVersions.size === 0) {
|
|
160
|
-
const versions = packages.map(
|
|
160
|
+
const versions = packages.map(p => p.version);
|
|
161
161
|
if (versions.length > 0) newestVersions.add(versions[0]);
|
|
162
162
|
}
|
|
163
163
|
|
package/src/web/scrapers/rfc.ts
CHANGED
|
@@ -135,7 +135,7 @@ export const handleRfc: SpecialHandler = async (
|
|
|
135
135
|
// Authors
|
|
136
136
|
if (metadata.authors?.length) {
|
|
137
137
|
const authorList = metadata.authors
|
|
138
|
-
.map(
|
|
138
|
+
.map(a => (a.affiliation ? `${a.name} (${a.affiliation})` : a.name))
|
|
139
139
|
.join(", ");
|
|
140
140
|
md += `**Authors:** ${authorList}\n`;
|
|
141
141
|
}
|
|
@@ -27,12 +27,12 @@ function parseLineNumbers(lines: SearchcodeResult["lines"]): number[] | null {
|
|
|
27
27
|
|
|
28
28
|
if (typeof lines === "string") {
|
|
29
29
|
const parts = lines.split(/[,\s]+/).filter(Boolean);
|
|
30
|
-
const parsed = parts.map(
|
|
30
|
+
const parsed = parts.map(part => Number.parseInt(part, 10)).filter(value => Number.isFinite(value));
|
|
31
31
|
return parsed.length ? parsed : null;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
if (Array.isArray(lines)) {
|
|
35
|
-
const parsed = lines.map(
|
|
35
|
+
const parsed = lines.map(part => Number.parseInt(String(part), 10)).filter(value => Number.isFinite(value));
|
|
36
36
|
return parsed.length ? parsed : null;
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -114,7 +114,7 @@ export const handleSemanticScholar: SpecialHandler = async (url: string, timeout
|
|
|
114
114
|
sections.push("");
|
|
115
115
|
|
|
116
116
|
if (paper.authors && paper.authors.length > 0) {
|
|
117
|
-
const authorList = paper.authors.map(
|
|
117
|
+
const authorList = paper.authors.map(a => a.name).join(", ");
|
|
118
118
|
sections.push(`**Authors:** ${authorList}`);
|
|
119
119
|
sections.push("");
|
|
120
120
|
}
|
|
@@ -81,9 +81,9 @@ function formatChannelName(channel?: SnapcraftChannel): string | null {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function pickVersionFromChannels(entries: SnapcraftChannelMapEntry[]): string | undefined {
|
|
84
|
-
const stable = entries.find(
|
|
84
|
+
const stable = entries.find(entry => entry.channel?.risk === "stable" && entry.version);
|
|
85
85
|
if (stable?.version) return stable.version;
|
|
86
|
-
const first = entries.find(
|
|
86
|
+
const first = entries.find(entry => entry.version);
|
|
87
87
|
return first?.version;
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -129,7 +129,7 @@ function parseSourcegraphUrl(url: string): SourcegraphTarget | null {
|
|
|
129
129
|
const parts = parsed.pathname
|
|
130
130
|
.split("/")
|
|
131
131
|
.filter(Boolean)
|
|
132
|
-
.map(
|
|
132
|
+
.map(part => decodeURIComponent(part));
|
|
133
133
|
if (parts.length < 3) return null;
|
|
134
134
|
|
|
135
135
|
const hyphenIndex = parts.indexOf("-");
|
package/src/web/scrapers/spdx.ts
CHANGED
|
@@ -30,11 +30,11 @@ function formatYesNo(value?: boolean): string {
|
|
|
30
30
|
|
|
31
31
|
function collectCrossReferences(license: SpdxLicense): string[] {
|
|
32
32
|
const ordered = (license.crossRef ?? [])
|
|
33
|
-
.filter(
|
|
33
|
+
.filter(ref => ref.url)
|
|
34
34
|
.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
|
|
35
|
-
.map(
|
|
35
|
+
.map(ref => ref.url as string);
|
|
36
36
|
|
|
37
|
-
const seeAlso = (license.seeAlso ?? []).filter(
|
|
37
|
+
const seeAlso = (license.seeAlso ?? []).filter(url => url);
|
|
38
38
|
const combined = [...ordered, ...seeAlso];
|
|
39
39
|
return combined.filter((url, index) => combined.indexOf(url) === index);
|
|
40
40
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ToolAbortError } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
2
1
|
import { parse as parseHtml } from "node-html-parser";
|
|
2
|
+
import { ToolAbortError } from "../../tools/tool-errors";
|
|
3
3
|
import type { RenderResult, SpecialHandler } from "./types";
|
|
4
4
|
import { finalizeOutput, loadPage } from "./types";
|
|
5
5
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as os from "node:os";
|
|
3
3
|
import * as path from "node:path";
|
|
4
|
-
import { ensureTool } from "@oh-my-pi/pi-coding-agent/utils/tools-manager";
|
|
5
4
|
import { ptree } from "@oh-my-pi/pi-utils";
|
|
6
5
|
import { nanoid } from "nanoid";
|
|
6
|
+
import { ensureTool } from "../../utils/tools-manager";
|
|
7
7
|
import { createRequestSignal } from "./types";
|
|
8
8
|
|
|
9
9
|
const MAX_BYTES = 50 * 1024 * 1024; // 50MB for binary files
|
|
@@ -40,7 +40,7 @@ export async function convertWithMarkitdown(
|
|
|
40
40
|
|
|
41
41
|
// Write to temp file with extension hint
|
|
42
42
|
const ext = extensionHint || ".bin";
|
|
43
|
-
const tmpDir = tmpdir();
|
|
43
|
+
const tmpDir = os.tmpdir();
|
|
44
44
|
const tmpFile = path.join(tmpDir, `omp-convert-${nanoid()}${ext}`);
|
|
45
45
|
|
|
46
46
|
if (content.length > MAX_BYTES) {
|
|
@@ -61,7 +61,7 @@ export async function convertWithMarkitdown(
|
|
|
61
61
|
return { content: stdout, ok: true };
|
|
62
62
|
} finally {
|
|
63
63
|
try {
|
|
64
|
-
await rm(tmpFile, { force: true });
|
|
64
|
+
await fs.rm(tmpFile, { force: true });
|
|
65
65
|
} catch {}
|
|
66
66
|
}
|
|
67
67
|
}
|
|
@@ -179,8 +179,8 @@ export const handleWikidata: SpecialHandler = async (
|
|
|
179
179
|
|
|
180
180
|
// Sort: known properties first, then by property ID
|
|
181
181
|
processedProperties.sort((a, b) => {
|
|
182
|
-
const aKnown = Object.values(PROPERTY_LABELS).some(
|
|
183
|
-
const bKnown = Object.values(PROPERTY_LABELS).some(
|
|
182
|
+
const aKnown = Object.values(PROPERTY_LABELS).some(l => a.includes(`**${l}:**`));
|
|
183
|
+
const bKnown = Object.values(PROPERTY_LABELS).some(l => b.includes(`**${l}:**`));
|
|
184
184
|
if (aKnown && !bKnown) return -1;
|
|
185
185
|
if (!aKnown && bKnown) return 1;
|
|
186
186
|
return a.localeCompare(b);
|
|
@@ -254,7 +254,7 @@ function getLocalizedAliases(
|
|
|
254
254
|
if (!aliases) return [];
|
|
255
255
|
const langAliases = aliases[preferredLang];
|
|
256
256
|
if (!langAliases) return [];
|
|
257
|
-
return langAliases.map(
|
|
257
|
+
return langAliases.map(a => a.value);
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
/**
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { throwIfAborted } from "@oh-my-pi/pi-coding-agent/tools/tool-errors";
|
|
5
|
-
import { ensureTool } from "@oh-my-pi/pi-coding-agent/utils/tools-manager";
|
|
6
4
|
import { cspawn } from "@oh-my-pi/pi-utils";
|
|
7
5
|
import { nanoid } from "nanoid";
|
|
6
|
+
import { throwIfAborted } from "../../tools/tool-errors";
|
|
7
|
+
import { ensureTool } from "../../utils/tools-manager";
|
|
8
8
|
import type { RenderResult, SpecialHandler } from "./types";
|
|
9
9
|
import { finalizeOutput } from "./types";
|
|
10
10
|
|
|
@@ -229,7 +229,7 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
229
229
|
const hasAutoSubs = listResult.stdout.includes("[info] Available automatic captions");
|
|
230
230
|
|
|
231
231
|
// Create temp directory for subtitle download
|
|
232
|
-
const tmpDir = tmpdir();
|
|
232
|
+
const tmpDir = os.tmpdir();
|
|
233
233
|
const tmpBase = path.join(tmpDir, `yt-${yt.videoId}-${nanoid()}`);
|
|
234
234
|
|
|
235
235
|
try {
|
|
@@ -302,15 +302,10 @@ export const handleYouTube: SpecialHandler = async (
|
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
304
|
} finally {
|
|
305
|
-
// Cleanup temp files
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
try {
|
|
310
|
-
unlinkSync(f);
|
|
311
|
-
} catch {}
|
|
312
|
-
}
|
|
313
|
-
} catch {}
|
|
305
|
+
// Cleanup temp files (fire-and-forget with error suppression)
|
|
306
|
+
Array.fromAsync(new Bun.Glob(`${tmpBase}*`).scan({ absolute: true }))
|
|
307
|
+
.then(tmpFiles => Promise.all(tmpFiles.map(f => fs.unlink(f).catch(() => {}))))
|
|
308
|
+
.catch(() => {});
|
|
314
309
|
}
|
|
315
310
|
|
|
316
311
|
// Build markdown output
|
package/src/web/search/auth.ts
CHANGED
|
@@ -7,19 +7,14 @@
|
|
|
7
7
|
* 3. OAuth credentials in ~/.omp/agent/agent.db (with expiry check)
|
|
8
8
|
* 4. ANTHROPIC_API_KEY / ANTHROPIC_BASE_URL fallback
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
10
|
import * as os from "node:os";
|
|
12
11
|
import * as path from "node:path";
|
|
13
12
|
import { buildAnthropicHeaders as buildProviderAnthropicHeaders } from "@oh-my-pi/pi-ai";
|
|
14
|
-
import { getAgentDbPath, getConfigDirPaths } from "@oh-my-pi/pi-coding-agent/config";
|
|
15
|
-
import { AgentStorage } from "@oh-my-pi/pi-coding-agent/session/agent-storage";
|
|
16
|
-
import type {
|
|
17
|
-
AuthCredential,
|
|
18
|
-
AuthCredentialEntry,
|
|
19
|
-
AuthStorageData,
|
|
20
|
-
} from "@oh-my-pi/pi-coding-agent/session/auth-storage";
|
|
21
|
-
import { migrateJsonStorage } from "@oh-my-pi/pi-coding-agent/session/storage-migration";
|
|
22
13
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
14
|
+
import { getAgentDbPath, getConfigDirPaths } from "../../config";
|
|
15
|
+
import { AgentStorage } from "../../session/agent-storage";
|
|
16
|
+
import type { AuthCredential, AuthCredentialEntry, AuthStorageData } from "../../session/auth-storage";
|
|
17
|
+
import { migrateJsonStorage } from "../../session/storage-migration";
|
|
23
18
|
import type { AnthropicAuthConfig, AnthropicOAuthCredential, ModelsJson } from "./types";
|
|
24
19
|
|
|
25
20
|
const DEFAULT_BASE_URL = "https://api.anthropic.com";
|
package/src/web/search/index.ts
CHANGED
|
@@ -11,29 +11,19 @@
|
|
|
11
11
|
* - web_search_linkedin: Search LinkedIn profiles and companies
|
|
12
12
|
* - web_search_company: Comprehensive company research
|
|
13
13
|
*/
|
|
14
|
-
|
|
15
14
|
import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@oh-my-pi/pi-agent-core";
|
|
16
15
|
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
17
|
-
import { renderPromptTemplate } from "@oh-my-pi/pi-coding-agent/config/prompt-templates";
|
|
18
|
-
import {
|
|
19
|
-
callExaTool,
|
|
20
|
-
findApiKey as findExaKey,
|
|
21
|
-
formatSearchResults,
|
|
22
|
-
isSearchResponse,
|
|
23
|
-
} from "@oh-my-pi/pi-coding-agent/exa/mcp-client";
|
|
24
|
-
import { renderExaCall, renderExaResult } from "@oh-my-pi/pi-coding-agent/exa/render";
|
|
25
|
-
import type { ExaRenderDetails } from "@oh-my-pi/pi-coding-agent/exa/types";
|
|
26
|
-
import type {
|
|
27
|
-
CustomTool,
|
|
28
|
-
CustomToolContext,
|
|
29
|
-
RenderResultOptions,
|
|
30
|
-
} from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
31
|
-
import type { Theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
32
|
-
import webSearchSystemPrompt from "@oh-my-pi/pi-coding-agent/prompts/system/web-search.md" with { type: "text" };
|
|
33
|
-
import webSearchDescription from "@oh-my-pi/pi-coding-agent/prompts/tools/web-search.md" with { type: "text" };
|
|
34
|
-
import type { ToolSession } from "@oh-my-pi/pi-coding-agent/tools";
|
|
35
|
-
import { formatAge } from "@oh-my-pi/pi-coding-agent/tools/render-utils";
|
|
36
16
|
import { Type } from "@sinclair/typebox";
|
|
17
|
+
import { renderPromptTemplate } from "../../config/prompt-templates";
|
|
18
|
+
import { callExaTool, findApiKey as findExaKey, formatSearchResults, isSearchResponse } from "../../exa/mcp-client";
|
|
19
|
+
import { renderExaCall, renderExaResult } from "../../exa/render";
|
|
20
|
+
import type { ExaRenderDetails } from "../../exa/types";
|
|
21
|
+
import type { CustomTool, CustomToolContext, RenderResultOptions } from "../../extensibility/custom-tools/types";
|
|
22
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
23
|
+
import webSearchSystemPrompt from "../../prompts/system/web-search.md" with { type: "text" };
|
|
24
|
+
import webSearchDescription from "../../prompts/tools/web-search.md" with { type: "text" };
|
|
25
|
+
import type { ToolSession } from "../../tools";
|
|
26
|
+
import { formatAge } from "../../tools/render-utils";
|
|
37
27
|
import { findAnthropicAuth } from "./auth";
|
|
38
28
|
import { searchAnthropic } from "./providers/anthropic";
|
|
39
29
|
import { searchExa } from "./providers/exa";
|
|
@@ -103,7 +93,7 @@ function formatProviderLabel(provider: WebSearchProvider): string {
|
|
|
103
93
|
}
|
|
104
94
|
|
|
105
95
|
function formatProviderList(providers: WebSearchProvider[]): string {
|
|
106
|
-
return providers.map(
|
|
96
|
+
return providers.map(provider => formatProviderLabel(provider)).join(", ");
|
|
107
97
|
}
|
|
108
98
|
|
|
109
99
|
function buildNoProviderError(): string {
|
|
@@ -4,14 +4,8 @@
|
|
|
4
4
|
* Uses Claude's built-in web_search_20250305 tool to search the web.
|
|
5
5
|
* Returns synthesized answers with citations and source metadata.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import { applyClaudeToolPrefix, buildAnthropicSystemBlocks, stripClaudeToolPrefix } from "@oh-my-pi/pi-ai";
|
|
9
|
-
import {
|
|
10
|
-
buildAnthropicHeaders,
|
|
11
|
-
buildAnthropicUrl,
|
|
12
|
-
findAnthropicAuth,
|
|
13
|
-
getEnv,
|
|
14
|
-
} from "@oh-my-pi/pi-coding-agent/web/search/auth";
|
|
8
|
+
import { buildAnthropicHeaders, buildAnthropicUrl, findAnthropicAuth, getEnv } from "../../../web/search/auth";
|
|
15
9
|
import type {
|
|
16
10
|
AnthropicApiResponse,
|
|
17
11
|
AnthropicAuthConfig,
|
|
@@ -19,8 +13,8 @@ import type {
|
|
|
19
13
|
WebSearchCitation,
|
|
20
14
|
WebSearchResponse,
|
|
21
15
|
WebSearchSource,
|
|
22
|
-
} from "
|
|
23
|
-
import { WebSearchProviderError } from "
|
|
16
|
+
} from "../../../web/search/types";
|
|
17
|
+
import { WebSearchProviderError } from "../../../web/search/types";
|
|
24
18
|
|
|
25
19
|
const DEFAULT_MODEL = "claude-haiku-4-5";
|
|
26
20
|
const DEFAULT_MAX_TOKENS = 4096;
|
|
@@ -4,11 +4,9 @@
|
|
|
4
4
|
* High-quality neural search via Exa Search API.
|
|
5
5
|
* Returns structured search results with optional content extraction.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import type { WebSearchResponse, WebSearchSource } from "@oh-my-pi/pi-coding-agent/web/search/types";
|
|
11
|
-
import { WebSearchProviderError } from "@oh-my-pi/pi-coding-agent/web/search/types";
|
|
7
|
+
import * as os from "node:os";
|
|
8
|
+
import type { WebSearchResponse, WebSearchSource } from "../../../web/search/types";
|
|
9
|
+
import { WebSearchProviderError } from "../../../web/search/types";
|
|
12
10
|
|
|
13
11
|
const EXA_API_URL = "https://api.exa.ai/search";
|
|
14
12
|
|
|
@@ -30,9 +28,7 @@ export interface ExaSearchParams {
|
|
|
30
28
|
async function parseEnvFile(filePath: string): Promise<Record<string, string>> {
|
|
31
29
|
const result: Record<string, string> = {};
|
|
32
30
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const content = readFileSync(filePath, "utf-8");
|
|
31
|
+
const content = await Bun.file(filePath).text();
|
|
36
32
|
for (const line of content.split("\n")) {
|
|
37
33
|
let trimmed = line.trim();
|
|
38
34
|
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
@@ -54,13 +50,13 @@ async function parseEnvFile(filePath: string): Promise<Record<string, string>> {
|
|
|
54
50
|
result[key] = value;
|
|
55
51
|
}
|
|
56
52
|
} catch {
|
|
57
|
-
// Ignore read errors
|
|
53
|
+
// Ignore read errors (including ENOENT for missing files)
|
|
58
54
|
}
|
|
59
55
|
return result;
|
|
60
56
|
}
|
|
61
57
|
|
|
62
58
|
function getHomeDir(): string {
|
|
63
|
-
return homedir();
|
|
59
|
+
return os.homedir();
|
|
64
60
|
}
|
|
65
61
|
|
|
66
62
|
/** Find EXA_API_KEY from environment or .env files */
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Supports both sonar (fast) and sonar-pro (comprehensive) models.
|
|
5
5
|
* Returns synthesized answers with citations and related questions.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import * as os from "node:os";
|
|
9
8
|
import type {
|
|
10
9
|
PerplexityRequest,
|
|
@@ -12,8 +11,8 @@ import type {
|
|
|
12
11
|
WebSearchCitation,
|
|
13
12
|
WebSearchResponse,
|
|
14
13
|
WebSearchSource,
|
|
15
|
-
} from "
|
|
16
|
-
import { WebSearchProviderError } from "
|
|
14
|
+
} from "../../../web/search/types";
|
|
15
|
+
import { WebSearchProviderError } from "../../../web/search/types";
|
|
17
16
|
|
|
18
17
|
const PERPLEXITY_API_URL = "https://api.perplexity.ai/chat/completions";
|
|
19
18
|
|
|
@@ -123,7 +122,7 @@ function parseResponse(response: PerplexityResponse): WebSearchResponse {
|
|
|
123
122
|
const searchResults = response.search_results ?? [];
|
|
124
123
|
|
|
125
124
|
for (const url of citationUrls) {
|
|
126
|
-
const searchResult = searchResults.find(
|
|
125
|
+
const searchResult = searchResults.find(r => r.url === url);
|
|
127
126
|
sources.push({
|
|
128
127
|
title: searchResult?.title ?? url,
|
|
129
128
|
url,
|
|
@@ -167,9 +166,10 @@ export async function searchPerplexity(params: PerplexitySearchParams): Promise<
|
|
|
167
166
|
messages.push({ role: "user", content: params.query });
|
|
168
167
|
|
|
169
168
|
const request: PerplexityRequest = {
|
|
170
|
-
model: "sonar",
|
|
169
|
+
model: "sonar-pro",
|
|
171
170
|
messages,
|
|
172
171
|
return_related_questions: true,
|
|
172
|
+
search_context_size: "high",
|
|
173
173
|
};
|
|
174
174
|
|
|
175
175
|
if (params.search_recency_filter) {
|
package/src/web/search/render.ts
CHANGED
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Tree-based rendering with collapsed/expanded states for web search results.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import
|
|
8
|
-
import type {
|
|
6
|
+
import type { Component } from "@oh-my-pi/pi-tui";
|
|
7
|
+
import { Text } from "@oh-my-pi/pi-tui";
|
|
8
|
+
import type { RenderResultOptions } from "../../extensibility/custom-tools/types";
|
|
9
|
+
import type { Theme } from "../../modes/theme/theme";
|
|
9
10
|
import {
|
|
10
11
|
formatAge,
|
|
11
12
|
formatCount,
|
|
@@ -17,10 +18,8 @@ import {
|
|
|
17
18
|
PREVIEW_LIMITS,
|
|
18
19
|
TRUNCATE_LENGTHS,
|
|
19
20
|
truncate,
|
|
20
|
-
} from "
|
|
21
|
-
import { renderOutputBlock, renderStatusLine, renderTreeList } from "
|
|
22
|
-
import type { Component } from "@oh-my-pi/pi-tui";
|
|
23
|
-
import { Text } from "@oh-my-pi/pi-tui";
|
|
21
|
+
} from "../../tools/render-utils";
|
|
22
|
+
import { renderOutputBlock, renderStatusLine, renderTreeList } from "../../tui";
|
|
24
23
|
import type { WebSearchResponse } from "./types";
|
|
25
24
|
|
|
26
25
|
const MAX_COLLAPSED_ANSWER_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
|
|
@@ -34,9 +33,9 @@ const MAX_QUERY_LEN = 90;
|
|
|
34
33
|
const MAX_REQUEST_ID_LEN = 36;
|
|
35
34
|
|
|
36
35
|
function renderFallbackText(contentText: string, expanded: boolean, theme: Theme): Component {
|
|
37
|
-
const lines = contentText.split("\n").filter(
|
|
36
|
+
const lines = contentText.split("\n").filter(line => line.trim());
|
|
38
37
|
const maxLines = expanded ? lines.length : 6;
|
|
39
|
-
const displayLines = lines.slice(0, maxLines).map(
|
|
38
|
+
const displayLines = lines.slice(0, maxLines).map(line => truncate(line.trim(), 110, theme.format.ellipsis));
|
|
40
39
|
const remaining = lines.length - displayLines.length;
|
|
41
40
|
|
|
42
41
|
const headerIcon = formatStatusIcon("warning", theme);
|
|
@@ -81,7 +80,7 @@ export function renderWebSearchResult(
|
|
|
81
80
|
return new Text(theme.fg("error", `Error: ${details.error}`), 0, 0);
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
const rawText = result.content?.find(
|
|
83
|
+
const rawText = result.content?.find(block => block.type === "text")?.text?.trim() ?? "";
|
|
85
84
|
const response = details?.response;
|
|
86
85
|
if (!response) {
|
|
87
86
|
return renderFallbackText(rawText, expanded, theme);
|
|
@@ -92,18 +91,18 @@ export function renderWebSearchResult(
|
|
|
92
91
|
const citations = Array.isArray(response.citations) ? response.citations : [];
|
|
93
92
|
const citationCount = citations.length;
|
|
94
93
|
const related = Array.isArray(response.relatedQuestions)
|
|
95
|
-
? response.relatedQuestions.filter(
|
|
94
|
+
? response.relatedQuestions.filter(item => typeof item === "string")
|
|
96
95
|
: [];
|
|
97
96
|
const relatedCount = related.length;
|
|
98
97
|
const searchQueries = Array.isArray(response.searchQueries)
|
|
99
|
-
? response.searchQueries.filter(
|
|
98
|
+
? response.searchQueries.filter(item => typeof item === "string")
|
|
100
99
|
: [];
|
|
101
100
|
const provider = response.provider;
|
|
102
101
|
|
|
103
102
|
// Get answer text
|
|
104
103
|
const answerText = typeof response.answer === "string" ? response.answer.trim() : "";
|
|
105
104
|
const contentText = answerText || rawText;
|
|
106
|
-
const totalAnswerLines = contentText ? contentText.split("\n").filter(
|
|
105
|
+
const totalAnswerLines = contentText ? contentText.split("\n").filter(l => l.trim()).length : 0;
|
|
107
106
|
const answerLimit = expanded ? MAX_EXPANDED_ANSWER_LINES : MAX_COLLAPSED_ANSWER_LINES;
|
|
108
107
|
const answerPreview = contentText
|
|
109
108
|
? getPreviewLines(contentText, answerLimit, MAX_ANSWER_LINE_LEN, theme.format.ellipsis)
|
|
@@ -140,7 +139,7 @@ export function renderWebSearchResult(
|
|
|
140
139
|
expanded: true,
|
|
141
140
|
maxCollapsed: answerLines.length,
|
|
142
141
|
itemType: "line",
|
|
143
|
-
renderItem:
|
|
142
|
+
renderItem: line => (line === "No answer text returned" ? theme.fg("muted", line) : theme.fg("dim", line)),
|
|
144
143
|
},
|
|
145
144
|
theme,
|
|
146
145
|
);
|
|
@@ -154,7 +153,7 @@ export function renderWebSearchResult(
|
|
|
154
153
|
expanded,
|
|
155
154
|
maxCollapsed: MAX_COLLAPSED_ITEMS,
|
|
156
155
|
itemType: "source",
|
|
157
|
-
renderItem:
|
|
156
|
+
renderItem: src => {
|
|
158
157
|
const titleText =
|
|
159
158
|
typeof src.title === "string" && src.title.trim()
|
|
160
159
|
? src.title
|
|
@@ -198,8 +197,7 @@ export function renderWebSearchResult(
|
|
|
198
197
|
expanded,
|
|
199
198
|
maxCollapsed: MAX_COLLAPSED_ITEMS,
|
|
200
199
|
itemType: "question",
|
|
201
|
-
renderItem: (line)
|
|
202
|
-
theme.fg("muted", line === "No related questions" ? line : `${theme.format.dash} ${line}`),
|
|
200
|
+
renderItem: line => theme.fg("muted", line === "No related questions" ? line : `${theme.format.dash} ${line}`),
|
|
203
201
|
},
|
|
204
202
|
theme,
|
|
205
203
|
);
|
|
@@ -233,7 +231,7 @@ export function renderWebSearchResult(
|
|
|
233
231
|
}
|
|
234
232
|
if (searchQueries.length > 0) {
|
|
235
233
|
const queriesPreview = searchQueries.slice(0, MAX_QUERY_PREVIEW);
|
|
236
|
-
const queryList = queriesPreview.map(
|
|
234
|
+
const queryList = queriesPreview.map(q => truncate(q, MAX_QUERY_LEN, theme.format.ellipsis));
|
|
237
235
|
const suffix = searchQueries.length > queriesPreview.length ? theme.format.ellipsis : "";
|
|
238
236
|
metaLines.push(`${theme.fg("muted", "Queries:")} ${theme.fg("text", queryList.join("; "))}${suffix}`);
|
|
239
237
|
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* Generates a base64-encoded JavaScript module from the photon WASM file.
|
|
4
|
-
* This allows bundling the WASM binary inline for single-file distribution.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
|
|
9
|
-
const VENDOR_DIR = join(import.meta.dir, "../src/vendor/photon");
|
|
10
|
-
const WASM_PATH = join(VENDOR_DIR, "photon_rs_bg.wasm");
|
|
11
|
-
const OUTPUT_PATH = join(VENDOR_DIR, "photon_rs_bg.wasm.b64.js");
|
|
12
|
-
|
|
13
|
-
const wasmFile = Bun.file(WASM_PATH);
|
|
14
|
-
if (!(await wasmFile.exists())) {
|
|
15
|
-
console.error(`WASM file not found: ${WASM_PATH}`);
|
|
16
|
-
process.exit(1);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const wasmBytes = await wasmFile.arrayBuffer();
|
|
20
|
-
const base64 = Buffer.from(wasmBytes).toString("base64");
|
|
21
|
-
const content = `export default "${base64}";\n`;
|
|
22
|
-
|
|
23
|
-
await Bun.write(OUTPUT_PATH, content);
|
|
24
|
-
console.log(`Generated ${OUTPUT_PATH} (${Math.round(base64.length / 1024)}KB)`);
|
|
File without changes
|
|
File without changes
|