@linxiraos/zeta 1.0.5 → 1.0.6

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.
Files changed (180) hide show
  1. package/CHANGELOG.md +98 -12
  2. package/dist/{CHANGELOG-2hch7rvp.md → CHANGELOG-tv8yytqn.md} +98 -12
  3. package/dist/cli.js +3539 -3519
  4. package/dist/docs-index.generated.txt +1 -1
  5. package/dist/types/config/model-discovery.d.ts +2 -0
  6. package/dist/types/config/model-registry.d.ts +6 -1
  7. package/dist/types/config/settings-schema.d.ts +20 -0
  8. package/dist/types/config/settings-zh.d.ts +36 -0
  9. package/dist/types/debug/report-bundle.d.ts +7 -2
  10. package/dist/types/extensibility/extensions/loader.d.ts +2 -0
  11. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  12. package/dist/types/extensibility/extensions/types.d.ts +2 -0
  13. package/dist/types/extensibility/legacy-pi-ai-shim.d.ts +4 -0
  14. package/dist/types/i18n/en.d.ts +91 -0
  15. package/dist/types/i18n/messages.d.ts +91 -0
  16. package/dist/types/i18n/zh.d.ts +91 -0
  17. package/dist/types/launch/presence.d.ts +11 -0
  18. package/dist/types/launch/spawn-options.d.ts +9 -1
  19. package/dist/types/lsp/client.d.ts +22 -0
  20. package/dist/types/lsp/workspace-diagnostics.d.ts +2 -0
  21. package/dist/types/markit/converters/pdf/index.d.ts +2 -1
  22. package/dist/types/mcp/config.d.ts +3 -1
  23. package/dist/types/modes/components/settings-defs.d.ts +6 -0
  24. package/dist/types/modes/components/tool-execution.d.ts +3 -1
  25. package/dist/types/registry/agent-lifecycle.d.ts +11 -0
  26. package/dist/types/registry/agent-registry.d.ts +4 -0
  27. package/dist/types/server/web-gateway/models.d.ts +1 -0
  28. package/dist/types/server/web-gateway/settings.d.ts +67 -0
  29. package/dist/types/session/agent-session-types.d.ts +0 -2
  30. package/dist/types/session/agent-session.d.ts +20 -0
  31. package/dist/types/session/date-cwd-reminder.d.ts +22 -0
  32. package/dist/types/session/irc-bridge.d.ts +2 -0
  33. package/dist/types/session/messages.d.ts +4 -0
  34. package/dist/types/session/session-loader.d.ts +18 -11
  35. package/dist/types/session/session-maintenance.d.ts +6 -2
  36. package/dist/types/session/session-manager.d.ts +19 -3
  37. package/dist/types/session/session-tools.d.ts +0 -1
  38. package/dist/types/session/turn-recovery.d.ts +7 -7
  39. package/dist/types/tools/browser/attach.d.ts +16 -0
  40. package/dist/types/tools/browser/launch.d.ts +2 -2
  41. package/dist/types/tools/browser.d.ts +1 -1
  42. package/dist/types/tools/builtin-names.d.ts +1 -1
  43. package/dist/types/tools/hub/jobs.d.ts +6 -0
  44. package/dist/types/tools/hub/types.d.ts +6 -0
  45. package/dist/types/tools/read-pdf.d.ts +15 -0
  46. package/dist/types/utils/external-editor.d.ts +7 -0
  47. package/dist/types/utils/markit.d.ts +3 -4
  48. package/dist/types/vibe/runtime.d.ts +3 -3
  49. package/package.json +11 -14
  50. package/scripts/build-binary.ts +0 -2
  51. package/src/auto-thinking/classifier.ts +37 -23
  52. package/src/cli/models-cli.ts +1 -1
  53. package/src/cli/read-cli.ts +2 -0
  54. package/src/commit/analysis/conventional.ts +15 -9
  55. package/src/commit/analysis/summary.ts +15 -9
  56. package/src/commit/changelog/generate.ts +15 -9
  57. package/src/commit/map-reduce/map-phase.ts +3 -19
  58. package/src/commit/map-reduce/reduce-phase.ts +15 -9
  59. package/src/config/model-discovery.ts +3 -3
  60. package/src/config/model-registry.ts +29 -16
  61. package/src/config/settings-schema.ts +25 -0
  62. package/src/config/settings-zh.ts +3791 -0
  63. package/src/debug/report-bundle.ts +25 -59
  64. package/src/discovery/claude-plugins.ts +2 -1
  65. package/src/discovery/claude.ts +4 -2
  66. package/src/discovery/helpers.ts +5 -0
  67. package/src/edit/renderer.ts +48 -19
  68. package/src/extensibility/extensions/loader.ts +9 -5
  69. package/src/extensibility/extensions/runner.ts +124 -21
  70. package/src/extensibility/extensions/types.ts +2 -0
  71. package/src/extensibility/extensions/wrapper.ts +16 -10
  72. package/src/extensibility/legacy-pi-ai-shim.ts +4 -0
  73. package/src/extensibility/plugins/legacy-pi-compat.ts +1 -1
  74. package/src/extensibility/plugins/marketplace/manager.ts +15 -18
  75. package/src/i18n/en.ts +98 -0
  76. package/src/i18n/messages.ts +99 -0
  77. package/src/i18n/zh.ts +96 -0
  78. package/src/irc/bus.ts +1 -1
  79. package/src/launch/broker.ts +8 -1
  80. package/src/launch/presence.ts +77 -1
  81. package/src/launch/spawn-options.ts +11 -4
  82. package/src/lsp/client.ts +35 -3
  83. package/src/lsp/clients/biome-client.ts +47 -93
  84. package/src/lsp/servers.ts +17 -11
  85. package/src/lsp/tool.ts +2 -4
  86. package/src/lsp/workspace-diagnostics.ts +24 -2
  87. package/src/markit/NOTICE +8 -8
  88. package/src/markit/converters/pdf/index.ts +14 -126
  89. package/src/mcp/client.ts +8 -9
  90. package/src/mcp/config.ts +50 -6
  91. package/src/memories/index.ts +29 -25
  92. package/src/mnemopi/backend.ts +13 -11
  93. package/src/modes/components/ask-dialog.ts +25 -5
  94. package/src/modes/components/settings-defs.ts +35 -5
  95. package/src/modes/components/settings-selector.ts +52 -39
  96. package/src/modes/components/tool-execution.ts +10 -6
  97. package/src/modes/components/welcome.ts +4 -1
  98. package/src/modes/controllers/extension-ui-controller.ts +52 -32
  99. package/src/modes/controllers/selector-controller.ts +6 -0
  100. package/src/modes/controllers/tan-command-controller.ts +1 -0
  101. package/src/modes/interactive-mode.ts +49 -10
  102. package/src/modes/rpc/rpc-client.ts +7 -0
  103. package/src/modes/theme/defaults/birch.json +2 -2
  104. package/src/modes/utils/hotkeys-markdown.ts +1 -1
  105. package/src/prompts/system/checkpoint-active-notice.md +5 -0
  106. package/src/prompts/system/date-cwd-reminder.md +3 -0
  107. package/src/prompts/system/project-prompt.md +0 -1
  108. package/src/prompts/system/rewind-report.md +1 -3
  109. package/src/prompts/tools/browser.md +2 -1
  110. package/src/prompts/tools/rewind.md +1 -13
  111. package/src/registry/agent-lifecycle.ts +34 -0
  112. package/src/registry/agent-registry.ts +27 -2
  113. package/src/registry/persisted-agents.ts +40 -20
  114. package/src/sdk.ts +32 -2
  115. package/src/server/web-gateway/agents.ts +30 -14
  116. package/src/server/web-gateway/models.ts +28 -0
  117. package/src/server/web-gateway/settings.ts +342 -0
  118. package/src/server/web-gateway.ts +15 -0
  119. package/src/session/agent-session-types.ts +0 -2
  120. package/src/session/agent-session.ts +178 -46
  121. package/src/session/date-cwd-reminder.ts +77 -0
  122. package/src/session/irc-bridge.ts +5 -0
  123. package/src/session/messages.ts +5 -1
  124. package/src/session/session-loader.ts +106 -64
  125. package/src/session/session-maintenance.ts +189 -115
  126. package/src/session/session-manager.ts +142 -35
  127. package/src/session/session-persistence.ts +4 -4
  128. package/src/session/session-storage.ts +18 -5
  129. package/src/session/session-tools.ts +5 -10
  130. package/src/session/turn-recovery.ts +102 -20
  131. package/src/session/unexpected-stop-classifier.ts +33 -21
  132. package/src/slash-commands/builtin-collaboration.ts +5 -5
  133. package/src/slash-commands/builtin-lifecycle.ts +17 -12
  134. package/src/slash-commands/builtin-marketplace.ts +3 -3
  135. package/src/slash-commands/builtin-modes.ts +32 -29
  136. package/src/slash-commands/builtin-session.ts +18 -13
  137. package/src/slash-commands/builtin-zeta.ts +11 -0
  138. package/src/system-prompt.ts +0 -5
  139. package/src/task/executor.ts +4 -15
  140. package/src/task/persisted-revive.ts +3 -6
  141. package/src/tools/ask.ts +39 -34
  142. package/src/tools/browser/attach.ts +80 -25
  143. package/src/tools/browser/launch.ts +44 -15
  144. package/src/tools/browser/relay/daemon.ts +3 -7
  145. package/src/tools/browser/render.ts +1 -1
  146. package/src/tools/browser/shared-daemon.ts +3 -7
  147. package/src/tools/browser.ts +5 -5
  148. package/src/tools/builtin-names.ts +7 -3
  149. package/src/tools/checkpoint.ts +5 -6
  150. package/src/tools/hub/index.ts +1 -1
  151. package/src/tools/hub/jobs.ts +20 -3
  152. package/src/tools/hub/types.ts +6 -0
  153. package/src/tools/index.ts +1 -0
  154. package/src/tools/read-pdf.ts +135 -0
  155. package/src/tools/read.ts +63 -37
  156. package/src/tools/render-utils.ts +53 -21
  157. package/src/tools/think.ts +15 -3
  158. package/src/tts/speech-enhancer.ts +19 -14
  159. package/src/utils/commit-message-generator.ts +14 -12
  160. package/src/utils/external-editor.ts +24 -5
  161. package/src/utils/markit.ts +6 -44
  162. package/src/utils/title-generator.ts +29 -19
  163. package/src/vibe/runtime.ts +32 -17
  164. package/dist/types/markit/converters/pdf/columns.d.ts +0 -35
  165. package/dist/types/markit/converters/pdf/extract.d.ts +0 -10
  166. package/dist/types/markit/converters/pdf/grid.d.ts +0 -25
  167. package/dist/types/markit/converters/pdf/headers.d.ts +0 -24
  168. package/dist/types/markit/converters/pdf/render.d.ts +0 -24
  169. package/dist/types/markit/converters/pdf/types.d.ts +0 -75
  170. package/dist/types/tools/read-pdf-images.d.ts +0 -12
  171. package/dist/types/utils/mupdf-wasm-embed.d.ts +0 -1
  172. package/scripts/embed-mupdf-wasm.ts +0 -67
  173. package/src/markit/converters/pdf/columns.ts +0 -103
  174. package/src/markit/converters/pdf/extract.ts +0 -598
  175. package/src/markit/converters/pdf/grid.ts +0 -780
  176. package/src/markit/converters/pdf/headers.ts +0 -106
  177. package/src/markit/converters/pdf/render.ts +0 -501
  178. package/src/markit/converters/pdf/types.ts +0 -84
  179. package/src/tools/read-pdf-images.ts +0 -250
  180. package/src/utils/mupdf-wasm-embed.ts +0 -12
