@oh-my-pi/pi-coding-agent 8.0.20 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +125 -0
- package/docs/session.md +111 -46
- package/examples/custom-tools/hello/index.ts +1 -1
- package/examples/custom-tools/todo/index.ts +3 -4
- package/examples/extensions/api-demo.ts +0 -1
- package/examples/extensions/chalk-logger.ts +2 -3
- package/examples/extensions/hello.ts +0 -1
- package/examples/extensions/pirate.ts +0 -1
- package/examples/extensions/plan-mode.ts +15 -16
- package/examples/extensions/todo.ts +3 -4
- package/examples/extensions/tools.ts +1 -2
- package/examples/extensions/with-deps/index.ts +0 -1
- package/examples/hooks/auto-commit-on-exit.ts +1 -2
- package/examples/hooks/confirm-destructive.ts +0 -1
- package/examples/hooks/custom-compaction.ts +1 -2
- package/examples/hooks/dirty-repo-guard.ts +0 -1
- package/examples/hooks/file-trigger.ts +3 -4
- package/examples/hooks/git-checkpoint.ts +0 -1
- package/examples/hooks/handoff.ts +3 -4
- package/examples/hooks/permission-gate.ts +1 -2
- package/examples/hooks/protected-paths.ts +1 -2
- package/examples/hooks/qna.ts +2 -3
- package/examples/hooks/snake.ts +4 -5
- package/examples/hooks/status-line.ts +0 -1
- package/examples/sdk/01-minimal.ts +2 -3
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/03-custom-prompt.ts +3 -4
- package/examples/sdk/04-skills.ts +2 -3
- package/examples/sdk/06-extensions.ts +1 -2
- package/examples/sdk/06-hooks.ts +6 -7
- package/examples/sdk/07-context-files.ts +0 -1
- package/examples/sdk/08-prompt-templates.ts +0 -1
- package/examples/sdk/08-slash-commands.ts +0 -1
- package/examples/sdk/09-api-keys-and-oauth.ts +0 -1
- package/examples/sdk/10-settings.ts +0 -1
- package/examples/sdk/11-sessions.ts +0 -1
- package/package.json +54 -23
- package/scripts/format-prompts.ts +0 -1
- package/src/capability/context-file.ts +3 -4
- package/src/capability/extension-module.ts +3 -4
- package/src/capability/extension.ts +3 -4
- package/src/capability/fs.ts +20 -21
- package/src/capability/hook.ts +3 -4
- package/src/capability/index.ts +15 -16
- package/src/capability/instruction.ts +3 -4
- package/src/capability/mcp.ts +3 -4
- package/src/capability/prompt.ts +3 -4
- package/src/capability/rule.ts +3 -4
- package/src/capability/settings.ts +2 -3
- package/src/capability/skill.ts +3 -4
- package/src/capability/slash-command.ts +3 -4
- package/src/capability/ssh.ts +3 -4
- package/src/capability/system-prompt.ts +3 -4
- package/src/capability/tool.ts +3 -4
- package/src/cli/args.ts +5 -6
- package/src/cli/config-cli.ts +6 -7
- package/src/cli/file-processor.ts +19 -17
- package/src/cli/jupyter-cli.ts +105 -0
- package/src/cli/list-models.ts +10 -11
- package/src/cli/plugin-cli.ts +20 -25
- package/src/cli/session-picker.ts +2 -3
- package/src/cli/setup-cli.ts +2 -3
- package/src/cli/stats-cli.ts +2 -3
- package/src/cli/update-cli.ts +25 -22
- package/src/commit/agentic/agent.ts +307 -0
- package/src/commit/agentic/fallback.ts +96 -0
- package/src/commit/agentic/index.ts +351 -0
- package/src/commit/agentic/prompts/analyze-file.md +22 -0
- package/src/commit/agentic/prompts/session-user.md +26 -0
- package/src/commit/agentic/prompts/split-confirm.md +1 -0
- package/src/commit/agentic/prompts/system.md +40 -0
- package/src/commit/agentic/state.ts +69 -0
- package/src/commit/agentic/tools/analyze-file.ts +131 -0
- package/src/commit/agentic/tools/git-file-diff.ts +194 -0
- package/src/commit/agentic/tools/git-hunk.ts +50 -0
- package/src/commit/agentic/tools/git-overview.ts +84 -0
- package/src/commit/agentic/tools/index.ts +56 -0
- package/src/commit/agentic/tools/propose-changelog.ts +128 -0
- package/src/commit/agentic/tools/propose-commit.ts +154 -0
- package/src/commit/agentic/tools/recent-commits.ts +81 -0
- package/src/commit/agentic/tools/split-commit.ts +280 -0
- package/src/commit/agentic/topo-sort.ts +44 -0
- package/src/commit/agentic/trivial.ts +51 -0
- package/src/commit/agentic/validation.ts +200 -0
- package/src/commit/analysis/conventional.ts +165 -0
- package/src/commit/analysis/index.ts +4 -0
- package/src/commit/analysis/scope.ts +242 -0
- package/src/commit/analysis/summary.ts +112 -0
- package/src/commit/analysis/validation.ts +66 -0
- package/src/commit/changelog/detect.ts +36 -0
- package/src/commit/changelog/generate.ts +110 -0
- package/src/commit/changelog/index.ts +233 -0
- package/src/commit/changelog/parse.ts +44 -0
- package/src/commit/cli.ts +93 -0
- package/src/commit/git/diff.ts +148 -0
- package/src/commit/git/errors.ts +11 -0
- package/src/commit/git/index.ts +212 -0
- package/src/commit/git/operations.ts +53 -0
- package/src/commit/index.ts +5 -0
- package/src/commit/map-reduce/index.ts +63 -0
- package/src/commit/map-reduce/map-phase.ts +178 -0
- package/src/commit/map-reduce/reduce-phase.ts +145 -0
- package/src/commit/map-reduce/utils.ts +9 -0
- package/src/commit/message.ts +11 -0
- package/src/commit/model-selection.ts +80 -0
- package/src/commit/pipeline.ts +240 -0
- package/src/commit/prompts/analysis-system.md +155 -0
- package/src/commit/prompts/analysis-user.md +41 -0
- package/src/commit/prompts/changelog-system.md +56 -0
- package/src/commit/prompts/changelog-user.md +19 -0
- package/src/commit/prompts/file-observer-system.md +26 -0
- package/src/commit/prompts/file-observer-user.md +9 -0
- package/src/commit/prompts/reduce-system.md +60 -0
- package/src/commit/prompts/reduce-user.md +17 -0
- package/src/commit/prompts/summary-retry.md +4 -0
- package/src/commit/prompts/summary-system.md +52 -0
- package/src/commit/prompts/summary-user.md +13 -0
- package/src/commit/prompts/types-description.md +2 -0
- package/src/commit/types.ts +109 -0
- package/src/commit/utils/exclusions.ts +42 -0
- package/src/config/file-lock.ts +121 -0
- package/src/config/keybindings.ts +6 -8
- package/src/config/model-registry.ts +65 -38
- package/src/config/model-resolver.ts +18 -19
- package/src/config/prompt-templates.ts +11 -11
- package/src/config/settings-manager.ts +141 -50
- package/src/config.ts +64 -66
- package/src/cursor.ts +11 -9
- package/src/discovery/agents-md.ts +11 -12
- package/src/discovery/builtin.ts +68 -73
- package/src/discovery/claude.ts +41 -42
- package/src/discovery/cline.ts +11 -12
- package/src/discovery/codex.ts +52 -53
- package/src/discovery/cursor.ts +9 -10
- package/src/discovery/gemini.ts +17 -22
- package/src/discovery/github.ts +13 -14
- package/src/discovery/helpers.ts +35 -34
- package/src/discovery/index.ts +22 -24
- package/src/discovery/mcp-json.ts +8 -9
- package/src/discovery/ssh.ts +8 -9
- package/src/discovery/vscode.ts +4 -5
- package/src/discovery/windsurf.ts +6 -7
- package/src/exa/company.ts +1 -2
- package/src/exa/index.ts +2 -3
- package/src/exa/linkedin.ts +1 -2
- package/src/exa/mcp-client.ts +14 -16
- package/src/exa/render.ts +10 -11
- package/src/exa/researcher.ts +1 -2
- package/src/exa/search.ts +1 -2
- package/src/exa/types.ts +0 -1
- package/src/exa/websets.ts +1 -2
- package/src/exec/bash-executor.ts +3 -4
- package/src/exec/exec.ts +0 -1
- package/src/export/custom-share.ts +5 -6
- package/src/export/html/index.ts +24 -21
- package/src/export/ttsr.ts +2 -3
- package/src/extensibility/custom-commands/bundled/review/index.ts +7 -8
- package/src/extensibility/custom-commands/loader.ts +18 -15
- package/src/extensibility/custom-commands/types.ts +2 -3
- package/src/extensibility/custom-tools/loader.ts +11 -12
- package/src/extensibility/custom-tools/types.ts +7 -8
- package/src/extensibility/custom-tools/wrapper.ts +2 -3
- package/src/extensibility/extensions/loader.ts +76 -54
- package/src/extensibility/extensions/runner.ts +11 -12
- package/src/extensibility/extensions/types.ts +20 -27
- package/src/extensibility/extensions/wrapper.ts +3 -4
- package/src/extensibility/hooks/index.ts +1 -1
- package/src/extensibility/hooks/loader.ts +9 -10
- package/src/extensibility/hooks/runner.ts +7 -8
- package/src/extensibility/hooks/tool-wrapper.ts +0 -1
- package/src/extensibility/hooks/types.ts +11 -18
- package/src/extensibility/plugins/doctor.ts +3 -3
- package/src/extensibility/plugins/installer.ts +27 -27
- package/src/extensibility/plugins/loader.ts +59 -56
- package/src/extensibility/plugins/manager.ts +211 -171
- package/src/extensibility/plugins/parser.ts +1 -1
- package/src/extensibility/plugins/paths.ts +8 -8
- package/src/extensibility/skills.ts +63 -60
- package/src/extensibility/slash-commands.ts +10 -10
- package/src/index.ts +54 -54
- package/src/internal-urls/agent-protocol.ts +21 -11
- package/src/internal-urls/artifact-protocol.ts +17 -13
- package/src/internal-urls/router.ts +1 -2
- package/src/internal-urls/rule-protocol.ts +3 -4
- package/src/internal-urls/skill-protocol.ts +3 -4
- package/src/ipy/executor.ts +109 -9
- package/src/ipy/gateway-coordinator.ts +79 -90
- package/src/ipy/kernel.ts +32 -30
- package/src/ipy/modules.ts +13 -13
- package/src/lsp/client.ts +21 -10
- package/src/lsp/clients/biome-client.ts +1 -2
- package/src/lsp/clients/index.ts +3 -3
- package/src/lsp/clients/lsp-linter-client.ts +4 -5
- package/src/lsp/config.ts +15 -15
- package/src/lsp/edits.ts +4 -5
- package/src/lsp/index.ts +43 -44
- package/src/lsp/lspmux.ts +8 -8
- package/src/lsp/render.ts +99 -61
- package/src/lsp/utils.ts +3 -3
- package/src/main.ts +71 -37
- package/src/mcp/client.ts +2 -3
- package/src/mcp/config.ts +5 -6
- package/src/mcp/json-rpc.ts +0 -1
- package/src/mcp/loader.ts +6 -7
- package/src/mcp/manager.ts +17 -18
- package/src/mcp/tool-bridge.ts +4 -9
- package/src/mcp/tool-cache.ts +2 -3
- package/src/mcp/transports/http.ts +2 -4
- package/src/mcp/transports/stdio.ts +1 -2
- package/src/migrations.ts +63 -52
- package/src/modes/components/armin.ts +4 -5
- package/src/modes/components/assistant-message.ts +33 -5
- package/src/modes/components/bash-execution.ts +7 -8
- package/src/modes/components/bordered-loader.ts +3 -3
- package/src/modes/components/branch-summary-message.ts +3 -3
- package/src/modes/components/compaction-summary-message.ts +3 -3
- package/src/modes/components/countdown-timer.ts +0 -1
- package/src/modes/components/custom-message.ts +5 -5
- package/src/modes/components/diff.ts +1 -1
- package/src/modes/components/dynamic-border.ts +2 -2
- package/src/modes/components/extensions/extension-dashboard.ts +6 -7
- package/src/modes/components/extensions/extension-list.ts +2 -3
- package/src/modes/components/extensions/inspector-panel.ts +3 -4
- package/src/modes/components/extensions/state-manager.ts +25 -26
- package/src/modes/components/extensions/types.ts +1 -2
- package/src/modes/components/footer.ts +47 -43
- package/src/modes/components/history-search.ts +2 -2
- package/src/modes/components/hook-editor.ts +3 -4
- package/src/modes/components/hook-input.ts +2 -3
- package/src/modes/components/hook-message.ts +5 -5
- package/src/modes/components/hook-selector.ts +2 -3
- package/src/modes/components/keybinding-hints.ts +2 -3
- package/src/modes/components/login-dialog.ts +2 -2
- package/src/modes/components/model-selector.ts +12 -12
- package/src/modes/components/oauth-selector.ts +2 -2
- package/src/modes/components/plugin-settings.ts +20 -20
- package/src/modes/components/python-execution.ts +7 -8
- package/src/modes/components/queue-mode-selector.ts +3 -3
- package/src/modes/components/read-tool-group.ts +2 -2
- package/src/modes/components/session-selector.ts +4 -4
- package/src/modes/components/settings-defs.ts +77 -69
- package/src/modes/components/settings-selector.ts +16 -16
- package/src/modes/components/show-images-selector.ts +2 -2
- package/src/modes/components/status-line/segments.ts +4 -4
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line/types.ts +2 -2
- package/src/modes/components/status-line-segment-editor.ts +7 -8
- package/src/modes/components/status-line.ts +12 -12
- package/src/modes/components/theme-selector.ts +8 -7
- package/src/modes/components/thinking-selector.ts +4 -4
- package/src/modes/components/todo-display.ts +2 -2
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +16 -19
- package/src/modes/components/tree-selector.ts +12 -12
- package/src/modes/components/ttsr-notification.ts +5 -5
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +1 -1
- package/src/modes/components/visual-truncate.ts +0 -1
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +46 -47
- package/src/modes/controllers/event-controller.ts +16 -20
- package/src/modes/controllers/extension-ui-controller.ts +40 -46
- package/src/modes/controllers/input-controller.ts +17 -18
- package/src/modes/controllers/selector-controller.ts +103 -91
- package/src/modes/index.ts +3 -3
- package/src/modes/interactive-mode.ts +31 -31
- package/src/modes/print-mode.ts +12 -13
- package/src/modes/rpc/rpc-client.ts +7 -8
- package/src/modes/rpc/rpc-mode.ts +24 -28
- package/src/modes/rpc/rpc-types.ts +3 -4
- package/src/modes/theme/mermaid-cache.ts +89 -0
- package/src/modes/theme/theme.ts +130 -53
- package/src/modes/types.ts +10 -10
- package/src/modes/utils/ui-helpers.ts +17 -17
- package/src/patch/applicator.ts +18 -19
- package/src/patch/diff.ts +1 -2
- package/src/patch/fuzzy.ts +1 -2
- package/src/patch/index.ts +11 -18
- package/src/patch/normalize.ts +4 -4
- package/src/patch/normative.ts +1 -2
- package/src/patch/parser.ts +8 -9
- package/src/patch/shared.ts +43 -16
- package/src/prompts/tools/task.md +2 -0
- package/src/sdk.ts +100 -65
- package/src/session/agent-session.ts +84 -85
- package/src/session/agent-storage.ts +43 -39
- package/src/session/artifacts.ts +32 -10
- package/src/session/auth-storage.ts +50 -39
- package/src/session/compaction/branch-summarization.ts +7 -10
- package/src/session/compaction/compaction.ts +8 -19
- package/src/session/compaction/utils.ts +6 -9
- package/src/session/history-storage.ts +10 -10
- package/src/session/messages.ts +4 -5
- package/src/session/session-manager.ts +76 -65
- package/src/session/session-storage.ts +57 -69
- package/src/session/storage-migration.ts +14 -56
- package/src/session/streaming-output.ts +2 -2
- package/src/ssh/connection-manager.ts +43 -50
- package/src/ssh/ssh-executor.ts +2 -2
- package/src/ssh/sshfs-mount.ts +11 -18
- package/src/system-prompt.ts +28 -35
- package/src/task/agents.ts +45 -30
- package/src/task/commands.ts +6 -7
- package/src/task/discovery.ts +39 -76
- package/src/task/executor.ts +14 -15
- package/src/task/index.ts +40 -34
- package/src/task/output-manager.ts +93 -0
- package/src/task/parallel.ts +0 -1
- package/src/task/render.ts +24 -30
- package/src/task/subprocess-tool-registry.ts +1 -2
- package/src/task/worker-protocol.ts +3 -3
- package/src/task/worker.ts +33 -39
- package/src/task/worktree.ts +19 -19
- package/src/tools/ask.ts +41 -20
- package/src/tools/bash-interceptor.ts +1 -5
- package/src/tools/bash.ts +91 -97
- package/src/tools/calculator.ts +49 -47
- package/src/tools/complete.ts +4 -5
- package/src/tools/context.ts +2 -2
- package/src/tools/fetch.ts +84 -124
- package/src/tools/find.ts +94 -98
- package/src/tools/gemini-image.ts +14 -14
- package/src/tools/grep.ts +100 -116
- package/src/tools/index.ts +80 -55
- package/src/tools/list-limit.ts +1 -1
- package/src/tools/ls.ts +44 -70
- package/src/tools/notebook.ts +51 -67
- package/src/tools/output-meta.ts +3 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/path-utils.ts +5 -5
- package/src/tools/python.ts +104 -217
- package/src/tools/read.ts +92 -33
- package/src/tools/render-utils.ts +8 -23
- package/src/tools/renderers.ts +6 -7
- package/src/tools/review.ts +8 -11
- package/src/tools/ssh.ts +69 -49
- package/src/tools/todo-write.ts +37 -25
- package/src/tools/tool-errors.ts +3 -3
- package/src/tools/tool-result.ts +3 -8
- package/src/tools/write.ts +99 -75
- package/src/tui/code-cell.ts +109 -0
- package/src/tui/file-list.ts +47 -0
- package/src/tui/index.ts +11 -0
- package/src/tui/output-block.ts +72 -0
- package/src/tui/status-line.ts +39 -0
- package/src/tui/tree-list.ts +55 -0
- package/src/tui/types.ts +16 -0
- package/src/tui/utils.ts +48 -0
- package/src/utils/changelog.ts +9 -10
- package/src/utils/clipboard.ts +11 -11
- package/src/utils/file-mentions.ts +4 -10
- package/src/utils/frontmatter.ts +6 -3
- package/src/utils/fuzzy.ts +2 -2
- package/src/utils/image-convert.ts +1 -1
- package/src/utils/image-resize.ts +1 -1
- package/src/utils/mime.ts +2 -2
- package/src/utils/shell-snapshot.ts +11 -13
- package/src/utils/shell.ts +4 -5
- package/src/utils/title-generator.ts +8 -9
- package/src/utils/tools-manager.ts +23 -23
- package/src/vendor/photon/index.js +1099 -1059
- package/src/vendor/photon/photon_rs_bg.wasm +0 -0
- package/src/web/scrapers/artifacthub.ts +1 -1
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/bluesky.ts +2 -2
- package/src/web/scrapers/cheatsh.ts +1 -1
- package/src/web/scrapers/chocolatey.ts +2 -2
- package/src/web/scrapers/choosealicense.ts +5 -5
- package/src/web/scrapers/cisa-kev.ts +1 -1
- package/src/web/scrapers/crossref.ts +2 -2
- package/src/web/scrapers/devto.ts +3 -3
- package/src/web/scrapers/discogs.ts +3 -4
- package/src/web/scrapers/discourse.ts +1 -1
- package/src/web/scrapers/dockerhub.ts +1 -1
- package/src/web/scrapers/fdroid.ts +2 -2
- package/src/web/scrapers/firefox-addons.ts +3 -3
- package/src/web/scrapers/flathub.ts +1 -1
- package/src/web/scrapers/github.ts +3 -3
- package/src/web/scrapers/gitlab.ts +4 -4
- package/src/web/scrapers/hackernews.ts +2 -2
- package/src/web/scrapers/huggingface.ts +1 -1
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/index.ts +0 -1
- package/src/web/scrapers/jetbrains-marketplace.ts +1 -1
- package/src/web/scrapers/lemmy.ts +2 -2
- package/src/web/scrapers/maven.ts +2 -2
- package/src/web/scrapers/mdn.ts +2 -4
- package/src/web/scrapers/metacpan.ts +2 -2
- package/src/web/scrapers/musicbrainz.ts +1 -2
- package/src/web/scrapers/npm.ts +1 -1
- package/src/web/scrapers/nuget.ts +2 -2
- package/src/web/scrapers/nvd.ts +3 -3
- package/src/web/scrapers/ollama.ts +7 -9
- package/src/web/scrapers/opencorporates.ts +2 -2
- package/src/web/scrapers/openlibrary.ts +6 -6
- package/src/web/scrapers/orcid.ts +0 -1
- package/src/web/scrapers/osv.ts +2 -2
- package/src/web/scrapers/packagist.ts +1 -1
- package/src/web/scrapers/pubmed.ts +1 -2
- package/src/web/scrapers/rawg.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +1 -2
- package/src/web/scrapers/repology.ts +2 -2
- package/src/web/scrapers/rfc.ts +1 -1
- package/src/web/scrapers/searchcode.ts +2 -2
- package/src/web/scrapers/semantic-scholar.ts +1 -1
- package/src/web/scrapers/snapcraft.ts +2 -2
- package/src/web/scrapers/sourcegraph.ts +1 -1
- package/src/web/scrapers/spdx.ts +3 -3
- package/src/web/scrapers/spotify.ts +0 -1
- package/src/web/scrapers/twitter.ts +1 -1
- package/src/web/scrapers/types.ts +1 -2
- package/src/web/scrapers/utils.ts +5 -5
- package/src/web/scrapers/wikidata.ts +3 -3
- package/src/web/scrapers/youtube.ts +9 -14
- package/src/web/search/auth.ts +5 -10
- package/src/web/search/index.ts +11 -21
- package/src/web/search/providers/anthropic.ts +3 -9
- package/src/web/search/providers/exa.ts +6 -10
- package/src/web/search/providers/perplexity.ts +5 -5
- package/src/web/search/render.ts +129 -175
- package/tsconfig.json +0 -42
|
@@ -6,12 +6,11 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Priority: 5 (low, as this is a fallback after tool-specific providers)
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
import { readFile } from "
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import type { LoadContext, LoadResult, SourceMeta } from "@oh-my-pi/pi-coding-agent/capability/types";
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { registerProvider } from "../capability";
|
|
11
|
+
import { readFile } from "../capability/fs";
|
|
12
|
+
import { type MCPServer, mcpCapability } from "../capability/mcp";
|
|
13
|
+
import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
|
|
15
14
|
import { createSourceMeta, expandEnvVarsDeep, parseJSON } from "./helpers";
|
|
16
15
|
|
|
17
16
|
const PROVIDER_ID = "mcp-json";
|
|
@@ -102,11 +101,11 @@ async function loadMCPJsonFile(
|
|
|
102
101
|
async function load(ctx: LoadContext): Promise<LoadResult<MCPServer>> {
|
|
103
102
|
const filenames = ["mcp.json", ".mcp.json"];
|
|
104
103
|
const results = await Promise.all(
|
|
105
|
-
filenames.map(
|
|
104
|
+
filenames.map(filename => loadMCPJsonFile(ctx, path.join(ctx.cwd, filename), "project")),
|
|
106
105
|
);
|
|
107
106
|
|
|
108
|
-
const allItems = results.flatMap(
|
|
109
|
-
const allWarnings = results.flatMap(
|
|
107
|
+
const allItems = results.flatMap(r => r.items);
|
|
108
|
+
const allWarnings = results.flatMap(r => r.warnings ?? []);
|
|
110
109
|
|
|
111
110
|
return {
|
|
112
111
|
items: allItems,
|
package/src/discovery/ssh.ts
CHANGED
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* Discovers SSH hosts from ssh.json or .ssh.json in the project root.
|
|
5
5
|
* Priority: 5 (low, project-level only)
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
import { readFile } from "
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import type { LoadContext, LoadResult, SourceMeta } from "@oh-my-pi/pi-coding-agent/capability/types";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { registerProvider } from "../capability";
|
|
9
|
+
import { readFile } from "../capability/fs";
|
|
10
|
+
import { type SSHHost, sshCapability } from "../capability/ssh";
|
|
11
|
+
import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
|
|
13
12
|
import { createSourceMeta, expandEnvVarsDeep, parseJSON } from "./helpers";
|
|
14
13
|
|
|
15
14
|
const PROVIDER_ID = "ssh-json";
|
|
@@ -134,10 +133,10 @@ async function loadSshJsonFile(_ctx: LoadContext, path: string): Promise<LoadRes
|
|
|
134
133
|
|
|
135
134
|
async function load(ctx: LoadContext): Promise<LoadResult<SSHHost>> {
|
|
136
135
|
const filenames = ["ssh.json", ".ssh.json"];
|
|
137
|
-
const results = await Promise.all(filenames.map(
|
|
136
|
+
const results = await Promise.all(filenames.map(filename => loadSshJsonFile(ctx, path.join(ctx.cwd, filename))));
|
|
138
137
|
|
|
139
|
-
const allItems = results.flatMap(
|
|
140
|
-
const allWarnings = results.flatMap(
|
|
138
|
+
const allItems = results.flatMap(r => r.items);
|
|
139
|
+
const allWarnings = results.flatMap(r => r.warnings ?? []);
|
|
141
140
|
|
|
142
141
|
return {
|
|
143
142
|
items: allItems,
|
package/src/discovery/vscode.ts
CHANGED
|
@@ -4,11 +4,10 @@
|
|
|
4
4
|
* Loads config from `.vscode` directory (project-only).
|
|
5
5
|
* Supports MCP server discovery from `mcp.json` with nested `mcp.servers` structure.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { readFile } from "
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import type { LoadContext, LoadResult } from "@oh-my-pi/pi-coding-agent/capability/types";
|
|
7
|
+
import { registerProvider } from "../capability";
|
|
8
|
+
import { readFile } from "../capability/fs";
|
|
9
|
+
import { type MCPServer, mcpCapability } from "../capability/mcp";
|
|
10
|
+
import type { LoadContext, LoadResult } from "../capability/types";
|
|
12
11
|
import { createSourceMeta, expandEnvVarsDeep, getProjectPath, parseJSON } from "./helpers";
|
|
13
12
|
|
|
14
13
|
const PROVIDER_ID = "vscode";
|
|
@@ -10,13 +10,12 @@
|
|
|
10
10
|
* - Rules from .windsurf/rules/*.md and ~/.codeium/windsurf/memories/global_rules.md
|
|
11
11
|
* - Legacy .windsurfrules file
|
|
12
12
|
*/
|
|
13
|
-
|
|
14
|
-
import { readFile } from "
|
|
15
|
-
import {
|
|
16
|
-
import { type
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
19
|
-
import { parseFrontmatter } from "@oh-my-pi/pi-coding-agent/utils/frontmatter";
|
|
13
|
+
import { registerProvider } from "../capability";
|
|
14
|
+
import { readFile } from "../capability/fs";
|
|
15
|
+
import { type MCPServer, mcpCapability } from "../capability/mcp";
|
|
16
|
+
import { type Rule, ruleCapability } from "../capability/rule";
|
|
17
|
+
import type { LoadContext, LoadResult } from "../capability/types";
|
|
18
|
+
import { parseFrontmatter } from "../utils/frontmatter";
|
|
20
19
|
import {
|
|
21
20
|
createSourceMeta,
|
|
22
21
|
expandEnvVarsDeep,
|
package/src/exa/company.ts
CHANGED
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Research companies using Exa's comprehensive data sources.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
8
6
|
import { Type } from "@sinclair/typebox";
|
|
7
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
9
8
|
import { callExaTool, findApiKey, formatSearchResults, isSearchResponse } from "./mcp-client";
|
|
10
9
|
import type { ExaRenderDetails } from "./types";
|
|
11
10
|
|
package/src/exa/index.ts
CHANGED
|
@@ -8,9 +8,8 @@
|
|
|
8
8
|
* - 2 researcher tools (start, poll)
|
|
9
9
|
* - 14 websets tools (CRUD, items, search, enrichment, monitor)
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
import type {
|
|
13
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
11
|
+
import type { ExaSettings } from "../config/settings-manager";
|
|
12
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
14
13
|
import { companyTool } from "./company";
|
|
15
14
|
import { linkedinTool } from "./linkedin";
|
|
16
15
|
import { researcherTools } from "./researcher";
|
package/src/exa/linkedin.ts
CHANGED
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Search LinkedIn for people, companies, and professional content.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
8
6
|
import { Type } from "@sinclair/typebox";
|
|
7
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
9
8
|
import { callExaTool, findApiKey, formatSearchResults, isSearchResponse } from "./mcp-client";
|
|
10
9
|
import type { ExaRenderDetails } from "./types";
|
|
11
10
|
|
package/src/exa/mcp-client.ts
CHANGED
|
@@ -3,13 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Client for interacting with Exa MCP servers.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
import { homedir } from "node:os";
|
|
9
|
-
import type { CustomTool, CustomToolResult } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
10
|
-
import { callMCP } from "@oh-my-pi/pi-coding-agent/mcp/json-rpc";
|
|
11
|
-
import { logger } from "@oh-my-pi/pi-utils";
|
|
6
|
+
import * as os from "node:os";
|
|
7
|
+
import { isEnoent, logger } from "@oh-my-pi/pi-utils";
|
|
12
8
|
import type { TSchema } from "@sinclair/typebox";
|
|
9
|
+
import type { CustomTool, CustomToolResult } from "../extensibility/custom-tools/types";
|
|
10
|
+
import { callMCP } from "../mcp/json-rpc";
|
|
13
11
|
import type {
|
|
14
12
|
ExaRenderDetails,
|
|
15
13
|
ExaSearchResponse,
|
|
@@ -29,20 +27,20 @@ export async function findApiKey(): Promise<string | null> {
|
|
|
29
27
|
|
|
30
28
|
// Try loading from .env files in cwd and home
|
|
31
29
|
const cwd = process.cwd();
|
|
32
|
-
const home = homedir();
|
|
30
|
+
const home = os.homedir();
|
|
33
31
|
|
|
34
32
|
for (const dir of [cwd, home]) {
|
|
35
33
|
const envPath = `${dir}/.env`;
|
|
36
34
|
try {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
const content = await Bun.file(envPath).text();
|
|
36
|
+
const match = content.match(/^EXA_API_KEY=(.+)$/m);
|
|
37
|
+
if (match?.[1]) {
|
|
38
|
+
return match[1].trim().replace(/^["']|["']$/g, "");
|
|
39
|
+
}
|
|
40
|
+
} catch (err) {
|
|
41
|
+
if (!isEnoent(err)) {
|
|
42
|
+
logger.debug("Error reading .env file", { path: envPath, error: String(err) });
|
|
43
43
|
}
|
|
44
|
-
} catch {
|
|
45
|
-
// Ignore read errors
|
|
46
44
|
}
|
|
47
45
|
}
|
|
48
46
|
|
|
@@ -231,7 +229,7 @@ export async function fetchMCPToolSchema(
|
|
|
231
229
|
|
|
232
230
|
try {
|
|
233
231
|
const tools = isWebsetsTool ? await fetchWebsetsTools(apiKey) : await fetchExaTools(apiKey, [mcpToolName]);
|
|
234
|
-
const tool = tools.find(
|
|
232
|
+
const tool = tools.find(t => t.name === mcpToolName);
|
|
235
233
|
if (tool) {
|
|
236
234
|
mcpSchemaCache.set(cacheKey, tool);
|
|
237
235
|
return tool;
|
package/src/exa/render.ts
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Tree-based rendering with collapsed/expanded states for Exa search results.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import
|
|
8
|
-
import
|
|
6
|
+
import type { Component } from "@oh-my-pi/pi-tui";
|
|
7
|
+
import { Text } from "@oh-my-pi/pi-tui";
|
|
8
|
+
import { logger } from "@oh-my-pi/pi-utils";
|
|
9
|
+
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
10
|
+
import type { Theme } from "../modes/theme/theme";
|
|
9
11
|
import {
|
|
10
12
|
formatCount,
|
|
11
13
|
formatExpandHint,
|
|
@@ -16,10 +18,7 @@ import {
|
|
|
16
18
|
PREVIEW_LIMITS,
|
|
17
19
|
TRUNCATE_LENGTHS,
|
|
18
20
|
truncate,
|
|
19
|
-
} from "
|
|
20
|
-
import type { Component } from "@oh-my-pi/pi-tui";
|
|
21
|
-
import { Text } from "@oh-my-pi/pi-tui";
|
|
22
|
-
import { logger } from "@oh-my-pi/pi-utils";
|
|
21
|
+
} from "../tools/render-utils";
|
|
23
22
|
import type { ExaRenderDetails } from "./types";
|
|
24
23
|
|
|
25
24
|
const COLLAPSED_PREVIEW_LINES = PREVIEW_LIMITS.COLLAPSED_LINES;
|
|
@@ -60,7 +59,7 @@ export function renderExaResult(
|
|
|
60
59
|
if (!response) {
|
|
61
60
|
if (details?.raw) {
|
|
62
61
|
const rawText = typeof details.raw === "string" ? details.raw : JSON.stringify(details.raw, null, 2);
|
|
63
|
-
const rawLines = rawText.split("\n").filter(
|
|
62
|
+
const rawLines = rawText.split("\n").filter(l => l.trim());
|
|
64
63
|
const maxLines = expanded ? rawLines.length : Math.min(rawLines.length, COLLAPSED_PREVIEW_LINES);
|
|
65
64
|
const displayLines = rawLines.slice(0, maxLines);
|
|
66
65
|
const remaining = rawLines.length - maxLines;
|
|
@@ -104,7 +103,7 @@ export function renderExaResult(
|
|
|
104
103
|
let hasMorePreview = false;
|
|
105
104
|
if (!expanded && resultCount > 0) {
|
|
106
105
|
const previewText = results[0].text ?? results[0].title ?? "";
|
|
107
|
-
const totalLines = previewText.split("\n").filter(
|
|
106
|
+
const totalLines = previewText.split("\n").filter(l => l.trim()).length;
|
|
108
107
|
hasMorePreview = totalLines > COLLAPSED_PREVIEW_LINES || resultCount > 1;
|
|
109
108
|
}
|
|
110
109
|
const expandHint = formatExpandHint(uiTheme, expanded, hasMorePreview);
|
|
@@ -123,7 +122,7 @@ export function renderExaResult(
|
|
|
123
122
|
? getPreviewLines(previewText, COLLAPSED_PREVIEW_LINES, COLLAPSED_PREVIEW_LINE_LEN, uiTheme.format.ellipsis)
|
|
124
123
|
: [];
|
|
125
124
|
const safePreviewLines = previewLines.length > 0 ? previewLines : ["No preview text"];
|
|
126
|
-
const totalLines = previewText.split("\n").filter(
|
|
125
|
+
const totalLines = previewText.split("\n").filter(l => l.trim()).length;
|
|
127
126
|
const remainingLines = Math.max(0, totalLines - previewLines.length);
|
|
128
127
|
const extraItems: string[] = [];
|
|
129
128
|
if (remainingLines > 0) {
|
|
@@ -189,7 +188,7 @@ export function renderExaResult(
|
|
|
189
188
|
}
|
|
190
189
|
|
|
191
190
|
if (res.text) {
|
|
192
|
-
const textLines = res.text.split("\n").filter(
|
|
191
|
+
const textLines = res.text.split("\n").filter(l => l.trim());
|
|
193
192
|
const displayLines = textLines.slice(0, EXPANDED_TEXT_LINES);
|
|
194
193
|
for (const line of displayLines) {
|
|
195
194
|
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
package/src/exa/researcher.ts
CHANGED
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Async research tasks with polling for completion.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
8
6
|
import { Type } from "@sinclair/typebox";
|
|
7
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
9
8
|
import { callExaTool, findApiKey } from "./mcp-client";
|
|
10
9
|
import type { ExaRenderDetails } from "./types";
|
|
11
10
|
|
package/src/exa/search.ts
CHANGED
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Basic neural/keyword search, deep research, code search, and URL crawling.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
6
|
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
8
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
9
7
|
import { Type } from "@sinclair/typebox";
|
|
8
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
10
9
|
import { callExaTool, findApiKey, formatSearchResults, isSearchResponse } from "./mcp-client";
|
|
11
10
|
import type { ExaRenderDetails } from "./types";
|
|
12
11
|
|
package/src/exa/types.ts
CHANGED
package/src/exa/websets.ts
CHANGED
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* CRUD operations for websets, items, searches, enrichments, and monitoring.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import type { CustomTool } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
8
6
|
import { Type } from "@sinclair/typebox";
|
|
7
|
+
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
9
8
|
import { callWebsetsTool, findApiKey } from "./mcp-client";
|
|
10
9
|
import type { ExaRenderDetails } from "./types";
|
|
11
10
|
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides unified bash execution for AgentSession.executeBash() and direct calls.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { OutputSink } from "@oh-my-pi/pi-coding-agent/session/streaming-output";
|
|
8
|
-
import { getShellConfig } from "@oh-my-pi/pi-coding-agent/utils/shell";
|
|
9
|
-
import { getOrCreateSnapshot, getSnapshotSourceCommand } from "@oh-my-pi/pi-coding-agent/utils/shell-snapshot";
|
|
10
6
|
import { cspawn, Exception, ptree } from "@oh-my-pi/pi-utils";
|
|
7
|
+
import { OutputSink } from "../session/streaming-output";
|
|
8
|
+
import { getShellConfig } from "../utils/shell";
|
|
9
|
+
import { getOrCreateSnapshot, getSnapshotSourceCommand } from "../utils/shell-snapshot";
|
|
11
10
|
|
|
12
11
|
export interface BashExecutorOptions {
|
|
13
12
|
cwd?: string;
|
package/src/exec/exec.ts
CHANGED
|
@@ -4,10 +4,9 @@
|
|
|
4
4
|
* Allows users to define a custom share handler at ~/.omp/agent/share.ts
|
|
5
5
|
* that will be used instead of the default GitHub Gist sharing.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import { getAgentDir } from "@oh-my-pi/pi-coding-agent/config";
|
|
7
|
+
import * as fs from "node:fs";
|
|
8
|
+
import * as path from "node:path";
|
|
9
|
+
import { getAgentDir } from "../config";
|
|
11
10
|
|
|
12
11
|
export interface CustomShareResult {
|
|
13
12
|
/** URL to display/open (optional - script may handle everything itself) */
|
|
@@ -32,8 +31,8 @@ export function getCustomSharePath(): string | null {
|
|
|
32
31
|
const agentDir = getAgentDir();
|
|
33
32
|
|
|
34
33
|
for (const candidate of SHARE_SCRIPT_CANDIDATES) {
|
|
35
|
-
const scriptPath = join(agentDir, candidate);
|
|
36
|
-
if (existsSync(scriptPath)) {
|
|
34
|
+
const scriptPath = path.join(agentDir, candidate);
|
|
35
|
+
if (fs.existsSync(scriptPath)) {
|
|
37
36
|
return scriptPath;
|
|
38
37
|
}
|
|
39
38
|
}
|
package/src/export/html/index.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { basename } from "node:path";
|
|
1
|
+
import * as path from "node:path";
|
|
3
2
|
import type { AgentState } from "@oh-my-pi/pi-agent-core";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
3
|
+
import { isEnoent } from "@oh-my-pi/pi-utils";
|
|
4
|
+
import { APP_NAME } from "../../config";
|
|
5
|
+
import { getResolvedThemeColors, getThemeExportColors } from "../../modes/theme/theme";
|
|
6
|
+
import { SessionManager } from "../../session/session-manager";
|
|
8
7
|
// Pre-generated template (created by scripts/generate-template.ts at publish time)
|
|
9
8
|
import { TEMPLATE } from "./template.generated";
|
|
10
9
|
|
|
@@ -74,14 +73,14 @@ function deriveExportColors(baseColor: string): { pageBg: string; cardBg: string
|
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
/** Generate CSS custom properties for theme. */
|
|
77
|
-
function generateThemeVars(themeName?: string): string {
|
|
78
|
-
const colors = getResolvedThemeColors(themeName);
|
|
76
|
+
async function generateThemeVars(themeName?: string): Promise<string> {
|
|
77
|
+
const colors = await getResolvedThemeColors(themeName);
|
|
79
78
|
const lines: string[] = [];
|
|
80
79
|
for (const [key, value] of Object.entries(colors)) {
|
|
81
80
|
lines.push(`--${key}: ${value};`);
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
const themeExport = getThemeExportColors(themeName);
|
|
83
|
+
const themeExport = await getThemeExportColors(themeName);
|
|
85
84
|
const userMessageBg = colors.userMessageBg || "#343541";
|
|
86
85
|
const derived = deriveExportColors(userMessageBg);
|
|
87
86
|
|
|
@@ -101,8 +100,8 @@ interface SessionData {
|
|
|
101
100
|
}
|
|
102
101
|
|
|
103
102
|
/** Generate HTML from bundled template with runtime substitutions. */
|
|
104
|
-
function generateHtml(sessionData: SessionData, themeName?: string): string {
|
|
105
|
-
const themeVars = generateThemeVars(themeName);
|
|
103
|
+
async function generateHtml(sessionData: SessionData, themeName?: string): Promise<string> {
|
|
104
|
+
const themeVars = await generateThemeVars(themeName);
|
|
106
105
|
const sessionDataBase64 = Buffer.from(JSON.stringify(sessionData)).toString("base64");
|
|
107
106
|
|
|
108
107
|
return TEMPLATE.replace("<theme-vars/>", `<style>:root { ${themeVars} }</style>`).replace(
|
|
@@ -121,20 +120,19 @@ export async function exportSessionToHtml(
|
|
|
121
120
|
|
|
122
121
|
const sessionFile = sm.getSessionFile();
|
|
123
122
|
if (!sessionFile) throw new Error("Cannot export in-memory session to HTML");
|
|
124
|
-
if (!existsSync(sessionFile)) throw new Error("Nothing to export yet - start a conversation first");
|
|
125
123
|
|
|
126
124
|
const sessionData: SessionData = {
|
|
127
125
|
header: sm.getHeader(),
|
|
128
126
|
entries: sm.getEntries(),
|
|
129
127
|
leafId: sm.getLeafId(),
|
|
130
128
|
systemPrompt: state?.systemPrompt,
|
|
131
|
-
tools: state?.tools?.map(
|
|
129
|
+
tools: state?.tools?.map(t => ({ name: t.name, description: t.description })),
|
|
132
130
|
};
|
|
133
131
|
|
|
134
|
-
const html = generateHtml(sessionData, opts.themeName);
|
|
135
|
-
const outputPath = opts.outputPath || `${APP_NAME}-session-${basename(sessionFile, ".jsonl")}.html`;
|
|
132
|
+
const html = await generateHtml(sessionData, opts.themeName);
|
|
133
|
+
const outputPath = opts.outputPath || `${APP_NAME}-session-${path.basename(sessionFile, ".jsonl")}.html`;
|
|
136
134
|
|
|
137
|
-
|
|
135
|
+
await Bun.write(outputPath, html);
|
|
138
136
|
return outputPath;
|
|
139
137
|
}
|
|
140
138
|
|
|
@@ -142,18 +140,23 @@ export async function exportSessionToHtml(
|
|
|
142
140
|
export async function exportFromFile(inputPath: string, options?: ExportOptions | string): Promise<string> {
|
|
143
141
|
const opts: ExportOptions = typeof options === "string" ? { outputPath: options } : options || {};
|
|
144
142
|
|
|
145
|
-
|
|
143
|
+
let sm: SessionManager;
|
|
144
|
+
try {
|
|
145
|
+
sm = await SessionManager.open(inputPath);
|
|
146
|
+
} catch (err) {
|
|
147
|
+
if (isEnoent(err)) throw new Error(`File not found: ${inputPath}`);
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
146
150
|
|
|
147
|
-
const sm = await SessionManager.open(inputPath);
|
|
148
151
|
const sessionData: SessionData = {
|
|
149
152
|
header: sm.getHeader(),
|
|
150
153
|
entries: sm.getEntries(),
|
|
151
154
|
leafId: sm.getLeafId(),
|
|
152
155
|
};
|
|
153
156
|
|
|
154
|
-
const html = generateHtml(sessionData, opts.themeName);
|
|
155
|
-
const outputPath = opts.outputPath || `${APP_NAME}-session-${basename(inputPath, ".jsonl")}.html`;
|
|
157
|
+
const html = await generateHtml(sessionData, opts.themeName);
|
|
158
|
+
const outputPath = opts.outputPath || `${APP_NAME}-session-${path.basename(inputPath, ".jsonl")}.html`;
|
|
156
159
|
|
|
157
|
-
|
|
160
|
+
await Bun.write(outputPath, html);
|
|
158
161
|
return outputPath;
|
|
159
162
|
}
|
package/src/export/ttsr.ts
CHANGED
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
* the agent's output. When a match occurs, the stream is aborted, the rule is
|
|
6
6
|
* injected as a system reminder, and the request is retried.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
import type { Rule } from "@oh-my-pi/pi-coding-agent/capability/rule";
|
|
10
|
-
import type { TtsrSettings } from "@oh-my-pi/pi-coding-agent/config/settings-manager";
|
|
11
8
|
import { logger } from "@oh-my-pi/pi-utils";
|
|
9
|
+
import type { Rule } from "../capability/rule";
|
|
10
|
+
import type { TtsrSettings } from "../config/settings-manager";
|
|
12
11
|
|
|
13
12
|
interface TtsrEntry {
|
|
14
13
|
rule: Rule;
|
|
@@ -11,11 +11,10 @@
|
|
|
11
11
|
* rich context for the orchestrating agent to distribute work across
|
|
12
12
|
* multiple reviewer agents based on diff weight and locality.
|
|
13
13
|
*/
|
|
14
|
-
|
|
15
|
-
import {
|
|
16
|
-
import type {
|
|
17
|
-
import
|
|
18
|
-
import reviewRequestTemplate from "@oh-my-pi/pi-coding-agent/prompts/review-request.md" with { type: "text" };
|
|
14
|
+
import { renderPromptTemplate } from "../../../../config/prompt-templates";
|
|
15
|
+
import type { CustomCommand, CustomCommandAPI } from "../../../../extensibility/custom-commands/types";
|
|
16
|
+
import type { HookCommandContext } from "../../../../extensibility/hooks/types";
|
|
17
|
+
import reviewRequestTemplate from "../../../../prompts/review-request.md" with { type: "text" };
|
|
19
18
|
|
|
20
19
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
20
|
// Types
|
|
@@ -203,7 +202,7 @@ function buildReviewPrompt(mode: string, stats: DiffStats, rawDiff: string): str
|
|
|
203
202
|
const totalLines = stats.totalAdded + stats.totalRemoved;
|
|
204
203
|
const linesPerFile = skipDiff ? Math.max(5, Math.floor(100 / stats.files.length)) : 0;
|
|
205
204
|
|
|
206
|
-
const filesWithExt = stats.files.map(
|
|
205
|
+
const filesWithExt = stats.files.map(f => ({
|
|
207
206
|
...f,
|
|
208
207
|
ext: getFileExt(f.path),
|
|
209
208
|
hunksPreview: skipDiff ? getDiffPreview(f.hunks, linesPerFile) : "",
|
|
@@ -393,7 +392,7 @@ async function getGitBranches(api: CustomCommandAPI): Promise<string[]> {
|
|
|
393
392
|
if (result.code !== 0) return [];
|
|
394
393
|
return result.stdout
|
|
395
394
|
.split("\n")
|
|
396
|
-
.map(
|
|
395
|
+
.map(b => b.trim())
|
|
397
396
|
.filter(Boolean);
|
|
398
397
|
} catch {
|
|
399
398
|
return [];
|
|
@@ -424,7 +423,7 @@ async function getRecentCommits(api: CustomCommandAPI, count: number): Promise<s
|
|
|
424
423
|
if (result.code !== 0) return [];
|
|
425
424
|
return result.stdout
|
|
426
425
|
.split("\n")
|
|
427
|
-
.map(
|
|
426
|
+
.map(c => c.trim())
|
|
428
427
|
.filter(Boolean);
|
|
429
428
|
} catch {
|
|
430
429
|
return [];
|
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
* Dependencies (@sinclair/typebox and pi-coding-agent) are injected via the CustomCommandAPI
|
|
5
5
|
* to avoid import resolution issues with custom commands loaded from user directories.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
import { type Dirent, existsSync, readdirSync } from "node:fs";
|
|
7
|
+
import * as fs from "node:fs";
|
|
9
8
|
import * as path from "node:path";
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent/index";
|
|
13
|
-
import { logger } from "@oh-my-pi/pi-utils";
|
|
9
|
+
import * as piCodingAgent from "@oh-my-pi/pi-coding-agent";
|
|
10
|
+
import { isEnoent, logger } from "@oh-my-pi/pi-utils";
|
|
14
11
|
import * as typebox from "@sinclair/typebox";
|
|
12
|
+
import { getAgentDir, getConfigDirs } from "../../config";
|
|
13
|
+
import { execCommand } from "../../exec/exec";
|
|
15
14
|
import { ReviewCommand } from "./bundled/review";
|
|
16
15
|
import type {
|
|
17
16
|
CustomCommand,
|
|
@@ -77,7 +76,9 @@ export interface DiscoverCustomCommandsResult {
|
|
|
77
76
|
* Discover custom command modules (TypeScript slash commands).
|
|
78
77
|
* Markdown slash commands are handled by core/slash-commands.ts.
|
|
79
78
|
*/
|
|
80
|
-
export function discoverCustomCommands(
|
|
79
|
+
export async function discoverCustomCommands(
|
|
80
|
+
options: DiscoverCustomCommandsOptions = {},
|
|
81
|
+
): Promise<DiscoverCustomCommandsResult> {
|
|
81
82
|
const cwd = options.cwd ?? process.cwd();
|
|
82
83
|
const agentDir = options.agentDir ?? getAgentDir();
|
|
83
84
|
const paths: Array<{ path: string; source: CustomCommandSource }> = [];
|
|
@@ -93,25 +94,27 @@ export function discoverCustomCommands(options: DiscoverCustomCommandsOptions =
|
|
|
93
94
|
const commandDirs: Array<{ path: string; source: CustomCommandSource }> = [];
|
|
94
95
|
if (agentDir) {
|
|
95
96
|
const userCommandsDir = path.join(agentDir, "commands");
|
|
96
|
-
if (existsSync(userCommandsDir)) {
|
|
97
|
+
if (fs.existsSync(userCommandsDir)) {
|
|
97
98
|
commandDirs.push({ path: userCommandsDir, source: "user" });
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
for (const entry of getConfigDirs("commands", { cwd, existingOnly: true })) {
|
|
102
103
|
const source = entry.level === "user" ? "user" : "project";
|
|
103
|
-
if (!commandDirs.some(
|
|
104
|
+
if (!commandDirs.some(d => d.path === entry.path)) {
|
|
104
105
|
commandDirs.push({ path: entry.path, source });
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
108
|
|
|
108
109
|
const indexCandidates = ["index.ts", "index.js", "index.mjs", "index.cjs"];
|
|
109
110
|
for (const { path: commandsDir, source } of commandDirs) {
|
|
110
|
-
let entries: Dirent[];
|
|
111
|
+
let entries: fs.Dirent[];
|
|
111
112
|
try {
|
|
112
|
-
entries =
|
|
113
|
+
entries = await fs.promises.readdir(commandsDir, { withFileTypes: true });
|
|
113
114
|
} catch (error) {
|
|
114
|
-
|
|
115
|
+
if (!isEnoent(error)) {
|
|
116
|
+
logger.warn("Failed to read custom commands directory", { path: commandsDir, error: String(error) });
|
|
117
|
+
}
|
|
115
118
|
continue;
|
|
116
119
|
}
|
|
117
120
|
for (const entry of entries) {
|
|
@@ -120,7 +123,7 @@ export function discoverCustomCommands(options: DiscoverCustomCommandsOptions =
|
|
|
120
123
|
|
|
121
124
|
for (const filename of indexCandidates) {
|
|
122
125
|
const candidate = path.join(commandDir, filename);
|
|
123
|
-
if (existsSync(candidate)) {
|
|
126
|
+
if (fs.existsSync(candidate)) {
|
|
124
127
|
addPath(candidate, source);
|
|
125
128
|
break;
|
|
126
129
|
}
|
|
@@ -162,7 +165,7 @@ export async function loadCustomCommands(options: LoadCustomCommandsOptions = {}
|
|
|
162
165
|
const cwd = options.cwd ?? process.cwd();
|
|
163
166
|
const agentDir = options.agentDir ?? getAgentDir();
|
|
164
167
|
|
|
165
|
-
const { paths } = discoverCustomCommands({ cwd, agentDir });
|
|
168
|
+
const { paths } = await discoverCustomCommands({ cwd, agentDir });
|
|
166
169
|
|
|
167
170
|
const commands: LoadedCustomCommand[] = [];
|
|
168
171
|
const errors: Array<{ path: string; error: string }> = [];
|
|
@@ -195,7 +198,7 @@ export async function loadCustomCommands(options: LoadCustomCommandsOptions = {}
|
|
|
195
198
|
if (loadedCommands) {
|
|
196
199
|
for (const command of loadedCommands) {
|
|
197
200
|
// Allow overriding bundled commands, but not user/project conflicts
|
|
198
|
-
const existingIdx = commands.findIndex(
|
|
201
|
+
const existingIdx = commands.findIndex(c => c.command.name === command.name);
|
|
199
202
|
if (existingIdx !== -1) {
|
|
200
203
|
const existing = commands[existingIdx];
|
|
201
204
|
if (existing.source === "bundled") {
|
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
* Unlike markdown commands which expand to prompts, custom commands can execute
|
|
6
6
|
* arbitrary logic with full access to the hook context.
|
|
7
7
|
*/
|
|
8
|
-
|
|
9
|
-
import type { ExecOptions, ExecResult, HookCommandContext } from "@oh-my-pi/pi-coding-agent/extensibility/hooks/types";
|
|
8
|
+
import type { ExecOptions, ExecResult, HookCommandContext } from "../../extensibility/hooks/types";
|
|
10
9
|
|
|
11
10
|
// Re-export for custom commands to use
|
|
12
11
|
export type { ExecOptions, ExecResult, HookCommandContext };
|
|
@@ -23,7 +22,7 @@ export interface CustomCommandAPI {
|
|
|
23
22
|
/** Injected @sinclair/typebox module */
|
|
24
23
|
typebox: typeof import("@sinclair/typebox");
|
|
25
24
|
/** Injected pi-coding-agent exports */
|
|
26
|
-
pi: typeof import("
|
|
25
|
+
pi: typeof import("../..");
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
/**
|