@oh-my-pi/pi-coding-agent 8.1.0 → 8.2.1
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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [8.2.0] - 2026-01-24
|
|
6
|
+
|
|
5
7
|
### Added
|
|
6
8
|
- Added `omp commit` command to generate conventional commits with changelog updates
|
|
7
9
|
- Added agentic commit mode with commit-specific tools and `--legacy` fallback
|
|
@@ -44,7 +46,12 @@
|
|
|
44
46
|
- Added two-level mermaid caching with pending deduplication to prevent redundant renders
|
|
45
47
|
- Added Python kernel session pooling with MAX_KERNEL_SESSIONS limit and automatic eviction of oldest sessions
|
|
46
48
|
- Added automatic idle kernel session cleanup timer (5-minute timeout, 30-second interval)
|
|
47
|
-
- Added
|
|
49
|
+
- Added types/assets/index.d.ts for global TypeScript module declarations supporting `.md`, `.py`, and `.wasm?raw` imports
|
|
50
|
+
- Added bunfig.toml loader configuration for importing markdown, Python, and WASM files as text modules
|
|
51
|
+
- Added color manipulation utilities (hexToHsv, hsvToHex, shiftHue) to pi-utils for accessible theme adjustments
|
|
52
|
+
- Added color-blind mode setting for improved accessibility
|
|
53
|
+
- Added filesystem error type guards (isEnoent, isEacces, isPerm, isEnotempty, isFsError, hasFsCode) to pi-utils for safe error handling
|
|
54
|
+
- Added tarball installation test Dockerfile to validate npm publish/install flow
|
|
48
55
|
|
|
49
56
|
### Changed
|
|
50
57
|
- Changed changelog diff truncation limit to be configurable via settings
|
|
@@ -98,6 +105,14 @@
|
|
|
98
105
|
- Changed AuthStorage from constructor-based instantiation to async factory method (AuthStorage.create())
|
|
99
106
|
- Changed Python kernel resource management with gateway shutdown on session disposal
|
|
100
107
|
- Updated TypeScript configuration for better publish-time configuration handling with tsconfig.publish.json
|
|
108
|
+
- Updated TypeScript and Bun configuration for monorepo-wide build consistency and reduced boilerplate
|
|
109
|
+
- Removed WASM base64 encoding build script; imports now use Bun loader with `wasm?raw` query parameter
|
|
110
|
+
- Unified TypeScript checking pipeline with tsgo-based configuration instead of per-package tsconfig.publish.json boilerplate
|
|
111
|
+
- Refactored scanDirectoryForSkills to use async/await with concurrent directory scanning via Promise.all
|
|
112
|
+
- Improved error logging in settings manager for config file access failures
|
|
113
|
+
- Migrated node module imports from named to namespace imports across all packages for consistency with project guidelines
|
|
114
|
+
- Improved filesystem error handling in extension loader with additional type guards (isEacces, hasFsCode) for permission and EPERM errors
|
|
115
|
+
- Changed model discovery to synchronous file operations for more immediate initialization
|
|
101
116
|
|
|
102
117
|
### Fixed
|
|
103
118
|
- Fixed database busy errors during concurrent access by adding retry logic with exponential backoff when opening storage
|
|
@@ -107,6 +122,11 @@
|
|
|
107
122
|
- Fixed indentation formatting in split-commit tool function signature
|
|
108
123
|
- Fixed changelog application to process proposals containing only deletion entries without additions
|
|
109
124
|
- Fixed indentation formatting in Python tool output renderer
|
|
125
|
+
- Fixed Python kernel resource management with proper timing instrumentation for performance monitoring
|
|
126
|
+
- Fixed model discovery to re-check file existence after JSON to YAML migration
|
|
127
|
+
- Fixed branch change callbacks in footer component to properly update state after git resolution
|
|
128
|
+
- Added guard clause in plugin-settings to prevent null reference when settings list is undefined
|
|
129
|
+
- Fixed agent task discovery to support symlinks and improved error handling for file access failures
|
|
110
130
|
## [8.0.0] - 2026-01-23
|
|
111
131
|
### Added
|
|
112
132
|
|
package/docs/session.md
CHANGED
|
@@ -31,10 +31,10 @@ All entries (except `SessionHeader`) extend `SessionEntryBase`:
|
|
|
31
31
|
|
|
32
32
|
```typescript
|
|
33
33
|
interface SessionEntryBase {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
type: string;
|
|
35
|
+
id: string; // 8-char hex ID
|
|
36
|
+
parentId: string | null; // Parent entry ID (null for first entry)
|
|
37
|
+
timestamp: string; // ISO timestamp
|
|
38
38
|
}
|
|
39
39
|
```
|
|
40
40
|
|
|
@@ -45,13 +45,20 @@ interface SessionEntryBase {
|
|
|
45
45
|
First line of the file. Metadata only, not part of the tree (no `id`/`parentId`).
|
|
46
46
|
|
|
47
47
|
```json
|
|
48
|
-
{"type":"session","version":2,"id":"uuid","timestamp":"2024-12-03T14:00:00.000Z","cwd":"/path/to/project"}
|
|
48
|
+
{ "type": "session", "version": 2, "id": "uuid", "timestamp": "2024-12-03T14:00:00.000Z", "cwd": "/path/to/project" }
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
For sessions with a parent (created via `/branch` or `newSession({ parentSession })`):
|
|
52
52
|
|
|
53
53
|
```json
|
|
54
|
-
{
|
|
54
|
+
{
|
|
55
|
+
"type": "session",
|
|
56
|
+
"version": 2,
|
|
57
|
+
"id": "uuid",
|
|
58
|
+
"timestamp": "2024-12-03T14:00:00.000Z",
|
|
59
|
+
"cwd": "/path/to/project",
|
|
60
|
+
"parentSession": "/path/to/original/session.jsonl"
|
|
61
|
+
}
|
|
55
62
|
```
|
|
56
63
|
|
|
57
64
|
### SessionMessageEntry
|
|
@@ -69,7 +76,14 @@ A message in the conversation. The `message` field contains an `AgentMessage`.
|
|
|
69
76
|
Emitted when the user switches models mid-session.
|
|
70
77
|
|
|
71
78
|
```json
|
|
72
|
-
{
|
|
79
|
+
{
|
|
80
|
+
"type": "model_change",
|
|
81
|
+
"id": "d4e5f6g7",
|
|
82
|
+
"parentId": "c3d4e5f6",
|
|
83
|
+
"timestamp": "2024-12-03T14:05:00.000Z",
|
|
84
|
+
"provider": "openai",
|
|
85
|
+
"modelId": "gpt-4o"
|
|
86
|
+
}
|
|
73
87
|
```
|
|
74
88
|
|
|
75
89
|
### ThinkingLevelChangeEntry
|
|
@@ -77,7 +91,13 @@ Emitted when the user switches models mid-session.
|
|
|
77
91
|
Emitted when the user changes the thinking/reasoning level.
|
|
78
92
|
|
|
79
93
|
```json
|
|
80
|
-
{
|
|
94
|
+
{
|
|
95
|
+
"type": "thinking_level_change",
|
|
96
|
+
"id": "e5f6g7h8",
|
|
97
|
+
"parentId": "d4e5f6g7",
|
|
98
|
+
"timestamp": "2024-12-03T14:06:00.000Z",
|
|
99
|
+
"thinkingLevel": "high"
|
|
100
|
+
}
|
|
81
101
|
```
|
|
82
102
|
|
|
83
103
|
### CompactionEntry
|
|
@@ -85,10 +105,19 @@ Emitted when the user changes the thinking/reasoning level.
|
|
|
85
105
|
Created when context is compacted. Stores a summary of earlier messages.
|
|
86
106
|
|
|
87
107
|
```json
|
|
88
|
-
{
|
|
108
|
+
{
|
|
109
|
+
"type": "compaction",
|
|
110
|
+
"id": "f6g7h8i9",
|
|
111
|
+
"parentId": "e5f6g7h8",
|
|
112
|
+
"timestamp": "2024-12-03T14:10:00.000Z",
|
|
113
|
+
"summary": "User discussed X, Y, Z...",
|
|
114
|
+
"firstKeptEntryId": "c3d4e5f6",
|
|
115
|
+
"tokensBefore": 50000
|
|
116
|
+
}
|
|
89
117
|
```
|
|
90
118
|
|
|
91
119
|
Optional fields:
|
|
120
|
+
|
|
92
121
|
- `details`: Compaction-implementation specific data (e.g., file operations for default implementation, or custom data for custom hook implementations)
|
|
93
122
|
- `fromHook`: `true` if generated by a hook, `false`/`undefined` if omp-generated
|
|
94
123
|
|
|
@@ -97,10 +126,18 @@ Optional fields:
|
|
|
97
126
|
Created when switching branches via `/tree` with an LLM generated summary of the left branch up to the common ancestor. Captures context from the abandoned path.
|
|
98
127
|
|
|
99
128
|
```json
|
|
100
|
-
{
|
|
129
|
+
{
|
|
130
|
+
"type": "branch_summary",
|
|
131
|
+
"id": "g7h8i9j0",
|
|
132
|
+
"parentId": "a1b2c3d4",
|
|
133
|
+
"timestamp": "2024-12-03T14:15:00.000Z",
|
|
134
|
+
"fromId": "f6g7h8i9",
|
|
135
|
+
"summary": "Branch explored approach A..."
|
|
136
|
+
}
|
|
101
137
|
```
|
|
102
138
|
|
|
103
139
|
Optional fields:
|
|
140
|
+
|
|
104
141
|
- `details`: File tracking data (`{ readFiles: string[], modifiedFiles: string[] }`) for default implementation, arbitrary for custom implementation
|
|
105
142
|
- `fromHook`: `true` if generated by a hook
|
|
106
143
|
|
|
@@ -109,7 +146,14 @@ Optional fields:
|
|
|
109
146
|
Hook state persistence. Does NOT participate in LLM context.
|
|
110
147
|
|
|
111
148
|
```json
|
|
112
|
-
{
|
|
149
|
+
{
|
|
150
|
+
"type": "custom",
|
|
151
|
+
"id": "h8i9j0k1",
|
|
152
|
+
"parentId": "g7h8i9j0",
|
|
153
|
+
"timestamp": "2024-12-03T14:20:00.000Z",
|
|
154
|
+
"customType": "my-hook",
|
|
155
|
+
"data": { "count": 42 }
|
|
156
|
+
}
|
|
113
157
|
```
|
|
114
158
|
|
|
115
159
|
Use `customType` to identify your hook's entries on reload.
|
|
@@ -119,10 +163,19 @@ Use `customType` to identify your hook's entries on reload.
|
|
|
119
163
|
Hook-injected messages that DO participate in LLM context.
|
|
120
164
|
|
|
121
165
|
```json
|
|
122
|
-
{
|
|
166
|
+
{
|
|
167
|
+
"type": "custom_message",
|
|
168
|
+
"id": "i9j0k1l2",
|
|
169
|
+
"parentId": "h8i9j0k1",
|
|
170
|
+
"timestamp": "2024-12-03T14:25:00.000Z",
|
|
171
|
+
"customType": "my-hook",
|
|
172
|
+
"content": "Injected context...",
|
|
173
|
+
"display": true
|
|
174
|
+
}
|
|
123
175
|
```
|
|
124
176
|
|
|
125
177
|
Fields:
|
|
178
|
+
|
|
126
179
|
- `content`: String or `(TextContent | ImageContent)[]` (same as UserMessage)
|
|
127
180
|
- `display`: `true` = show in TUI with purple styling, `false` = hidden
|
|
128
181
|
- `details`: Optional hook-specific metadata (not sent to LLM)
|
|
@@ -132,7 +185,14 @@ Fields:
|
|
|
132
185
|
User-defined bookmark/marker on an entry.
|
|
133
186
|
|
|
134
187
|
```json
|
|
135
|
-
{
|
|
188
|
+
{
|
|
189
|
+
"type": "label",
|
|
190
|
+
"id": "j0k1l2m3",
|
|
191
|
+
"parentId": "i9j0k1l2",
|
|
192
|
+
"timestamp": "2024-12-03T14:30:00.000Z",
|
|
193
|
+
"targetId": "a1b2c3d4",
|
|
194
|
+
"label": "checkpoint-1"
|
|
195
|
+
}
|
|
136
196
|
```
|
|
137
197
|
|
|
138
198
|
Set `label` to `undefined` to clear a label.
|
|
@@ -140,6 +200,7 @@ Set `label` to `undefined` to clear a label.
|
|
|
140
200
|
## Tree Structure
|
|
141
201
|
|
|
142
202
|
Entries form a tree:
|
|
203
|
+
|
|
143
204
|
- First entry has `parentId: null`
|
|
144
205
|
- Each subsequent entry points to its parent via `parentId`
|
|
145
206
|
- Branching creates new children from an earlier entry
|
|
@@ -166,42 +227,42 @@ Entries form a tree:
|
|
|
166
227
|
## Parsing Example
|
|
167
228
|
|
|
168
229
|
```typescript
|
|
169
|
-
import
|
|
230
|
+
import * as fs from "node:fs";
|
|
170
231
|
|
|
171
|
-
const lines = readFileSync("session.jsonl", "utf8").trim().split("\n");
|
|
232
|
+
const lines = fs.readFileSync("session.jsonl", "utf8").trim().split("\n");
|
|
172
233
|
|
|
173
234
|
for (const line of lines) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
235
|
+
const entry = JSON.parse(line);
|
|
236
|
+
|
|
237
|
+
switch (entry.type) {
|
|
238
|
+
case "session":
|
|
239
|
+
console.log(`Session v${entry.version ?? 1}: ${entry.id}`);
|
|
240
|
+
break;
|
|
241
|
+
case "message":
|
|
242
|
+
console.log(`[${entry.id}] ${entry.message.role}: ${JSON.stringify(entry.message.content)}`);
|
|
243
|
+
break;
|
|
244
|
+
case "compaction":
|
|
245
|
+
console.log(`[${entry.id}] Compaction: ${entry.tokensBefore} tokens summarized`);
|
|
246
|
+
break;
|
|
247
|
+
case "branch_summary":
|
|
248
|
+
console.log(`[${entry.id}] Branch from ${entry.fromId}`);
|
|
249
|
+
break;
|
|
250
|
+
case "custom":
|
|
251
|
+
console.log(`[${entry.id}] Custom (${entry.customType}): ${JSON.stringify(entry.data)}`);
|
|
252
|
+
break;
|
|
253
|
+
case "custom_message":
|
|
254
|
+
console.log(`[${entry.id}] Hook message (${entry.customType}): ${entry.content}`);
|
|
255
|
+
break;
|
|
256
|
+
case "label":
|
|
257
|
+
console.log(`[${entry.id}] Label "${entry.label}" on ${entry.targetId}`);
|
|
258
|
+
break;
|
|
259
|
+
case "model_change":
|
|
260
|
+
console.log(`[${entry.id}] Model: ${entry.provider}/${entry.modelId}`);
|
|
261
|
+
break;
|
|
262
|
+
case "thinking_level_change":
|
|
263
|
+
console.log(`[${entry.id}] Thinking: ${entry.thinkingLevel}`);
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
205
266
|
}
|
|
206
267
|
```
|
|
207
268
|
|
|
@@ -210,12 +271,14 @@ for (const line of lines) {
|
|
|
210
271
|
Key methods for working with sessions programmatically:
|
|
211
272
|
|
|
212
273
|
### Creation
|
|
274
|
+
|
|
213
275
|
- `SessionManager.create(cwd, sessionDir?)` - New session
|
|
214
276
|
- `SessionManager.open(path, sessionDir?)` - Open existing
|
|
215
277
|
- `SessionManager.continueRecent(cwd, sessionDir?)` - Continue most recent or create new
|
|
216
278
|
- `SessionManager.inMemory(cwd?)` - No file persistence
|
|
217
279
|
|
|
218
280
|
### Appending (all return entry ID)
|
|
281
|
+
|
|
219
282
|
- `appendMessage(message)` - Add message
|
|
220
283
|
- `appendThinkingLevelChange(level)` - Record thinking change
|
|
221
284
|
- `appendModelChange(provider, modelId)` - Record model change
|
|
@@ -225,6 +288,7 @@ Key methods for working with sessions programmatically:
|
|
|
225
288
|
- `appendLabelChange(targetId, label)` - Set/clear label
|
|
226
289
|
|
|
227
290
|
### Tree Navigation
|
|
291
|
+
|
|
228
292
|
- `getLeafId()` - Current position
|
|
229
293
|
- `getEntry(id)` - Get entry by ID
|
|
230
294
|
- `getPath(fromId?)` - Walk from entry to root
|
|
@@ -235,6 +299,7 @@ Key methods for working with sessions programmatically:
|
|
|
235
299
|
- `branchWithSummary(entryId, summary, details?, fromHook?)` - Branch with context summary
|
|
236
300
|
|
|
237
301
|
### Context
|
|
302
|
+
|
|
238
303
|
- `buildSessionContext()` - Get messages for LLM
|
|
239
304
|
- `getEntries()` - All entries (excluding header)
|
|
240
305
|
- `getHeader()` - Session metadata
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The onSession callback reconstructs state by scanning past tool results.
|
|
9
9
|
*/
|
|
10
|
-
|
|
11
10
|
import type {
|
|
12
11
|
CustomTool,
|
|
13
12
|
CustomToolContext,
|
|
@@ -29,7 +28,7 @@ interface TodoDetails {
|
|
|
29
28
|
error?: string;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
const factory: CustomToolFactory =
|
|
31
|
+
const factory: CustomToolFactory = pi => {
|
|
33
32
|
const { Type } = pi.typebox;
|
|
34
33
|
const { StringEnum, Text } = pi.pi;
|
|
35
34
|
|
|
@@ -85,7 +84,7 @@ const factory: CustomToolFactory = (pi) => {
|
|
|
85
84
|
{
|
|
86
85
|
type: "text",
|
|
87
86
|
text: todos.length
|
|
88
|
-
? todos.map(
|
|
87
|
+
? todos.map(t => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
|
|
89
88
|
: "No todos",
|
|
90
89
|
},
|
|
91
90
|
],
|
|
@@ -114,7 +113,7 @@ const factory: CustomToolFactory = (pi) => {
|
|
|
114
113
|
details: { action: "toggle", todos: [...todos], nextId, error: "id required" },
|
|
115
114
|
};
|
|
116
115
|
}
|
|
117
|
-
const todo = todos.find(
|
|
116
|
+
const todo = todos.find(t => t.id === params.id);
|
|
118
117
|
if (!todo) {
|
|
119
118
|
return {
|
|
120
119
|
content: [{ type: "text", text: `Todo #${params.id} not found` }],
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Example extension that uses a 3rd party dependency (chalk).
|
|
3
3
|
* Tests that jiti can resolve npm modules correctly.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
import type { ExtensionAPI } from "@oh-my-pi/pi-coding-agent";
|
|
7
6
|
import chalk from "chalk";
|
|
8
7
|
|
|
@@ -14,12 +13,12 @@ export default function (pi: ExtensionAPI) {
|
|
|
14
13
|
console.log(`${chalk.blue("[chalk-logger]")} Agent starting`);
|
|
15
14
|
});
|
|
16
15
|
|
|
17
|
-
pi.on("tool_call", async
|
|
16
|
+
pi.on("tool_call", async event => {
|
|
18
17
|
console.log(`${chalk.yellow("[chalk-logger]")} Tool: ${chalk.cyan(event.toolName)}`);
|
|
19
18
|
return undefined;
|
|
20
19
|
});
|
|
21
20
|
|
|
22
|
-
pi.on("agent_end", async
|
|
21
|
+
pi.on("agent_end", async event => {
|
|
23
22
|
const count = event.messages.length;
|
|
24
23
|
console.log(`${chalk.green("[chalk-logger]")} Done with ${chalk.bold(String(count))} messages`);
|
|
25
24
|
});
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
* 2. Use /plan to toggle plan mode on/off
|
|
19
19
|
* 3. Or start in plan mode with --plan flag
|
|
20
20
|
*/
|
|
21
|
-
|
|
22
21
|
import type { ExtensionAPI, ExtensionContext } from "@oh-my-pi/pi-coding-agent";
|
|
23
22
|
import { Key } from "@oh-my-pi/pi-tui";
|
|
24
23
|
|
|
@@ -120,12 +119,12 @@ const SAFE_COMMANDS = [
|
|
|
120
119
|
];
|
|
121
120
|
|
|
122
121
|
function isSafeCommand(command: string): boolean {
|
|
123
|
-
if (SAFE_COMMANDS.some(
|
|
124
|
-
if (!DESTRUCTIVE_PATTERNS.some(
|
|
122
|
+
if (SAFE_COMMANDS.some(pattern => pattern.test(command))) {
|
|
123
|
+
if (!DESTRUCTIVE_PATTERNS.some(pattern => pattern.test(command))) {
|
|
125
124
|
return true;
|
|
126
125
|
}
|
|
127
126
|
}
|
|
128
|
-
if (DESTRUCTIVE_PATTERNS.some(
|
|
127
|
+
if (DESTRUCTIVE_PATTERNS.some(pattern => pattern.test(command))) {
|
|
129
128
|
return false;
|
|
130
129
|
}
|
|
131
130
|
return true;
|
|
@@ -223,7 +222,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
|
|
|
223
222
|
// Helper to update status displays
|
|
224
223
|
function updateStatus(ctx: ExtensionContext) {
|
|
225
224
|
if (executionMode && todoItems.length > 0) {
|
|
226
|
-
const completed = todoItems.filter(
|
|
225
|
+
const completed = todoItems.filter(t => t.completed).length;
|
|
227
226
|
ctx.ui.setStatus("plan-mode", ctx.ui.theme.fg("accent", `📋 ${completed}/${todoItems.length}`));
|
|
228
227
|
} else if (planModeEnabled) {
|
|
229
228
|
ctx.ui.setStatus("plan-mode", ctx.ui.theme.fg("warning", "⏸ plan"));
|
|
@@ -293,13 +292,13 @@ export default function planModeExtension(pi: ExtensionAPI) {
|
|
|
293
292
|
// Register Shift+P shortcut
|
|
294
293
|
pi.registerShortcut(Key.shift("p"), {
|
|
295
294
|
description: "Toggle plan mode",
|
|
296
|
-
handler: async
|
|
295
|
+
handler: async ctx => {
|
|
297
296
|
await togglePlanMode(ctx);
|
|
298
297
|
},
|
|
299
298
|
});
|
|
300
299
|
|
|
301
300
|
// Block destructive bash in plan mode
|
|
302
|
-
pi.on("tool_call", async
|
|
301
|
+
pi.on("tool_call", async event => {
|
|
303
302
|
if (!planModeEnabled) return;
|
|
304
303
|
if (event.toolName !== "bash") return;
|
|
305
304
|
|
|
@@ -319,7 +318,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
|
|
|
319
318
|
if (!executionMode || todoItems.length === 0) return;
|
|
320
319
|
|
|
321
320
|
// Mark the first uncompleted step as done when any tool succeeds
|
|
322
|
-
const nextStep = todoItems.find(
|
|
321
|
+
const nextStep = todoItems.find(t => !t.completed);
|
|
323
322
|
if (nextStep) {
|
|
324
323
|
nextStep.completed = true;
|
|
325
324
|
updateStatus(ctx);
|
|
@@ -328,7 +327,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
|
|
|
328
327
|
|
|
329
328
|
// Filter out stale plan mode context messages from LLM context
|
|
330
329
|
// This ensures the agent only sees the CURRENT state (plan mode on/off)
|
|
331
|
-
pi.on("context", async
|
|
330
|
+
pi.on("context", async event => {
|
|
332
331
|
// Only filter when NOT in plan mode (i.e., when executing)
|
|
333
332
|
if (planModeEnabled) {
|
|
334
333
|
return;
|
|
@@ -336,7 +335,7 @@ export default function planModeExtension(pi: ExtensionAPI) {
|
|
|
336
335
|
|
|
337
336
|
// Remove any previous plan-mode-context messages
|
|
338
337
|
const _beforeCount = event.messages.length;
|
|
339
|
-
const filtered = event.messages.filter(
|
|
338
|
+
const filtered = event.messages.filter(m => {
|
|
340
339
|
if (m.role === "user" && Array.isArray(m.content)) {
|
|
341
340
|
const hasOldContext = m.content.some(
|
|
342
341
|
(c: { type: string; text?: string }) => c.type === "text" && c.text?.includes("[PLAN MODE ACTIVE]"),
|
|
@@ -381,8 +380,8 @@ Do NOT attempt to make changes - just describe what you would do.`,
|
|
|
381
380
|
}
|
|
382
381
|
|
|
383
382
|
if (executionMode && todoItems.length > 0) {
|
|
384
|
-
const remaining = todoItems.filter(
|
|
385
|
-
const todoList = remaining.map(
|
|
383
|
+
const remaining = todoItems.filter(t => !t.completed);
|
|
384
|
+
const todoList = remaining.map(t => `${t.step}. ${t.text}`).join("\n");
|
|
386
385
|
return {
|
|
387
386
|
message: {
|
|
388
387
|
customType: "plan-execution-context",
|
|
@@ -402,10 +401,10 @@ Execute each step in order.`,
|
|
|
402
401
|
pi.on("agent_end", async (event, ctx) => {
|
|
403
402
|
// In execution mode, check if all steps complete
|
|
404
403
|
if (executionMode && todoItems.length > 0) {
|
|
405
|
-
const allComplete = todoItems.every(
|
|
404
|
+
const allComplete = todoItems.every(t => t.completed);
|
|
406
405
|
if (allComplete) {
|
|
407
406
|
// Show final completed list in chat
|
|
408
|
-
const completedList = todoItems.map(
|
|
407
|
+
const completedList = todoItems.map(t => `~~${t.text}~~`).join("\n");
|
|
409
408
|
pi.sendMessage(
|
|
410
409
|
{
|
|
411
410
|
customType: "plan-complete",
|
|
@@ -428,7 +427,7 @@ Execute each step in order.`,
|
|
|
428
427
|
|
|
429
428
|
// Extract todos from last message
|
|
430
429
|
const messages = event.messages;
|
|
431
|
-
const lastAssistant = [...messages].reverse().find(
|
|
430
|
+
const lastAssistant = [...messages].reverse().find(m => m.role === "assistant");
|
|
432
431
|
if (lastAssistant && Array.isArray(lastAssistant.content)) {
|
|
433
432
|
const textContent = lastAssistant.content
|
|
434
433
|
.filter(
|
|
@@ -541,7 +540,7 @@ Execute each step in order.`,
|
|
|
541
540
|
// If no tools were called this turn, the agent was doing analysis/explanation
|
|
542
541
|
// Mark the next uncompleted step as done
|
|
543
542
|
if (!toolsCalledThisTurn) {
|
|
544
|
-
const nextStep = todoItems.find(
|
|
543
|
+
const nextStep = todoItems.find(t => !t.completed);
|
|
545
544
|
if (nextStep) {
|
|
546
545
|
nextStep.completed = true;
|
|
547
546
|
updateStatus(ctx);
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
* proper branching - when you branch, the todo state is automatically
|
|
10
10
|
* correct for that point in history.
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
12
|
import { StringEnum } from "@oh-my-pi/pi-ai";
|
|
14
13
|
import type { ExtensionAPI, ExtensionContext, Theme } from "@oh-my-pi/pi-coding-agent";
|
|
15
14
|
import { matchesKey, Text, truncateToWidth } from "@oh-my-pi/pi-tui";
|
|
@@ -74,7 +73,7 @@ class TodoListComponent {
|
|
|
74
73
|
if (this.todos.length === 0) {
|
|
75
74
|
lines.push(truncateToWidth(` ${th.fg("dim", "No todos yet. Ask the agent to add some!")}`, width));
|
|
76
75
|
} else {
|
|
77
|
-
const done = this.todos.filter(
|
|
76
|
+
const done = this.todos.filter(t => t.done).length;
|
|
78
77
|
const total = this.todos.length;
|
|
79
78
|
lines.push(truncateToWidth(` ${th.fg("muted", `${done}/${total} completed`)}`, width));
|
|
80
79
|
lines.push("");
|
|
@@ -149,7 +148,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
149
148
|
{
|
|
150
149
|
type: "text",
|
|
151
150
|
text: todos.length
|
|
152
|
-
? todos.map(
|
|
151
|
+
? todos.map(t => `[${t.done ? "x" : " "}] #${t.id}: ${t.text}`).join("\n")
|
|
153
152
|
: "No todos",
|
|
154
153
|
},
|
|
155
154
|
],
|
|
@@ -178,7 +177,7 @@ export default function (pi: ExtensionAPI) {
|
|
|
178
177
|
details: { action: "toggle", todos: [...todos], nextId, error: "id required" } as TodoDetails,
|
|
179
178
|
};
|
|
180
179
|
}
|
|
181
|
-
const todo = todos.find(
|
|
180
|
+
const todo = todos.find(t => t.id === params.id);
|
|
182
181
|
if (!todo) {
|
|
183
182
|
return {
|
|
184
183
|
content: [{ type: "text", text: `Todo #${params.id} not found` }],
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
* 1. Copy this file to ~/.omp/agent/extensions/ (legacy: ~/.pi/agent/extensions/) or your project's .omp/extensions/
|
|
9
9
|
* 2. Use /tools to open the tool selector
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
11
|
import type { ExtensionAPI, ExtensionContext } from "@oh-my-pi/pi-coding-agent";
|
|
13
12
|
import { getSettingsListTheme } from "@oh-my-pi/pi-coding-agent";
|
|
14
13
|
import { Container, type SettingItem, SettingsList } from "@oh-my-pi/pi-tui";
|
|
@@ -71,7 +70,7 @@ export default function toolsExtension(pi: ExtensionAPI) {
|
|
|
71
70
|
|
|
72
71
|
await ctx.ui.custom((tui, theme, done) => {
|
|
73
72
|
// Build settings items for each tool
|
|
74
|
-
const items: SettingItem[] = allTools.map(
|
|
73
|
+
const items: SettingItem[] = allTools.map(tool => ({
|
|
75
74
|
id: tool,
|
|
76
75
|
label: tool,
|
|
77
76
|
currentValue: enabledTools.has(tool) ? "enabled" : "disabled",
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Automatically commits changes when the agent exits.
|
|
5
5
|
* Uses the last assistant message to generate a commit message.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { HookAPI } from "@oh-my-pi/pi-coding-agent";
|
|
9
8
|
|
|
10
9
|
export default function (pi: HookAPI) {
|
|
@@ -27,7 +26,7 @@ export default function (pi: HookAPI) {
|
|
|
27
26
|
if (Array.isArray(content)) {
|
|
28
27
|
lastAssistantText = content
|
|
29
28
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
30
|
-
.map(
|
|
29
|
+
.map(c => c.text)
|
|
31
30
|
.join("\n");
|
|
32
31
|
}
|
|
33
32
|
break;
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Prompts for confirmation before destructive session actions (clear, switch, branch).
|
|
5
5
|
* Demonstrates how to cancel session events using the before_* events.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { HookAPI, SessionBeforeSwitchEvent, SessionMessageEntry } from "@oh-my-pi/pi-coding-agent";
|
|
9
8
|
|
|
10
9
|
export default function (pi: HookAPI) {
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
* Usage:
|
|
13
13
|
* omp --hook examples/hooks/custom-compaction.ts
|
|
14
14
|
*/
|
|
15
|
-
|
|
16
15
|
import { complete, getModel } from "@oh-my-pi/pi-ai";
|
|
17
16
|
import type { HookAPI } from "@oh-my-pi/pi-coding-agent";
|
|
18
17
|
import { convertToLlm, serializeConversation } from "@oh-my-pi/pi-coding-agent";
|
|
@@ -89,7 +88,7 @@ ${conversationText}
|
|
|
89
88
|
|
|
90
89
|
const summary = response.content
|
|
91
90
|
.filter((c): c is { type: "text"; text: string } => c.type === "text")
|
|
92
|
-
.map(
|
|
91
|
+
.map(c => c.text)
|
|
93
92
|
.join("\n");
|
|
94
93
|
|
|
95
94
|
if (!summary.trim()) {
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* Prevents session changes when there are uncommitted git changes.
|
|
5
5
|
* Useful to ensure work is committed before switching context.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
import type { HookAPI, HookContext } from "@oh-my-pi/pi-coding-agent";
|
|
9
8
|
|
|
10
9
|
async function checkDirtyRepo(pi: HookAPI, ctx: HookContext, action: string): Promise<{ cancel: boolean } | undefined> {
|