package/CHANGELOG.md CHANGED
@@ -1,8 +1,94 @@
1
1
  # Changelog
2
2
 
3
- ## [1.0.5] - 2026-08-16
3
+ ## [Unreleased]
4
4
 
5
- ## [1.0.2] - 2026-08-15
5
+ ### Changed
6
+
7
+ - `tracking_update` tool and `/tracking` are now off by default, gated by the
8
+ `tracking.enabled` setting (opt-in)
9
+
10
+ ## [1.0.6] - 2026-08-17
11
+
12
+ ## [17.3.5] - 2026-08-16
13
+
14
+ ### Added
15
+
16
+ - Added Extensions tab group to settings schema
17
+
18
+ ### Changed
19
+
20
+ - Routed paid xAI models (XAI_API_KEY / xai/…) through the Responses API used by SuperGrok OAuth instead of Chat Completions, including reliable replay of encrypted reasoning content on follow-up turns.
21
+ - Updated the default model for XAI_API_KEY (xai) to grok-4.5, and the default SuperGrok OAuth (xai-oauth) model to grok-4.5. Automatic model selection continues to prefer paid xai/grok-4.5 when only XAI_API_KEY is set, with xai-oauth/grok-4.5 still available explicitly.
22
+ - Stopped sending presence/frequency penalties and stop sequences to xAI reasoning models such as grok-4.5, which reject them.
23
+
24
+ ### Fixed
25
+
26
+ - Fixed `hub` job and wait lists hiding stale running subagent registrations that have no turn in flight, ensuring they remain visible so operators can cancel them
27
+ - Fixed external thinking scratchpads running alongside native reasoning on xAI Grok 4 and other reasoning-only Responses models that reject `reasoning.effort`
28
+ - Fixed llama.cpp model discovery producing a baseUrl without the /v1 prefix for non-Qwen models, causing 404 errors on OpenAI-compatible endpoints.
29
+ - Fixed prompt caching on open-weight providers (DeepSeek, Qwen, GLM, …) so tool schemas stay cached across directory changes and midnight rollovers.
30
+ - Fixed omp --fork omitting the source session's artifact directory, so CLI-created forks now preserve artifact:// references like interactive /fork.
31
+ - Fixed long ask option labels being hard-truncated at the terminal width; labels now wrap onto indented continuation lines.
32
+ - Fixed toggling display.showTokenUsage from /settings leaving existing token-usage rows stale until the transcript was rebuilt.
33
+ - Fixed mid-run auto-compaction blocking the live loop while waiting on extension handlers, which could hang after a snapcompact or context-full pass.
34
+ - Reduced peak memory for persisted subagent revival probes by streaming large file-backed session journals instead of loading them fully.
35
+ - Improved responsiveness of streaming edit previews for large diffs by rendering only the visible tail.
36
+ - Fixed repeated /btw panels committing transient frames to native scrollback and replaying conversation history after dismissal.
37
+ - Clarified that closing browser tool sessions releases managed handles without closing pages in spawned, CDP-connected, or relay browsers.
38
+ - Fixed interrupted vibe_wait calls being reported as elapsed timeout windows.
39
+ - Improved checkpoint/rewind prompt rendering to stay accurate after a rewind and be more concise.
40
+ - Fixed Cursor turns dying with HTTP/2 stream errors (NGHTTP2_INTERNAL_ERROR / NGHTTP2_REFUSED_STREAM) after tool calls already had results, instead of leaving the agent idle until the user typed "continue".
41
+ - Fixed mixed-case plugin tool names being lowercased during tool-set refresh, which unmounted them from xd:// whenever MCP tools connected.
42
+ - Fixed Exa MCP servers being unmounted when their config explicitly requests tools the native Exa integration does not provide, breaking /mcp reconnect exa.
43
+ - Fixed Claude Code custom tool discovery attempting to import non-module files from .claude/tools.
44
+ - Fixed Agent Hub parking a mid-spawn child session so subsequent task calls failed with an ownership error and the row could never be revived.
45
+ - Fixed the welcome banner displaying a stale model name when the session's active model changes after startup (e.g. after a delayed config load or an explicit /model switch).
46
+ - Fixed Nix standalone binaries retaining Bun's build-time package in their runtime closure.
47
+ - Fixed birch user/custom message card contrast on dark terminals, where chat bubbles could render light-on-light.
48
+ - Fixed hidden tool snapshots preventing long streamed assistant responses from entering terminal scrollback.
49
+ - Prevented omp models from loading ambient hook factories while preserving extension-contributed providers.
50
+ - Fixed the ask dialog's multi-select mode dead-ending on Enter; Space now toggles options and Enter submits the current selection.
51
+ - Fixed workspace diagnostics reporting a clean workspace when its checker crashed without producing output.
52
+ - Fixed manual /compact failing outright when a summarization request hit a transient provider overload.
53
+ - Fixed transient Anthropic failures (overloaded_error, rate_limit_error, 429/500/502/503/529) aborting or silently degrading side-effect-free background LLM calls such as session title generation, TTS speech enhancement, commit-message generation, thinking/stop classifiers, memory extraction/consolidation, and commit analysis/summary/changelog passes; these now retry with backoff honoring retry-after instead of failing or returning an indistinguishable empty result.
54
+ - Fixed the shared headless browser daemon launching from the macOS system Google Chrome bundle, which could cause macOS to route the user's link clicks to the automation daemon and silently swallow them; the daemon now prefers an isolated Chrome for Testing binary on macOS.
55
+ - Reclaimed abandoned daemon runtime directories under ~/.omp/run/daemons/, preventing unbounded growth of leftover Chromium profiles and broker state.
56
+ - Kept the welcome screen's Tips, LSP Servers, and Recent sessions visible when a long model name still leaves enough terminal width for both columns.
57
+ - Fixed focused shimmer animation frames (ultrathink, orchestrate, workflowz) repainting the full TUI too frequently, causing high CPU usage while composing prompts on WSL2.
58
+ - Fixed the /debug report bundle including unrelated historic sessions, leaking other sessions' files and bloating archives.
59
+ - Fixed adopted keep-alive agents remaining stuck in a running state in the registry after deferred turn settlement, and prevented stale refs from sustaining bare hub wait calls indefinitely.
60
+ - Fixed home-relative marketplace catalog paths not being expanded before cache access, preventing updates from writing into a literal ~ directory.
61
+ - Fixed broker-owned headless Chromium opening and retaining an unowned blank foreground window on Windows.
62
+ - Fixed the auto thinking classifier failing every turn on Anthropic models served through LiteLLM/Vertex due to a thinking-budget mismatch.
63
+ - Fixed always-ask approval prompts bypassing edit preview readiness when a built-in tool executes under its wire-level alias, such as edit running as apply_patch.
64
+ - Fixed lsp reload crashing non-rust-analyzer language servers by sending them a rust-analyzer-specific request; that request is now gated to rust-analyzer only.
65
+ - Fixed browser open failing with "Shared browser daemon unavailable" when HTTP_PROXY/HTTPS_PROXY is set, because liveness probes were incorrectly routed through the proxy.
66
+ - Fixed defaultThinkingLevel: auto skipping classification for user-invoked /skill:<name> turns, leaving the effort stuck on pending auto.
67
+ - Fixed custom-tool directory discovery recursing into subtrees despite a non-recursive default, which could crash startup when scanning large dependency directories such as Python venvs.
68
+ - Repaired torn session JSONL appends after disk-write failures, rewrote malformed resumed files before their next append, retried transient persistence failures, and surfaced failures in the TUI.
69
+ - Prevented Anthropic model fallback from replaying model-bound thinking blocks across models, and surfaced immutable-thinking errors without retrying the unchanged invalid turn.
70
+ - Fixed empty-stop failure messages always suggesting a context problem even when the provider billed output tokens; the message now reports the billed token count and points at a provider-side filter/translation issue when appropriate.
71
+ - Fixed a parked, session-less agent-registry entry with no reviver permanently poisoning its agent id, preventing fresh subagent spawns from reusing that id.
72
+ - Made extension tool-call timeouts configurable and paused them during user dialogs.
73
+ - Fixed /vibe cancellation leaving an in-flight model turn unaware that Vibe mode and its tools were removed.
74
+ - Fixed empty local-model stops lingering on the persisted active branch after retries, preventing them from resurfacing after reload or a mid-retry process kill.
75
+ - Fixed the Biome linter client silently dropping every diagnostic due to an outdated JSON output schema; it now supports Biome 2.x's diagnostic format.
76
+ - Fixed `hub jobs` and empty `hub wait` snapshots hiding running subagents that have no live turn, which removed the only way to discover and `hub cancel` a stale registration; such agents are listed again and flagged as having no turn in flight.
77
+ - Fixed external thinking being offered on xAI reasoning-only Responses models (grok-4 family) that reject `reasoning.effort`, where the private scratchpad ran alongside native reasoning instead of replacing it.
78
+ - Fixed the extension tool-call handler timeout rendering outside a titled section in `/settings` by registering its Extensions group on the Tools tab.
79
+
80
+ ## [17.3.4] - 2026-08-14
81
+
82
+ ### Changed
83
+
84
+ - Replaced the MuPDF-WASM PDF document backend with `pdf-inspector` through `@linxiraos/pi-natives`, preserving cached text conversion and PDF line selectors while reporting pages that need OCR.
85
+ - Restored `read <pdf>:` and `read <pdf>:<image>.png` page rendering by automatically capturing PDF pages through the headless Chromium browser tool.
86
+
87
+ ### Fixed
88
+
89
+ - Fixed Streamable HTTP MCP sessions being invalidated by opening the optional GET SSE stream before sending `notifications/initialized`, which prevented Figma Dev Mode MCP from connecting ([#8514](https://github.com/can1357/oh-my-pi/issues/8514)).
90
+ - Fixed the `/hotkeys` table describing Ctrl+D (`app.exit`) as "Exit (when editor is empty)" when it actually exits unconditionally and saves the current prompt as a resumable draft ([#8530](https://github.com/can1357/oh-my-pi/issues/8530)).
91
+ - Fixed Ctrl+G external editors failing to launch on Windows because Bun re-quoted the embedded `cmd.exe /c` command line ([#8544](https://github.com/can1357/oh-my-pi/issues/8544)).
6
92
 
7
93
  ## [17.3.3] - 2026-08-14
8
94
 
@@ -1111,7 +1197,7 @@
1111
1197
  - Fixed onboarding omitting model selection by adding a persisted default-model step (fresh installs only — the setup version is not bumped, so existing installs are not re-prompted), and documented custom `models.yml` provider configuration and default-role selection ([#5979](https://github.com/can1357/oh-my-pi/issues/5979)).
1112
1198
  - Fixed `autoResume` crossing an explicit `/new` boundary: after `/new` a new session's JSONL is created lazily (only once assistant output exists), so exiting before any assistant message left the per-terminal breadcrumb pointing at a not-yet-materialized file. `readTerminalBreadcrumbEntry` rejected the missing target and `continueRecent()` fell back to the most-recent session — the pre-`/new` transcript — processing the next prompt with stale context. `/new` now records a durable `fresh` breadcrumb boundary that `continueRecent()` honors (starting fresh) even when the target is absent, while a genuinely stale/deleted breadcrumb still falls back to the most-recent session ([#5730](https://github.com/can1357/oh-my-pi/issues/5730)).
1113
1199
  - Fixed subagents that repeatedly submit malformed `yield` results from leaving the parent waiting forever; malformed submissions now repeat the required response format, and repeated invalid submissions fail the child with a clear error. ([#4957](https://github.com/can1357/oh-my-pi/issues/4957))
1114
- - Fixed configured or `-e` extensions in compiled binaries failing to resolve bundled `@oh-my-pi/*` value imports through the `omp-legacy-pi-bundled:` registry, and surfaced extension load failures during interactive and `-p` session startup. ([#4954](https://github.com/can1357/oh-my-pi/issues/4954))
1200
+ - Fixed configured or `-e` extensions in compiled binaries failing to resolve bundled `@linxiraos/*` value imports through the `omp-legacy-pi-bundled:` registry, and surfaced extension load failures during interactive and `-p` session startup. ([#4954](https://github.com/can1357/oh-my-pi/issues/4954))
1115
1201
 
1116
1202
  ### Removed
1117
1203
 
@@ -2600,7 +2686,7 @@
2600
2686
  - Fixed the `ask` tool's "Other (type your own)" free-text editor (prompt-style `HookEditorComponent`) ignoring Ctrl+Q and Ctrl+Enter, so Windows Terminal users who learned the `app.message.followUp` chord from the main editor (#1903 / fixed by #1905) got zero feedback on submit. The hook-style and main-editor surfaces honored `matchesAppFollowUp`; the prompt-style handler did not, leaving plain Enter as the sole submit path and Ctrl+Enter falling through to Editor as a newline (silently swallowed by WT). `#handlePromptStyleInput` now checks `matchesAppFollowUp` first — mirroring `#handleHookStyleInput` — and the hint reads `enter or ctrl+q submit` so the chord is discoverable. ([#3353](https://github.com/can1357/oh-my-pi/issues/3353))
2601
2687
  - Fixed the TUI freezing when a tool approval prompt fires while `/settings` (or the Extensions/Agents dashboard) is open. The fullscreen overlay's close handler restored focus to the editor it had captured at open time, but `ExtensionUiController` had since swapped the editor out of the editor slot for the approval prompt — so on exit the visible prompt sat unreachable while keystrokes routed to the now-unmounted editor (no Enter/Up/Down/Esc response, only Ctrl+C escaped). `SelectorController` now restores focus to whatever currently owns the editor slot via a `focusActiveEditorArea()` helper, applied to settings, extensions dashboard, and agents dashboard close paths. ([#3349](https://github.com/can1357/oh-my-pi/issues/3349))
2602
2688
  - Fixed `/settings` coercing enum/text values to display strings before handing them to the TUI list, preventing YAML numeric enum values from reaching native truncation ([#3338](https://github.com/can1357/oh-my-pi/issues/3338)).
2603
- - Fixed all extension loading silently failing on the cross-compiled `omp-darwin-arm64` release binary (downloaded directly or via a Homebrew tap wrapper) because `__computeBunfsPackageRoot` mis-handled `import.meta.dir = "//root/omp-darwin-arm64"`. Bun 1.3.14 reports `<bunfs-root>/<binary-name>` for the compiled entry's `import.meta.dir`, but the pre-fix function joined `metaDir + "packages"` and produced `/root/omp-darwin-arm64/packages` — the binary basename was baked into every bunfs path, so the TypeBox/legacy-pi shims and every `@oh-my-pi/pi-*` package-root override failed `existsSync` validation and `resolveCanonicalPiSpecifier` fell through to a bunfs `Bun.resolveSync` that also could not find the module. The function now detects the bunfs-root + binary-basename shape (`path.basename(path.dirname(metaDir)) === "root"`) and strips the trailing binary segment by slicing the original `metaDir`; the production bunfs shim join path also preserves Bun's bunfs-native `//root` / `B:\~BUN\root` prefix that `path.join` would otherwise collapse. ([#3329](https://github.com/can1357/oh-my-pi/issues/3329))
2689
+ - Fixed all extension loading silently failing on the cross-compiled `omp-darwin-arm64` release binary (downloaded directly or via a Homebrew tap wrapper) because `__computeBunfsPackageRoot` mis-handled `import.meta.dir = "//root/omp-darwin-arm64"`. Bun 1.3.14 reports `<bunfs-root>/<binary-name>` for the compiled entry's `import.meta.dir`, but the pre-fix function joined `metaDir + "packages"` and produced `/root/omp-darwin-arm64/packages` — the binary basename was baked into every bunfs path, so the TypeBox/legacy-pi shims and every `@linxiraos/pi-*` package-root override failed `existsSync` validation and `resolveCanonicalPiSpecifier` fell through to a bunfs `Bun.resolveSync` that also could not find the module. The function now detects the bunfs-root + binary-basename shape (`path.basename(path.dirname(metaDir)) === "root"`) and strips the trailing binary segment by slicing the original `metaDir`; the production bunfs shim join path also preserves Bun's bunfs-native `//root` / `B:\~BUN\root` prefix that `path.join` would otherwise collapse. ([#3329](https://github.com/can1357/oh-my-pi/issues/3329))
2604
2690
  - Fixed llama.cpp discovery to prefer per-model `/v1/models` `meta.n_ctx`/`meta.n_ctx_train` values, refresh selected models after lazy load, and bypass fresh-cache reuse so server restarts update context windows. ([#3310](https://github.com/can1357/oh-my-pi/issues/3310))
2605
2691
  - Fixed `task.maxConcurrency: 0` serializing subagent spawns instead of running them unbounded. The settings UI labels `0` as "Unlimited", but the session-scoped spawn `Semaphore` clamped `max` via `Math.max(1, max)`, so the second subagent body in a batch always waited for the first to release the seat. The constructor now treats `max <= 0` (and any non-finite input) as unbounded via `Number.POSITIVE_INFINITY`, matching the eval `parallel()`/`pipeline()` worker-pool semantics ([#3305](https://github.com/can1357/oh-my-pi/issues/3305)).
2606
2692
  - Fixed MCP tool calls forwarding empty optional placeholder arguments (`""` and `{}`) to `tools/call`; optional placeholders are now omitted while required fields and meaningful falsy values are preserved. ([#3302](https://github.com/can1357/oh-my-pi/issues/3302))
@@ -4182,7 +4268,7 @@
4182
4268
  - Fixed `task`-spawned subagents repeating filesystem scans the parent had already completed. `ExecutorOptions` and the `createAgentSession()` call inside `runSubprocess()` did not forward `rules`, the discovered extension paths, or the discovered `.omp/tools/` paths, so each subagent re-ran `loadCapability<Rule>()`, `discoverAndLoadExtensions()`, and the full `.omp/tools/` walk. The toolsession now caches `session.rules`, `session.extensionPaths`, and `session.customToolPaths`; `runSubprocess()` threads them through; and `createAgentSession()` accepts new `preloadedExtensionPaths` and `preloadedCustomToolPaths` options backed by new exported `discoverExtensionPaths()` and `discoverCustomToolPaths()` helpers. Crucially, only path lists are forwarded — never loaded instances. Each session rebuilds its own `Extension` and `LoadedCustomTool` objects so the per-session `ExtensionAPI`/`CustomToolAPI` (cwd, eventBus, runtime, exec, pushPendingAction, UI) targets the right session; forwarding loaded instances would have routed extension handlers and custom-tool execution back through the parent. The CLI's `preloadedExtensions` short-circuit is preserved for same-process reuse and now shallow-clones the caller's `extensions` array so inline-extension augmentation (autoresearch + custom-tools wrapper) cannot bleed back into it ([#2190](https://github.com/can1357/oh-my-pi/issues/2190)).
4183
4269
  - Fixed SSH tool cancellation hanging behind OpenSSH ControlMaster streams that stayed open after an Esc/user interrupt ([#2180](https://github.com/can1357/oh-my-pi/issues/2180)).
4184
4270
  - Fixed Windows stdio MCP servers launched through PATH shims such as `codegraph.cmd` so bare commands like `codegraph` resolve via `PATHEXT` before spawn ([#2174](https://github.com/can1357/oh-my-pi/issues/2174)).
4185
- - Fixed compiled-binary extensions failing to load `@oh-my-pi/pi-*` packages when `bun --compile` quietly dropped one of the extra entrypoints (observed on macOS arm64 release builds): the legacy-pi compat shim's package-root override branch returned the bunfs path without checking the target was present, so the rewrite emitted a `file://` URL to a missing module and the #1216 fallback (scoped to the throwing `getResolvedSpecifier` path) never ran. Override targets are now validated against the on-disk filesystem at module init, missing entries are dropped, and resolution falls through to canonical lookup so Bun resolves the import from the extension's own `node_modules` ([#2168](https://github.com/can1357/oh-my-pi/issues/2168)).
4271
+ - Fixed compiled-binary extensions failing to load `@linxiraos/pi-*` packages when `bun --compile` quietly dropped one of the extra entrypoints (observed on macOS arm64 release builds): the legacy-pi compat shim's package-root override branch returned the bunfs path without checking the target was present, so the rewrite emitted a `file://` URL to a missing module and the #1216 fallback (scoped to the throwing `getResolvedSpecifier` path) never ran. Override targets are now validated against the on-disk filesystem at module init, missing entries are dropped, and resolution falls through to canonical lookup so Bun resolves the import from the extension's own `node_modules` ([#2168](https://github.com/can1357/oh-my-pi/issues/2168)).
4186
4272
 
4187
4273
  ## [15.10.8] - 2026-06-09
4188
4274
 
@@ -5009,7 +5095,7 @@
5009
5095
  ### Fixed
5010
5096
 
5011
5097
  - Fixed a rewind/restore loop when the session leaf lands on an assistant turn that emitted tool calls (e.g. selecting such a turn in `/tree`, or restoring a session whose head is a mid-batch turn). That turn's tool results are persisted as its children — *below* the leaf — so they fall off the leaf→root path that `buildSessionContext` walks, leaving the assistant turn's `tool_use` blocks dangling as the final message. `transformMessages` then fabricated one synthetic `"aborted"`/`"No result provided"` result per call plus a `<turn-aborted>` developer note, which both rendered as phantom failed calls on a turn that "hadn't run anything yet" and re-injected the whole failed batch into the model's context, prompting it to re-issue the batch (the spiral). `buildSessionContext` now strips dangling `tool_use` blocks from a trailing assistant turn (dropping the turn entirely if nothing else remains), so a rewound turn resumes cleanly from its reasoning/text. Live turns are unaffected — their results persist and the leaf advances past the assistant before any rebuild.
5012
- - Fixed external extension loading on Windows compiled binaries: bare `@oh-my-pi/pi-*` value imports (e.g. `import { AssistantMessageEventStream } from "@linxiraos/pi-ai"`) failed with `Cannot find package '\$bunfs\root\packages\…'` because `legacy-pi-compat.ts` built shim override paths from a hardcoded POSIX `/$bunfs/root/packages` literal. Win32 normalised the leading slash to a backslash and the resulting path never resolved against the real bunfs mount (`<drive>:\~BUN\root\…`). The bunfs package root is now derived from `import.meta.dir`, so override paths stay platform-native on Windows, Linux, and macOS ([#1514](https://github.com/can1357/oh-my-pi/issues/1514)).
5098
+ - Fixed external extension loading on Windows compiled binaries: bare `@linxiraos/pi-*` value imports (e.g. `import { AssistantMessageEventStream } from "@linxiraos/pi-ai"`) failed with `Cannot find package '\$bunfs\root\packages\…'` because `legacy-pi-compat.ts` built shim override paths from a hardcoded POSIX `/$bunfs/root/packages` literal. Win32 normalised the leading slash to a backslash and the resulting path never resolved against the real bunfs mount (`<drive>:\~BUN\root\…`). The bunfs package root is now derived from `import.meta.dir`, so override paths stay platform-native on Windows, Linux, and macOS ([#1514](https://github.com/can1357/oh-my-pi/issues/1514)).
5013
5099
  - Fixed the interactive prompt showing no cursor in Ghostty. A prior change wired the editor's cursor mode to a new `getUseTerminalCursorMarker()` (which always reported the *requested* preference) instead of the resolved hardware-cursor visibility, so when Ghostty force-hid the hardware cursor the editor stayed in terminal-cursor (marker-only) mode and drew no glyph — leaving no visible caret with either `showHardwareCursor`/`PI_HARDWARE_CURSOR` value. The editor now follows `ui.getShowHardwareCursor()`: a hidden hardware cursor falls back to the steady software-cursor glyph (which still emits `CURSOR_MARKER` for IME positioning).
5014
5100
 
5015
5101
  ### Changed
@@ -5660,7 +5746,7 @@
5660
5746
  - Fixed command-fixup notices to list all stripped segments instead of reporting only one
5661
5747
  - Fixed summarized `read` output stalling agents on elided regions by appending an explicit footer like `[NN lines across MM elided regions; read <path>:raw or a line range like <path>:1-9999 for verbatim content]`. The footer fires whenever the structural summarizer elided at least one span, so the model gets a concrete recovery selector instead of having to guess from a bare `...` / `{ .. }` marker. Surfaces `elidedLines` on `ReadToolDetails.summary` alongside the existing `elidedSpans`. ([#1046](https://github.com/can1357/oh-my-pi/issues/1046))
5662
5748
  - Updated the `read` tool prompt to describe the new elision footer and instruct the model to follow `:raw` (or an explicit line range) when the elided body is actually needed, rather than guessing.
5663
- - Fixed plugin extensions failing to load when their `peerDependencies` reference internal `pi-*` packages under any scope other than `@mariozechner` (e.g. `Cannot find module '@earendil-works/pi-tui'` from `@juicesharp/rpiv-ask-user-question`). The legacy-pi specifier shim now treats `@mariozechner`, `@earendil-works`, **and** the canonical `@oh-my-pi` itself as aliases for the same set of bundled in-process packages (`pi-agent-core`, `pi-ai`, `pi-coding-agent`, `pi-natives`, `pi-tui`, `pi-utils`), and additionally rewrites the upstream-only `pi-ai/oauth` subpath onto our `pi-ai/utils/oauth` layout. Restored the `Key` runtime helper export on `@linxiraos/pi-tui` to match upstream …
5749
+ - Fixed plugin extensions failing to load when their `peerDependencies` reference internal `pi-*` packages under any scope other than `@mariozechner` (e.g. `Cannot find module '@earendil-works/pi-tui'` from `@juicesharp/rpiv-ask-user-question`). The legacy-pi specifier shim now treats `@mariozechner`, `@earendil-works`, **and** the canonical `@linxiraos` itself as aliases for the same set of bundled in-process packages (`pi-agent-core`, `pi-ai`, `pi-coding-agent`, `pi-natives`, `pi-tui`, `pi-utils`), and additionally rewrites the upstream-only `pi-ai/oauth` subpath onto our `pi-ai/utils/oauth` layout. Restored the `Key` runtime helper export on `@linxiraos/pi-tui` to match upstream …
5664
5750
  - Fixed `omp commit` hanging after a successful commit instead of returning to the shell. The command now mirrors the `runPrintMode` exit pattern and calls `postmortem.quit(0)` once the pipeline resolves so lingering HTTP/2 keep-alive sockets, the Settings autosave timer, and other AgentSession background handles don't keep the event loop pinned. ([#1041](https://github.com/can1357/oh-my-pi/issues/1041))
5665
5751
  - Fixed hashline payload parsing to silently treat truly-blank lines as empty `~`-prefixed payload lines when more payload follows in the same run. The previous behavior broke at the blank ("payload line has no preceding +, <, or = operation.") even though the intent is obvious — the only ambiguity is between in-payload blanks and end-of-section blanks, and a one-line lookahead resolves it: blanks that precede a non-payload op still end the run cleanly as section separators. Recovers the common case of forgetting the leading separator on a blank inserted line without changing how trailing blanks between ops behave.
5666
5752
  - Rewrote the hashline edit prompt examples to use an ASCII-only `TITLE = "Mr"` → `"Mrs"` / `"Dr"` motif instead of the previous `" • "` and `"·"` separators. Some agents had been copying the middle-dot literal characters into real edits as if they were format scaffolding (e.g. emitting payload lines like `~ ·`), since the demo inserts were near-twins of the existing string. The new example keeps every original op shape (single-line replace, multiline replace, insert AFTER/BEFORE, append, delete, blank, plus both anti-patterns) but uses content that is obviously domain-specific and clearly distinct from any payload separator. Pure prompt change; no parser, schema, or runtime behavior is affected.
@@ -11126,7 +11212,7 @@
11126
11212
  - Removed worktree management system
11127
11213
  - Removed bundled wt custom command
11128
11214
  - Removed voice-related settings and configuration options
11129
- - Removed @oh-my-pi/pi-git-tool dependency
11215
+ - Removed @linxiraos/pi-git-tool dependency
11130
11216
 
11131
11217
  ## [6.8.5] - 2026-01-21
11132
11218
 
@@ -12623,7 +12709,7 @@
12623
12709
 
12624
12710
  ### Changed
12625
12711
 
12626
- - Renamed package scope to @oh-my-pi for consistent branding
12712
+ - Renamed package scope to @linxiraos for consistent branding
12627
12713
  - Simplified toolset and enhanced navigation
12628
12714
  - Improved process cleanup with tree kill
12629
12715
  - Updated CI/CD workflows for GitHub Actions with provenance-signed npm publishing
@@ -12636,7 +12722,7 @@
12636
12722
 
12637
12723
  ## [1.337.0] - 2026-01-02
12638
12724
 
12639
- Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mono](https://github.com/badlogic/pi-mono).
12725
+ Initial release under @linxiraos scope. See previous releases at [badlogic/pi-mono](https://github.com/badlogic/pi-mono).
12640
12726
 
12641
12727
  ## [1.5.1] - 2026-01-03
12642
12728
 
@@ -12727,7 +12813,7 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
12727
12813
 
12728
12814
  ### Changed
12729
12815
 
12730
- - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@oh-my-pi` version lineage.
12816
+ - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@linxiraos` version lineage.
12731
12817
 
12732
12818
  ## [1.0.0] - 2026-08-13
12733
12819
 
@@ -12749,7 +12835,7 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
12749
12835
 
12750
12836
  ### Changed
12751
12837
 
12752
- - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@oh-my-pi` version lineage.
12838
+ - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@linxiraos` version lineage.
12753
12839
 
12754
12840
  ## [0.50.1] - 2026-01-26
12755
12841
 
@@ -1,8 +1,94 @@
1
1
  # Changelog
2
2
 
3
- ## [1.0.5] - 2026-08-16
3
+ ## [Unreleased]
4
4
 
5
- ## [1.0.2] - 2026-08-15
5
+ ### Changed
6
+
7
+ - `tracking_update` tool and `/tracking` are now off by default, gated by the
8
+ `tracking.enabled` setting (opt-in)
9
+
10
+ ## [1.0.6] - 2026-08-17
11
+
12
+ ## [17.3.5] - 2026-08-16
13
+
14
+ ### Added
15
+
16
+ - Added Extensions tab group to settings schema
17
+
18
+ ### Changed
19
+
20
+ - Routed paid xAI models (XAI_API_KEY / xai/…) through the Responses API used by SuperGrok OAuth instead of Chat Completions, including reliable replay of encrypted reasoning content on follow-up turns.
21
+ - Updated the default model for XAI_API_KEY (xai) to grok-4.5, and the default SuperGrok OAuth (xai-oauth) model to grok-4.5. Automatic model selection continues to prefer paid xai/grok-4.5 when only XAI_API_KEY is set, with xai-oauth/grok-4.5 still available explicitly.
22
+ - Stopped sending presence/frequency penalties and stop sequences to xAI reasoning models such as grok-4.5, which reject them.
23
+
24
+ ### Fixed
25
+
26
+ - Fixed `hub` job and wait lists hiding stale running subagent registrations that have no turn in flight, ensuring they remain visible so operators can cancel them
27
+ - Fixed external thinking scratchpads running alongside native reasoning on xAI Grok 4 and other reasoning-only Responses models that reject `reasoning.effort`
28
+ - Fixed llama.cpp model discovery producing a baseUrl without the /v1 prefix for non-Qwen models, causing 404 errors on OpenAI-compatible endpoints.
29
+ - Fixed prompt caching on open-weight providers (DeepSeek, Qwen, GLM, …) so tool schemas stay cached across directory changes and midnight rollovers.
30
+ - Fixed omp --fork omitting the source session's artifact directory, so CLI-created forks now preserve artifact:// references like interactive /fork.
31
+ - Fixed long ask option labels being hard-truncated at the terminal width; labels now wrap onto indented continuation lines.
32
+ - Fixed toggling display.showTokenUsage from /settings leaving existing token-usage rows stale until the transcript was rebuilt.
33
+ - Fixed mid-run auto-compaction blocking the live loop while waiting on extension handlers, which could hang after a snapcompact or context-full pass.
34
+ - Reduced peak memory for persisted subagent revival probes by streaming large file-backed session journals instead of loading them fully.
35
+ - Improved responsiveness of streaming edit previews for large diffs by rendering only the visible tail.
36
+ - Fixed repeated /btw panels committing transient frames to native scrollback and replaying conversation history after dismissal.
37
+ - Clarified that closing browser tool sessions releases managed handles without closing pages in spawned, CDP-connected, or relay browsers.
38
+ - Fixed interrupted vibe_wait calls being reported as elapsed timeout windows.
39
+ - Improved checkpoint/rewind prompt rendering to stay accurate after a rewind and be more concise.
40
+ - Fixed Cursor turns dying with HTTP/2 stream errors (NGHTTP2_INTERNAL_ERROR / NGHTTP2_REFUSED_STREAM) after tool calls already had results, instead of leaving the agent idle until the user typed "continue".
41
+ - Fixed mixed-case plugin tool names being lowercased during tool-set refresh, which unmounted them from xd:// whenever MCP tools connected.
42
+ - Fixed Exa MCP servers being unmounted when their config explicitly requests tools the native Exa integration does not provide, breaking /mcp reconnect exa.
43
+ - Fixed Claude Code custom tool discovery attempting to import non-module files from .claude/tools.
44
+ - Fixed Agent Hub parking a mid-spawn child session so subsequent task calls failed with an ownership error and the row could never be revived.
45
+ - Fixed the welcome banner displaying a stale model name when the session's active model changes after startup (e.g. after a delayed config load or an explicit /model switch).
46
+ - Fixed Nix standalone binaries retaining Bun's build-time package in their runtime closure.
47
+ - Fixed birch user/custom message card contrast on dark terminals, where chat bubbles could render light-on-light.
48
+ - Fixed hidden tool snapshots preventing long streamed assistant responses from entering terminal scrollback.
49
+ - Prevented omp models from loading ambient hook factories while preserving extension-contributed providers.
50
+ - Fixed the ask dialog's multi-select mode dead-ending on Enter; Space now toggles options and Enter submits the current selection.
51
+ - Fixed workspace diagnostics reporting a clean workspace when its checker crashed without producing output.
52
+ - Fixed manual /compact failing outright when a summarization request hit a transient provider overload.
53
+ - Fixed transient Anthropic failures (overloaded_error, rate_limit_error, 429/500/502/503/529) aborting or silently degrading side-effect-free background LLM calls such as session title generation, TTS speech enhancement, commit-message generation, thinking/stop classifiers, memory extraction/consolidation, and commit analysis/summary/changelog passes; these now retry with backoff honoring retry-after instead of failing or returning an indistinguishable empty result.
54
+ - Fixed the shared headless browser daemon launching from the macOS system Google Chrome bundle, which could cause macOS to route the user's link clicks to the automation daemon and silently swallow them; the daemon now prefers an isolated Chrome for Testing binary on macOS.
55
+ - Reclaimed abandoned daemon runtime directories under ~/.omp/run/daemons/, preventing unbounded growth of leftover Chromium profiles and broker state.
56
+ - Kept the welcome screen's Tips, LSP Servers, and Recent sessions visible when a long model name still leaves enough terminal width for both columns.
57
+ - Fixed focused shimmer animation frames (ultrathink, orchestrate, workflowz) repainting the full TUI too frequently, causing high CPU usage while composing prompts on WSL2.
58
+ - Fixed the /debug report bundle including unrelated historic sessions, leaking other sessions' files and bloating archives.
59
+ - Fixed adopted keep-alive agents remaining stuck in a running state in the registry after deferred turn settlement, and prevented stale refs from sustaining bare hub wait calls indefinitely.
60
+ - Fixed home-relative marketplace catalog paths not being expanded before cache access, preventing updates from writing into a literal ~ directory.
61
+ - Fixed broker-owned headless Chromium opening and retaining an unowned blank foreground window on Windows.
62
+ - Fixed the auto thinking classifier failing every turn on Anthropic models served through LiteLLM/Vertex due to a thinking-budget mismatch.
63
+ - Fixed always-ask approval prompts bypassing edit preview readiness when a built-in tool executes under its wire-level alias, such as edit running as apply_patch.
64
+ - Fixed lsp reload crashing non-rust-analyzer language servers by sending them a rust-analyzer-specific request; that request is now gated to rust-analyzer only.
65
+ - Fixed browser open failing with "Shared browser daemon unavailable" when HTTP_PROXY/HTTPS_PROXY is set, because liveness probes were incorrectly routed through the proxy.
66
+ - Fixed defaultThinkingLevel: auto skipping classification for user-invoked /skill:<name> turns, leaving the effort stuck on pending auto.
67
+ - Fixed custom-tool directory discovery recursing into subtrees despite a non-recursive default, which could crash startup when scanning large dependency directories such as Python venvs.
68
+ - Repaired torn session JSONL appends after disk-write failures, rewrote malformed resumed files before their next append, retried transient persistence failures, and surfaced failures in the TUI.
69
+ - Prevented Anthropic model fallback from replaying model-bound thinking blocks across models, and surfaced immutable-thinking errors without retrying the unchanged invalid turn.
70
+ - Fixed empty-stop failure messages always suggesting a context problem even when the provider billed output tokens; the message now reports the billed token count and points at a provider-side filter/translation issue when appropriate.
71
+ - Fixed a parked, session-less agent-registry entry with no reviver permanently poisoning its agent id, preventing fresh subagent spawns from reusing that id.
72
+ - Made extension tool-call timeouts configurable and paused them during user dialogs.
73
+ - Fixed /vibe cancellation leaving an in-flight model turn unaware that Vibe mode and its tools were removed.
74
+ - Fixed empty local-model stops lingering on the persisted active branch after retries, preventing them from resurfacing after reload or a mid-retry process kill.
75
+ - Fixed the Biome linter client silently dropping every diagnostic due to an outdated JSON output schema; it now supports Biome 2.x's diagnostic format.
76
+ - Fixed `hub jobs` and empty `hub wait` snapshots hiding running subagents that have no live turn, which removed the only way to discover and `hub cancel` a stale registration; such agents are listed again and flagged as having no turn in flight.
77
+ - Fixed external thinking being offered on xAI reasoning-only Responses models (grok-4 family) that reject `reasoning.effort`, where the private scratchpad ran alongside native reasoning instead of replacing it.
78
+ - Fixed the extension tool-call handler timeout rendering outside a titled section in `/settings` by registering its Extensions group on the Tools tab.
79
+
80
+ ## [17.3.4] - 2026-08-14
81
+
82
+ ### Changed
83
+
84
+ - Replaced the MuPDF-WASM PDF document backend with `pdf-inspector` through `@linxiraos/pi-natives`, preserving cached text conversion and PDF line selectors while reporting pages that need OCR.
85
+ - Restored `read <pdf>:` and `read <pdf>:<image>.png` page rendering by automatically capturing PDF pages through the headless Chromium browser tool.
86
+
87
+ ### Fixed
88
+
89
+ - Fixed Streamable HTTP MCP sessions being invalidated by opening the optional GET SSE stream before sending `notifications/initialized`, which prevented Figma Dev Mode MCP from connecting ([#8514](https://github.com/can1357/oh-my-pi/issues/8514)).
90
+ - Fixed the `/hotkeys` table describing Ctrl+D (`app.exit`) as "Exit (when editor is empty)" when it actually exits unconditionally and saves the current prompt as a resumable draft ([#8530](https://github.com/can1357/oh-my-pi/issues/8530)).
91
+ - Fixed Ctrl+G external editors failing to launch on Windows because Bun re-quoted the embedded `cmd.exe /c` command line ([#8544](https://github.com/can1357/oh-my-pi/issues/8544)).
6
92
 
7
93
  ## [17.3.3] - 2026-08-14
8
94
 
@@ -1111,7 +1197,7 @@
1111
1197
  - Fixed onboarding omitting model selection by adding a persisted default-model step (fresh installs only — the setup version is not bumped, so existing installs are not re-prompted), and documented custom `models.yml` provider configuration and default-role selection ([#5979](https://github.com/can1357/oh-my-pi/issues/5979)).
1112
1198
  - Fixed `autoResume` crossing an explicit `/new` boundary: after `/new` a new session's JSONL is created lazily (only once assistant output exists), so exiting before any assistant message left the per-terminal breadcrumb pointing at a not-yet-materialized file. `readTerminalBreadcrumbEntry` rejected the missing target and `continueRecent()` fell back to the most-recent session — the pre-`/new` transcript — processing the next prompt with stale context. `/new` now records a durable `fresh` breadcrumb boundary that `continueRecent()` honors (starting fresh) even when the target is absent, while a genuinely stale/deleted breadcrumb still falls back to the most-recent session ([#5730](https://github.com/can1357/oh-my-pi/issues/5730)).
1113
1199
  - Fixed subagents that repeatedly submit malformed `yield` results from leaving the parent waiting forever; malformed submissions now repeat the required response format, and repeated invalid submissions fail the child with a clear error. ([#4957](https://github.com/can1357/oh-my-pi/issues/4957))
1114
- - Fixed configured or `-e` extensions in compiled binaries failing to resolve bundled `@oh-my-pi/*` value imports through the `omp-legacy-pi-bundled:` registry, and surfaced extension load failures during interactive and `-p` session startup. ([#4954](https://github.com/can1357/oh-my-pi/issues/4954))
1200
+ - Fixed configured or `-e` extensions in compiled binaries failing to resolve bundled `@linxiraos/*` value imports through the `omp-legacy-pi-bundled:` registry, and surfaced extension load failures during interactive and `-p` session startup. ([#4954](https://github.com/can1357/oh-my-pi/issues/4954))
1115
1201
 
1116
1202
  ### Removed
1117
1203
 
@@ -2600,7 +2686,7 @@
2600
2686
  - Fixed the `ask` tool's "Other (type your own)" free-text editor (prompt-style `HookEditorComponent`) ignoring Ctrl+Q and Ctrl+Enter, so Windows Terminal users who learned the `app.message.followUp` chord from the main editor (#1903 / fixed by #1905) got zero feedback on submit. The hook-style and main-editor surfaces honored `matchesAppFollowUp`; the prompt-style handler did not, leaving plain Enter as the sole submit path and Ctrl+Enter falling through to Editor as a newline (silently swallowed by WT). `#handlePromptStyleInput` now checks `matchesAppFollowUp` first — mirroring `#handleHookStyleInput` — and the hint reads `enter or ctrl+q submit` so the chord is discoverable. ([#3353](https://github.com/can1357/oh-my-pi/issues/3353))
2601
2687
  - Fixed the TUI freezing when a tool approval prompt fires while `/settings` (or the Extensions/Agents dashboard) is open. The fullscreen overlay's close handler restored focus to the editor it had captured at open time, but `ExtensionUiController` had since swapped the editor out of the editor slot for the approval prompt — so on exit the visible prompt sat unreachable while keystrokes routed to the now-unmounted editor (no Enter/Up/Down/Esc response, only Ctrl+C escaped). `SelectorController` now restores focus to whatever currently owns the editor slot via a `focusActiveEditorArea()` helper, applied to settings, extensions dashboard, and agents dashboard close paths. ([#3349](https://github.com/can1357/oh-my-pi/issues/3349))
2602
2688
  - Fixed `/settings` coercing enum/text values to display strings before handing them to the TUI list, preventing YAML numeric enum values from reaching native truncation ([#3338](https://github.com/can1357/oh-my-pi/issues/3338)).
2603
- - Fixed all extension loading silently failing on the cross-compiled `omp-darwin-arm64` release binary (downloaded directly or via a Homebrew tap wrapper) because `__computeBunfsPackageRoot` mis-handled `import.meta.dir = "//root/omp-darwin-arm64"`. Bun 1.3.14 reports `<bunfs-root>/<binary-name>` for the compiled entry's `import.meta.dir`, but the pre-fix function joined `metaDir + "packages"` and produced `/root/omp-darwin-arm64/packages` — the binary basename was baked into every bunfs path, so the TypeBox/legacy-pi shims and every `@oh-my-pi/pi-*` package-root override failed `existsSync` validation and `resolveCanonicalPiSpecifier` fell through to a bunfs `Bun.resolveSync` that also could not find the module. The function now detects the bunfs-root + binary-basename shape (`path.basename(path.dirname(metaDir)) === "root"`) and strips the trailing binary segment by slicing the original `metaDir`; the production bunfs shim join path also preserves Bun's bunfs-native `//root` / `B:\~BUN\root` prefix that `path.join` would otherwise collapse. ([#3329](https://github.com/can1357/oh-my-pi/issues/3329))
2689
+ - Fixed all extension loading silently failing on the cross-compiled `omp-darwin-arm64` release binary (downloaded directly or via a Homebrew tap wrapper) because `__computeBunfsPackageRoot` mis-handled `import.meta.dir = "//root/omp-darwin-arm64"`. Bun 1.3.14 reports `<bunfs-root>/<binary-name>` for the compiled entry's `import.meta.dir`, but the pre-fix function joined `metaDir + "packages"` and produced `/root/omp-darwin-arm64/packages` — the binary basename was baked into every bunfs path, so the TypeBox/legacy-pi shims and every `@linxiraos/pi-*` package-root override failed `existsSync` validation and `resolveCanonicalPiSpecifier` fell through to a bunfs `Bun.resolveSync` that also could not find the module. The function now detects the bunfs-root + binary-basename shape (`path.basename(path.dirname(metaDir)) === "root"`) and strips the trailing binary segment by slicing the original `metaDir`; the production bunfs shim join path also preserves Bun's bunfs-native `//root` / `B:\~BUN\root` prefix that `path.join` would otherwise collapse. ([#3329](https://github.com/can1357/oh-my-pi/issues/3329))
2604
2690
  - Fixed llama.cpp discovery to prefer per-model `/v1/models` `meta.n_ctx`/`meta.n_ctx_train` values, refresh selected models after lazy load, and bypass fresh-cache reuse so server restarts update context windows. ([#3310](https://github.com/can1357/oh-my-pi/issues/3310))
2605
2691
  - Fixed `task.maxConcurrency: 0` serializing subagent spawns instead of running them unbounded. The settings UI labels `0` as "Unlimited", but the session-scoped spawn `Semaphore` clamped `max` via `Math.max(1, max)`, so the second subagent body in a batch always waited for the first to release the seat. The constructor now treats `max <= 0` (and any non-finite input) as unbounded via `Number.POSITIVE_INFINITY`, matching the eval `parallel()`/`pipeline()` worker-pool semantics ([#3305](https://github.com/can1357/oh-my-pi/issues/3305)).
2606
2692
  - Fixed MCP tool calls forwarding empty optional placeholder arguments (`""` and `{}`) to `tools/call`; optional placeholders are now omitted while required fields and meaningful falsy values are preserved. ([#3302](https://github.com/can1357/oh-my-pi/issues/3302))
@@ -4182,7 +4268,7 @@
4182
4268
  - Fixed `task`-spawned subagents repeating filesystem scans the parent had already completed. `ExecutorOptions` and the `createAgentSession()` call inside `runSubprocess()` did not forward `rules`, the discovered extension paths, or the discovered `.omp/tools/` paths, so each subagent re-ran `loadCapability<Rule>()`, `discoverAndLoadExtensions()`, and the full `.omp/tools/` walk. The toolsession now caches `session.rules`, `session.extensionPaths`, and `session.customToolPaths`; `runSubprocess()` threads them through; and `createAgentSession()` accepts new `preloadedExtensionPaths` and `preloadedCustomToolPaths` options backed by new exported `discoverExtensionPaths()` and `discoverCustomToolPaths()` helpers. Crucially, only path lists are forwarded — never loaded instances. Each session rebuilds its own `Extension` and `LoadedCustomTool` objects so the per-session `ExtensionAPI`/`CustomToolAPI` (cwd, eventBus, runtime, exec, pushPendingAction, UI) targets the right session; forwarding loaded instances would have routed extension handlers and custom-tool execution back through the parent. The CLI's `preloadedExtensions` short-circuit is preserved for same-process reuse and now shallow-clones the caller's `extensions` array so inline-extension augmentation (autoresearch + custom-tools wrapper) cannot bleed back into it ([#2190](https://github.com/can1357/oh-my-pi/issues/2190)).
4183
4269
  - Fixed SSH tool cancellation hanging behind OpenSSH ControlMaster streams that stayed open after an Esc/user interrupt ([#2180](https://github.com/can1357/oh-my-pi/issues/2180)).
4184
4270
  - Fixed Windows stdio MCP servers launched through PATH shims such as `codegraph.cmd` so bare commands like `codegraph` resolve via `PATHEXT` before spawn ([#2174](https://github.com/can1357/oh-my-pi/issues/2174)).
4185
- - Fixed compiled-binary extensions failing to load `@oh-my-pi/pi-*` packages when `bun --compile` quietly dropped one of the extra entrypoints (observed on macOS arm64 release builds): the legacy-pi compat shim's package-root override branch returned the bunfs path without checking the target was present, so the rewrite emitted a `file://` URL to a missing module and the #1216 fallback (scoped to the throwing `getResolvedSpecifier` path) never ran. Override targets are now validated against the on-disk filesystem at module init, missing entries are dropped, and resolution falls through to canonical lookup so Bun resolves the import from the extension's own `node_modules` ([#2168](https://github.com/can1357/oh-my-pi/issues/2168)).
4271
+ - Fixed compiled-binary extensions failing to load `@linxiraos/pi-*` packages when `bun --compile` quietly dropped one of the extra entrypoints (observed on macOS arm64 release builds): the legacy-pi compat shim's package-root override branch returned the bunfs path without checking the target was present, so the rewrite emitted a `file://` URL to a missing module and the #1216 fallback (scoped to the throwing `getResolvedSpecifier` path) never ran. Override targets are now validated against the on-disk filesystem at module init, missing entries are dropped, and resolution falls through to canonical lookup so Bun resolves the import from the extension's own `node_modules` ([#2168](https://github.com/can1357/oh-my-pi/issues/2168)).
4186
4272
 
4187
4273
  ## [15.10.8] - 2026-06-09
4188
4274
 
@@ -5009,7 +5095,7 @@
5009
5095
  ### Fixed
5010
5096
 
5011
5097
  - Fixed a rewind/restore loop when the session leaf lands on an assistant turn that emitted tool calls (e.g. selecting such a turn in `/tree`, or restoring a session whose head is a mid-batch turn). That turn's tool results are persisted as its children — *below* the leaf — so they fall off the leaf→root path that `buildSessionContext` walks, leaving the assistant turn's `tool_use` blocks dangling as the final message. `transformMessages` then fabricated one synthetic `"aborted"`/`"No result provided"` result per call plus a `<turn-aborted>` developer note, which both rendered as phantom failed calls on a turn that "hadn't run anything yet" and re-injected the whole failed batch into the model's context, prompting it to re-issue the batch (the spiral). `buildSessionContext` now strips dangling `tool_use` blocks from a trailing assistant turn (dropping the turn entirely if nothing else remains), so a rewound turn resumes cleanly from its reasoning/text. Live turns are unaffected — their results persist and the leaf advances past the assistant before any rebuild.
5012
- - Fixed external extension loading on Windows compiled binaries: bare `@oh-my-pi/pi-*` value imports (e.g. `import { AssistantMessageEventStream } from "@linxiraos/pi-ai"`) failed with `Cannot find package '\$bunfs\root\packages\…'` because `legacy-pi-compat.ts` built shim override paths from a hardcoded POSIX `/$bunfs/root/packages` literal. Win32 normalised the leading slash to a backslash and the resulting path never resolved against the real bunfs mount (`<drive>:\~BUN\root\…`). The bunfs package root is now derived from `import.meta.dir`, so override paths stay platform-native on Windows, Linux, and macOS ([#1514](https://github.com/can1357/oh-my-pi/issues/1514)).
5098
+ - Fixed external extension loading on Windows compiled binaries: bare `@linxiraos/pi-*` value imports (e.g. `import { AssistantMessageEventStream } from "@linxiraos/pi-ai"`) failed with `Cannot find package '\$bunfs\root\packages\…'` because `legacy-pi-compat.ts` built shim override paths from a hardcoded POSIX `/$bunfs/root/packages` literal. Win32 normalised the leading slash to a backslash and the resulting path never resolved against the real bunfs mount (`<drive>:\~BUN\root\…`). The bunfs package root is now derived from `import.meta.dir`, so override paths stay platform-native on Windows, Linux, and macOS ([#1514](https://github.com/can1357/oh-my-pi/issues/1514)).
5013
5099
  - Fixed the interactive prompt showing no cursor in Ghostty. A prior change wired the editor's cursor mode to a new `getUseTerminalCursorMarker()` (which always reported the *requested* preference) instead of the resolved hardware-cursor visibility, so when Ghostty force-hid the hardware cursor the editor stayed in terminal-cursor (marker-only) mode and drew no glyph — leaving no visible caret with either `showHardwareCursor`/`PI_HARDWARE_CURSOR` value. The editor now follows `ui.getShowHardwareCursor()`: a hidden hardware cursor falls back to the steady software-cursor glyph (which still emits `CURSOR_MARKER` for IME positioning).
5014
5100
 
5015
5101
  ### Changed
@@ -5660,7 +5746,7 @@
5660
5746
  - Fixed command-fixup notices to list all stripped segments instead of reporting only one
5661
5747
  - Fixed summarized `read` output stalling agents on elided regions by appending an explicit footer like `[NN lines across MM elided regions; read <path>:raw or a line range like <path>:1-9999 for verbatim content]`. The footer fires whenever the structural summarizer elided at least one span, so the model gets a concrete recovery selector instead of having to guess from a bare `...` / `{ .. }` marker. Surfaces `elidedLines` on `ReadToolDetails.summary` alongside the existing `elidedSpans`. ([#1046](https://github.com/can1357/oh-my-pi/issues/1046))
5662
5748
  - Updated the `read` tool prompt to describe the new elision footer and instruct the model to follow `:raw` (or an explicit line range) when the elided body is actually needed, rather than guessing.
5663
- - Fixed plugin extensions failing to load when their `peerDependencies` reference internal `pi-*` packages under any scope other than `@mariozechner` (e.g. `Cannot find module '@earendil-works/pi-tui'` from `@juicesharp/rpiv-ask-user-question`). The legacy-pi specifier shim now treats `@mariozechner`, `@earendil-works`, **and** the canonical `@oh-my-pi` itself as aliases for the same set of bundled in-process packages (`pi-agent-core`, `pi-ai`, `pi-coding-agent`, `pi-natives`, `pi-tui`, `pi-utils`), and additionally rewrites the upstream-only `pi-ai/oauth` subpath onto our `pi-ai/utils/oauth` layout. Restored the `Key` runtime helper export on `@linxiraos/pi-tui` to match upstream …
5749
+ - Fixed plugin extensions failing to load when their `peerDependencies` reference internal `pi-*` packages under any scope other than `@mariozechner` (e.g. `Cannot find module '@earendil-works/pi-tui'` from `@juicesharp/rpiv-ask-user-question`). The legacy-pi specifier shim now treats `@mariozechner`, `@earendil-works`, **and** the canonical `@linxiraos` itself as aliases for the same set of bundled in-process packages (`pi-agent-core`, `pi-ai`, `pi-coding-agent`, `pi-natives`, `pi-tui`, `pi-utils`), and additionally rewrites the upstream-only `pi-ai/oauth` subpath onto our `pi-ai/utils/oauth` layout. Restored the `Key` runtime helper export on `@linxiraos/pi-tui` to match upstream …
5664
5750
  - Fixed `omp commit` hanging after a successful commit instead of returning to the shell. The command now mirrors the `runPrintMode` exit pattern and calls `postmortem.quit(0)` once the pipeline resolves so lingering HTTP/2 keep-alive sockets, the Settings autosave timer, and other AgentSession background handles don't keep the event loop pinned. ([#1041](https://github.com/can1357/oh-my-pi/issues/1041))
5665
5751
  - Fixed hashline payload parsing to silently treat truly-blank lines as empty `~`-prefixed payload lines when more payload follows in the same run. The previous behavior broke at the blank ("payload line has no preceding +, <, or = operation.") even though the intent is obvious — the only ambiguity is between in-payload blanks and end-of-section blanks, and a one-line lookahead resolves it: blanks that precede a non-payload op still end the run cleanly as section separators. Recovers the common case of forgetting the leading separator on a blank inserted line without changing how trailing blanks between ops behave.
5666
5752
  - Rewrote the hashline edit prompt examples to use an ASCII-only `TITLE = "Mr"` → `"Mrs"` / `"Dr"` motif instead of the previous `" • "` and `"·"` separators. Some agents had been copying the middle-dot literal characters into real edits as if they were format scaffolding (e.g. emitting payload lines like `~ ·`), since the demo inserts were near-twins of the existing string. The new example keeps every original op shape (single-line replace, multiline replace, insert AFTER/BEFORE, append, delete, blank, plus both anti-patterns) but uses content that is obviously domain-specific and clearly distinct from any payload separator. Pure prompt change; no parser, schema, or runtime behavior is affected.
@@ -11126,7 +11212,7 @@
11126
11212
  - Removed worktree management system
11127
11213
  - Removed bundled wt custom command
11128
11214
  - Removed voice-related settings and configuration options
11129
- - Removed @oh-my-pi/pi-git-tool dependency
11215
+ - Removed @linxiraos/pi-git-tool dependency
11130
11216
 
11131
11217
  ## [6.8.5] - 2026-01-21
11132
11218
 
@@ -12623,7 +12709,7 @@
12623
12709
 
12624
12710
  ### Changed
12625
12711
 
12626
- - Renamed package scope to @oh-my-pi for consistent branding
12712
+ - Renamed package scope to @linxiraos for consistent branding
12627
12713
  - Simplified toolset and enhanced navigation
12628
12714
  - Improved process cleanup with tree kill
12629
12715
  - Updated CI/CD workflows for GitHub Actions with provenance-signed npm publishing
@@ -12636,7 +12722,7 @@
12636
12722
 
12637
12723
  ## [1.337.0] - 2026-01-02
12638
12724
 
12639
- Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mono](https://github.com/badlogic/pi-mono).
12725
+ Initial release under @linxiraos scope. See previous releases at [badlogic/pi-mono](https://github.com/badlogic/pi-mono).
12640
12726
 
12641
12727
  ## [1.5.1] - 2026-01-03
12642
12728
 
@@ -12727,7 +12813,7 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
12727
12813
 
12728
12814
  ### Changed
12729
12815
 
12730
- - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@oh-my-pi` version lineage.
12816
+ - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@linxiraos` version lineage.
12731
12817
 
12732
12818
  ## [1.0.0] - 2026-08-13
12733
12819
 
@@ -12749,7 +12835,7 @@ Initial release under @oh-my-pi scope. See previous releases at [badlogic/pi-mon
12749
12835
 
12750
12836
  ### Changed
12751
12837
 
12752
- - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@oh-my-pi` version lineage.
12838
+ - Reset the version to 1.0.0 and republished under the `@linxiraos/*` scope, breaking from the `@linxiraos` version lineage.
12753
12839
 
12754
12840
  ## [0.50.1] - 2026-01-26
12755
12841