@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
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jupyter CLI command handlers.
|
|
3
|
+
*
|
|
4
|
+
* Handles `omp jupyter` subcommand for managing the shared Python gateway.
|
|
5
|
+
*/
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { APP_NAME } from "../config";
|
|
8
|
+
import { getGatewayStatus, shutdownSharedGateway } from "../ipy/gateway-coordinator";
|
|
9
|
+
|
|
10
|
+
export type JupyterAction = "kill" | "status";
|
|
11
|
+
|
|
12
|
+
export interface JupyterCommandArgs {
|
|
13
|
+
action: JupyterAction;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function parseJupyterArgs(args: string[]): JupyterCommandArgs | undefined {
|
|
17
|
+
if (args.length === 0 || args[0] !== "jupyter") {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const action = args[1] as JupyterAction | undefined;
|
|
22
|
+
if (!action || !["kill", "status"].includes(action)) {
|
|
23
|
+
return { action: "status" };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return { action };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function runJupyterCommand(cmd: JupyterCommandArgs): Promise<void> {
|
|
30
|
+
switch (cmd.action) {
|
|
31
|
+
case "kill":
|
|
32
|
+
await runKill();
|
|
33
|
+
break;
|
|
34
|
+
case "status":
|
|
35
|
+
await runStatus();
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function runKill(): Promise<void> {
|
|
41
|
+
const status = await getGatewayStatus();
|
|
42
|
+
|
|
43
|
+
if (!status.active) {
|
|
44
|
+
console.log(chalk.dim("No Jupyter gateway is running"));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
console.log(`Killing Jupyter gateway (PID ${status.pid})...`);
|
|
49
|
+
await shutdownSharedGateway();
|
|
50
|
+
console.log(chalk.green("Jupyter gateway stopped"));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function runStatus(): Promise<void> {
|
|
54
|
+
const status = await getGatewayStatus();
|
|
55
|
+
|
|
56
|
+
if (!status.active) {
|
|
57
|
+
console.log(chalk.dim("No Jupyter gateway is running"));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
console.log(chalk.bold("Jupyter Gateway Status\n"));
|
|
62
|
+
console.log(` ${chalk.green("●")} Running`);
|
|
63
|
+
console.log(` PID: ${status.pid}`);
|
|
64
|
+
console.log(` URL: ${status.url}`);
|
|
65
|
+
if (status.uptime !== null) {
|
|
66
|
+
console.log(` Uptime: ${formatUptime(status.uptime)}`);
|
|
67
|
+
}
|
|
68
|
+
if (status.pythonPath) {
|
|
69
|
+
console.log(` Python: ${status.pythonPath}`);
|
|
70
|
+
}
|
|
71
|
+
if (status.venvPath) {
|
|
72
|
+
console.log(` Venv: ${status.venvPath}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function formatUptime(ms: number): string {
|
|
77
|
+
const seconds = Math.floor(ms / 1000);
|
|
78
|
+
const minutes = Math.floor(seconds / 60);
|
|
79
|
+
const hours = Math.floor(minutes / 60);
|
|
80
|
+
|
|
81
|
+
if (hours > 0) {
|
|
82
|
+
return `${hours}h ${minutes % 60}m`;
|
|
83
|
+
}
|
|
84
|
+
if (minutes > 0) {
|
|
85
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
86
|
+
}
|
|
87
|
+
return `${seconds}s`;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function printJupyterHelp(): void {
|
|
91
|
+
console.log(`${chalk.bold(`${APP_NAME} jupyter`)} - Manage the shared Jupyter gateway
|
|
92
|
+
|
|
93
|
+
${chalk.bold("Usage:")}
|
|
94
|
+
${APP_NAME} jupyter <command>
|
|
95
|
+
|
|
96
|
+
${chalk.bold("Commands:")}
|
|
97
|
+
status Show gateway status (default)
|
|
98
|
+
kill Stop the running gateway
|
|
99
|
+
|
|
100
|
+
${chalk.bold("Examples:")}
|
|
101
|
+
${APP_NAME} jupyter # Show status
|
|
102
|
+
${APP_NAME} jupyter status # Show status
|
|
103
|
+
${APP_NAME} jupyter kill # Stop the gateway
|
|
104
|
+
`);
|
|
105
|
+
}
|
package/src/cli/list-models.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* List available models with optional fuzzy search
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
4
|
import type { Api, Model } from "@oh-my-pi/pi-ai";
|
|
6
|
-
import type { ModelRegistry } from "
|
|
7
|
-
import { fuzzyFilter } from "
|
|
5
|
+
import type { ModelRegistry } from "../config/model-registry";
|
|
6
|
+
import { fuzzyFilter } from "../utils/fuzzy";
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* Format a number as human-readable (e.g., 200000 -> "200K", 1000000 -> "1M")
|
|
@@ -35,7 +34,7 @@ export async function listModels(modelRegistry: ModelRegistry, searchPattern?: s
|
|
|
35
34
|
// Apply fuzzy filter if search pattern provided
|
|
36
35
|
let filteredModels: Model<Api>[] = models;
|
|
37
36
|
if (searchPattern) {
|
|
38
|
-
filteredModels = fuzzyFilter(models, searchPattern,
|
|
37
|
+
filteredModels = fuzzyFilter(models, searchPattern, m => `${m.provider} ${m.id}`);
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
if (filteredModels.length === 0) {
|
|
@@ -51,7 +50,7 @@ export async function listModels(modelRegistry: ModelRegistry, searchPattern?: s
|
|
|
51
50
|
});
|
|
52
51
|
|
|
53
52
|
// Calculate column widths
|
|
54
|
-
const rows = filteredModels.map(
|
|
53
|
+
const rows = filteredModels.map(m => ({
|
|
55
54
|
provider: m.provider,
|
|
56
55
|
model: m.id,
|
|
57
56
|
context: formatTokenCount(m.contextWindow),
|
|
@@ -70,12 +69,12 @@ export async function listModels(modelRegistry: ModelRegistry, searchPattern?: s
|
|
|
70
69
|
};
|
|
71
70
|
|
|
72
71
|
const widths = {
|
|
73
|
-
provider: Math.max(headers.provider.length, ...rows.map(
|
|
74
|
-
model: Math.max(headers.model.length, ...rows.map(
|
|
75
|
-
context: Math.max(headers.context.length, ...rows.map(
|
|
76
|
-
maxOut: Math.max(headers.maxOut.length, ...rows.map(
|
|
77
|
-
thinking: Math.max(headers.thinking.length, ...rows.map(
|
|
78
|
-
images: Math.max(headers.images.length, ...rows.map(
|
|
72
|
+
provider: Math.max(headers.provider.length, ...rows.map(r => r.provider.length)),
|
|
73
|
+
model: Math.max(headers.model.length, ...rows.map(r => r.model.length)),
|
|
74
|
+
context: Math.max(headers.context.length, ...rows.map(r => r.context.length)),
|
|
75
|
+
maxOut: Math.max(headers.maxOut.length, ...rows.map(r => r.maxOut.length)),
|
|
76
|
+
thinking: Math.max(headers.thinking.length, ...rows.map(r => r.thinking.length)),
|
|
77
|
+
images: Math.max(headers.images.length, ...rows.map(r => r.images.length)),
|
|
79
78
|
};
|
|
80
79
|
|
|
81
80
|
// Print header
|
package/src/cli/plugin-cli.ts
CHANGED
|
@@ -3,15 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles `omp plugin <command>` subcommands for plugin lifecycle management.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { APP_NAME } from "@oh-my-pi/pi-coding-agent/config";
|
|
8
|
-
import {
|
|
9
|
-
PluginManager,
|
|
10
|
-
parseSettingValue,
|
|
11
|
-
validateSetting,
|
|
12
|
-
} from "@oh-my-pi/pi-coding-agent/extensibility/plugins/index";
|
|
13
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
14
6
|
import chalk from "chalk";
|
|
7
|
+
import { APP_NAME } from "../config";
|
|
8
|
+
import { PluginManager, parseSettingValue, validateSetting } from "../extensibility/plugins";
|
|
9
|
+
import { theme } from "../modes/theme/theme";
|
|
15
10
|
|
|
16
11
|
// =============================================================================
|
|
17
12
|
// Types
|
|
@@ -251,7 +246,7 @@ async function handleList(manager: PluginManager, flags: { json?: boolean }): Pr
|
|
|
251
246
|
if (availableFeatures.length > 0) {
|
|
252
247
|
const enabledSet = new Set(plugin.enabledFeatures ?? []);
|
|
253
248
|
const featureDisplay = availableFeatures
|
|
254
|
-
.map(
|
|
249
|
+
.map(f => (enabledSet.has(f) ? chalk.green(f) : chalk.dim(f)))
|
|
255
250
|
.join(", ");
|
|
256
251
|
console.log(chalk.dim(` Available: [${featureDisplay}]`));
|
|
257
252
|
}
|
|
@@ -302,10 +297,10 @@ async function handleDoctor(manager: PluginManager, flags: { json?: boolean; fix
|
|
|
302
297
|
}
|
|
303
298
|
}
|
|
304
299
|
|
|
305
|
-
const errors = checks.filter(
|
|
306
|
-
const warnings = checks.filter(
|
|
307
|
-
const ok = checks.filter(
|
|
308
|
-
const fixed = checks.filter(
|
|
300
|
+
const errors = checks.filter(c => c.status === "error" && !c.fixed).length;
|
|
301
|
+
const warnings = checks.filter(c => c.status === "warning" && !c.fixed).length;
|
|
302
|
+
const ok = checks.filter(c => c.status === "ok").length;
|
|
303
|
+
const fixed = checks.filter(c => c.fixed).length;
|
|
309
304
|
|
|
310
305
|
console.log("");
|
|
311
306
|
console.log(`Summary: ${ok} ok, ${warnings} warnings, ${errors} errors${fixed > 0 ? `, ${fixed} fixed` : ""}`);
|
|
@@ -332,7 +327,7 @@ async function handleFeatures(
|
|
|
332
327
|
|
|
333
328
|
const pluginName = args[0];
|
|
334
329
|
const plugins = await manager.list();
|
|
335
|
-
const plugin = plugins.find(
|
|
330
|
+
const plugin = plugins.find(p => p.name === pluginName);
|
|
336
331
|
|
|
337
332
|
if (!plugin) {
|
|
338
333
|
console.error(chalk.red(`Plugin "${pluginName}" not found`));
|
|
@@ -341,21 +336,21 @@ async function handleFeatures(
|
|
|
341
336
|
|
|
342
337
|
// Handle modifications
|
|
343
338
|
if (flags.enable || flags.disable || flags.set) {
|
|
344
|
-
let currentFeatures = new Set(manager.getEnabledFeatures(pluginName) ?? []);
|
|
339
|
+
let currentFeatures = new Set((await manager.getEnabledFeatures(pluginName)) ?? []);
|
|
345
340
|
|
|
346
341
|
if (flags.set) {
|
|
347
342
|
// --set replaces all features
|
|
348
343
|
currentFeatures = new Set(
|
|
349
344
|
flags.set
|
|
350
345
|
.split(",")
|
|
351
|
-
.map(
|
|
346
|
+
.map(f => f.trim())
|
|
352
347
|
.filter(Boolean),
|
|
353
348
|
);
|
|
354
349
|
} else {
|
|
355
350
|
if (flags.enable) {
|
|
356
351
|
for (const f of flags.enable
|
|
357
352
|
.split(",")
|
|
358
|
-
.map(
|
|
353
|
+
.map(f => f.trim())
|
|
359
354
|
.filter(Boolean)) {
|
|
360
355
|
currentFeatures.add(f);
|
|
361
356
|
}
|
|
@@ -363,7 +358,7 @@ async function handleFeatures(
|
|
|
363
358
|
if (flags.disable) {
|
|
364
359
|
for (const f of flags.disable
|
|
365
360
|
.split(",")
|
|
366
|
-
.map(
|
|
361
|
+
.map(f => f.trim())
|
|
367
362
|
.filter(Boolean)) {
|
|
368
363
|
currentFeatures.delete(f);
|
|
369
364
|
}
|
|
@@ -375,7 +370,7 @@ async function handleFeatures(
|
|
|
375
370
|
}
|
|
376
371
|
|
|
377
372
|
// Display current state
|
|
378
|
-
const updatedFeatures = manager.getEnabledFeatures(pluginName);
|
|
373
|
+
const updatedFeatures = await manager.getEnabledFeatures(pluginName);
|
|
379
374
|
|
|
380
375
|
if (flags.json) {
|
|
381
376
|
console.log(
|
|
@@ -437,7 +432,7 @@ async function handleConfig(
|
|
|
437
432
|
}
|
|
438
433
|
|
|
439
434
|
const plugins = await manager.list();
|
|
440
|
-
const plugin = plugins.find(
|
|
435
|
+
const plugin = plugins.find(p => p.name === pluginName);
|
|
441
436
|
|
|
442
437
|
if (!plugin) {
|
|
443
438
|
console.error(chalk.red(`Plugin "${pluginName}" not found`));
|
|
@@ -446,7 +441,7 @@ async function handleConfig(
|
|
|
446
441
|
|
|
447
442
|
switch (subcommand) {
|
|
448
443
|
case "list": {
|
|
449
|
-
const settings = manager.getPluginSettings(pluginName);
|
|
444
|
+
const settings = await manager.getPluginSettings(pluginName);
|
|
450
445
|
const schema = plugin.manifest.settings || {};
|
|
451
446
|
|
|
452
447
|
if (flags.json) {
|
|
@@ -481,7 +476,7 @@ async function handleConfig(
|
|
|
481
476
|
process.exit(1);
|
|
482
477
|
}
|
|
483
478
|
|
|
484
|
-
const settings = manager.getPluginSettings(pluginName);
|
|
479
|
+
const settings = await manager.getPluginSettings(pluginName);
|
|
485
480
|
const schema = plugin.manifest.settings?.[key];
|
|
486
481
|
const value = settings[key] ?? schema?.default;
|
|
487
482
|
|
|
@@ -516,7 +511,7 @@ async function handleConfig(
|
|
|
516
511
|
}
|
|
517
512
|
}
|
|
518
513
|
|
|
519
|
-
manager.setPluginSetting(pluginName, key, value);
|
|
514
|
+
await manager.setPluginSetting(pluginName, key, value);
|
|
520
515
|
console.log(chalk.green(`${theme.status.success} Set ${key}`));
|
|
521
516
|
break;
|
|
522
517
|
}
|
|
@@ -527,7 +522,7 @@ async function handleConfig(
|
|
|
527
522
|
process.exit(1);
|
|
528
523
|
}
|
|
529
524
|
|
|
530
|
-
manager.deletePluginSetting(pluginName, key);
|
|
525
|
+
await manager.deletePluginSetting(pluginName, key);
|
|
531
526
|
console.log(chalk.green(`${theme.status.success} Deleted ${key}`));
|
|
532
527
|
break;
|
|
533
528
|
}
|
|
@@ -544,7 +539,7 @@ async function handleConfigValidate(manager: PluginManager, flags: { json?: bool
|
|
|
544
539
|
const results: Array<{ plugin: string; key: string; error: string }> = [];
|
|
545
540
|
|
|
546
541
|
for (const plugin of plugins) {
|
|
547
|
-
const settings = manager.getPluginSettings(plugin.name);
|
|
542
|
+
const settings = await manager.getPluginSettings(plugin.name);
|
|
548
543
|
const schema = plugin.manifest.settings || {};
|
|
549
544
|
|
|
550
545
|
for (const [key, s] of Object.entries(schema)) {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TUI session selector for --resume flag
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import { SessionSelectorComponent } from "@oh-my-pi/pi-coding-agent/modes/components/session-selector";
|
|
6
|
-
import type { SessionInfo } from "@oh-my-pi/pi-coding-agent/session/session-manager";
|
|
7
4
|
import { ProcessTerminal, TUI } from "@oh-my-pi/pi-tui";
|
|
5
|
+
import { SessionSelectorComponent } from "../modes/components/session-selector";
|
|
6
|
+
import type { SessionInfo } from "../session/session-manager";
|
|
8
7
|
|
|
9
8
|
/** Show TUI session selector and return selected session path or null if cancelled */
|
|
10
9
|
export async function selectSession(sessions: SessionInfo[]): Promise<string | null> {
|
package/src/cli/setup-cli.ts
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles `omp setup <component>` to install dependencies for optional features.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { APP_NAME } from "@oh-my-pi/pi-coding-agent/config";
|
|
8
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
9
6
|
import { $ } from "bun";
|
|
10
7
|
import chalk from "chalk";
|
|
8
|
+
import { APP_NAME } from "../config";
|
|
9
|
+
import { theme } from "../modes/theme/theme";
|
|
11
10
|
|
|
12
11
|
export type SetupComponent = "python";
|
|
13
12
|
|
package/src/cli/stats-cli.ts
CHANGED
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles `omp stats` subcommand for viewing AI usage statistics.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
import { APP_NAME } from "@oh-my-pi/pi-coding-agent/config";
|
|
8
6
|
import chalk from "chalk";
|
|
7
|
+
import { APP_NAME } from "../config";
|
|
9
8
|
|
|
10
9
|
// =============================================================================
|
|
11
10
|
// Types
|
|
@@ -106,7 +105,7 @@ export async function runStatsCommand(cmd: StatsCommandArgs): Promise<void> {
|
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
// Start the dashboard server
|
|
109
|
-
const { port } = startServer(cmd.port);
|
|
108
|
+
const { port } = await startServer(cmd.port);
|
|
110
109
|
console.log(chalk.green(`Dashboard available at: http://localhost:${port}`));
|
|
111
110
|
console.log("Press Ctrl+C to stop\n");
|
|
112
111
|
|
package/src/cli/update-cli.ts
CHANGED
|
@@ -4,15 +4,15 @@
|
|
|
4
4
|
* Handles `omp update` to check for and install updates.
|
|
5
5
|
* Uses bun if available, otherwise downloads binary from GitHub releases.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import { execSync, spawnSync } from "node:child_process";
|
|
9
|
-
import
|
|
10
|
-
import
|
|
8
|
+
import * as fs from "node:fs";
|
|
9
|
+
import * as path from "node:path";
|
|
11
10
|
import { Readable } from "node:stream";
|
|
12
11
|
import { pipeline } from "node:stream/promises";
|
|
13
|
-
import {
|
|
14
|
-
import { theme } from "@oh-my-pi/pi-coding-agent/modes/theme/theme";
|
|
12
|
+
import { isEnoent } from "@oh-my-pi/pi-utils";
|
|
15
13
|
import chalk from "chalk";
|
|
14
|
+
import { APP_NAME, VERSION } from "../config";
|
|
15
|
+
import { theme } from "../modes/theme/theme";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Detect if we're running as a Bun compiled binary.
|
|
@@ -73,7 +73,7 @@ async function getLatestRelease(): Promise<ReleaseInfo> {
|
|
|
73
73
|
return {
|
|
74
74
|
tag: data.tag_name,
|
|
75
75
|
version: data.tag_name.replace(/^v/, ""),
|
|
76
|
-
assets: data.assets.map(
|
|
76
|
+
assets: data.assets.map(a => ({ name: a.name, url: a.browser_download_url })),
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -154,14 +154,14 @@ async function updateViaBun(): Promise<void> {
|
|
|
154
154
|
*/
|
|
155
155
|
async function updateViaBinary(release: ReleaseInfo): Promise<void> {
|
|
156
156
|
const binaryName = getBinaryName();
|
|
157
|
-
const asset = release.assets.find(
|
|
157
|
+
const asset = release.assets.find(a => a.name === binaryName);
|
|
158
158
|
|
|
159
159
|
if (!asset) {
|
|
160
160
|
throw new Error(`No binary found for ${binaryName}`);
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
const execPath = process.execPath;
|
|
164
|
-
const _execDir = dirname(execPath);
|
|
164
|
+
const _execDir = path.dirname(execPath);
|
|
165
165
|
const tempPath = `${execPath}.new`;
|
|
166
166
|
const backupPath = `${execPath}.bak`;
|
|
167
167
|
|
|
@@ -173,7 +173,7 @@ async function updateViaBinary(release: ReleaseInfo): Promise<void> {
|
|
|
173
173
|
throw new Error(`Download failed: ${response.statusText}`);
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
const fileStream = createWriteStream(tempPath, { mode: 0o755 });
|
|
176
|
+
const fileStream = fs.createWriteStream(tempPath, { mode: 0o755 });
|
|
177
177
|
const nodeStream = Readable.fromWeb(response.body as import("stream/web").ReadableStream);
|
|
178
178
|
await pipeline(nodeStream, fileStream);
|
|
179
179
|
|
|
@@ -181,27 +181,30 @@ async function updateViaBinary(release: ReleaseInfo): Promise<void> {
|
|
|
181
181
|
console.log(chalk.dim("Installing update..."));
|
|
182
182
|
|
|
183
183
|
try {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
184
|
+
try {
|
|
185
|
+
await fs.promises.unlink(backupPath);
|
|
186
|
+
} catch (err) {
|
|
187
|
+
if (!isEnoent(err)) throw err;
|
|
187
188
|
}
|
|
188
|
-
|
|
189
|
+
await fs.promises.rename(execPath, backupPath);
|
|
189
190
|
|
|
190
|
-
|
|
191
|
-
renameSync(tempPath, execPath);
|
|
191
|
+
await fs.promises.rename(tempPath, execPath);
|
|
192
192
|
|
|
193
|
-
|
|
194
|
-
unlinkSync(backupPath);
|
|
193
|
+
await fs.promises.unlink(backupPath);
|
|
195
194
|
|
|
196
195
|
console.log(chalk.green(`\n${theme.status.success} Updated to ${release.version}`));
|
|
197
196
|
console.log(chalk.dim(`Restart ${APP_NAME} to use the new version`));
|
|
198
197
|
} catch (err) {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
198
|
+
const [backupExists, execExists, tempExists] = await Promise.all([
|
|
199
|
+
Bun.file(backupPath).exists(),
|
|
200
|
+
Bun.file(execPath).exists(),
|
|
201
|
+
Bun.file(tempPath).exists(),
|
|
202
|
+
]);
|
|
203
|
+
if (backupExists && !execExists) {
|
|
204
|
+
await fs.promises.rename(backupPath, execPath);
|
|
202
205
|
}
|
|
203
|
-
if (
|
|
204
|
-
|
|
206
|
+
if (tempExists) {
|
|
207
|
+
await fs.promises.unlink(tempPath);
|
|
205
208
|
}
|
|
206
209
|
throw err;
|
|
207
210
|
}
|