@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/sdk.ts
CHANGED
|
@@ -25,31 +25,26 @@
|
|
|
25
25
|
* });
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
|
|
29
|
-
import
|
|
30
|
-
import { rename } from "node:fs/promises";
|
|
31
|
-
import { join } from "node:path";
|
|
28
|
+
import * as fs from "node:fs";
|
|
29
|
+
import * as path from "node:path";
|
|
32
30
|
import { Agent, type AgentEvent, type AgentMessage, type AgentTool, type ThinkingLevel } from "@oh-my-pi/pi-agent-core";
|
|
33
31
|
import { type Message, type Model, supportsXhigh } from "@oh-my-pi/pi-ai";
|
|
34
|
-
// Import discovery to register all providers on startup
|
|
35
|
-
import { loadCapability } from "@oh-my-pi/pi-coding-agent/capability";
|
|
36
|
-
import { type Rule, ruleCapability } from "@oh-my-pi/pi-coding-agent/capability/rule";
|
|
37
|
-
import { getAgentDir, getConfigDirPaths } from "@oh-my-pi/pi-coding-agent/config";
|
|
38
|
-
import { CursorExecHandlers } from "@oh-my-pi/pi-coding-agent/cursor";
|
|
39
|
-
import { initializeWithSettings } from "@oh-my-pi/pi-coding-agent/discovery";
|
|
40
|
-
import { TtsrManager } from "@oh-my-pi/pi-coding-agent/export/ttsr";
|
|
41
|
-
import { disposeAllKernelSessions } from "@oh-my-pi/pi-coding-agent/ipy/executor";
|
|
42
|
-
import { closeAllConnections } from "@oh-my-pi/pi-coding-agent/ssh/connection-manager";
|
|
43
|
-
import { unmountAll } from "@oh-my-pi/pi-coding-agent/ssh/sshfs-mount";
|
|
44
32
|
import type { Component } from "@oh-my-pi/pi-tui";
|
|
45
33
|
import { logger, postmortem } from "@oh-my-pi/pi-utils";
|
|
46
34
|
import { YAML } from "bun";
|
|
47
35
|
import chalk from "chalk";
|
|
36
|
+
// Import discovery to register all providers on startup
|
|
37
|
+
import { loadCapability } from "./capability";
|
|
38
|
+
import { type Rule, ruleCapability } from "./capability/rule";
|
|
39
|
+
import { getAgentDir, getConfigDirPaths } from "./config";
|
|
48
40
|
import { ModelRegistry } from "./config/model-registry";
|
|
49
41
|
import { formatModelString, parseModelString } from "./config/model-resolver";
|
|
50
42
|
import { loadPromptTemplates as loadPromptTemplatesInternal, type PromptTemplate } from "./config/prompt-templates";
|
|
51
43
|
import { type Settings, SettingsManager, type SkillsSettings } from "./config/settings-manager";
|
|
44
|
+
import { CursorExecHandlers } from "./cursor";
|
|
52
45
|
import "./discovery";
|
|
46
|
+
import { initializeWithSettings } from "./discovery";
|
|
47
|
+
import { TtsrManager } from "./export/ttsr";
|
|
53
48
|
import {
|
|
54
49
|
type CustomCommandsLoadResult,
|
|
55
50
|
loadCustomCommands as loadCustomCommandsInternal,
|
|
@@ -77,12 +72,15 @@ import {
|
|
|
77
72
|
RuleProtocolHandler,
|
|
78
73
|
SkillProtocolHandler,
|
|
79
74
|
} from "./internal-urls";
|
|
75
|
+
import { disposeAllKernelSessions } from "./ipy/executor";
|
|
80
76
|
import { discoverAndLoadMCPTools, type MCPManager, type MCPToolsLoadResult } from "./mcp";
|
|
81
77
|
import { AgentSession } from "./session/agent-session";
|
|
82
78
|
import { AuthStorage } from "./session/auth-storage";
|
|
83
79
|
import { convertToLlm } from "./session/messages";
|
|
84
80
|
import { SessionManager } from "./session/session-manager";
|
|
85
81
|
import { migrateJsonStorage } from "./session/storage-migration";
|
|
82
|
+
import { closeAllConnections } from "./ssh/connection-manager";
|
|
83
|
+
import { unmountAll } from "./ssh/sshfs-mount";
|
|
86
84
|
import {
|
|
87
85
|
buildSystemPrompt as buildSystemPromptInternal,
|
|
88
86
|
loadProjectContextFiles as loadContextFilesInternal,
|
|
@@ -205,22 +203,19 @@ export interface CreateAgentSessionResult {
|
|
|
205
203
|
|
|
206
204
|
// Re-exports
|
|
207
205
|
|
|
208
|
-
export type { PromptTemplate } from "
|
|
209
|
-
export type { Settings, SkillsSettings } from "
|
|
210
|
-
export type {
|
|
211
|
-
|
|
212
|
-
CustomCommandFactory,
|
|
213
|
-
} from "@oh-my-pi/pi-coding-agent/extensibility/custom-commands/types";
|
|
214
|
-
export type { CustomTool, CustomToolFactory } from "@oh-my-pi/pi-coding-agent/extensibility/custom-tools/types";
|
|
206
|
+
export type { PromptTemplate } from "./config/prompt-templates";
|
|
207
|
+
export type { Settings, SkillsSettings } from "./config/settings-manager";
|
|
208
|
+
export type { CustomCommand, CustomCommandFactory } from "./extensibility/custom-commands/types";
|
|
209
|
+
export type { CustomTool, CustomToolFactory } from "./extensibility/custom-tools/types";
|
|
215
210
|
export type {
|
|
216
211
|
ExtensionAPI,
|
|
217
212
|
ExtensionCommandContext,
|
|
218
213
|
ExtensionContext,
|
|
219
214
|
ExtensionFactory,
|
|
220
215
|
ToolDefinition,
|
|
221
|
-
} from "
|
|
222
|
-
export type { Skill } from "
|
|
223
|
-
export type { FileSlashCommand } from "
|
|
216
|
+
} from "./extensibility/extensions";
|
|
217
|
+
export type { Skill } from "./extensibility/skills";
|
|
218
|
+
export type { FileSlashCommand } from "./extensibility/slash-commands";
|
|
224
219
|
export type { MCPManager, MCPServerConfig, MCPServerConnection, MCPToolsLoadResult } from "./mcp";
|
|
225
220
|
export type { Tool } from "./tools";
|
|
226
221
|
|
|
@@ -254,17 +249,17 @@ function getDefaultAgentDir(): string {
|
|
|
254
249
|
* Reads from primary path first, then falls back to legacy paths (.pi, .claude).
|
|
255
250
|
*/
|
|
256
251
|
export async function discoverAuthStorage(agentDir: string = getDefaultAgentDir()): Promise<AuthStorage> {
|
|
257
|
-
const primaryPath = join(agentDir, "auth.json");
|
|
252
|
+
const primaryPath = path.join(agentDir, "auth.json");
|
|
258
253
|
// Get all auth.json paths (user-level only), excluding the primary
|
|
259
254
|
const allPaths = getConfigDirPaths("auth.json", { project: false });
|
|
260
|
-
const fallbackPaths = allPaths.filter(
|
|
255
|
+
const fallbackPaths = allPaths.filter(p => p !== primaryPath);
|
|
261
256
|
|
|
262
257
|
logger.debug("discoverAuthStorage", { agentDir, primaryPath, allPaths, fallbackPaths });
|
|
263
258
|
|
|
264
259
|
// Migrate legacy JSON files (settings.json, auth.json) to SQLite before loading
|
|
265
260
|
await migrateJsonStorage({
|
|
266
261
|
agentDir,
|
|
267
|
-
settingsPath: join(agentDir, "settings.json"),
|
|
262
|
+
settingsPath: path.join(agentDir, "settings.json"),
|
|
268
263
|
authPaths: [primaryPath, ...fallbackPaths],
|
|
269
264
|
});
|
|
270
265
|
|
|
@@ -278,48 +273,52 @@ export async function discoverAuthStorage(agentDir: string = getDefaultAgentDir(
|
|
|
278
273
|
* Prefers models.yml over models.json. Reads from primary path first,
|
|
279
274
|
* then falls back to legacy paths (.pi, .claude).
|
|
280
275
|
*/
|
|
281
|
-
export
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
276
|
+
export function discoverModels(authStorage: AuthStorage, agentDir: string = getDefaultAgentDir()): ModelRegistry {
|
|
277
|
+
const yamlPath = path.join(agentDir, "models.yml");
|
|
278
|
+
const jsonPath = path.join(agentDir, "models.json");
|
|
279
|
+
|
|
280
|
+
// Check existence of yaml and json files
|
|
281
|
+
let yamlExists = fs.existsSync(yamlPath);
|
|
282
|
+
let jsonExists = fs.existsSync(jsonPath);
|
|
287
283
|
|
|
288
284
|
// Migrate models.json to models.yml if yaml doesn't exist but json does
|
|
289
|
-
if (!
|
|
290
|
-
|
|
285
|
+
if (!yamlExists && jsonExists) {
|
|
286
|
+
migrateModelsJsonToYaml(jsonPath, yamlPath);
|
|
287
|
+
yamlExists = fs.existsSync(yamlPath);
|
|
288
|
+
jsonExists = fs.existsSync(jsonPath);
|
|
291
289
|
}
|
|
292
290
|
|
|
293
291
|
// Prefer models.yml, fall back to models.json
|
|
294
|
-
const primaryPath =
|
|
292
|
+
const primaryPath = yamlExists ? yamlPath : jsonPath;
|
|
295
293
|
|
|
296
294
|
// Get all models config paths (user-level only), excluding the primary
|
|
297
295
|
const yamlPaths = getConfigDirPaths("models.yml", { project: false });
|
|
298
296
|
const jsonPaths = getConfigDirPaths("models.json", { project: false });
|
|
299
297
|
const allPaths = [...yamlPaths, ...jsonPaths];
|
|
300
|
-
const
|
|
298
|
+
const existenceResults = allPaths.map(p => {
|
|
299
|
+
return { p, exists: fs.existsSync(p) };
|
|
300
|
+
});
|
|
301
|
+
const fallbackPaths = existenceResults.filter(({ p, exists }) => p !== primaryPath && exists).map(({ p }) => p);
|
|
301
302
|
|
|
302
303
|
logger.debug("discoverModels", { primaryPath, fallbackPaths });
|
|
303
|
-
|
|
304
|
-
const registry = new ModelRegistry(authStorage, primaryPath, fallbackPaths);
|
|
305
|
-
registry.refresh();
|
|
306
|
-
return registry;
|
|
304
|
+
return new ModelRegistry(authStorage, primaryPath, fallbackPaths);
|
|
307
305
|
}
|
|
308
306
|
|
|
309
307
|
/**
|
|
310
308
|
* Migrate models.json to models.yml.
|
|
311
309
|
* Creates models.yml from models.json and renames the json file to .bak.
|
|
312
310
|
*/
|
|
313
|
-
|
|
311
|
+
function migrateModelsJsonToYaml(jsonPath: string, yamlPath: string): void {
|
|
314
312
|
try {
|
|
315
|
-
const content =
|
|
313
|
+
const content = fs.readFileSync(jsonPath, "utf-8");
|
|
316
314
|
const parsed = JSON.parse(content);
|
|
317
315
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
318
316
|
logger.warn("migrateModelsJsonToYaml: invalid models.json structure", { path: jsonPath });
|
|
319
317
|
return;
|
|
320
318
|
}
|
|
321
|
-
|
|
322
|
-
|
|
319
|
+
fs.mkdirSync(path.dirname(yamlPath), { recursive: true });
|
|
320
|
+
fs.writeFileSync(yamlPath, YAML.stringify(parsed, null, 2));
|
|
321
|
+
fs.renameSync(jsonPath, `${jsonPath}.bak`);
|
|
323
322
|
logger.debug("migrateModelsJsonToYaml: migrated models.json to models.yml", { from: jsonPath, to: yamlPath });
|
|
324
323
|
} catch (error) {
|
|
325
324
|
logger.warn("migrateModelsJsonToYaml: migration failed", { error: String(error) });
|
|
@@ -524,7 +523,7 @@ function customToolToDefinition(tool: CustomTool): ToolDefinition {
|
|
|
524
523
|
}
|
|
525
524
|
|
|
526
525
|
function createCustomToolsExtension(tools: CustomTool[]): ExtensionFactory {
|
|
527
|
-
return
|
|
526
|
+
return api => {
|
|
528
527
|
for (const tool of tools) {
|
|
529
528
|
api.registerTool(customToolToDefinition(tool));
|
|
530
529
|
}
|
|
@@ -601,7 +600,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
601
600
|
|
|
602
601
|
// Use provided or create AuthStorage and ModelRegistry
|
|
603
602
|
const authStorage = options.authStorage ?? (await discoverAuthStorage(agentDir));
|
|
604
|
-
const modelRegistry = options.modelRegistry ??
|
|
603
|
+
const modelRegistry = options.modelRegistry ?? discoverModels(authStorage, agentDir);
|
|
605
604
|
time("discoverModels");
|
|
606
605
|
|
|
607
606
|
const settingsManager = options.settingsManager ?? (await SettingsManager.create(cwd, agentDir));
|
|
@@ -659,9 +658,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
659
658
|
if (!model) {
|
|
660
659
|
const allModels = modelRegistry.getAll();
|
|
661
660
|
const keyResults = await Promise.all(
|
|
662
|
-
allModels.map(async
|
|
661
|
+
allModels.map(async m => ({ model: m, hasKey: !!(await modelRegistry.getApiKey(m, sessionId)) })),
|
|
663
662
|
);
|
|
664
|
-
model = keyResults.find(
|
|
663
|
+
model = keyResults.find(r => r.hasKey)?.model;
|
|
665
664
|
time("findAvailableModel");
|
|
666
665
|
if (model) {
|
|
667
666
|
if (modelFallbackMessage) {
|
|
@@ -784,7 +783,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
784
783
|
const customTools: CustomTool[] = [];
|
|
785
784
|
if (enableMCP) {
|
|
786
785
|
const mcpResult = await discoverAndLoadMCPTools(cwd, {
|
|
787
|
-
onConnecting:
|
|
786
|
+
onConnecting: serverNames => {
|
|
788
787
|
if (options.hasUI && serverNames.length > 0) {
|
|
789
788
|
process.stderr.write(
|
|
790
789
|
chalk.gray(`Connecting to MCP servers: ${serverNames.join(", ")}...
|
|
@@ -813,7 +812,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
813
812
|
|
|
814
813
|
if (mcpResult.tools.length > 0) {
|
|
815
814
|
// MCP tools are LoadedCustomTool, extract the tool property
|
|
816
|
-
customTools.push(...mcpResult.tools.map(
|
|
815
|
+
customTools.push(...mcpResult.tools.map(loaded => loaded.tool));
|
|
817
816
|
}
|
|
818
817
|
}
|
|
819
818
|
|
|
@@ -832,7 +831,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
832
831
|
enableCompany: exaSettings.enableCompany,
|
|
833
832
|
});
|
|
834
833
|
// Filter out the base web_search (already in built-in tools), add specialized Exa tools
|
|
835
|
-
const specializedTools = exaWebSearchTools.filter(
|
|
834
|
+
const specializedTools = exaWebSearchTools.filter(t => t.name !== "web_search");
|
|
836
835
|
if (specializedTools.length > 0) {
|
|
837
836
|
customTools.push(...specializedTools);
|
|
838
837
|
}
|
|
@@ -922,7 +921,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
922
921
|
const registeredTools = extensionRunner?.getAllRegisteredTools() ?? [];
|
|
923
922
|
const allCustomTools = [
|
|
924
923
|
...registeredTools,
|
|
925
|
-
...(options.customTools?.map(
|
|
924
|
+
...(options.customTools?.map(tool => {
|
|
926
925
|
const definition = isCustomTool(tool) ? customToolToDefinition(tool) : tool;
|
|
927
926
|
return { definition, extensionPath: "<sdk>" };
|
|
928
927
|
}) ?? []),
|
|
@@ -952,7 +951,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
952
951
|
cwd,
|
|
953
952
|
tools: toolRegistry,
|
|
954
953
|
getToolContext: () => toolContextStore.getContext(),
|
|
955
|
-
emitEvent:
|
|
954
|
+
emitEvent: event => cursorEventEmitter?.(event),
|
|
956
955
|
});
|
|
957
956
|
|
|
958
957
|
const rebuildSystemPrompt = async (toolNames: string[], tools: Map<string, AgentTool>): Promise<string> => {
|
|
@@ -1002,16 +1001,14 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
1002
1001
|
return converted;
|
|
1003
1002
|
}
|
|
1004
1003
|
// Filter out ImageContent from all messages, replacing with text placeholder
|
|
1005
|
-
return converted.map(
|
|
1004
|
+
return converted.map(msg => {
|
|
1006
1005
|
if (msg.role === "user" || msg.role === "toolResult") {
|
|
1007
1006
|
const content = msg.content;
|
|
1008
1007
|
if (Array.isArray(content)) {
|
|
1009
|
-
const hasImages = content.some(
|
|
1008
|
+
const hasImages = content.some(c => c.type === "image");
|
|
1010
1009
|
if (hasImages) {
|
|
1011
1010
|
const filteredContent = content
|
|
1012
|
-
.map((c)
|
|
1013
|
-
c.type === "image" ? { type: "text" as const, text: "Image reading is disabled." } : c,
|
|
1014
|
-
)
|
|
1011
|
+
.map(c => (c.type === "image" ? { type: "text" as const, text: "Image reading is disabled." } : c))
|
|
1015
1012
|
.filter(
|
|
1016
1013
|
(c, i, arr) =>
|
|
1017
1014
|
// Dedupe consecutive "Image reading is disabled." texts
|
|
@@ -1045,7 +1042,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
1045
1042
|
convertToLlm: convertToLlmWithBlockImages,
|
|
1046
1043
|
sessionId: sessionManager.getSessionId(),
|
|
1047
1044
|
transformContext: extensionRunner
|
|
1048
|
-
? async
|
|
1045
|
+
? async messages => {
|
|
1049
1046
|
return extensionRunner.emitContext(messages);
|
|
1050
1047
|
}
|
|
1051
1048
|
: undefined,
|
|
@@ -1053,7 +1050,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
1053
1050
|
followUpMode: settingsManager.getFollowUpMode(),
|
|
1054
1051
|
interruptMode: settingsManager.getInterruptMode(),
|
|
1055
1052
|
thinkingBudgets: settingsManager.getThinkingBudgets(),
|
|
1056
|
-
getToolContext:
|
|
1053
|
+
getToolContext: tc => toolContextStore.getContext(tc),
|
|
1057
1054
|
getApiKey: async () => {
|
|
1058
1055
|
const currentModel = agent.state.model;
|
|
1059
1056
|
if (!currentModel) {
|
|
@@ -1067,7 +1064,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
1067
1064
|
},
|
|
1068
1065
|
cursorExecHandlers,
|
|
1069
1066
|
});
|
|
1070
|
-
cursorEventEmitter =
|
|
1067
|
+
cursorEventEmitter = event => agent.emitExternalEvent(event);
|
|
1071
1068
|
time("createAgent");
|
|
1072
1069
|
|
|
1073
1070
|
// Restore messages if session has existing data
|
|
@@ -1105,7 +1102,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
|
|
|
1105
1102
|
if (enableLsp && settingsManager.getLspDiagnosticsOnWrite()) {
|
|
1106
1103
|
try {
|
|
1107
1104
|
const result = await warmupLspServers(cwd, {
|
|
1108
|
-
onConnecting:
|
|
1105
|
+
onConnecting: serverNames => {
|
|
1109
1106
|
if (options.hasUI && serverNames.length > 0) {
|
|
1110
1107
|
process.stderr.write(chalk.gray(`Starting LSP servers: ${serverNames.join(", ")}...\n`));
|
|
1111
1108
|
}
|