@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
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,131 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [8.2.0] - 2026-01-24
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- Added `omp commit` command to generate conventional commits with changelog updates
|
|
9
|
+
- Added agentic commit mode with commit-specific tools and `--legacy` fallback
|
|
10
|
+
- Added configurable settings for map-reduce analysis including concurrency, timeout, file thresholds, and token limits
|
|
11
|
+
- Added support for excluding YAML lock files (`.lock.yml`, `.lock.yaml`, `-lock.yml`, `-lock.yaml`) from commit analysis
|
|
12
|
+
- Added new TUI component library with reusable rendering utilities including code cells, file lists, tree lists, status lines, and output blocks
|
|
13
|
+
- Added renderCodeCell component for displaying code with optional output sections, supporting syntax highlighting and status indicators
|
|
14
|
+
- Added renderFileList component for rendering file/directory listings with language icons and metadata
|
|
15
|
+
- Added renderTreeList component for hierarchical tree-based item rendering with expand/collapse support
|
|
16
|
+
- Added renderStatusLine component for standardized tool status headers with icons, descriptions, and metadata
|
|
17
|
+
- Added renderOutputBlock component for bordered output containers with structured sections
|
|
18
|
+
- Added renderOutputBlock to Bash tool for improved output formatting with status indicators
|
|
19
|
+
- Added `--legacy` flag to `omp commit` for using the deterministic pipeline instead of agentic mode
|
|
20
|
+
- Added split commit support to automatically create multiple atomic commits for unrelated changes
|
|
21
|
+
- Added git hunk inspection tools for fine-grained diff analysis in commit generation
|
|
22
|
+
- Added commit message validation with filler word and meta phrase detection
|
|
23
|
+
- Added automatic unicode normalization in commit summaries
|
|
24
|
+
- Added real-time progress output to agentic commit mode showing thinking status, tool calls, and completion summary
|
|
25
|
+
- Added hunk-level staging support in split commits allowing partial file changes per commit
|
|
26
|
+
- Added dependency ordering for split commits ensuring commits are applied in correct sequence
|
|
27
|
+
- Added circular dependency detection with validation errors for split commit plans
|
|
28
|
+
- Added parallel file analysis with cross-file context awareness via `analyze_files` tool
|
|
29
|
+
- Added AGENTS.md context file discovery for commit generation
|
|
30
|
+
- Added progress indicators during changelog generation and model resolution
|
|
31
|
+
- Added propose_changelog tool for agent-provided changelog entries in agentic commit workflow
|
|
32
|
+
- Added fallback commit generation when agentic mode fails, using file pattern analysis and heuristic-based type inference
|
|
33
|
+
- Added trivial change detection to automatically classify whitespace-only and import-reorganization commits
|
|
34
|
+
- Added support for pre-computed file observations in commit agent to skip redundant analyze_files calls
|
|
35
|
+
- Added diff content caching with smart file prioritization to optimize token usage in large changesets
|
|
36
|
+
- Added lock file filtering (17 patterns including Cargo.lock, package-lock.json, bun.lock) from commit analysis
|
|
37
|
+
- Added changelog deletion support to remove outdated entries via the changelog proposal interface
|
|
38
|
+
- Added support for pre-computed changelog entries in commit agent to display existing unreleased sections for potential deletion
|
|
39
|
+
- Added `ExistingChangelogEntries` interface to track changelog sections by path for changelog proposal context
|
|
40
|
+
- Added conditional `analyze_files` skipping in commit agent when pre-analyzed observations are provided
|
|
41
|
+
- Added guidance to commit agent prompts instructing subagents to write files directly instead of returning changes for manual application
|
|
42
|
+
- Added mermaid diagram rendering with terminal graphics support (Kitty/iTerm2) for markdown output
|
|
43
|
+
- Added renderMermaidToPng utility for converting mermaid code blocks to terminal-displayable PNG images via mmdc CLI
|
|
44
|
+
- Added mermaid block extraction with content-addressed hashing for deduplication and cache lookup
|
|
45
|
+
- Added background mermaid pre-rendering in assistant messages for responsive diagram display
|
|
46
|
+
- Added two-level mermaid caching with pending deduplication to prevent redundant renders
|
|
47
|
+
- Added Python kernel session pooling with MAX_KERNEL_SESSIONS limit and automatic eviction of oldest sessions
|
|
48
|
+
- Added automatic idle kernel session cleanup timer (5-minute timeout, 30-second interval)
|
|
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
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
- Changed changelog diff truncation limit to be configurable via settings
|
|
58
|
+
- Changed tool result rendering to use new TUI component library across multiple tools (bash, calculator, fetch, find, grep, ls, notebook, python, read, ssh, write, lsp, web search) for consistent output formatting
|
|
59
|
+
- Changed Bash tool output rendering to use renderOutputBlock with proper section handling and width-aware truncation
|
|
60
|
+
- Changed Python tool output rendering to use renderCodeCell component for code cell display with status indicators
|
|
61
|
+
- Changed Read tool output rendering to use renderCodeCell with syntax highlighting and warnings display
|
|
62
|
+
- Changed Write tool output rendering to use renderCodeCell for code display with streaming preview support
|
|
63
|
+
- Changed Fetch tool output rendering to use renderOutputBlock with metadata and content preview sections
|
|
64
|
+
- Changed LSP tool output rendering to use renderStatusLine and renderOutputBlock for structured output display
|
|
65
|
+
- Changed Web Search result rendering to use renderOutputBlock with answer, sources, related questions, and metadata sections
|
|
66
|
+
- Changed Find, Grep, and Ls tools to use renderFileList and renderTreeList for consistent file/item listing
|
|
67
|
+
- Changed Calculator tool result rendering to use renderTreeList for result item display
|
|
68
|
+
- Changed Notebook and TodoWrite tools to use new TUI rendering components for consistent output format
|
|
69
|
+
- Refactored render-utils to move tree-related utilities to TUI module (getTreeBranch, getTreeContinuePrefix)
|
|
70
|
+
- Changed import organization in sdk.ts for consistency
|
|
71
|
+
- Changed tool result rendering to merge call and result displays, showing tool arguments (command, pattern, query, path) in result headers for Bash, Calculator, Fetch, Find, Grep, Ls, LSP, Notebook, Read, SSH, TodoWrite, Web Search, and Write tools
|
|
72
|
+
- Changed Read tool title to display line range when offset or limit arguments are provided
|
|
73
|
+
- Changed worker instantiation to use direct URL import instead of pre-bundled worker files
|
|
74
|
+
- Changed `omp commit` to use agentic mode by default with tool-based git inspection
|
|
75
|
+
- Changed agentic commit progress output to show real-time thinking previews and structured tool argument details
|
|
76
|
+
- Changed agentic commit progress output to display full multi-line assistant messages and render tool arguments with tree-style formatting for improved readability
|
|
77
|
+
- Changed agentic commit progress output to render assistant messages as formatted Markdown with proper word wrapping
|
|
78
|
+
- Changed output block border color to reflect state (error, success, warning) for improved visual feedback
|
|
79
|
+
- Changed LSP hover rendering to display documentation text before code blocks in both collapsed and expanded views
|
|
80
|
+
- Changed Write tool to show streaming preview of content being written with syntax highlighting
|
|
81
|
+
- Changed Read tool to display resolved path information when reading from URLs or symlinks
|
|
82
|
+
- Changed Calculator tool result display to show both expression and output (e.g., `2+2 = 4`) instead of just the result
|
|
83
|
+
- Changed Python tool output to group status information under a labeled section for clearer organization
|
|
84
|
+
- Changed SSH tool output to apply consistent styling to non-ANSI output lines
|
|
85
|
+
- Changed Todo Write tool to respect expanded/collapsed state and use standard preview limits
|
|
86
|
+
- Changed Web Search related questions to respect expanded/collapsed state instead of always showing all items
|
|
87
|
+
- Changed empty and error state rendering across multiple tools (Find, Grep, Ls, Notebook, Calculator, Ask) to include consistent status headers
|
|
88
|
+
- Changed split commit to support hunk selectors (all, indices, or line ranges) instead of whole-file staging
|
|
89
|
+
- Changed `analyze_file` tool to `analyze_files` for batch parallel analysis of multiple files
|
|
90
|
+
- Switched agentic commit from auto-generated changelogs to agent-proposed entries with validation and retry logic
|
|
91
|
+
- Commit agent now resolves a separate smaller model for commit generation instead of reusing the primary model
|
|
92
|
+
- Normalized code formatting and indentation across tool renderers and UI components
|
|
93
|
+
- Changed git-file-diff tool to prioritize files by type and respect token budget limits with intelligent truncation
|
|
94
|
+
- Changed git-overview tool to filter and report excluded lock files separately from staged files
|
|
95
|
+
- Changed analyze-file tool to include file type inference and enriched related files with line counts
|
|
96
|
+
- Changed propose-changelog tool to support optional deletion entries for removing existing changelog items
|
|
97
|
+
- Changed commit agent to accept pre-computed file observations and format them into session prompts
|
|
98
|
+
- Changed changelog skip condition in `applyChangelogProposals` to also check for empty deletions object
|
|
99
|
+
- Changed `createCommitTools()` to build tools array incrementally with conditional `analyze_files` inclusion based on `enableAnalyzeFiles` flag
|
|
100
|
+
- Changed system prompt guidance to clarify that pre-computed observations prevent redundant `analyze_files` calls
|
|
101
|
+
- Removed map-reduce preprocessing phase from commit agent for faster iteration
|
|
102
|
+
- Changed commit agent to process full diff text directly instead of pre-computed file observations
|
|
103
|
+
- Changed commit agent initialization to load settingsManager, authStorage, modelRegistry, and stagedFiles in parallel
|
|
104
|
+
- Changed commit agent prompt to remove pre-computed observations guidance and encourage direct analyze_files usage
|
|
105
|
+
- Changed AuthStorage from constructor-based instantiation to async factory method (AuthStorage.create())
|
|
106
|
+
- Changed Python kernel resource management with gateway shutdown on session disposal
|
|
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
|
|
116
|
+
|
|
117
|
+
### Fixed
|
|
118
|
+
- Fixed database busy errors during concurrent access by adding retry logic with exponential backoff when opening storage
|
|
119
|
+
- Find tool now rejects searches from root directory and enforces a 5-second timeout on fd operations
|
|
120
|
+
- Commit command now exits cleanly with exit code 0 on success
|
|
121
|
+
- Handle undefined code parameter in code cell renderer
|
|
122
|
+
- Fixed indentation formatting in split-commit tool function signature
|
|
123
|
+
- Fixed changelog application to process proposals containing only deletion entries without additions
|
|
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
|
|
5
130
|
## [8.0.0] - 2026-01-23
|
|
6
131
|
### Added
|
|
7
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` }],
|