@code-yeongyu/senpi 2026.5.13 → 2026.5.15

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 (156) hide show
  1. package/CHANGELOG.md +1105 -1063
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +12 -5
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/bash-executor.d.ts.map +1 -1
  6. package/dist/core/bash-executor.js +1 -1
  7. package/dist/core/bash-executor.js.map +1 -1
  8. package/dist/core/compaction/compaction.d.ts.map +1 -1
  9. package/dist/core/compaction/compaction.js +2 -2
  10. package/dist/core/compaction/compaction.js.map +1 -1
  11. package/dist/core/export-html/index.d.ts.map +1 -1
  12. package/dist/core/export-html/index.js +8 -1
  13. package/dist/core/export-html/index.js.map +1 -1
  14. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  15. package/dist/core/extensions/builtin/anthropic-web-search/index.js +20 -0
  16. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  17. package/dist/core/extensions/builtin/background-task/notification.d.ts +1 -1
  18. package/dist/core/extensions/builtin/background-task/notification.d.ts.map +1 -1
  19. package/dist/core/extensions/builtin/background-task/notification.js.map +1 -1
  20. package/dist/core/extensions/builtin/background-task/types.d.ts +2 -2
  21. package/dist/core/extensions/builtin/background-task/types.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/background-task/types.js +2 -2
  23. package/dist/core/extensions/builtin/background-task/types.js.map +1 -1
  24. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/index.js +0 -18
  26. package/dist/core/extensions/builtin/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/openai-web-search/index.js +28 -0
  29. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  30. package/dist/core/extensions/builtin/system-messages.d.ts +6 -6
  31. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/system-messages.js +10 -10
  33. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  34. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +1 -1
  35. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/todotools/continuation/prompt.js +1 -1
  37. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  38. package/dist/core/extensions/builtin/todotools/state.d.ts +1 -1
  39. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/todotools/state.js +2 -2
  41. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  42. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +3 -3
  43. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/todotools/system-messages.js +6 -6
  45. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  46. package/dist/core/resource-loader.d.ts.map +1 -1
  47. package/dist/core/resource-loader.js +0 -9
  48. package/dist/core/resource-loader.js.map +1 -1
  49. package/dist/core/sdk.d.ts +1 -1
  50. package/dist/core/sdk.d.ts.map +1 -1
  51. package/dist/core/sdk.js +1 -1
  52. package/dist/core/sdk.js.map +1 -1
  53. package/dist/core/session-manager.d.ts.map +1 -1
  54. package/dist/core/session-manager.js.map +1 -1
  55. package/dist/core/tools/render-utils.d.ts.map +1 -1
  56. package/dist/core/tools/render-utils.js +1 -1
  57. package/dist/core/tools/render-utils.js.map +1 -1
  58. package/dist/main.d.ts.map +1 -1
  59. package/dist/main.js +3 -2
  60. package/dist/main.js.map +1 -1
  61. package/dist/modes/interactive/components/assistant-message.d.ts +0 -3
  62. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  63. package/dist/modes/interactive/components/assistant-message.js +3 -22
  64. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  65. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  66. package/dist/modes/interactive/components/bash-execution.js +1 -1
  67. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  68. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  69. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  70. package/dist/modes/interactive/components/extension-selector.js +6 -1
  71. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  72. package/dist/modes/interactive/interactive-mode.d.ts +12 -0
  73. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  74. package/dist/modes/interactive/interactive-mode.js +43 -5
  75. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  76. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  77. package/dist/modes/interactive/theme/theme.js +2 -2
  78. package/dist/modes/interactive/theme/theme.js.map +1 -1
  79. package/dist/modes/print-mode.d.ts.map +1 -1
  80. package/dist/modes/print-mode.js +3 -11
  81. package/dist/modes/print-mode.js.map +1 -1
  82. package/dist/modes/provider-native-rendering.d.ts +5 -0
  83. package/dist/modes/provider-native-rendering.d.ts.map +1 -0
  84. package/dist/modes/provider-native-rendering.js +247 -0
  85. package/dist/modes/provider-native-rendering.js.map +1 -0
  86. package/dist/utils/ansi.d.ts +2 -0
  87. package/dist/utils/ansi.d.ts.map +1 -0
  88. package/dist/utils/ansi.js +52 -0
  89. package/dist/utils/ansi.js.map +1 -0
  90. package/dist/utils/html.d.ts +7 -0
  91. package/dist/utils/html.d.ts.map +1 -0
  92. package/dist/utils/html.js +40 -0
  93. package/dist/utils/html.js.map +1 -0
  94. package/dist/utils/mime.d.ts +1 -0
  95. package/dist/utils/mime.d.ts.map +1 -1
  96. package/dist/utils/mime.js +59 -16
  97. package/dist/utils/mime.js.map +1 -1
  98. package/dist/utils/syntax-highlight.d.ts +12 -0
  99. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  100. package/dist/utils/syntax-highlight.js +118 -0
  101. package/dist/utils/syntax-highlight.js.map +1 -0
  102. package/dist/utils/tools-manager.d.ts.map +1 -1
  103. package/dist/utils/tools-manager.js +76 -7
  104. package/dist/utils/tools-manager.js.map +1 -1
  105. package/docs/agents.md +1 -1
  106. package/docs/sdk.md +25 -43
  107. package/examples/sdk/01-minimal.ts +14 -10
  108. package/examples/sdk/02-custom-model.ts +12 -8
  109. package/examples/sdk/03-custom-prompt.ts +24 -16
  110. package/examples/sdk/04-skills.ts +2 -2
  111. package/examples/sdk/05-tools.ts +8 -4
  112. package/examples/sdk/06-extensions.ts +11 -7
  113. package/examples/sdk/07-context-files.ts +2 -2
  114. package/examples/sdk/08-prompt-templates.ts +2 -2
  115. package/examples/sdk/09-api-keys-and-oauth.ts +8 -4
  116. package/examples/sdk/10-settings.ts +4 -4
  117. package/examples/sdk/11-sessions.ts +4 -0
  118. package/examples/sdk/12-full-control.ts +11 -7
  119. package/examples/sdk/README.md +6 -9
  120. package/package.json +7 -12
  121. package/dist/core/extensions/builtin/anthropic-code-execution/index.d.ts +0 -7
  122. package/dist/core/extensions/builtin/anthropic-code-execution/index.d.ts.map +0 -1
  123. package/dist/core/extensions/builtin/anthropic-code-execution/index.js +0 -79
  124. package/dist/core/extensions/builtin/anthropic-code-execution/index.js.map +0 -1
  125. package/dist/core/extensions/builtin/anthropic-computer-use/index.d.ts +0 -53
  126. package/dist/core/extensions/builtin/anthropic-computer-use/index.d.ts.map +0 -1
  127. package/dist/core/extensions/builtin/anthropic-computer-use/index.js +0 -676
  128. package/dist/core/extensions/builtin/anthropic-computer-use/index.js.map +0 -1
  129. package/dist/core/extensions/builtin/anthropic-text-editor/index.d.ts +0 -25
  130. package/dist/core/extensions/builtin/anthropic-text-editor/index.d.ts.map +0 -1
  131. package/dist/core/extensions/builtin/anthropic-text-editor/index.js +0 -244
  132. package/dist/core/extensions/builtin/anthropic-text-editor/index.js.map +0 -1
  133. package/dist/core/extensions/builtin/anthropic-tool-search/index.d.ts +0 -6
  134. package/dist/core/extensions/builtin/anthropic-tool-search/index.d.ts.map +0 -1
  135. package/dist/core/extensions/builtin/anthropic-tool-search/index.js +0 -112
  136. package/dist/core/extensions/builtin/anthropic-tool-search/index.js.map +0 -1
  137. package/dist/core/extensions/builtin/google-code-execution/index.d.ts +0 -7
  138. package/dist/core/extensions/builtin/google-code-execution/index.d.ts.map +0 -1
  139. package/dist/core/extensions/builtin/google-code-execution/index.js +0 -73
  140. package/dist/core/extensions/builtin/google-code-execution/index.js.map +0 -1
  141. package/dist/core/extensions/builtin/google-google-search/index.d.ts +0 -7
  142. package/dist/core/extensions/builtin/google-google-search/index.d.ts.map +0 -1
  143. package/dist/core/extensions/builtin/google-google-search/index.js +0 -83
  144. package/dist/core/extensions/builtin/google-google-search/index.js.map +0 -1
  145. package/dist/core/extensions/builtin/google-url-context/index.d.ts +0 -7
  146. package/dist/core/extensions/builtin/google-url-context/index.d.ts.map +0 -1
  147. package/dist/core/extensions/builtin/google-url-context/index.js +0 -82
  148. package/dist/core/extensions/builtin/google-url-context/index.js.map +0 -1
  149. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.d.ts +0 -6
  150. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.d.ts.map +0 -1
  151. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.js +0 -57
  152. package/dist/core/extensions/builtin/openai-api-parallel-tool-calls/index.js.map +0 -1
  153. package/dist/core/extensions/builtin/openai-code-interpreter/index.d.ts +0 -10
  154. package/dist/core/extensions/builtin/openai-code-interpreter/index.d.ts.map +0 -1
  155. package/dist/core/extensions/builtin/openai-code-interpreter/index.js +0 -95
  156. package/dist/core/extensions/builtin/openai-code-interpreter/index.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,45 @@
1
1
  # Changelog
2
2
 
3
+ ## [2026.5.15] - 2026-05-15
4
+
5
+ ### Added
6
+
7
+ ### Fixed
8
+
9
+ ### Removed
10
+
11
+ ## [2026.5.14] - 2026-05-14
12
+
13
+ ### Added
14
+
15
+ ### Fixed
16
+
17
+ ### Removed
18
+
19
+ ## [2026.5.13-4] - 2026-05-13
20
+
21
+ ### Added
22
+
23
+ ### Fixed
24
+
25
+ ### Removed
26
+
27
+ ## [2026.5.13-3] - 2026-05-13
28
+
29
+ ### Added
30
+
31
+ ### Fixed
32
+
33
+ ### Removed
34
+
35
+ ## [2026.5.13-2] - 2026-05-13
36
+
37
+ ### Added
38
+
39
+ ### Fixed
40
+
41
+ ### Removed
42
+
3
43
  ## [2026.05.13] - 2026-05-13
4
44
 
5
45
  ### Added
@@ -16,6 +56,8 @@
16
56
  - Fixed model catalog narrowing so `--models` / `enabledModels` constrain startup and selectors separately from Ctrl+P `favoriteModels`, preserve exact model IDs ending in `-fast`, and filter `/favorite-models` by canonical `provider/model` IDs without writing resolver warnings into the active TUI.
17
57
  - Fixed clean-profile startup spending seconds importing generated default global extension shims through jiti by loading unchanged generated shims from known factories while preserving custom-edited shim behavior.
18
58
  - Fixed OpenAI Responses request validation failures by using the `web_search_preview` native tool type and stripping leaked Anthropic native `web_search_*` / `web_fetch_*` tool descriptors from OpenAI payloads.
59
+ - Fixed tool output expansion while extension confirmation dialogs are focused ([#4429](https://github.com/earendil-works/pi/issues/4429)).
60
+ - Fixed auto-retry for Anthropic streams that end before `message_stop` ([#4433](https://github.com/earendil-works/pi/issues/4433)).
19
61
  - Fixed theme sharing across package scopes so extensions do not crash with `Theme not initialized` ([#4333](https://github.com/earendil-works/pi/issues/4333)).
20
62
  - Fixed keybinding hints to show Option instead of Alt on macOS ([#4289](https://github.com/earendil-works/pi/issues/4289)).
21
63
  - Fixed the interactive update notification to render the changelog as an OSC 8 hyperlink when the terminal supports hyperlinks ([#4280](https://github.com/earendil-works/pi/issues/4280)).
@@ -42,24 +84,24 @@
42
84
 
43
85
  ### Added
44
86
 
45
- - Added interactive login selection support so OAuth providers can present multiple login choices ([#4190](https://github.com/code-yeongyu/sanepi-mono/pull/4190) by [@mitsuhiko](https://github.com/mitsuhiko)).
87
+ - Added interactive login selection support so OAuth providers can present multiple login choices ([#4190](https://github.com/code-yeongyu/senpi-mono/pull/4190) by [@mitsuhiko](https://github.com/mitsuhiko)).
46
88
 
47
89
  ### Changed
48
90
 
49
91
  - Changed `pi update --self` to honor the active package name returned by the Pi version check endpoint, defaulting to the current package when omitted and uninstalling the old global package before installing a renamed package.
50
- - Changed extension loading to use upstream `jiti` 2.7 instead of the `@mariozechner/jiti` fork ([#4244](https://github.com/code-yeongyu/sanepi-mono/pull/4244) by [@pi0](https://github.com/pi0)).
51
- - Changed `models.json` parsing to allow comments and trailing commas ([#4162](https://github.com/code-yeongyu/sanepi-mono/pull/4162) by [@julien-c](https://github.com/julien-c)).
92
+ - Changed extension loading to use upstream `jiti` 2.7 instead of the `@mariozechner/jiti` fork ([#4244](https://github.com/code-yeongyu/senpi-mono/pull/4244) by [@pi0](https://github.com/pi0)).
93
+ - Changed `models.json` parsing to allow comments and trailing commas ([#4162](https://github.com/code-yeongyu/senpi-mono/pull/4162) by [@julien-c](https://github.com/julien-c)).
52
94
 
53
95
  ### Fixed
54
96
 
55
- - Fixed `pi -p` treating prompts that start with YAML frontmatter as extension flags instead of user messages ([#4163](https://github.com/code-yeongyu/sanepi-mono/issues/4163)).
56
- - Fixed pending tool results not updating in the live TUI after toggling thinking block visibility while the tool is running ([#4167](https://github.com/code-yeongyu/sanepi-mono/issues/4167)).
57
- - Fixed `/copy` reporting success on Linux without writing the clipboard on Wayland-only compositors (Hyprland, Niri, ...) by skipping the X11-only native addon on Linux and routing through `wl-copy`/`xclip`/`xsel` instead ([#4177](https://github.com/code-yeongyu/sanepi-mono/issues/4177)).
58
- - Fixed HTML session exports to strip skill wrapper XML from rendered user messages ([#4234](https://github.com/code-yeongyu/sanepi-mono/pull/4234) by [@aliou](https://github.com/aliou)).
97
+ - Fixed `pi -p` treating prompts that start with YAML frontmatter as extension flags instead of user messages ([#4163](https://github.com/code-yeongyu/senpi-mono/issues/4163)).
98
+ - Fixed pending tool results not updating in the live TUI after toggling thinking block visibility while the tool is running ([#4167](https://github.com/code-yeongyu/senpi-mono/issues/4167)).
99
+ - Fixed `/copy` reporting success on Linux without writing the clipboard on Wayland-only compositors (Hyprland, Niri, ...) by skipping the X11-only native addon on Linux and routing through `wl-copy`/`xclip`/`xsel` instead ([#4177](https://github.com/code-yeongyu/senpi-mono/issues/4177)).
100
+ - Fixed HTML session exports to strip skill wrapper XML from rendered user messages ([#4234](https://github.com/code-yeongyu/senpi-mono/pull/4234) by [@aliou](https://github.com/aliou)).
59
101
  - Fixed OpenAI-compatible chat completion streams that interleave content and tool-call deltas in the same choice.
60
- - Fixed OpenAI Codex OAuth refresh failures writing directly to stderr while the TUI is active ([#4141](https://github.com/code-yeongyu/sanepi-mono/issues/4141)).
61
- - Fixed OpenAI Codex Responses requests to send a non-empty system prompt ([#4184](https://github.com/code-yeongyu/sanepi-mono/issues/4184)).
62
- - Fixed Kimi For Coding model resolution for the Kimi K2 P6 alias ([#4218](https://github.com/code-yeongyu/sanepi-mono/issues/4218)).
102
+ - Fixed OpenAI Codex OAuth refresh failures writing directly to stderr while the TUI is active ([#4141](https://github.com/code-yeongyu/senpi-mono/issues/4141)).
103
+ - Fixed OpenAI Codex Responses requests to send a non-empty system prompt ([#4184](https://github.com/code-yeongyu/senpi-mono/issues/4184)).
104
+ - Fixed Kimi For Coding model resolution for the Kimi K2 P6 alias ([#4218](https://github.com/code-yeongyu/senpi-mono/issues/4218)).
63
105
  - Fixed Kitty inline image redraws to stay within TUI-owned terminal regions and avoid writing below the active viewport.
64
106
  - Fixed Kitty inline image rendering by letting the terminal allocate image ids and bounding parsed image ids to valid values.
65
107
  - Fixed inline image capability detection to disable inline images in cmux terminals.
@@ -68,17 +110,17 @@
68
110
 
69
111
  ### New Features
70
112
 
71
- - **Xiaomi MiMo API billing and regional Token Plan providers** - `xiaomi` now uses API billing, with separate `xiaomi-token-plan-{cn,ams,sgp}` providers. See [docs/providers.md#api-keys](docs/providers.md#api-keys) and [README.md#providers--models](README.md#providers--models). ([#4112](https://github.com/code-yeongyu/sanepi-mono/pull/4112) by [@Phoen1xCode](https://github.com/Phoen1xCode))
72
- - **Incremental bash output streaming** - Bash tool output now appears while commands run instead of only after completion. ([#4145](https://github.com/code-yeongyu/sanepi-mono/issues/4145))
113
+ - **Xiaomi MiMo API billing and regional Token Plan providers** - `xiaomi` now uses API billing, with separate `xiaomi-token-plan-{cn,ams,sgp}` providers. See [docs/providers.md#api-keys](docs/providers.md#api-keys) and [README.md#providers--models](README.md#providers--models). ([#4112](https://github.com/code-yeongyu/senpi-mono/pull/4112) by [@Phoen1xCode](https://github.com/Phoen1xCode))
114
+ - **Incremental bash output streaming** - Bash tool output now appears while commands run instead of only after completion. ([#4145](https://github.com/code-yeongyu/senpi-mono/issues/4145))
73
115
  - **Compact read rendering** - Interactive `read` output for Pi docs, context files, and skills is collapsed by default and shows selected line ranges.
74
116
 
75
117
  ### Breaking Changes
76
118
 
77
- - Switched the built-in `xiaomi` provider from Token Plan AMS to Xiaomi's API billing endpoint, and renamed its `/login` display from "Xiaomi MiMo Token Plan" to "Xiaomi MiMo". `XIAOMI_API_KEY` now refers to the API billing key from [platform.xiaomimimo.com](https://platform.xiaomimimo.com). Users on Token Plan should switch to the appropriate `xiaomi-token-plan-*` provider and set the corresponding env var ([#4112](https://github.com/code-yeongyu/sanepi-mono/pull/4112) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
119
+ - Switched the built-in `xiaomi` provider from Token Plan AMS to Xiaomi's API billing endpoint, and renamed its `/login` display from "Xiaomi MiMo Token Plan" to "Xiaomi MiMo". `XIAOMI_API_KEY` now refers to the API billing key from [platform.xiaomimimo.com](https://platform.xiaomimimo.com). Users on Token Plan should switch to the appropriate `xiaomi-token-plan-*` provider and set the corresponding env var ([#4112](https://github.com/code-yeongyu/senpi-mono/pull/4112) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
78
120
 
79
121
  ### Added
80
122
 
81
- - Added three Xiaomi MiMo Token Plan regional providers visible in `/login`: `xiaomi-token-plan-cn` (`XIAOMI_TOKEN_PLAN_CN_API_KEY`), `xiaomi-token-plan-ams` (`XIAOMI_TOKEN_PLAN_AMS_API_KEY`), `xiaomi-token-plan-sgp` (`XIAOMI_TOKEN_PLAN_SGP_API_KEY`). Each defaults to `mimo-v2.5-pro` ([#4112](https://github.com/code-yeongyu/sanepi-mono/pull/4112) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
123
+ - Added three Xiaomi MiMo Token Plan regional providers visible in `/login`: `xiaomi-token-plan-cn` (`XIAOMI_TOKEN_PLAN_CN_API_KEY`), `xiaomi-token-plan-ams` (`XIAOMI_TOKEN_PLAN_AMS_API_KEY`), `xiaomi-token-plan-sgp` (`XIAOMI_TOKEN_PLAN_SGP_API_KEY`). Each defaults to `mimo-v2.5-pro` ([#4112](https://github.com/code-yeongyu/senpi-mono/pull/4112) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
82
124
 
83
125
  ### Changed
84
126
 
@@ -86,13 +128,13 @@
86
128
 
87
129
  ### Fixed
88
130
 
89
- - Fixed generated OpenAI-compatible model metadata for Qwen 3.5/3.6 and MiniMax M2.7, so those models work through the built-in provider catalog ([#4110](https://github.com/code-yeongyu/sanepi-mono/pull/4110) by [@jsynowiec](https://github.com/jsynowiec)).
131
+ - Fixed generated OpenAI-compatible model metadata for Qwen 3.5/3.6 and MiniMax M2.7, so those models work through the built-in provider catalog ([#4110](https://github.com/code-yeongyu/senpi-mono/pull/4110) by [@jsynowiec](https://github.com/jsynowiec)).
90
132
  - Fixed Bedrock Claude Opus 4.7 `xhigh` thinking requests by preserving the provider's native effort value.
91
- - Fixed OpenAI Codex WebSocket transport to fall back to SSE when setup fails before streaming starts, and surface transport diagnostics in the assistant message ([#4133](https://github.com/code-yeongyu/sanepi-mono/issues/4133)).
92
- - Fixed OpenAI Codex WebSocket transport keeping `--print` and JSON mode processes alive after the response by closing cached WebSocket sessions during session shutdown ([#4103](https://github.com/code-yeongyu/sanepi-mono/issues/4103)).
133
+ - Fixed OpenAI Codex WebSocket transport to fall back to SSE when setup fails before streaming starts, and surface transport diagnostics in the assistant message ([#4133](https://github.com/code-yeongyu/senpi-mono/issues/4133)).
134
+ - Fixed OpenAI Codex WebSocket transport keeping `--print` and JSON mode processes alive after the response by closing cached WebSocket sessions during session shutdown ([#4103](https://github.com/code-yeongyu/senpi-mono/issues/4103)).
93
135
  - Fixed compact `read` tool calls to render directly and include selected line ranges in interactive output.
94
136
  - Fixed interactive sessions to exit when terminal input is lost instead of continuing in a broken state.
95
- - Fixed bash tool output to stream incrementally while commands run instead of waiting for command completion ([#4145](https://github.com/code-yeongyu/sanepi-mono/issues/4145)).
137
+ - Fixed bash tool output to stream incrementally while commands run instead of waiting for command completion ([#4145](https://github.com/code-yeongyu/senpi-mono/issues/4145)).
96
138
  - Fixed selector and autocomplete fuzzy ranking to prioritize exact matches.
97
139
 
98
140
  ## [0.72.1] - 2026-05-02
@@ -101,21 +143,21 @@
101
143
 
102
144
  ### New Features
103
145
 
104
- - **Xiaomi MiMo Token Plan provider** - New Anthropic-compatible provider with `XIAOMI_API_KEY` auth, default model (`mimo-v2.5-pro`), and `/login` display. See [docs/providers.md](docs/providers.md). ([#4005](https://github.com/code-yeongyu/sanepi-mono/pull/4005) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
105
- - **Model thinking level metadata** - Models can now declare which thinking levels they support via `thinkingLevelMap`, replacing the old `reasoningEffortMap`. See [docs/models.md#thinking-level-map](docs/models.md#thinking-level-map) and [docs/custom-provider.md](docs/custom-provider.md). ([#3208](https://github.com/code-yeongyu/sanepi-mono/issues/3208)).
106
- - **Custom provider base URL overrides** - `pi.registerProvider()` now respects per-model `baseUrl` settings. See [docs/custom-provider.md](docs/custom-provider.md). ([#4063](https://github.com/code-yeongyu/sanepi-mono/issues/4063)).
107
- - **Post-turn stop callback** - Agent loop can now exit gracefully after a completed turn via `shouldStopAfterTurn`. See [`packages/agent/README.md`](https://github.com/code-yeongyu/sanepi-mono/blob/main/packages/agent/README.md).
108
- - **Self-update detection fix** - `pi` now correctly identifies and applies available updates. ([#3942](https://github.com/code-yeongyu/sanepi-mono/issues/3942), [#3980](https://github.com/code-yeongyu/sanepi-mono/issues/3980), [#3922](https://github.com/code-yeongyu/sanepi-mono/issues/3922)).
146
+ - **Xiaomi MiMo Token Plan provider** - New Anthropic-compatible provider with `XIAOMI_API_KEY` auth, default model (`mimo-v2.5-pro`), and `/login` display. See [docs/providers.md](docs/providers.md). ([#4005](https://github.com/code-yeongyu/senpi-mono/pull/4005) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
147
+ - **Model thinking level metadata** - Models can now declare which thinking levels they support via `thinkingLevelMap`, replacing the old `reasoningEffortMap`. See [docs/models.md#thinking-level-map](docs/models.md#thinking-level-map) and [docs/custom-provider.md](docs/custom-provider.md). ([#3208](https://github.com/code-yeongyu/senpi-mono/issues/3208)).
148
+ - **Custom provider base URL overrides** - `pi.registerProvider()` now respects per-model `baseUrl` settings. See [docs/custom-provider.md](docs/custom-provider.md). ([#4063](https://github.com/code-yeongyu/senpi-mono/issues/4063)).
149
+ - **Post-turn stop callback** - Agent loop can now exit gracefully after a completed turn via `shouldStopAfterTurn`. See [`packages/agent/README.md`](https://github.com/code-yeongyu/senpi-mono/blob/main/packages/agent/README.md).
150
+ - **Self-update detection fix** - `pi` now correctly identifies and applies available updates. ([#3942](https://github.com/code-yeongyu/senpi-mono/issues/3942), [#3980](https://github.com/code-yeongyu/senpi-mono/issues/3980), [#3922](https://github.com/code-yeongyu/senpi-mono/issues/3922)).
109
151
 
110
152
  ### Breaking Changes
111
153
 
112
- - Replaced `compat.reasoningEffortMap` in `models.json` and `pi.registerProvider()` model definitions with model-level `thinkingLevelMap` ([#3208](https://github.com/code-yeongyu/sanepi-mono/issues/3208)). Migration: move old mappings from `compat.reasoningEffortMap` to `thinkingLevelMap`. Use string values for provider-specific thinking values and `null` for unsupported pi levels that should be hidden and skipped by cycling. See `docs/models.md#thinking-level-map` and `docs/custom-provider.md`.
154
+ - Replaced `compat.reasoningEffortMap` in `models.json` and `pi.registerProvider()` model definitions with model-level `thinkingLevelMap` ([#3208](https://github.com/code-yeongyu/senpi-mono/issues/3208)). Migration: move old mappings from `compat.reasoningEffortMap` to `thinkingLevelMap`. Use string values for provider-specific thinking values and `null` for unsupported pi levels that should be hidden and skipped by cycling. See `docs/models.md#thinking-level-map` and `docs/custom-provider.md`.
113
155
 
114
156
  ### Added
115
157
 
116
- - Added Xiaomi MiMo Token Plan provider support with `XIAOMI_API_KEY`, default model resolution, `/login` display support, and provider documentation ([#4005](https://github.com/code-yeongyu/sanepi-mono/pull/4005) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
117
- - Added model-level `thinkingLevelMap` support in `models.json` and `pi.registerProvider()`, allowing models to expose only the thinking levels they actually support ([#3208](https://github.com/code-yeongyu/sanepi-mono/issues/3208)).
118
- - Added `shouldStopAfterTurn` agent loop callback for post-turn stop control, inherited from `@earendil-works/pi-agent-core`. See [`packages/agent/README.md`](https://github.com/code-yeongyu/sanepi-mono/blob/main/packages/agent/README.md).
158
+ - Added Xiaomi MiMo Token Plan provider support with `XIAOMI_API_KEY`, default model resolution, `/login` display support, and provider documentation ([#4005](https://github.com/code-yeongyu/senpi-mono/pull/4005) by [@Phoen1xCode](https://github.com/Phoen1xCode)).
159
+ - Added model-level `thinkingLevelMap` support in `models.json` and `pi.registerProvider()`, allowing models to expose only the thinking levels they actually support ([#3208](https://github.com/code-yeongyu/senpi-mono/issues/3208)).
160
+ - Added `shouldStopAfterTurn` agent loop callback for post-turn stop control, inherited from `@earendil-works/pi-agent-core`. See [`packages/agent/README.md`](https://github.com/code-yeongyu/senpi-mono/blob/main/packages/agent/README.md).
119
161
  - Added the `webfetch` builtin extension, vendored from `pi-webfetch`, for bounded URL retrieval as markdown, text, or HTML.
120
162
  - Added build-time syncing for vendored builtin extensions from `../pi-extensions`, with `external-versions.json` recording the source package versions.
121
163
 
@@ -126,9 +168,9 @@
126
168
 
127
169
  ### Fixed
128
170
 
129
- - Fixed the default transport setting to use `auto`, allowing OpenAI Codex to use cached WebSocket context when available ([#4083](https://github.com/code-yeongyu/sanepi-mono/issues/4083)).
130
- - Fixed `pi.registerProvider()` to honor per-model `baseUrl` overrides ([#4063](https://github.com/code-yeongyu/sanepi-mono/issues/4063)).
131
- - Fixed self-update detection so `pi` correctly identifies when a newer version is available and applies updates ([#3942](https://github.com/code-yeongyu/sanepi-mono/issues/3942), [#3980](https://github.com/code-yeongyu/sanepi-mono/issues/3980), [#3922](https://github.com/code-yeongyu/sanepi-mono/issues/3922)).
171
+ - Fixed the default transport setting to use `auto`, allowing OpenAI Codex to use cached WebSocket context when available ([#4083](https://github.com/code-yeongyu/senpi-mono/issues/4083)).
172
+ - Fixed `pi.registerProvider()` to honor per-model `baseUrl` overrides ([#4063](https://github.com/code-yeongyu/senpi-mono/issues/4063)).
173
+ - Fixed self-update detection so `pi` correctly identifies when a newer version is available and applies updates ([#3942](https://github.com/code-yeongyu/senpi-mono/issues/3942), [#3980](https://github.com/code-yeongyu/senpi-mono/issues/3980), [#3922](https://github.com/code-yeongyu/senpi-mono/issues/3922)).
132
174
  ## [0.71.1] - 2026-05-01
133
175
 
134
176
  ### Added
@@ -143,60 +185,60 @@
143
185
 
144
186
  ### New Features
145
187
 
146
- - Cloudflare AI Gateway provider support with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID`/`CLOUDFLARE_GATEWAY_ID`, default model resolution, and `/login` display. See [docs/providers.md#cloudflare-ai-gateway](docs/providers.md#cloudflare-ai-gateway). ([#3856](https://github.com/code-yeongyu/sanepi-mono/pull/3856) by [@mchenco](https://github.com/mchenco)).
188
+ - Cloudflare AI Gateway provider support with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID`/`CLOUDFLARE_GATEWAY_ID`, default model resolution, and `/login` display. See [docs/providers.md#cloudflare-ai-gateway](docs/providers.md#cloudflare-ai-gateway). ([#3856](https://github.com/code-yeongyu/senpi-mono/pull/3856) by [@mchenco](https://github.com/mchenco)).
147
189
  - Moonshot AI provider support with `MOONSHOT_API_KEY`, default model resolution, and `/login` display.
148
- - Mistral Medium 3.5 built-in model support. See [docs/providers.md#api-keys](docs/providers.md#api-keys). ([#4009](https://github.com/code-yeongyu/sanepi-mono/pull/4009) by [@technocidal](https://github.com/technocidal)).
190
+ - Mistral Medium 3.5 built-in model support. See [docs/providers.md#api-keys](docs/providers.md#api-keys). ([#4009](https://github.com/code-yeongyu/senpi-mono/pull/4009) by [@technocidal](https://github.com/technocidal)).
149
191
  - Extension APIs can replace finalized `message_end` messages, wrap custom editor factories via `ctx.ui.getEditorComponent()`, and observe thinking level changes. See [docs/extensions.md#message_start--message_update--message_end](docs/extensions.md#message_start--message_update--message_end), [docs/extensions.md#widgets-status-and-footer](docs/extensions.md#widgets-status-and-footer), and [docs/extensions.md#thinking_level_select](docs/extensions.md#thinking_level_select).
150
192
  - `PI_CODING_AGENT_SESSION_DIR` configures session storage from the environment. See [docs/usage.md#environment-variables](docs/usage.md#environment-variables).
151
193
 
152
194
  ### Added
153
195
 
154
- - Added Cloudflare AI Gateway as a built-in provider with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID`/`CLOUDFLARE_GATEWAY_ID` setup, default model resolution, `/login` display support, and provider documentation ([#3856](https://github.com/code-yeongyu/sanepi-mono/pull/3856) by [@mchenco](https://github.com/mchenco)).
196
+ - Added Cloudflare AI Gateway as a built-in provider with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID`/`CLOUDFLARE_GATEWAY_ID` setup, default model resolution, `/login` display support, and provider documentation ([#3856](https://github.com/code-yeongyu/senpi-mono/pull/3856) by [@mchenco](https://github.com/mchenco)).
155
197
  - Added Moonshot AI as a built-in provider with `MOONSHOT_API_KEY` setup, default model resolution, and `/login` display support.
156
- - Added Mistral Medium 3.5 built-in model support via `@earendil-works/pi-ai` ([#4009](https://github.com/code-yeongyu/sanepi-mono/pull/4009) by [@technocidal](https://github.com/technocidal)).
157
- - Added routed OpenAI-compatible response model metadata in assistant messages, so providers such as OpenRouter can expose the concrete model used ([#3968](https://github.com/code-yeongyu/sanepi-mono/pull/3968) by [@purrgrammer](https://github.com/purrgrammer)).
158
- - Added `PI_CODING_AGENT_SESSION_DIR` as an environment equivalent to `--session-dir` ([#4027](https://github.com/code-yeongyu/sanepi-mono/issues/4027)).
159
- - Added `message_end` extension result support for replacing finalized messages, enabling extensions to override assistant usage cost ([#3982](https://github.com/code-yeongyu/sanepi-mono/issues/3982)).
160
- - Added top-level `name` support to `pi.registerProvider()` so extension-registered providers can show a friendly name in `/login` ([#3956](https://github.com/code-yeongyu/sanepi-mono/issues/3956)).
161
- - Added `ctx.ui.getEditorComponent()` so extensions can wrap the currently configured custom editor factory ([#3935](https://github.com/code-yeongyu/sanepi-mono/issues/3935)).
162
- - Added a `thinking_level_select` extension event for observing thinking level changes ([#3888](https://github.com/code-yeongyu/sanepi-mono/issues/3888)).
163
-
164
- ### Fixed
165
-
166
- - Fixed WSL clipboard image paste by passing the PowerShell save path directly instead of through a custom environment variable ([#2469](https://github.com/code-yeongyu/sanepi-mono/issues/2469)).
167
- - Fixed Google Vertex Gemini 3 tool call replay for unsigned tool calls ([#4032](https://github.com/code-yeongyu/sanepi-mono/issues/4032)).
168
- - Fixed blocked `edit` tool results rendering the rejection reason twice after interactive extension confirmation ([#3830](https://github.com/code-yeongyu/sanepi-mono/issues/3830)).
169
- - Fixed extension-triggered thinking level changes refreshing the interactive editor border immediately ([#3888](https://github.com/code-yeongyu/sanepi-mono/issues/3888)).
170
- - Fixed the coding-agent README See Also link to point at `@earendil-works/pi-agent-core` ([#4023](https://github.com/code-yeongyu/sanepi-mono/issues/4023)).
171
- - Fixed `grep` and `find` tool argument injection for flag-like search patterns ([#4018](https://github.com/code-yeongyu/sanepi-mono/issues/4018)).
172
- - Fixed PowerShell shell command output on Windows by only spawning detached processes on Unix ([#4013](https://github.com/code-yeongyu/sanepi-mono/pull/4013) by [@picasso250](https://github.com/picasso250)).
173
- - Fixed Bun package manager `node_modules` discovery when `npmCommand` is configured to use Bun ([#3998](https://github.com/code-yeongyu/sanepi-mono/pull/3998) by [@thirtythreeforty](https://github.com/thirtythreeforty)).
174
- - Fixed edit and edit-preview access failures to report filesystem errors correctly ([#3955](https://github.com/code-yeongyu/sanepi-mono/pull/3955) by [@rwachtler](https://github.com/rwachtler)).
175
- - Fixed `ProcessTerminal` sizing to use `COLUMNS` and `LINES` before falling back to 80x24 ([#4004](https://github.com/code-yeongyu/sanepi-mono/issues/4004)).
176
- - Updated `@anthropic-ai/sdk` to clear GHSA-p7fg-763f-g4gf audit findings ([#3992](https://github.com/code-yeongyu/sanepi-mono/issues/3992)).
177
- - Updated `@mariozechner/clipboard` to an attested release so package managers with trust policies do not reject installs ([#3946](https://github.com/code-yeongyu/sanepi-mono/issues/3946)).
178
- - Fixed project context discovery to load `AGENTS.MD` files in addition to `AGENTS.md` ([#3949](https://github.com/code-yeongyu/sanepi-mono/issues/3949)).
179
- - Fixed `/handoff` to use compacted session context instead of pre-compaction raw messages ([#3945](https://github.com/code-yeongyu/sanepi-mono/issues/3945)).
180
- - Fixed DeepSeek V4 Flash `xhigh` thinking support so requests map to DeepSeek's `max` reasoning effort ([#3944](https://github.com/code-yeongyu/sanepi-mono/issues/3944)).
181
- - Fixed Anthropic streams that end before `message_stop` to be treated as errors instead of successful partial responses ([#3936](https://github.com/code-yeongyu/sanepi-mono/issues/3936)).
182
- - Fixed generated OpenAI-compatible DeepSeek V4 reasoning compatibility outside the direct DeepSeek provider ([#3940](https://github.com/code-yeongyu/sanepi-mono/issues/3940)).
183
- - Fixed idle follow-up submission to clear the editor like normal message submission ([#3926](https://github.com/code-yeongyu/sanepi-mono/issues/3926)).
184
- - Fixed editor rendering artifacts for Thai Sara Am and Lao AM vowel characters ([#3904](https://github.com/code-yeongyu/sanepi-mono/issues/3904)).
185
- - Fixed DeepSeek V4 Flash and V4 Pro pricing metadata to match current official rates ([#3910](https://github.com/code-yeongyu/sanepi-mono/issues/3910)).
186
- - Updated the sandbox extension example lockfile to resolve the vulnerable `lodash-es` transitive dependency ([#3901](https://github.com/code-yeongyu/sanepi-mono/issues/3901)).
187
- - Fixed DeepSeek prompt cache hits to be tracked from OpenAI-compatible usage responses ([#3880](https://github.com/code-yeongyu/sanepi-mono/issues/3880)).
198
+ - Added Mistral Medium 3.5 built-in model support via `@earendil-works/pi-ai` ([#4009](https://github.com/code-yeongyu/senpi-mono/pull/4009) by [@technocidal](https://github.com/technocidal)).
199
+ - Added routed OpenAI-compatible response model metadata in assistant messages, so providers such as OpenRouter can expose the concrete model used ([#3968](https://github.com/code-yeongyu/senpi-mono/pull/3968) by [@purrgrammer](https://github.com/purrgrammer)).
200
+ - Added `PI_CODING_AGENT_SESSION_DIR` as an environment equivalent to `--session-dir` ([#4027](https://github.com/code-yeongyu/senpi-mono/issues/4027)).
201
+ - Added `message_end` extension result support for replacing finalized messages, enabling extensions to override assistant usage cost ([#3982](https://github.com/code-yeongyu/senpi-mono/issues/3982)).
202
+ - Added top-level `name` support to `pi.registerProvider()` so extension-registered providers can show a friendly name in `/login` ([#3956](https://github.com/code-yeongyu/senpi-mono/issues/3956)).
203
+ - Added `ctx.ui.getEditorComponent()` so extensions can wrap the currently configured custom editor factory ([#3935](https://github.com/code-yeongyu/senpi-mono/issues/3935)).
204
+ - Added a `thinking_level_select` extension event for observing thinking level changes ([#3888](https://github.com/code-yeongyu/senpi-mono/issues/3888)).
205
+
206
+ ### Fixed
207
+
208
+ - Fixed WSL clipboard image paste by passing the PowerShell save path directly instead of through a custom environment variable ([#2469](https://github.com/code-yeongyu/senpi-mono/issues/2469)).
209
+ - Fixed Google Vertex Gemini 3 tool call replay for unsigned tool calls ([#4032](https://github.com/code-yeongyu/senpi-mono/issues/4032)).
210
+ - Fixed blocked `edit` tool results rendering the rejection reason twice after interactive extension confirmation ([#3830](https://github.com/code-yeongyu/senpi-mono/issues/3830)).
211
+ - Fixed extension-triggered thinking level changes refreshing the interactive editor border immediately ([#3888](https://github.com/code-yeongyu/senpi-mono/issues/3888)).
212
+ - Fixed the coding-agent README See Also link to point at `@earendil-works/pi-agent-core` ([#4023](https://github.com/code-yeongyu/senpi-mono/issues/4023)).
213
+ - Fixed `grep` and `find` tool argument injection for flag-like search patterns ([#4018](https://github.com/code-yeongyu/senpi-mono/issues/4018)).
214
+ - Fixed PowerShell shell command output on Windows by only spawning detached processes on Unix ([#4013](https://github.com/code-yeongyu/senpi-mono/pull/4013) by [@picasso250](https://github.com/picasso250)).
215
+ - Fixed Bun package manager `node_modules` discovery when `npmCommand` is configured to use Bun ([#3998](https://github.com/code-yeongyu/senpi-mono/pull/3998) by [@thirtythreeforty](https://github.com/thirtythreeforty)).
216
+ - Fixed edit and edit-preview access failures to report filesystem errors correctly ([#3955](https://github.com/code-yeongyu/senpi-mono/pull/3955) by [@rwachtler](https://github.com/rwachtler)).
217
+ - Fixed `ProcessTerminal` sizing to use `COLUMNS` and `LINES` before falling back to 80x24 ([#4004](https://github.com/code-yeongyu/senpi-mono/issues/4004)).
218
+ - Updated `@anthropic-ai/sdk` to clear GHSA-p7fg-763f-g4gf audit findings ([#3992](https://github.com/code-yeongyu/senpi-mono/issues/3992)).
219
+ - Updated `@mariozechner/clipboard` to an attested release so package managers with trust policies do not reject installs ([#3946](https://github.com/code-yeongyu/senpi-mono/issues/3946)).
220
+ - Fixed project context discovery to load `AGENTS.MD` files in addition to `AGENTS.md` ([#3949](https://github.com/code-yeongyu/senpi-mono/issues/3949)).
221
+ - Fixed `/handoff` to use compacted session context instead of pre-compaction raw messages ([#3945](https://github.com/code-yeongyu/senpi-mono/issues/3945)).
222
+ - Fixed DeepSeek V4 Flash `xhigh` thinking support so requests map to DeepSeek's `max` reasoning effort ([#3944](https://github.com/code-yeongyu/senpi-mono/issues/3944)).
223
+ - Fixed Anthropic streams that end before `message_stop` to be treated as errors instead of successful partial responses ([#3936](https://github.com/code-yeongyu/senpi-mono/issues/3936)).
224
+ - Fixed generated OpenAI-compatible DeepSeek V4 reasoning compatibility outside the direct DeepSeek provider ([#3940](https://github.com/code-yeongyu/senpi-mono/issues/3940)).
225
+ - Fixed idle follow-up submission to clear the editor like normal message submission ([#3926](https://github.com/code-yeongyu/senpi-mono/issues/3926)).
226
+ - Fixed editor rendering artifacts for Thai Sara Am and Lao AM vowel characters ([#3904](https://github.com/code-yeongyu/senpi-mono/issues/3904)).
227
+ - Fixed DeepSeek V4 Flash and V4 Pro pricing metadata to match current official rates ([#3910](https://github.com/code-yeongyu/senpi-mono/issues/3910)).
228
+ - Updated the sandbox extension example lockfile to resolve the vulnerable `lodash-es` transitive dependency ([#3901](https://github.com/code-yeongyu/senpi-mono/issues/3901)).
229
+ - Fixed DeepSeek prompt cache hits to be tracked from OpenAI-compatible usage responses ([#3880](https://github.com/code-yeongyu/senpi-mono/issues/3880)).
188
230
 
189
231
  ### Removed
190
232
 
191
- - Removed the discontinued Qwen CLI OAuth custom provider extension example ([#3832](https://github.com/code-yeongyu/sanepi-mono/pull/3832) by [@4h9fbZ](https://github.com/4h9fbZ)).
233
+ - Removed the discontinued Qwen CLI OAuth custom provider extension example ([#3832](https://github.com/code-yeongyu/senpi-mono/pull/3832) by [@4h9fbZ](https://github.com/4h9fbZ)).
192
234
  - Removed Google Gemini CLI and Google Antigravity built-in login, default model, documentation, and example extension support.
193
235
 
194
236
  ## [0.70.6] - 2026-04-28
195
237
 
196
238
  ### New Features
197
239
 
198
- - Cloudflare Workers AI provider support with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID` setup. See [docs/providers.md#api-keys](docs/providers.md#api-keys). ([#3851](https://github.com/code-yeongyu/sanepi-mono/pull/3851) by [@mchenco](https://github.com/mchenco))
199
- - Pi update checks now use `pi.dev` and identify Pi with a `pi/<version>` user agent. See [docs/packages.md](docs/packages.md). ([#3877](https://github.com/code-yeongyu/sanepi-mono/pull/3877) by [@mitsuhiko](https://github.com/mitsuhiko))
240
+ - Cloudflare Workers AI provider support with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID` setup. See [docs/providers.md#api-keys](docs/providers.md#api-keys). ([#3851](https://github.com/code-yeongyu/senpi-mono/pull/3851) by [@mchenco](https://github.com/mchenco))
241
+ - Pi update checks now use `pi.dev` and identify Pi with a `pi/<version>` user agent. See [docs/packages.md](docs/packages.md). ([#3877](https://github.com/code-yeongyu/senpi-mono/pull/3877) by [@mitsuhiko](https://github.com/mitsuhiko))
200
242
 
201
243
  ### Added
202
244
 
@@ -205,22 +247,22 @@
205
247
  - `todotools` builtin extension: refactored the todo tooling into the new `todotools/` module tree and added
206
248
  todo continuation, configurable via `todotools.continuation.enabled` or disabled per run with
207
249
  `--disable-todo-continuation`
208
- - Added Cloudflare Workers AI as a built-in provider with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID` setup, default model resolution, `/login` support, and provider documentation ([#3851](https://github.com/code-yeongyu/sanepi-mono/pull/3851) by [@mchenco](https://github.com/mchenco)).
250
+ - Added Cloudflare Workers AI as a built-in provider with `CLOUDFLARE_API_KEY`/`CLOUDFLARE_ACCOUNT_ID` setup, default model resolution, `/login` support, and provider documentation ([#3851](https://github.com/code-yeongyu/senpi-mono/pull/3851) by [@mchenco](https://github.com/mchenco)).
209
251
 
210
252
  ### Changed
211
253
 
212
- - Changed Pi version checks to identify Pi with a `pi/<version>` user agent ([#3877](https://github.com/code-yeongyu/sanepi-mono/pull/3877) by [@mitsuhiko](https://github.com/mitsuhiko)).
254
+ - Changed Pi version checks to identify Pi with a `pi/<version>` user agent ([#3877](https://github.com/code-yeongyu/senpi-mono/pull/3877) by [@mitsuhiko](https://github.com/mitsuhiko)).
213
255
 
214
256
  ### Fixed
215
257
 
216
- - Fixed config selector scroll indicators to show item counts instead of line counts ([#3820](https://github.com/code-yeongyu/sanepi-mono/pull/3820) by [@aliou](https://github.com/aliou)).
217
- - Fixed exported HTML to escape embedded image data and session metadata, preventing crafted session content from injecting markup ([#3819](https://github.com/code-yeongyu/sanepi-mono/pull/3819) by [@justinpbarnett](https://github.com/justinpbarnett), [#3883](https://github.com/code-yeongyu/sanepi-mono/pull/3883) by [@justinpbarnett](https://github.com/justinpbarnett)).
218
- - Fixed Bun-based package manager startup by locating global `node_modules` relative to Bun's install layout ([#3861](https://github.com/code-yeongyu/sanepi-mono/pull/3861) by [@thirtythreeforty](https://github.com/thirtythreeforty)).
258
+ - Fixed config selector scroll indicators to show item counts instead of line counts ([#3820](https://github.com/code-yeongyu/senpi-mono/pull/3820) by [@aliou](https://github.com/aliou)).
259
+ - Fixed exported HTML to escape embedded image data and session metadata, preventing crafted session content from injecting markup ([#3819](https://github.com/code-yeongyu/senpi-mono/pull/3819) by [@justinpbarnett](https://github.com/justinpbarnett), [#3883](https://github.com/code-yeongyu/senpi-mono/pull/3883) by [@justinpbarnett](https://github.com/justinpbarnett)).
260
+ - Fixed Bun-based package manager startup by locating global `node_modules` relative to Bun's install layout ([#3861](https://github.com/code-yeongyu/senpi-mono/pull/3861) by [@thirtythreeforty](https://github.com/thirtythreeforty)).
219
261
  - Fixed Bedrock inference profile capability checks by normalizing profile ARNs to the underlying model name.
220
262
  - Fixed file discovery to fall back to `fdfind` when `fd` is unavailable.
221
- - Fixed `pi update` to skip self-update reinstalls when the installed version is already current ([#3853](https://github.com/code-yeongyu/sanepi-mono/issues/3853)).
263
+ - Fixed `pi update` to skip self-update reinstalls when the installed version is already current ([#3853](https://github.com/code-yeongyu/senpi-mono/issues/3853)).
222
264
  - Fixed Cloudflare Workers AI attribution headers to honor the install telemetry setting.
223
- - Fixed `pi update --self` detection and execution for Windows package-manager shim installs, including symlinked global package roots, and print the manual fallback command when self-update fails ([#3857](https://github.com/code-yeongyu/sanepi-mono/issues/3857)).
265
+ - Fixed `pi update --self` detection and execution for Windows package-manager shim installs, including symlinked global package roots, and print the manual fallback command when self-update fails ([#3857](https://github.com/code-yeongyu/senpi-mono/issues/3857)).
224
266
 
225
267
  ## [0.70.5] - 2026-04-27
226
268
 
@@ -238,53 +280,53 @@
238
280
 
239
281
  ### New Features
240
282
 
241
- - `pi update` can now update pi itself in addition to installed pi packages. See [docs/packages.md](docs/packages.md). ([#3680](https://github.com/code-yeongyu/sanepi-mono/pull/3680) by [@mitsuhiko](https://github.com/mitsuhiko))
242
- - Azure Cognitive Services endpoint support for Azure OpenAI Responses deployments. See [docs/providers.md#api-keys](docs/providers.md#api-keys). ([#3799](https://github.com/code-yeongyu/sanepi-mono/pull/3799) by [@marcbloech](https://github.com/marcbloech))
243
- - Suppressible Anthropic extra-usage billing warning via `warnings.anthropicExtraUsage` in `/settings`. See [docs/settings.md](docs/settings.md). ([#3808](https://github.com/code-yeongyu/sanepi-mono/issues/3808))
244
- - Extension-controlled working row visibility via `ctx.ui.setWorkingVisible()`, allowing extensions to hide the built-in loader row and render custom working state. See [docs/extensions.md](docs/extensions.md) and [examples/extensions/border-status-editor.ts](examples/extensions/border-status-editor.ts). ([#3674](https://github.com/code-yeongyu/sanepi-mono/issues/3674))
283
+ - `pi update` can now update pi itself in addition to installed pi packages. See [docs/packages.md](docs/packages.md). ([#3680](https://github.com/code-yeongyu/senpi-mono/pull/3680) by [@mitsuhiko](https://github.com/mitsuhiko))
284
+ - Azure Cognitive Services endpoint support for Azure OpenAI Responses deployments. See [docs/providers.md#api-keys](docs/providers.md#api-keys). ([#3799](https://github.com/code-yeongyu/senpi-mono/pull/3799) by [@marcbloech](https://github.com/marcbloech))
285
+ - Suppressible Anthropic extra-usage billing warning via `warnings.anthropicExtraUsage` in `/settings`. See [docs/settings.md](docs/settings.md). ([#3808](https://github.com/code-yeongyu/senpi-mono/issues/3808))
286
+ - Extension-controlled working row visibility via `ctx.ui.setWorkingVisible()`, allowing extensions to hide the built-in loader row and render custom working state. See [docs/extensions.md](docs/extensions.md) and [examples/extensions/border-status-editor.ts](examples/extensions/border-status-editor.ts). ([#3674](https://github.com/code-yeongyu/senpi-mono/issues/3674))
245
287
 
246
288
  ### Added
247
289
 
248
- - Added `pi update` support for updating pi itself in addition to installed pi packages ([#3680](https://github.com/code-yeongyu/sanepi-mono/pull/3680) by [@mitsuhiko](https://github.com/mitsuhiko)).
249
- - Added Azure Cognitive Services endpoint support for Azure OpenAI Responses base URLs ([#3799](https://github.com/code-yeongyu/sanepi-mono/pull/3799) by [@marcbloech](https://github.com/marcbloech)).
250
- - Added `warnings.anthropicExtraUsage` and a `/settings` warnings submenu to suppress the Anthropic extra usage billing warning ([#3808](https://github.com/code-yeongyu/sanepi-mono/issues/3808))
251
- - Added `ctx.ui.setWorkingVisible()` so extensions can hide the built-in interactive working loader row without reserving layout space, plus a border-status editor example that moves working state into a custom editor border ([#3674](https://github.com/code-yeongyu/sanepi-mono/issues/3674))
290
+ - Added `pi update` support for updating pi itself in addition to installed pi packages ([#3680](https://github.com/code-yeongyu/senpi-mono/pull/3680) by [@mitsuhiko](https://github.com/mitsuhiko)).
291
+ - Added Azure Cognitive Services endpoint support for Azure OpenAI Responses base URLs ([#3799](https://github.com/code-yeongyu/senpi-mono/pull/3799) by [@marcbloech](https://github.com/marcbloech)).
292
+ - Added `warnings.anthropicExtraUsage` and a `/settings` warnings submenu to suppress the Anthropic extra usage billing warning ([#3808](https://github.com/code-yeongyu/senpi-mono/issues/3808))
293
+ - Added `ctx.ui.setWorkingVisible()` so extensions can hide the built-in interactive working loader row without reserving layout space, plus a border-status editor example that moves working state into a custom editor border ([#3674](https://github.com/code-yeongyu/senpi-mono/issues/3674))
252
294
  - `bash-timeout` builtin extension: applies a default timeout to every `bash` tool call when the model does not specify one, and preserves explicit timeout values so host-specific timeout units do not get corrupted. Defaults to 120 s default / 600 s recommended max, configurable via `PI_BASH_DEFAULT_TIMEOUT_SECONDS` and `PI_BASH_MAX_TIMEOUT_SECONDS` env vars. Also injects a system prompt rider so the model knows the active default and recommended maximum.
253
295
  - `bash-timeout` integration tests: in-process handler tests covering the `tool_call` mutation path and the `before_agent_start` system-prompt-rider path, complementing the existing pure-function unit tests.
254
296
  - README discovery: the fork `README.md` "Core builtins" table now lists `bash-timeout`, and `packages/coding-agent/README.md` "Environment Variables" table documents `PI_BASH_DEFAULT_TIMEOUT_SECONDS` / `PI_BASH_MAX_TIMEOUT_SECONDS`.
255
297
 
256
298
  ### Fixed
257
299
 
258
- - Fixed duplicate printable characters from Kitty keyboard protocol CSI-u plus raw character input on layouts such as Italian ([#3780](https://github.com/code-yeongyu/sanepi-mono/issues/3780)).
259
- - Fixed API-key environment discovery and Bun startup to fall back to `/proc/self/environ` when Bun's sandbox leaves `process.env` empty ([#3801](https://github.com/code-yeongyu/sanepi-mono/pull/3801) by [@mdsjip](https://github.com/mdsjip)).
260
- - Fixed Bun sandboxed package-manager commands when `process.env` is empty ([#3807](https://github.com/code-yeongyu/sanepi-mono/pull/3807) by [@mdsjip](https://github.com/mdsjip)).
261
- - Fixed symlinked packages, resources, skills, and sessions being duplicated in selectors and loaders ([#3818](https://github.com/code-yeongyu/sanepi-mono/pull/3818) by [@aliou](https://github.com/aliou)).
262
- - Fixed Bedrock prompt-caching and adaptive-thinking capability checks for inference profile ARNs ([#3527](https://github.com/code-yeongyu/sanepi-mono/pull/3527) by [@anirudhmarc](https://github.com/anirudhmarc)).
300
+ - Fixed duplicate printable characters from Kitty keyboard protocol CSI-u plus raw character input on layouts such as Italian ([#3780](https://github.com/code-yeongyu/senpi-mono/issues/3780)).
301
+ - Fixed API-key environment discovery and Bun startup to fall back to `/proc/self/environ` when Bun's sandbox leaves `process.env` empty ([#3801](https://github.com/code-yeongyu/senpi-mono/pull/3801) by [@mdsjip](https://github.com/mdsjip)).
302
+ - Fixed Bun sandboxed package-manager commands when `process.env` is empty ([#3807](https://github.com/code-yeongyu/senpi-mono/pull/3807) by [@mdsjip](https://github.com/mdsjip)).
303
+ - Fixed symlinked packages, resources, skills, and sessions being duplicated in selectors and loaders ([#3818](https://github.com/code-yeongyu/senpi-mono/pull/3818) by [@aliou](https://github.com/aliou)).
304
+ - Fixed Bedrock prompt-caching and adaptive-thinking capability checks for inference profile ARNs ([#3527](https://github.com/code-yeongyu/senpi-mono/pull/3527) by [@anirudhmarc](https://github.com/anirudhmarc)).
263
305
  - Fixed OpenAI Codex Responses default verbosity to `low` when no verbosity is specified.
264
- - Stopped sending empty `tools` arrays to providers that reject them when tools are disabled ([#3650](https://github.com/code-yeongyu/sanepi-mono/pull/3650) by [@HQidea](https://github.com/HQidea)).
265
- - Fixed Anthropic SSE parsing to ignore unknown proxy events such as OpenAI-style `done` terminators ([#3708](https://github.com/code-yeongyu/sanepi-mono/issues/3708)).
266
- - Fixed provider registration with override-only `models.json` entries to preserve built-in model lists ([#3651](https://github.com/code-yeongyu/sanepi-mono/issues/3651)).
306
+ - Stopped sending empty `tools` arrays to providers that reject them when tools are disabled ([#3650](https://github.com/code-yeongyu/senpi-mono/pull/3650) by [@HQidea](https://github.com/HQidea)).
307
+ - Fixed Anthropic SSE parsing to ignore unknown proxy events such as OpenAI-style `done` terminators ([#3708](https://github.com/code-yeongyu/senpi-mono/issues/3708)).
308
+ - Fixed provider registration with override-only `models.json` entries to preserve built-in model lists ([#3651](https://github.com/code-yeongyu/senpi-mono/issues/3651)).
267
309
  - Fixed `/login` to show auth supplied by `models.json` provider definitions.
268
310
  - Fixed HTML export whitespace around extension-rendered tool output and expandable output hints.
269
- - Fixed bash executor temp output streams leaking file descriptors when output was truncated by line count ([#3786](https://github.com/code-yeongyu/sanepi-mono/issues/3786))
270
- - Fixed extension `pi.setSessionName()` updates to refresh the interactive terminal title immediately ([#3686](https://github.com/code-yeongyu/sanepi-mono/issues/3686))
271
- - Fixed `/tree` cancellation via `session_before_tree` leaving the session stuck in compaction state ([#3688](https://github.com/code-yeongyu/sanepi-mono/issues/3688))
272
- - Fixed Escape interrupt handling when extensions hide the built-in working loader row ([#3674](https://github.com/code-yeongyu/sanepi-mono/issues/3674))
311
+ - Fixed bash executor temp output streams leaking file descriptors when output was truncated by line count ([#3786](https://github.com/code-yeongyu/senpi-mono/issues/3786))
312
+ - Fixed extension `pi.setSessionName()` updates to refresh the interactive terminal title immediately ([#3686](https://github.com/code-yeongyu/senpi-mono/issues/3686))
313
+ - Fixed `/tree` cancellation via `session_before_tree` leaving the session stuck in compaction state ([#3688](https://github.com/code-yeongyu/senpi-mono/issues/3688))
314
+ - Fixed Escape interrupt handling when extensions hide the built-in working loader row ([#3674](https://github.com/code-yeongyu/senpi-mono/issues/3674))
273
315
  - Fixed coding-agent test expectations for current default models and missing-auth guidance.
274
- - Fixed long local-LLM SSE streams aborting at 5 minutes with `UND_ERR_BODY_TIMEOUT` by disabling undici `bodyTimeout`/`headersTimeout` on the global dispatcher; provider SDKs continue to enforce their own deadlines via `retry.provider.timeoutMs` ([#3715](https://github.com/code-yeongyu/sanepi-mono/issues/3715))
316
+ - Fixed long local-LLM SSE streams aborting at 5 minutes with `UND_ERR_BODY_TIMEOUT` by disabling undici `bodyTimeout`/`headersTimeout` on the global dispatcher; provider SDKs continue to enforce their own deadlines via `retry.provider.timeoutMs` ([#3715](https://github.com/code-yeongyu/senpi-mono/issues/3715))
275
317
 
276
318
  ## [0.70.2] - 2026-04-24
277
319
 
278
320
  ### Fixed
279
321
 
280
- - Fixed provider retry/timeout forwarding to omit undefined provider request controls, avoiding downstream SDK validation errors such as `timeout must be an integer` when `retry.provider.timeoutMs` is not configured ([#3627](https://github.com/code-yeongyu/sanepi-mono/issues/3627))
322
+ - Fixed provider retry/timeout forwarding to omit undefined provider request controls, avoiding downstream SDK validation errors such as `timeout must be an integer` when `retry.provider.timeoutMs` is not configured ([#3627](https://github.com/code-yeongyu/senpi-mono/issues/3627))
281
323
 
282
324
  ## [0.70.1] - 2026-04-24
283
325
 
284
326
  ### New Features
285
327
 
286
328
  - DeepSeek provider support with V4 Flash/Pro models and `DEEPSEEK_API_KEY` authentication. See [README.md#providers--models](README.md#providers--models) and [docs/providers.md#api-keys](docs/providers.md#api-keys).
287
- - Provider request timeout/retry controls via `retry.provider.{timeoutMs,maxRetries,maxRetryDelayMs}`, useful for long-running local inference and provider SDK retry behavior. See [docs/settings.md#retry](docs/settings.md#retry). ([#3627](https://github.com/code-yeongyu/sanepi-mono/issues/3627))
329
+ - Provider request timeout/retry controls via `retry.provider.{timeoutMs,maxRetries,maxRetryDelayMs}`, useful for long-running local inference and provider SDK retry behavior. See [docs/settings.md#retry](docs/settings.md#retry). ([#3627](https://github.com/code-yeongyu/senpi-mono/issues/3627))
288
330
 
289
331
  ### Added
290
332
 
@@ -292,30 +334,30 @@
292
334
 
293
335
  ### Fixed
294
336
 
295
- - Fixed `/copy` to avoid unbounded OSC 52 writes and clipboard races that could break terminal rendering or panic the native clipboard addon ([#3639](https://github.com/code-yeongyu/sanepi-mono/issues/3639))
296
- - Fixed extension flag docs to show `pi.getFlag()` using registered flag names without the CLI `--` prefix ([#3614](https://github.com/code-yeongyu/sanepi-mono/issues/3614))
297
- - Fixed provider retry/timeout settings wiring by adding `retry.provider.{timeoutMs,maxRetries,maxRetryDelayMs}`, migrating legacy `retry.maxDelayMs`, and forwarding provider controls into `streamSimple` request options ([#3627](https://github.com/code-yeongyu/sanepi-mono/issues/3627))
298
- - Fixed Windows git package installs to bypass `cmd.exe` for native git commands, so install paths containing spaces no longer break `pi install git:...` with `fatal: Too many arguments` ([#3642](https://github.com/code-yeongyu/sanepi-mono/issues/3642))
299
- - Fixed DeepSeek V4 session replay 400 errors by sending DeepSeek-compatible thinking controls and replayed assistant `reasoning_content` fields ([#3636](https://github.com/code-yeongyu/sanepi-mono/issues/3636))
337
+ - Fixed `/copy` to avoid unbounded OSC 52 writes and clipboard races that could break terminal rendering or panic the native clipboard addon ([#3639](https://github.com/code-yeongyu/senpi-mono/issues/3639))
338
+ - Fixed extension flag docs to show `pi.getFlag()` using registered flag names without the CLI `--` prefix ([#3614](https://github.com/code-yeongyu/senpi-mono/issues/3614))
339
+ - Fixed provider retry/timeout settings wiring by adding `retry.provider.{timeoutMs,maxRetries,maxRetryDelayMs}`, migrating legacy `retry.maxDelayMs`, and forwarding provider controls into `streamSimple` request options ([#3627](https://github.com/code-yeongyu/senpi-mono/issues/3627))
340
+ - Fixed Windows git package installs to bypass `cmd.exe` for native git commands, so install paths containing spaces no longer break `pi install git:...` with `fatal: Too many arguments` ([#3642](https://github.com/code-yeongyu/senpi-mono/issues/3642))
341
+ - Fixed DeepSeek V4 session replay 400 errors by sending DeepSeek-compatible thinking controls and replayed assistant `reasoning_content` fields ([#3636](https://github.com/code-yeongyu/senpi-mono/issues/3636))
300
342
  - Fixed GPT-5.5 generated context window metadata to use the observed 272k limit.
301
- - Fixed CSI-u Ctrl+letter decoding inside bracketed paste, so pasted modified-key escape sequences no longer become literal editor text ([#3623](https://github.com/code-yeongyu/sanepi-mono/pull/3623) by [@Exrun94](https://github.com/Exrun94))
343
+ - Fixed CSI-u Ctrl+letter decoding inside bracketed paste, so pasted modified-key escape sequences no longer become literal editor text ([#3623](https://github.com/code-yeongyu/senpi-mono/pull/3623) by [@Exrun94](https://github.com/Exrun94))
302
344
 
303
345
  ## [0.70.0] - 2026-04-23
304
346
 
305
347
  ### New Features
306
348
 
307
- - Searchable auth provider login flow: the `/login` provider selector now supports fuzzy search/filtering, making it faster to find providers when many are configured. See [docs/providers.md](docs/providers.md). ([#3572](https://github.com/code-yeongyu/sanepi-mono/pull/3572) by [@mitsuhiko](https://github.com/mitsuhiko))
349
+ - Searchable auth provider login flow: the `/login` provider selector now supports fuzzy search/filtering, making it faster to find providers when many are configured. See [docs/providers.md](docs/providers.md). ([#3572](https://github.com/code-yeongyu/senpi-mono/pull/3572) by [@mitsuhiko](https://github.com/mitsuhiko))
308
350
  - GPT-5.5 Codex support: `openai-codex/gpt-5.5` is available as a model option, including `xhigh` reasoning support and corrected priority-tier pricing.
309
- - Terminal progress indicators are now opt-in: OSC 9;4 progress reporting during streaming/compaction is off by default and can be toggled via `terminal.showTerminalProgress` in `/settings` ([#3588](https://github.com/code-yeongyu/sanepi-mono/issues/3588))
310
- - `--no-builtin-tools` / `createAgentSession({ noTools: "builtin" })` now correctly disables only built-in tools while keeping extension tools active. See [docs/extensions.md](docs/extensions.md) and [README.md](README.md) ([#3592](https://github.com/code-yeongyu/sanepi-mono/issues/3592))
351
+ - Terminal progress indicators are now opt-in: OSC 9;4 progress reporting during streaming/compaction is off by default and can be toggled via `terminal.showTerminalProgress` in `/settings` ([#3588](https://github.com/code-yeongyu/senpi-mono/issues/3588))
352
+ - `--no-builtin-tools` / `createAgentSession({ noTools: "builtin" })` now correctly disables only built-in tools while keeping extension tools active. See [docs/extensions.md](docs/extensions.md) and [README.md](README.md) ([#3592](https://github.com/code-yeongyu/senpi-mono/issues/3592))
311
353
 
312
354
  ### Breaking Changes
313
355
 
314
- - Disabled OSC 9;4 terminal progress indicators by default. Set `terminal.showTerminalProgress` to `true` in `/settings` to re-enable ([#3588](https://github.com/code-yeongyu/sanepi-mono/issues/3588))
356
+ - Disabled OSC 9;4 terminal progress indicators by default. Set `terminal.showTerminalProgress` to `true` in `/settings` to re-enable ([#3588](https://github.com/code-yeongyu/senpi-mono/issues/3588))
315
357
 
316
358
  ### Added
317
359
 
318
- - Added searchable auth provider login flow with fuzzy filtering in the provider selector ([#3572](https://github.com/code-yeongyu/sanepi-mono/pull/3572) by [@mitsuhiko](https://github.com/mitsuhiko))
360
+ - Added searchable auth provider login flow with fuzzy filtering in the provider selector ([#3572](https://github.com/code-yeongyu/senpi-mono/pull/3572) by [@mitsuhiko](https://github.com/mitsuhiko))
319
361
  - Added GPT-5.5 Codex model
320
362
  - Added auth source labels in `/login` so provider entries can show when auth comes from `--api-key`, an environment variable, or custom provider fallback without exposing secrets.
321
363
 
@@ -331,29 +373,29 @@
331
373
  - Added Amazon Bedrock setup guidance to `/login` and updated `/model` copy to refer to configured providers instead of only API keys.
332
374
  - Improved no-model and missing-auth warnings to point users to `/login` for OAuth or API key setup.
333
375
  - Fixed `/quit` shutdown ordering to stop the TUI before extension UI teardown can repaint, preserving the final rendered frame while still emitting `session_shutdown` before process exit.
334
- - Fixed `SettingsManager.inMemory()` initial settings being lost after reloads triggered by SDK resource loading ([#3616](https://github.com/code-yeongyu/sanepi-mono/issues/3616))
335
- - Fixed `models.json` provider compatibility to accept `compat.supportsLongCacheRetention`, allowing proxies to opt out of long-retention cache fields when needed while long retention is enabled by default when requested ([#3543](https://github.com/code-yeongyu/sanepi-mono/issues/3543))
376
+ - Fixed `SettingsManager.inMemory()` initial settings being lost after reloads triggered by SDK resource loading ([#3616](https://github.com/code-yeongyu/senpi-mono/issues/3616))
377
+ - Fixed `models.json` provider compatibility to accept `compat.supportsLongCacheRetention`, allowing proxies to opt out of long-retention cache fields when needed while long retention is enabled by default when requested ([#3543](https://github.com/code-yeongyu/senpi-mono/issues/3543))
336
378
  - Fixed `--thinking xhigh` for `openai-codex` `gpt-5.5` so it is no longer downgraded to `high`.
337
- - Fixed git package installs with custom `npmCommand` values such as `pnpm` by avoiding npm-specific production flags in that compatibility path ([#3604](https://github.com/code-yeongyu/sanepi-mono/issues/3604))
338
- - Fixed first user messages rendering without spacing after existing notices such as compaction summaries or status messages ([#3613](https://github.com/code-yeongyu/sanepi-mono/issues/3613))
339
- - Fixed the handoff extension example to use the replacement-session context after creating a new session, avoiding stale `ctx` errors when it installs the generated prompt ([#3606](https://github.com/code-yeongyu/sanepi-mono/issues/3606))
340
- - Fixed session replacement and `/quit` teardown ordering to run host-owned extension UI cleanup synchronously after `session_shutdown` handlers complete but before invalidating the old extension context, preventing stale extension UI from rendering against a disposed session ([#3597](https://github.com/code-yeongyu/sanepi-mono/pull/3597) by [@vegarsti](https://github.com/vegarsti))
341
- - Fixed crash on `/quit` when an extension registers a custom footer whose `render()` accesses `ctx`, by tearing down extension-provided UI before invalidating the extension runner during shutdown ([#3595](https://github.com/code-yeongyu/sanepi-mono/issues/3595))
342
- - Fixed auto-retry to treat Bedrock/Smithy HTTP/2 transport failures like `http2 request did not get a response` as transient errors, so the agent retries automatically instead of waiting for a manual nudge ([#3594](https://github.com/code-yeongyu/sanepi-mono/issues/3594))
343
- - Fixed the CLI/SDK tool-selection split so `--no-builtin-tools` and `createAgentSession({ noTools: "builtin" })` disable only built-in default tools while keeping extension/custom tools enabled, instead of falling through to the same "disable everything" path as `--no-tools` ([#3592](https://github.com/code-yeongyu/sanepi-mono/issues/3592))
344
- - Fixed remaining hardcoded `pi` / `.pi` branding to route through `APP_NAME` and `CONFIG_DIR_NAME` extension points, so SDK rebrands get consistent naming in `/quit` description, `process.title`, and the project-local extensions directory ([#3583](https://github.com/code-yeongyu/sanepi-mono/pull/3583) by [@jlaneve](https://github.com/jlaneve))
345
- - Fixed `pi-coding-agent` shipping `uuid@11`, which triggered `npm audit` moderate vulnerability reports for downstream installs; the package now depends on `uuid@14` ([#3577](https://github.com/code-yeongyu/sanepi-mono/issues/3577))
346
- - Fixed `openai-completions` streamed tool-call assembly to coalesce deltas by stable tool index when OpenAI-compatible gateways mutate tool call IDs mid-stream, preventing malformed Kimi K2.6/OpenCode tool streams from splitting one call into multiple bogus tool calls ([#3576](https://github.com/code-yeongyu/sanepi-mono/issues/3576))
347
- - Fixed `ctx.ui.setWorkingMessage()` to persist across loader recreation, matching the behavior of `ctx.ui.setWorkingIndicator()` ([#3566](https://github.com/code-yeongyu/sanepi-mono/issues/3566))
348
- - Fixed coding-agent `fs.watch` error handling for theme and git-footer watchers to retry after transient watcher failures such as `EMFILE`, avoiding startup crashes in large repos ([#3564](https://github.com/code-yeongyu/sanepi-mono/issues/3564))
349
- - Fixed built-in `kimi-coding` model generation to attach the expected `User-Agent` header so direct Kimi Coding requests use the provider's expected client identity ([#3586](https://github.com/code-yeongyu/sanepi-mono/issues/3586))
350
- - Fixed extension shortcut conflict diagnostics to display at startup instead of only on reload, so extension authors discover reserved keybinding conflicts immediately rather than discovering them later through user feedback ([#3617](https://github.com/code-yeongyu/sanepi-mono/issues/3617))
351
- - Fixed `models.json` Anthropic-compatible provider configuration to accept `compat.supportsEagerToolInputStreaming`, allowing proxies that reject per-tool `eager_input_streaming` to use the legacy fine-grained tool streaming beta header instead ([#3575](https://github.com/code-yeongyu/sanepi-mono/issues/3575))
352
- - Fixed startup banner extension labels to strip trailing `index.js`/`index.ts` suffixes ([#3596](https://github.com/code-yeongyu/sanepi-mono/pull/3596) by [@aliou](https://github.com/aliou))
353
- - Fixed OSC 9;4 terminal progress updates to stay alive in terminals such as Ghostty during long-running agent work ([#3610](https://github.com/code-yeongyu/sanepi-mono/issues/3610))
354
- - Fixed OpenAI-compatible completion usage parsing to avoid double-counting reasoning tokens already included in `completion_tokens` ([#3581](https://github.com/code-yeongyu/sanepi-mono/issues/3581))
355
- - Fixed `openai-responses` compatibility for strict OpenAI-compatible proxies by allowing `models.json` to disable the underscore-containing `session_id` header with `compat.sendSessionIdHeader: false` ([#3579](https://github.com/code-yeongyu/sanepi-mono/issues/3579))
356
- - Fixed GPT-5.5 Codex capability handling to clamp unsupported minimal reasoning to `low` and apply the model's 2.5x priority service-tier pricing multiplier ([#3618](https://github.com/code-yeongyu/sanepi-mono/pull/3618) by [@markusylisiurunen](https://github.com/markusylisiurunen))
379
+ - Fixed git package installs with custom `npmCommand` values such as `pnpm` by avoiding npm-specific production flags in that compatibility path ([#3604](https://github.com/code-yeongyu/senpi-mono/issues/3604))
380
+ - Fixed first user messages rendering without spacing after existing notices such as compaction summaries or status messages ([#3613](https://github.com/code-yeongyu/senpi-mono/issues/3613))
381
+ - Fixed the handoff extension example to use the replacement-session context after creating a new session, avoiding stale `ctx` errors when it installs the generated prompt ([#3606](https://github.com/code-yeongyu/senpi-mono/issues/3606))
382
+ - Fixed session replacement and `/quit` teardown ordering to run host-owned extension UI cleanup synchronously after `session_shutdown` handlers complete but before invalidating the old extension context, preventing stale extension UI from rendering against a disposed session ([#3597](https://github.com/code-yeongyu/senpi-mono/pull/3597) by [@vegarsti](https://github.com/vegarsti))
383
+ - Fixed crash on `/quit` when an extension registers a custom footer whose `render()` accesses `ctx`, by tearing down extension-provided UI before invalidating the extension runner during shutdown ([#3595](https://github.com/code-yeongyu/senpi-mono/issues/3595))
384
+ - Fixed auto-retry to treat Bedrock/Smithy HTTP/2 transport failures like `http2 request did not get a response` as transient errors, so the agent retries automatically instead of waiting for a manual nudge ([#3594](https://github.com/code-yeongyu/senpi-mono/issues/3594))
385
+ - Fixed the CLI/SDK tool-selection split so `--no-builtin-tools` and `createAgentSession({ noTools: "builtin" })` disable only built-in default tools while keeping extension/custom tools enabled, instead of falling through to the same "disable everything" path as `--no-tools` ([#3592](https://github.com/code-yeongyu/senpi-mono/issues/3592))
386
+ - Fixed remaining hardcoded `pi` / `.pi` branding to route through `APP_NAME` and `CONFIG_DIR_NAME` extension points, so SDK rebrands get consistent naming in `/quit` description, `process.title`, and the project-local extensions directory ([#3583](https://github.com/code-yeongyu/senpi-mono/pull/3583) by [@jlaneve](https://github.com/jlaneve))
387
+ - Fixed `pi-coding-agent` shipping `uuid@11`, which triggered `npm audit` moderate vulnerability reports for downstream installs; the package now depends on `uuid@14` ([#3577](https://github.com/code-yeongyu/senpi-mono/issues/3577))
388
+ - Fixed `openai-completions` streamed tool-call assembly to coalesce deltas by stable tool index when OpenAI-compatible gateways mutate tool call IDs mid-stream, preventing malformed Kimi K2.6/OpenCode tool streams from splitting one call into multiple bogus tool calls ([#3576](https://github.com/code-yeongyu/senpi-mono/issues/3576))
389
+ - Fixed `ctx.ui.setWorkingMessage()` to persist across loader recreation, matching the behavior of `ctx.ui.setWorkingIndicator()` ([#3566](https://github.com/code-yeongyu/senpi-mono/issues/3566))
390
+ - Fixed coding-agent `fs.watch` error handling for theme and git-footer watchers to retry after transient watcher failures such as `EMFILE`, avoiding startup crashes in large repos ([#3564](https://github.com/code-yeongyu/senpi-mono/issues/3564))
391
+ - Fixed built-in `kimi-coding` model generation to attach the expected `User-Agent` header so direct Kimi Coding requests use the provider's expected client identity ([#3586](https://github.com/code-yeongyu/senpi-mono/issues/3586))
392
+ - Fixed extension shortcut conflict diagnostics to display at startup instead of only on reload, so extension authors discover reserved keybinding conflicts immediately rather than discovering them later through user feedback ([#3617](https://github.com/code-yeongyu/senpi-mono/issues/3617))
393
+ - Fixed `models.json` Anthropic-compatible provider configuration to accept `compat.supportsEagerToolInputStreaming`, allowing proxies that reject per-tool `eager_input_streaming` to use the legacy fine-grained tool streaming beta header instead ([#3575](https://github.com/code-yeongyu/senpi-mono/issues/3575))
394
+ - Fixed startup banner extension labels to strip trailing `index.js`/`index.ts` suffixes ([#3596](https://github.com/code-yeongyu/senpi-mono/pull/3596) by [@aliou](https://github.com/aliou))
395
+ - Fixed OSC 9;4 terminal progress updates to stay alive in terminals such as Ghostty during long-running agent work ([#3610](https://github.com/code-yeongyu/senpi-mono/issues/3610))
396
+ - Fixed OpenAI-compatible completion usage parsing to avoid double-counting reasoning tokens already included in `completion_tokens` ([#3581](https://github.com/code-yeongyu/senpi-mono/issues/3581))
397
+ - Fixed `openai-responses` compatibility for strict OpenAI-compatible proxies by allowing `models.json` to disable the underscore-containing `session_id` header with `compat.sendSessionIdHeader: false` ([#3579](https://github.com/code-yeongyu/senpi-mono/issues/3579))
398
+ - Fixed GPT-5.5 Codex capability handling to clamp unsupported minimal reasoning to `low` and apply the model's 2.5x priority service-tier pricing multiplier ([#3618](https://github.com/code-yeongyu/senpi-mono/pull/3618) by [@markusylisiurunen](https://github.com/markusylisiurunen))
357
399
 
358
400
  ## [0.69.0] - 2026-04-22
359
401
 
@@ -366,22 +408,22 @@
366
408
 
367
409
  ### Breaking Changes
368
410
 
369
- - Migrated first-party coding-agent code, SDK/examples/docs, and package metadata from `@sinclair/typebox` 0.34.x to `typebox` 1.x. New extensions, SDK integrations, and pi packages should depend on and import from `typebox`. Legacy extension loading still aliases the root `@sinclair/typebox` package, but `@sinclair/typebox/compiler` is no longer shimmed. This migration also picks up the new `@earendil-works/pi-ai` TypeBox-native validator path, so tool argument validation now works in eval-restricted runtimes such as Cloudflare Workers instead of being skipped ([#3112](https://github.com/code-yeongyu/sanepi-mono/issues/3112))
411
+ - Migrated first-party coding-agent code, SDK/examples/docs, and package metadata from `@sinclair/typebox` 0.34.x to `typebox` 1.x. New extensions, SDK integrations, and pi packages should depend on and import from `typebox`. Legacy extension loading still aliases the root `@sinclair/typebox` package, but `@sinclair/typebox/compiler` is no longer shimmed. This migration also picks up the new `@earendil-works/pi-ai` TypeBox-native validator path, so tool argument validation now works in eval-restricted runtimes such as Cloudflare Workers instead of being skipped ([#3112](https://github.com/code-yeongyu/senpi-mono/issues/3112))
370
412
  - Session-replacement commands now invalidate captured pre-replacement session-bound extension objects after `ctx.newSession()`, `ctx.fork()`, and `ctx.switchSession()`. Old `pi` and command `ctx` references now throw instead of silently targeting the replaced session. Migration: if code needs to keep working in the replacement session after one of those calls, pass `withSession` to that same method and do the post-switch work there. In practice, move post-switch `pi.sendUserMessage()`, `pi.sendMessage()`, and command-ctx/session-manager access into `withSession`, and use only the `ReplacedSessionContext` passed to that callback for session-bound operations. Footguns: `withSession` runs after the old extension instance has already received `session_shutdown`, old cleanup may already have invalidated captured state, captured old `pi` / old command `ctx` are stale, and previously extracted raw objects such as `const sm = ctx.sessionManager` remain the caller's responsibility and must not be reused after the switch.
371
413
 
372
414
  ### Added
373
415
 
374
- - Added support for terminating tool results via `terminate: true`, allowing custom tools to end the current tool batch without an automatic follow-up LLM call, plus a `structured-output.ts` extension example and extension docs showing the pattern ([#3525](https://github.com/code-yeongyu/sanepi-mono/issues/3525))
416
+ - Added support for terminating tool results via `terminate: true`, allowing custom tools to end the current tool batch without an automatic follow-up LLM call, plus a `structured-output.ts` extension example and extension docs showing the pattern ([#3525](https://github.com/code-yeongyu/senpi-mono/issues/3525))
375
417
  - Added OSC 9;4 terminal progress indicators during agent streaming and compaction, so terminals like iTerm2, WezTerm, Windows Terminal, and Kitty show activity in their tab bar
376
- - Added `ctx.ui.addAutocompleteProvider(...)` for stacking extension autocomplete providers on top of the built-in slash/path provider, plus a `github-issue-autocomplete.ts` example and extension docs ([#2983](https://github.com/code-yeongyu/sanepi-mono/issues/2983))
418
+ - Added `ctx.ui.addAutocompleteProvider(...)` for stacking extension autocomplete providers on top of the built-in slash/path provider, plus a `github-issue-autocomplete.ts` example and extension docs ([#2983](https://github.com/code-yeongyu/senpi-mono/issues/2983))
377
419
 
378
420
  ### Fixed
379
421
 
380
- - Fixed exported session HTML to sanitize markdown link URLs before rendering them into anchor tags, blocking `javascript:`-style payloads while preserving safe links in shared/exported sessions ([#3532](https://github.com/code-yeongyu/sanepi-mono/issues/3532))
381
- - Fixed `ctx.getSystemPrompt()` inside `before_agent_start` to reflect chained system-prompt changes made by earlier `before_agent_start` handlers, and clarified the extension docs around provider-payload rewrites and what `ctx.getSystemPrompt()` does and does not report ([#3539](https://github.com/code-yeongyu/sanepi-mono/issues/3539))
382
- - Fixed built-in `google-gemini-cli` model lists and selector entries to include `gemini-3.1-flash-lite-preview`, so Cloud Code Assist users no longer need manual `--model` fallback selection to use it ([#3545](https://github.com/code-yeongyu/sanepi-mono/issues/3545))
383
- - Fixed extension session-replacement flows so `ctx.newSession()`, `ctx.fork()`, `ctx.switchSession()`, and imported-session replacements fully rebind before post-switch work runs, added `withSession` replacement callbacks with fresh `ReplacedSessionContext` helpers, and make stale pre-replacement `pi` / `ctx` session-bound accesses throw instead of silently targeting the wrong session ([#2860](https://github.com/code-yeongyu/sanepi-mono/issues/2860))
384
- - Fixed `models.json` built-in provider overrides to accept `headers` without requiring `baseUrl`, so request-header-only overrides now load and apply correctly ([#3538](https://github.com/code-yeongyu/sanepi-mono/issues/3538))
422
+ - Fixed exported session HTML to sanitize markdown link URLs before rendering them into anchor tags, blocking `javascript:`-style payloads while preserving safe links in shared/exported sessions ([#3532](https://github.com/code-yeongyu/senpi-mono/issues/3532))
423
+ - Fixed `ctx.getSystemPrompt()` inside `before_agent_start` to reflect chained system-prompt changes made by earlier `before_agent_start` handlers, and clarified the extension docs around provider-payload rewrites and what `ctx.getSystemPrompt()` does and does not report ([#3539](https://github.com/code-yeongyu/senpi-mono/issues/3539))
424
+ - Fixed built-in `google-gemini-cli` model lists and selector entries to include `gemini-3.1-flash-lite-preview`, so Cloud Code Assist users no longer need manual `--model` fallback selection to use it ([#3545](https://github.com/code-yeongyu/senpi-mono/issues/3545))
425
+ - Fixed extension session-replacement flows so `ctx.newSession()`, `ctx.fork()`, `ctx.switchSession()`, and imported-session replacements fully rebind before post-switch work runs, added `withSession` replacement callbacks with fresh `ReplacedSessionContext` helpers, and make stale pre-replacement `pi` / `ctx` session-bound accesses throw instead of silently targeting the wrong session ([#2860](https://github.com/code-yeongyu/senpi-mono/issues/2860))
426
+ - Fixed `models.json` built-in provider overrides to accept `headers` without requiring `baseUrl`, so request-header-only overrides now load and apply correctly ([#3538](https://github.com/code-yeongyu/senpi-mono/issues/3538))
385
427
 
386
428
  ## [0.68.1] - 2026-04-22
387
429
 
@@ -392,19 +434,19 @@
392
434
 
393
435
  ### Added
394
436
 
395
- - Added built-in Fireworks provider support, including `FIREWORKS_API_KEY` setup/docs and the default Fireworks model `accounts/fireworks/models/kimi-k2p6` ([#3519](https://github.com/code-yeongyu/sanepi-mono/issues/3519))
437
+ - Added built-in Fireworks provider support, including `FIREWORKS_API_KEY` setup/docs and the default Fireworks model `accounts/fireworks/models/kimi-k2p6` ([#3519](https://github.com/code-yeongyu/senpi-mono/issues/3519))
396
438
 
397
439
  ### Fixed
398
440
 
399
- - Fixed interactive inline tool images to honor configurable `terminal.imageWidthCells` via `/settings`, so tool-output images are no longer hard-capped to 60 terminal cells ([#3508](https://github.com/code-yeongyu/sanepi-mono/issues/3508))
400
- - Fixed `sessionDir` in `settings.json` to expand `~`, so portable session-directory settings no longer require a shell wrapper ([#3514](https://github.com/code-yeongyu/sanepi-mono/issues/3514))
401
- - Fixed parallel tool-call rows to leave the pending state as soon as each tool is finalized, while still appending persisted tool results in assistant source order ([#3503](https://github.com/code-yeongyu/sanepi-mono/issues/3503))
402
- - Fixed exported session markdown to render Markdown while showing HTML-like message content such as `<file name="...">...</file>` verbatim, so shared sessions match the TUI instead of letting the browser interpret message text ([#3484](https://github.com/code-yeongyu/sanepi-mono/issues/3484))
403
- - Fixed exported session HTML to render `grep` and `find` output through their existing TUI renderers and `ls` output through a native template renderer, avoiding missing formatting and spacing artifacts in shared sessions ([#3491](https://github.com/code-yeongyu/sanepi-mono/pull/3491) by [@aliou](https://github.com/aliou))
404
- - Fixed `@` autocomplete fuzzy search to follow symlinked directories and include symlinked paths in results ([#3507](https://github.com/code-yeongyu/sanepi-mono/issues/3507))
405
- - Fixed proxied agent streams to preserve the proxy-safe serializable subset of stream options, including session, transport, retry-delay, metadata, header, cache-retention, and thinking-budget settings ([#3512](https://github.com/code-yeongyu/sanepi-mono/issues/3512))
406
- - Hardened Anthropic streaming against malformed tool-call JSON by owning SSE parsing with defensive JSON repair, replacing the deprecated `fine-grained-tool-streaming` beta header with per-tool `eager_input_streaming`, and updating stale test model references ([#3175](https://github.com/code-yeongyu/sanepi-mono/issues/3175))
407
- - Fixed Bedrock runtime endpoint resolution to stop pinning built-in regional endpoints over `AWS_REGION` / `AWS_PROFILE`, restoring `us.*` and `eu.*` inference profile support after v0.68.0 while preserving custom VPC/proxy endpoint overrides ([#3481](https://github.com/code-yeongyu/sanepi-mono/issues/3481), [#3485](https://github.com/code-yeongyu/sanepi-mono/issues/3485), [#3486](https://github.com/code-yeongyu/sanepi-mono/issues/3486), [#3487](https://github.com/code-yeongyu/sanepi-mono/issues/3487), [#3488](https://github.com/code-yeongyu/sanepi-mono/issues/3488))
441
+ - Fixed interactive inline tool images to honor configurable `terminal.imageWidthCells` via `/settings`, so tool-output images are no longer hard-capped to 60 terminal cells ([#3508](https://github.com/code-yeongyu/senpi-mono/issues/3508))
442
+ - Fixed `sessionDir` in `settings.json` to expand `~`, so portable session-directory settings no longer require a shell wrapper ([#3514](https://github.com/code-yeongyu/senpi-mono/issues/3514))
443
+ - Fixed parallel tool-call rows to leave the pending state as soon as each tool is finalized, while still appending persisted tool results in assistant source order ([#3503](https://github.com/code-yeongyu/senpi-mono/issues/3503))
444
+ - Fixed exported session markdown to render Markdown while showing HTML-like message content such as `<file name="...">...</file>` verbatim, so shared sessions match the TUI instead of letting the browser interpret message text ([#3484](https://github.com/code-yeongyu/senpi-mono/issues/3484))
445
+ - Fixed exported session HTML to render `grep` and `find` output through their existing TUI renderers and `ls` output through a native template renderer, avoiding missing formatting and spacing artifacts in shared sessions ([#3491](https://github.com/code-yeongyu/senpi-mono/pull/3491) by [@aliou](https://github.com/aliou))
446
+ - Fixed `@` autocomplete fuzzy search to follow symlinked directories and include symlinked paths in results ([#3507](https://github.com/code-yeongyu/senpi-mono/issues/3507))
447
+ - Fixed proxied agent streams to preserve the proxy-safe serializable subset of stream options, including session, transport, retry-delay, metadata, header, cache-retention, and thinking-budget settings ([#3512](https://github.com/code-yeongyu/senpi-mono/issues/3512))
448
+ - Hardened Anthropic streaming against malformed tool-call JSON by owning SSE parsing with defensive JSON repair, replacing the deprecated `fine-grained-tool-streaming` beta header with per-tool `eager_input_streaming`, and updating stale test model references ([#3175](https://github.com/code-yeongyu/senpi-mono/issues/3175))
449
+ - Fixed Bedrock runtime endpoint resolution to stop pinning built-in regional endpoints over `AWS_REGION` / `AWS_PROFILE`, restoring `us.*` and `eu.*` inference profile support after v0.68.0 while preserving custom VPC/proxy endpoint overrides ([#3481](https://github.com/code-yeongyu/senpi-mono/issues/3481), [#3485](https://github.com/code-yeongyu/senpi-mono/issues/3485), [#3486](https://github.com/code-yeongyu/senpi-mono/issues/3486), [#3487](https://github.com/code-yeongyu/senpi-mono/issues/3487), [#3488](https://github.com/code-yeongyu/senpi-mono/issues/3488))
408
450
 
409
451
  ## [0.68.0] - 2026-04-20
410
452
 
@@ -417,51 +459,51 @@
417
459
 
418
460
  ### Breaking Changes
419
461
 
420
- - Changed SDK and CLI tool selection from cwd-bound built-in tool instances to tool-name allowlists. `createAgentSession({ tools })` now expects `string[]` names such as `"read"` and `"bash"` instead of `Tool[]`, `--tools` now allowlists built-in, extension, and custom tools by name, and `--no-tools` now disables all tools by default rather than only built-ins. Migrate SDK code from `tools: [readTool, bashTool]` to `tools: ["read", "bash"]` ([#2835](https://github.com/code-yeongyu/sanepi-mono/issues/2835), [#3452](https://github.com/code-yeongyu/sanepi-mono/issues/3452))
421
- - Removed prebuilt cwd-bound tool and tool-definition exports from `@code-yeongyu/senpi`, including `readTool`, `bashTool`, `editTool`, `writeTool`, `grepTool`, `findTool`, `lsTool`, `readOnlyTools`, `codingTools`, and the corresponding `*ToolDefinition` values. Use the explicit factory exports instead, for example `createReadTool(cwd)`, `createBashTool(cwd)`, `createCodingTools(cwd)`, and `createReadToolDefinition(cwd)` ([#3452](https://github.com/code-yeongyu/sanepi-mono/issues/3452))
422
- - Removed ambient `process.cwd()` / default agent-dir fallback behavior from public resource helpers. `DefaultResourceLoader`, `loadProjectContextFiles()`, and `loadSkills()` now require explicit cwd/agent-dir style inputs, and exported system-prompt option types now require an explicit `cwd`. Pass the session or project cwd explicitly instead of relying on process-global defaults ([#3452](https://github.com/code-yeongyu/sanepi-mono/issues/3452))
462
+ - Changed SDK and CLI tool selection from cwd-bound built-in tool instances to tool-name allowlists. `createAgentSession({ tools })` now expects `string[]` names such as `"read"` and `"bash"` instead of `Tool[]`, `--tools` now allowlists built-in, extension, and custom tools by name, and `--no-tools` now disables all tools by default rather than only built-ins. Migrate SDK code from `tools: [readTool, bashTool]` to `tools: ["read", "bash"]` ([#2835](https://github.com/code-yeongyu/senpi-mono/issues/2835), [#3452](https://github.com/code-yeongyu/senpi-mono/issues/3452))
463
+ - Removed prebuilt cwd-bound tool and tool-definition exports from `@code-yeongyu/senpi`, including `readTool`, `bashTool`, `editTool`, `writeTool`, `grepTool`, `findTool`, `lsTool`, `readOnlyTools`, `codingTools`, and the corresponding `*ToolDefinition` values. Use the explicit factory exports instead, for example `createReadTool(cwd)`, `createBashTool(cwd)`, `createCodingTools(cwd)`, and `createReadToolDefinition(cwd)` ([#3452](https://github.com/code-yeongyu/senpi-mono/issues/3452))
464
+ - Removed ambient `process.cwd()` / default agent-dir fallback behavior from public resource helpers. `DefaultResourceLoader`, `loadProjectContextFiles()`, and `loadSkills()` now require explicit cwd/agent-dir style inputs, and exported system-prompt option types now require an explicit `cwd`. Pass the session or project cwd explicitly instead of relying on process-global defaults ([#3452](https://github.com/code-yeongyu/senpi-mono/issues/3452))
423
465
 
424
466
  ### Added
425
467
 
426
- - Added extension support for customizing the interactive streaming working indicator via `ctx.ui.setWorkingIndicator()`, including custom animated frames, static indicators, hidden indicators, a new `working-indicator.ts` example extension, and updated extension/TUI/RPC docs ([#3413](https://github.com/code-yeongyu/sanepi-mono/issues/3413))
427
- - Added `systemPromptOptions` (`BuildSystemPromptOptions`) to `before_agent_start` extension events, so extensions can inspect the structured inputs used to build the current system prompt ([#3473](https://github.com/code-yeongyu/sanepi-mono/pull/3473) by [@dljsjr](https://github.com/dljsjr))
428
- - Added `/clone` to duplicate the current active branch into a new session, while keeping `/fork` focused on forking from a previous user message ([#2962](https://github.com/code-yeongyu/sanepi-mono/issues/2962))
429
- - Added `ctx.fork()` support for `position: "before" | "at"` so extensions and integrations can branch before a user message or duplicate the current point in the conversation; the interactive clone/fork UX builds on that runtime support ([#3431](https://github.com/code-yeongyu/sanepi-mono/pull/3431) by [@mitsuhiko](https://github.com/mitsuhiko))
430
- - Added configurable keybinding ids for scoped model selector actions and tree filter actions, so those interactive shortcuts can be remapped in `keybindings.json` ([#3343](https://github.com/code-yeongyu/sanepi-mono/pull/3343) by [@mpazik](https://github.com/mpazik))
431
- - Added `PI_OAUTH_CALLBACK_HOST` support for built-in OAuth login flows, allowing local callback servers used by `pi auth` to bind to a custom interface instead of hardcoded `127.0.0.1` ([#3409](https://github.com/code-yeongyu/sanepi-mono/pull/3409) by [@Michaelliv](https://github.com/Michaelliv))
432
- - Added `reason` and `targetSessionFile` metadata to `session_shutdown` extension events, so extensions can distinguish quit, reload, new-session, resume, and fork teardown paths ([#2863](https://github.com/code-yeongyu/sanepi-mono/issues/2863))
468
+ - Added extension support for customizing the interactive streaming working indicator via `ctx.ui.setWorkingIndicator()`, including custom animated frames, static indicators, hidden indicators, a new `working-indicator.ts` example extension, and updated extension/TUI/RPC docs ([#3413](https://github.com/code-yeongyu/senpi-mono/issues/3413))
469
+ - Added `systemPromptOptions` (`BuildSystemPromptOptions`) to `before_agent_start` extension events, so extensions can inspect the structured inputs used to build the current system prompt ([#3473](https://github.com/code-yeongyu/senpi-mono/pull/3473) by [@dljsjr](https://github.com/dljsjr))
470
+ - Added `/clone` to duplicate the current active branch into a new session, while keeping `/fork` focused on forking from a previous user message ([#2962](https://github.com/code-yeongyu/senpi-mono/issues/2962))
471
+ - Added `ctx.fork()` support for `position: "before" | "at"` so extensions and integrations can branch before a user message or duplicate the current point in the conversation; the interactive clone/fork UX builds on that runtime support ([#3431](https://github.com/code-yeongyu/senpi-mono/pull/3431) by [@mitsuhiko](https://github.com/mitsuhiko))
472
+ - Added configurable keybinding ids for scoped model selector actions and tree filter actions, so those interactive shortcuts can be remapped in `keybindings.json` ([#3343](https://github.com/code-yeongyu/senpi-mono/pull/3343) by [@mpazik](https://github.com/mpazik))
473
+ - Added `PI_OAUTH_CALLBACK_HOST` support for built-in OAuth login flows, allowing local callback servers used by `pi auth` to bind to a custom interface instead of hardcoded `127.0.0.1` ([#3409](https://github.com/code-yeongyu/senpi-mono/pull/3409) by [@Michaelliv](https://github.com/Michaelliv))
474
+ - Added `reason` and `targetSessionFile` metadata to `session_shutdown` extension events, so extensions can distinguish quit, reload, new-session, resume, and fork teardown paths ([#2863](https://github.com/code-yeongyu/senpi-mono/issues/2863))
433
475
 
434
476
  ### Changed
435
477
 
436
- - Changed `pi update` to batch npm package updates per scope and run git package updates with bounded parallelism, reducing multi-package update time while preserving skip behavior for pinned and already-current packages ([#2980](https://github.com/code-yeongyu/sanepi-mono/issues/2980))
437
- - Changed Bedrock session requests to omit `maxTokens` when model token limits are unknown and to omit `temperature` when unset, letting Bedrock use provider defaults and avoid unnecessary TPM quota reservation ([#3400](https://github.com/code-yeongyu/sanepi-mono/pull/3400) by [@wirjo](https://github.com/wirjo))
478
+ - Changed `pi update` to batch npm package updates per scope and run git package updates with bounded parallelism, reducing multi-package update time while preserving skip behavior for pinned and already-current packages ([#2980](https://github.com/code-yeongyu/senpi-mono/issues/2980))
479
+ - Changed Bedrock session requests to omit `maxTokens` when model token limits are unknown and to omit `temperature` when unset, letting Bedrock use provider defaults and avoid unnecessary TPM quota reservation ([#3400](https://github.com/code-yeongyu/senpi-mono/pull/3400) by [@wirjo](https://github.com/wirjo))
438
480
 
439
481
  ### Fixed
440
482
 
441
483
  - Fixed `AgentSession` system-prompt option initialization to avoid constructing an invalid empty `BuildSystemPromptOptions`, so `npm run check` passes after `cwd` became mandatory.
442
- - Fixed shell-path resolution to stop consulting ambient `process.cwd()` state during bash execution, so session/project-specific `shellPath` settings now follow the active coding-agent session cwd instead of the launcher cwd ([#3452](https://github.com/code-yeongyu/sanepi-mono/issues/3452))
443
- - Fixed `ctx.ui.setWorkingIndicator()` custom frames to render verbatim instead of forcing the theme accent color, so extensions now own working-indicator coloring when they customize it ([#3467](https://github.com/code-yeongyu/sanepi-mono/issues/3467))
444
- - Fixed `pi update` reinstalling npm packages that are already at the latest published version by checking the installed package version before running `npm install <pkg>@latest` ([#3000](https://github.com/code-yeongyu/sanepi-mono/issues/3000))
445
- - Fixed `@` autocomplete plain queries to stop matching against the full cwd/base path, so path fragments in worktree names no longer crowd out intended results such as `@plan` ([#2778](https://github.com/code-yeongyu/sanepi-mono/issues/2778))
446
- - Fixed built-in tool wrapping to use the same extension-runner context path as extension tools, so built-in tools receive execution context and `read` can warn when the current model does not support images ([#3429](https://github.com/code-yeongyu/sanepi-mono/issues/3429))
447
- - Fixed `openai-completions` assistant replay to preserve `compat.requiresThinkingAsText` text-part serialization, avoiding same-model follow-up crashes when previous assistant messages mix thinking and text ([#3387](https://github.com/code-yeongyu/sanepi-mono/issues/3387))
448
- - Fixed direct OpenAI Chat Completions sessions to map `sessionId` and `cacheRetention` to prompt caching fields, sending `prompt_cache_key` when caching is enabled and `prompt_cache_retention: "24h"` for direct `api.openai.com` requests with long retention ([#3426](https://github.com/code-yeongyu/sanepi-mono/issues/3426))
449
- - Fixed OpenAI-compatible Chat Completions sessions to optionally send aligned `session_id`, `x-client-request-id`, and `x-session-affinity` headers from `sessionId` via `compat.sendSessionAffinityHeaders`, improving cache-affinity routing for backends such as Fireworks ([#3430](https://github.com/code-yeongyu/sanepi-mono/issues/3430))
450
- - Fixed threaded `/resume` session relationships and current-session detection to canonicalize symlinked session paths during selector comparisons, so shared session directories no longer break parent-child matching or active-session delete protection ([#3364](https://github.com/code-yeongyu/sanepi-mono/issues/3364))
451
- - Fixed `/session`, Sessions docs, and CLI help to consistently document that session reuse supports both file paths and session IDs, and that `/session` shows the current session ID ([#3390](https://github.com/code-yeongyu/sanepi-mono/issues/3390))
452
- - Fixed Windows pnpm global install detection to recognize `\\.pnpm\\` store paths, so update notices now suggest `pnpm install -g @code-yeongyu/senpi` instead of falling back to npm ([#3378](https://github.com/code-yeongyu/sanepi-mono/issues/3378))
453
- - Fixed missing `@sinclair/typebox` runtime dependency in `@code-yeongyu/senpi`, so strict pnpm installs no longer fail with `ERR_MODULE_NOT_FOUND` when starting `pi` ([#3434](https://github.com/code-yeongyu/sanepi-mono/issues/3434))
454
- - Fixed xterm uppercase typing in the interactive editor by decoding printable `modifyOtherKeys` input and normalizing shifted letter matching, so `Shift+letter` no longer disappears in `pi` ([#3436](https://github.com/code-yeongyu/sanepi-mono/issues/3436))
455
- - Fixed `/compact` to reuse the session thinking level for compaction summaries instead of forcing `high`, avoiding invalid reasoning-effort errors on `github-copilot/claude-opus-4.7` sessions configured for `medium` thinking ([#3438](https://github.com/code-yeongyu/sanepi-mono/issues/3438))
456
- - Fixed shared/exported plain-text tool output to preserve indentation instead of collapsing leading whitespace in the web share page ([#3440](https://github.com/code-yeongyu/sanepi-mono/issues/3440))
457
- - Fixed exported share pages to use browser-safe `T` and `O` shortcuts with clickable header toggles for thinking and tool visibility instead of browser-reserved `Ctrl+T` / `Ctrl+O` bindings ([#3374](https://github.com/code-yeongyu/sanepi-mono/pull/3374) by [@vekexasia](https://github.com/vekexasia))
458
- - Fixed skill resolution to dedupe symlinked aliases by canonical path, so `pi config` no longer shows duplicate skill entries when `~/.senpi/agent/skills` points to `~/.agents/skills` ([#3417](https://github.com/code-yeongyu/sanepi-mono/pull/3417) by [@rwachtler](https://github.com/rwachtler))
459
- - Fixed OpenRouter request attribution to include Pi app headers (`HTTP-Referer: https://pi.dev`, `X-OpenRouter-Title: pi`, `X-OpenRouter-Categories: cli-agent`) when sessions are created through the coding-agent SDK and install telemetry is enabled ([#3414](https://github.com/code-yeongyu/sanepi-mono/issues/3414))
460
- - Fixed custom-model `compat` schema/docs to support `cacheControlFormat: "anthropic"` for OpenAI-compatible providers that expose Anthropic-style prompt caching via `cache_control` markers ([#3392](https://github.com/code-yeongyu/sanepi-mono/issues/3392))
461
- - Fixed Cloud Code Assist tool schemas to strip JSON Schema meta-declaration keys before provider translation, avoiding validation failures for tool-enabled sessions that use `$schema`, `$defs`, and related metadata ([#3412](https://github.com/code-yeongyu/sanepi-mono/pull/3412) by [@vladlearns](https://github.com/vladlearns))
462
- - Fixed direct Bedrock sessions to honor `model.baseUrl` as the runtime client endpoint, restoring support for custom Bedrock VPC or proxy routes ([#3402](https://github.com/code-yeongyu/sanepi-mono/pull/3402) by [@wirjo](https://github.com/wirjo))
463
- - Fixed the `edit` tool to coerce stringified `edits` JSON before validation, so models that send the array payload as a JSON string no longer fall back to ad-hoc shell edits ([#3370](https://github.com/code-yeongyu/sanepi-mono/pull/3370) by [@dannote](https://github.com/dannote))
464
- - Fixed package manifest positive glob entries to expand before loading packaged resources, restoring manifest patterns such as `skills/**/*.md` ([#3350](https://github.com/code-yeongyu/sanepi-mono/pull/3350) by [@neonspectra](https://github.com/neonspectra))
484
+ - Fixed shell-path resolution to stop consulting ambient `process.cwd()` state during bash execution, so session/project-specific `shellPath` settings now follow the active coding-agent session cwd instead of the launcher cwd ([#3452](https://github.com/code-yeongyu/senpi-mono/issues/3452))
485
+ - Fixed `ctx.ui.setWorkingIndicator()` custom frames to render verbatim instead of forcing the theme accent color, so extensions now own working-indicator coloring when they customize it ([#3467](https://github.com/code-yeongyu/senpi-mono/issues/3467))
486
+ - Fixed `pi update` reinstalling npm packages that are already at the latest published version by checking the installed package version before running `npm install <pkg>@latest` ([#3000](https://github.com/code-yeongyu/senpi-mono/issues/3000))
487
+ - Fixed `@` autocomplete plain queries to stop matching against the full cwd/base path, so path fragments in worktree names no longer crowd out intended results such as `@plan` ([#2778](https://github.com/code-yeongyu/senpi-mono/issues/2778))
488
+ - Fixed built-in tool wrapping to use the same extension-runner context path as extension tools, so built-in tools receive execution context and `read` can warn when the current model does not support images ([#3429](https://github.com/code-yeongyu/senpi-mono/issues/3429))
489
+ - Fixed `openai-completions` assistant replay to preserve `compat.requiresThinkingAsText` text-part serialization, avoiding same-model follow-up crashes when previous assistant messages mix thinking and text ([#3387](https://github.com/code-yeongyu/senpi-mono/issues/3387))
490
+ - Fixed direct OpenAI Chat Completions sessions to map `sessionId` and `cacheRetention` to prompt caching fields, sending `prompt_cache_key` when caching is enabled and `prompt_cache_retention: "24h"` for direct `api.openai.com` requests with long retention ([#3426](https://github.com/code-yeongyu/senpi-mono/issues/3426))
491
+ - Fixed OpenAI-compatible Chat Completions sessions to optionally send aligned `session_id`, `x-client-request-id`, and `x-session-affinity` headers from `sessionId` via `compat.sendSessionAffinityHeaders`, improving cache-affinity routing for backends such as Fireworks ([#3430](https://github.com/code-yeongyu/senpi-mono/issues/3430))
492
+ - Fixed threaded `/resume` session relationships and current-session detection to canonicalize symlinked session paths during selector comparisons, so shared session directories no longer break parent-child matching or active-session delete protection ([#3364](https://github.com/code-yeongyu/senpi-mono/issues/3364))
493
+ - Fixed `/session`, Sessions docs, and CLI help to consistently document that session reuse supports both file paths and session IDs, and that `/session` shows the current session ID ([#3390](https://github.com/code-yeongyu/senpi-mono/issues/3390))
494
+ - Fixed Windows pnpm global install detection to recognize `\\.pnpm\\` store paths, so update notices now suggest `pnpm install -g @code-yeongyu/senpi` instead of falling back to npm ([#3378](https://github.com/code-yeongyu/senpi-mono/issues/3378))
495
+ - Fixed missing `@sinclair/typebox` runtime dependency in `@code-yeongyu/senpi`, so strict pnpm installs no longer fail with `ERR_MODULE_NOT_FOUND` when starting `pi` ([#3434](https://github.com/code-yeongyu/senpi-mono/issues/3434))
496
+ - Fixed xterm uppercase typing in the interactive editor by decoding printable `modifyOtherKeys` input and normalizing shifted letter matching, so `Shift+letter` no longer disappears in `pi` ([#3436](https://github.com/code-yeongyu/senpi-mono/issues/3436))
497
+ - Fixed `/compact` to reuse the session thinking level for compaction summaries instead of forcing `high`, avoiding invalid reasoning-effort errors on `github-copilot/claude-opus-4.7` sessions configured for `medium` thinking ([#3438](https://github.com/code-yeongyu/senpi-mono/issues/3438))
498
+ - Fixed shared/exported plain-text tool output to preserve indentation instead of collapsing leading whitespace in the web share page ([#3440](https://github.com/code-yeongyu/senpi-mono/issues/3440))
499
+ - Fixed exported share pages to use browser-safe `T` and `O` shortcuts with clickable header toggles for thinking and tool visibility instead of browser-reserved `Ctrl+T` / `Ctrl+O` bindings ([#3374](https://github.com/code-yeongyu/senpi-mono/pull/3374) by [@vekexasia](https://github.com/vekexasia))
500
+ - Fixed skill resolution to dedupe symlinked aliases by canonical path, so `pi config` no longer shows duplicate skill entries when `~/.senpi/agent/skills` points to `~/.agents/skills` ([#3417](https://github.com/code-yeongyu/senpi-mono/pull/3417) by [@rwachtler](https://github.com/rwachtler))
501
+ - Fixed OpenRouter request attribution to include Pi app headers (`HTTP-Referer: https://pi.dev`, `X-OpenRouter-Title: pi`, `X-OpenRouter-Categories: cli-agent`) when sessions are created through the coding-agent SDK and install telemetry is enabled ([#3414](https://github.com/code-yeongyu/senpi-mono/issues/3414))
502
+ - Fixed custom-model `compat` schema/docs to support `cacheControlFormat: "anthropic"` for OpenAI-compatible providers that expose Anthropic-style prompt caching via `cache_control` markers ([#3392](https://github.com/code-yeongyu/senpi-mono/issues/3392))
503
+ - Fixed Cloud Code Assist tool schemas to strip JSON Schema meta-declaration keys before provider translation, avoiding validation failures for tool-enabled sessions that use `$schema`, `$defs`, and related metadata ([#3412](https://github.com/code-yeongyu/senpi-mono/pull/3412) by [@vladlearns](https://github.com/vladlearns))
504
+ - Fixed direct Bedrock sessions to honor `model.baseUrl` as the runtime client endpoint, restoring support for custom Bedrock VPC or proxy routes ([#3402](https://github.com/code-yeongyu/senpi-mono/pull/3402) by [@wirjo](https://github.com/wirjo))
505
+ - Fixed the `edit` tool to coerce stringified `edits` JSON before validation, so models that send the array payload as a JSON string no longer fall back to ad-hoc shell edits ([#3370](https://github.com/code-yeongyu/senpi-mono/pull/3370) by [@dannote](https://github.com/dannote))
506
+ - Fixed package manifest positive glob entries to expand before loading packaged resources, restoring manifest patterns such as `skills/**/*.md` ([#3350](https://github.com/code-yeongyu/senpi-mono/pull/3350) by [@neonspectra](https://github.com/neonspectra))
465
507
 
466
508
  ## [0.67.68] - 2026-04-17
467
509
 
@@ -473,24 +515,24 @@
473
515
 
474
516
  ### Added
475
517
 
476
- - Added Bedrock bearer-token authentication support via `AWS_BEARER_TOKEN_BEDROCK`, enabling coding-agent sessions to use Bedrock Converse without local SigV4 credentials ([#3125](https://github.com/code-yeongyu/sanepi-mono/pull/3125) by [@wirjo](https://github.com/wirjo))
518
+ - Added Bedrock bearer-token authentication support via `AWS_BEARER_TOKEN_BEDROCK`, enabling coding-agent sessions to use Bedrock Converse without local SigV4 credentials ([#3125](https://github.com/code-yeongyu/senpi-mono/pull/3125) by [@wirjo](https://github.com/wirjo))
477
519
 
478
520
  ### Fixed
479
521
 
480
- - Fixed `/scoped-models` Alt+Up/Down to stay a no-op in the implicit `all enabled` state instead of materializing a full explicit enabled-model list and marking the selector dirty ([#3331](https://github.com/code-yeongyu/sanepi-mono/issues/3331))
481
- - Fixed Mistral Small 4 default thinking requests to use the model's supported reasoning control, avoiding `400` errors when starting sessions on `mistral-small-2603` and `mistral-small-latest` ([#3338](https://github.com/code-yeongyu/sanepi-mono/issues/3338))
482
- - Fixed Qwen chat-template thinking replay to preserve prior thinking across turns, so affected OpenAI-compatible models keep multi-turn tool-call arguments instead of degrading to empty `{}` payloads ([#3325](https://github.com/code-yeongyu/sanepi-mono/issues/3325))
483
- - Fixed exported HTML transcripts so text selection no longer triggers click-based expand/collapse toggles ([#3332](https://github.com/code-yeongyu/sanepi-mono/pull/3332) by [@xu0o0](https://github.com/xu0o0))
484
- - Fixed flaky git package update notifications by waiting for captured git command stdio to fully drain before comparing local and remote commit SHAs ([#3027](https://github.com/code-yeongyu/sanepi-mono/issues/3027))
485
- - Fixed system prompt dates to use a stable `YYYY-MM-DD` format instead of locale-dependent output, keeping prompts deterministic across runtimes and locales ([#2814](https://github.com/code-yeongyu/sanepi-mono/issues/2814))
486
- - Fixed auto-retry transient error detection to treat `Network connection lost.` as retryable, so dropped provider connections retry instead of terminating the agent ([#3317](https://github.com/code-yeongyu/sanepi-mono/issues/3317))
487
- - Fixed compact interactive extension startup summaries to disambiguate package extensions and repeated local `index.ts` entries by using package-aware labels and the minimal parent path needed to make local entries unique ([#3308](https://github.com/code-yeongyu/sanepi-mono/issues/3308))
488
- - Fixed git package dependency installation to use production installs (`npm install --omit=dev`) during both install and update flows, so extension runtime dependencies must come from `dependencies` and not `devDependencies` ([#3009](https://github.com/code-yeongyu/sanepi-mono/issues/3009))
489
- - Fixed `tool_result` / `afterToolCall` extension handling for error results by forwarding `details` and `isError` overrides through `AgentSession` instead of dropping them when `isError` was already true ([#3051](https://github.com/code-yeongyu/sanepi-mono/issues/3051))
490
- - Fixed missing root exports for `RpcClient` and RPC protocol types from `@code-yeongyu/senpi`, so ESM consumers can import them from the main package entrypoint ([#3275](https://github.com/code-yeongyu/sanepi-mono/issues/3275))
491
- - Fixed OpenAI Codex service-tier cost accounting to trust the explicitly requested tier when the API echoes the default tier in responses, keeping session cost displays aligned with the selected tier ([#3307](https://github.com/code-yeongyu/sanepi-mono/pull/3307) by [@markusylisiurunen](https://github.com/markusylisiurunen))
492
- - Fixed parallel tool-call finalization to convert `afterToolCall` hook throws into error tool results instead of aborting the remaining tool batch ([#3084](https://github.com/code-yeongyu/sanepi-mono/issues/3084))
493
- - Fixed Bun binary asset path resolution to honor `PI_PACKAGE_DIR` for built-in themes, HTML export templates, and interactive bundled assets ([#3074](https://github.com/code-yeongyu/sanepi-mono/issues/3074))
522
+ - Fixed `/scoped-models` Alt+Up/Down to stay a no-op in the implicit `all enabled` state instead of materializing a full explicit enabled-model list and marking the selector dirty ([#3331](https://github.com/code-yeongyu/senpi-mono/issues/3331))
523
+ - Fixed Mistral Small 4 default thinking requests to use the model's supported reasoning control, avoiding `400` errors when starting sessions on `mistral-small-2603` and `mistral-small-latest` ([#3338](https://github.com/code-yeongyu/senpi-mono/issues/3338))
524
+ - Fixed Qwen chat-template thinking replay to preserve prior thinking across turns, so affected OpenAI-compatible models keep multi-turn tool-call arguments instead of degrading to empty `{}` payloads ([#3325](https://github.com/code-yeongyu/senpi-mono/issues/3325))
525
+ - Fixed exported HTML transcripts so text selection no longer triggers click-based expand/collapse toggles ([#3332](https://github.com/code-yeongyu/senpi-mono/pull/3332) by [@xu0o0](https://github.com/xu0o0))
526
+ - Fixed flaky git package update notifications by waiting for captured git command stdio to fully drain before comparing local and remote commit SHAs ([#3027](https://github.com/code-yeongyu/senpi-mono/issues/3027))
527
+ - Fixed system prompt dates to use a stable `YYYY-MM-DD` format instead of locale-dependent output, keeping prompts deterministic across runtimes and locales ([#2814](https://github.com/code-yeongyu/senpi-mono/issues/2814))
528
+ - Fixed auto-retry transient error detection to treat `Network connection lost.` as retryable, so dropped provider connections retry instead of terminating the agent ([#3317](https://github.com/code-yeongyu/senpi-mono/issues/3317))
529
+ - Fixed compact interactive extension startup summaries to disambiguate package extensions and repeated local `index.ts` entries by using package-aware labels and the minimal parent path needed to make local entries unique ([#3308](https://github.com/code-yeongyu/senpi-mono/issues/3308))
530
+ - Fixed git package dependency installation to use production installs (`npm install --omit=dev`) during both install and update flows, so extension runtime dependencies must come from `dependencies` and not `devDependencies` ([#3009](https://github.com/code-yeongyu/senpi-mono/issues/3009))
531
+ - Fixed `tool_result` / `afterToolCall` extension handling for error results by forwarding `details` and `isError` overrides through `AgentSession` instead of dropping them when `isError` was already true ([#3051](https://github.com/code-yeongyu/senpi-mono/issues/3051))
532
+ - Fixed missing root exports for `RpcClient` and RPC protocol types from `@code-yeongyu/senpi`, so ESM consumers can import them from the main package entrypoint ([#3275](https://github.com/code-yeongyu/senpi-mono/issues/3275))
533
+ - Fixed OpenAI Codex service-tier cost accounting to trust the explicitly requested tier when the API echoes the default tier in responses, keeping session cost displays aligned with the selected tier ([#3307](https://github.com/code-yeongyu/senpi-mono/pull/3307) by [@markusylisiurunen](https://github.com/markusylisiurunen))
534
+ - Fixed parallel tool-call finalization to convert `afterToolCall` hook throws into error tool results instead of aborting the remaining tool batch ([#3084](https://github.com/code-yeongyu/senpi-mono/issues/3084))
535
+ - Fixed Bun binary asset path resolution to honor `PI_PACKAGE_DIR` for built-in themes, HTML export templates, and interactive bundled assets ([#3074](https://github.com/code-yeongyu/senpi-mono/issues/3074))
494
536
  - Fixed user-message turn spacing in interactive mode by restoring an inter-message spacer before user turns (except the first user message), preventing assistant and user blocks from rendering flush together.
495
537
  - Fixed interactive `/import` handling to support quoted JSONL paths with spaces, route missing JSONL files through the non-fatal `SessionImportFileNotFoundError` path, and document the `importFromJsonl()` exceptions (`SessionImportFileNotFoundError`, `MissingSessionCwdError`).
496
538
 
@@ -505,30 +547,30 @@
505
547
 
506
548
  ### Added
507
549
 
508
- - Added `argument-hint` frontmatter field for prompt templates, displayed before the description in the autocomplete dropdown ([#2780](https://github.com/code-yeongyu/sanepi-mono/pull/2780) by [@andresvi94](https://github.com/andresvi94))
509
- - Added `after_provider_response` extension hook so extensions can inspect provider HTTP status codes and headers after each provider response is received and before stream consumption begins ([#3128](https://github.com/code-yeongyu/sanepi-mono/issues/3128))
510
- - Added OSC 8 hyperlink rendering for markdown links when the terminal advertises support ([#3248](https://github.com/code-yeongyu/sanepi-mono/pull/3248) by [@ofa1](https://github.com/ofa1))
550
+ - Added `argument-hint` frontmatter field for prompt templates, displayed before the description in the autocomplete dropdown ([#2780](https://github.com/code-yeongyu/senpi-mono/pull/2780) by [@andresvi94](https://github.com/andresvi94))
551
+ - Added `after_provider_response` extension hook so extensions can inspect provider HTTP status codes and headers after each provider response is received and before stream consumption begins ([#3128](https://github.com/code-yeongyu/senpi-mono/issues/3128))
552
+ - Added OSC 8 hyperlink rendering for markdown links when the terminal advertises support ([#3248](https://github.com/code-yeongyu/senpi-mono/pull/3248) by [@ofa1](https://github.com/ofa1))
511
553
 
512
554
  ### Changed
513
555
 
514
- - Changed interactive startup header to a compact, comma-separated view of loaded AGENTS.md files, prompt templates, skills, and extensions, with `Ctrl+O` to toggle the expanded listing ([#3267](https://github.com/code-yeongyu/sanepi-mono/pull/3267))
515
- - Tightened hyperlink capability detection to default `hyperlinks: false` for unknown terminals and force it off under tmux/screen (including nested sessions), preventing markdown link URLs from disappearing on terminals that silently swallow OSC 8 sequences ([#3248](https://github.com/code-yeongyu/sanepi-mono/pull/3248))
556
+ - Changed interactive startup header to a compact, comma-separated view of loaded AGENTS.md files, prompt templates, skills, and extensions, with `Ctrl+O` to toggle the expanded listing ([#3267](https://github.com/code-yeongyu/senpi-mono/pull/3267))
557
+ - Tightened hyperlink capability detection to default `hyperlinks: false` for unknown terminals and force it off under tmux/screen (including nested sessions), preventing markdown link URLs from disappearing on terminals that silently swallow OSC 8 sequences ([#3248](https://github.com/code-yeongyu/senpi-mono/pull/3248))
516
558
 
517
559
  ### Fixed
518
560
 
519
- - Fixed interactive user message rendering to keep bottom padding visible in terminals affected by OSC 133 prompt markers without adding an extra blank line before the following assistant message ([#3090](https://github.com/code-yeongyu/sanepi-mono/issues/3090))
520
- - Fixed `--verbose` startup output to begin with expanded startup help and loaded resource listings after the compact startup header change ([#3147](https://github.com/code-yeongyu/sanepi-mono/issues/3147))
521
- - Fixed `find` tool returning no results for path-based glob patterns such as `src/**/*.spec.ts` or `some/parent/child/**` by switching fd into full-path mode and normalizing the pattern when it contains a `/` ([#3302](https://github.com/code-yeongyu/sanepi-mono/issues/3302))
522
- - Fixed `find` tool applying nested `.gitignore` rules across sibling directories (e.g. rules from `a/.gitignore` hiding matching files under `b/`) by dropping the manual `--ignore-file` collection and delegating to fd's hierarchical `.gitignore` handling via `--no-require-git` ([#3303](https://github.com/code-yeongyu/sanepi-mono/issues/3303))
523
- - Fixed OpenAI Responses prompt caching for non-`api.openai.com` base URLs (OpenAI-compatible proxies such as litellm, theclawbay) by sending the `session_id` and `x-client-request-id` cache-affinity headers unconditionally when a `sessionId` is provided, matching the official Codex CLI behavior ([#3264](https://github.com/code-yeongyu/sanepi-mono/pull/3264) by [@vegarsti](https://github.com/vegarsti))
524
- - Fixed the `preset` example extension to snapshot the active model, thinking level, and tool set on the first preset application and restore that state when cycling back to `(none)`, instead of falling back to a hardcoded default tool list ([#3272](https://github.com/code-yeongyu/sanepi-mono/pull/3272) by [@stembi](https://github.com/stembi))
561
+ - Fixed interactive user message rendering to keep bottom padding visible in terminals affected by OSC 133 prompt markers without adding an extra blank line before the following assistant message ([#3090](https://github.com/code-yeongyu/senpi-mono/issues/3090))
562
+ - Fixed `--verbose` startup output to begin with expanded startup help and loaded resource listings after the compact startup header change ([#3147](https://github.com/code-yeongyu/senpi-mono/issues/3147))
563
+ - Fixed `find` tool returning no results for path-based glob patterns such as `src/**/*.spec.ts` or `some/parent/child/**` by switching fd into full-path mode and normalizing the pattern when it contains a `/` ([#3302](https://github.com/code-yeongyu/senpi-mono/issues/3302))
564
+ - Fixed `find` tool applying nested `.gitignore` rules across sibling directories (e.g. rules from `a/.gitignore` hiding matching files under `b/`) by dropping the manual `--ignore-file` collection and delegating to fd's hierarchical `.gitignore` handling via `--no-require-git` ([#3303](https://github.com/code-yeongyu/senpi-mono/issues/3303))
565
+ - Fixed OpenAI Responses prompt caching for non-`api.openai.com` base URLs (OpenAI-compatible proxies such as litellm, theclawbay) by sending the `session_id` and `x-client-request-id` cache-affinity headers unconditionally when a `sessionId` is provided, matching the official Codex CLI behavior ([#3264](https://github.com/code-yeongyu/senpi-mono/pull/3264) by [@vegarsti](https://github.com/vegarsti))
566
+ - Fixed the `preset` example extension to snapshot the active model, thinking level, and tool set on the first preset application and restore that state when cycling back to `(none)`, instead of falling back to a hardcoded default tool list ([#3272](https://github.com/code-yeongyu/senpi-mono/pull/3272) by [@stembi](https://github.com/stembi))
525
567
 
526
568
  ## [0.67.5] - 2026-04-16
527
569
 
528
570
  ### Fixed
529
571
 
530
- - Fixed Opus 4.7 adaptive thinking configuration across Anthropic and Bedrock providers by recognizing Opus 4.7 adaptive-thinking support and mapping `xhigh` reasoning to provider-supported effort values ([#3286](https://github.com/code-yeongyu/sanepi-mono/pull/3286) by [@markusylisiurunen](https://github.com/markusylisiurunen))
531
- - Fixed Zellij `Shift+Enter` regressions by reverting the Zellij-specific Kitty keyboard query bypass and restoring the previous keyboard negotiation behavior ([#3259](https://github.com/code-yeongyu/sanepi-mono/issues/3259))
572
+ - Fixed Opus 4.7 adaptive thinking configuration across Anthropic and Bedrock providers by recognizing Opus 4.7 adaptive-thinking support and mapping `xhigh` reasoning to provider-supported effort values ([#3286](https://github.com/code-yeongyu/senpi-mono/pull/3286) by [@markusylisiurunen](https://github.com/markusylisiurunen))
573
+ - Fixed Zellij `Shift+Enter` regressions by reverting the Zellij-specific Kitty keyboard query bypass and restoring the previous keyboard negotiation behavior ([#3259](https://github.com/code-yeongyu/senpi-mono/issues/3259))
532
574
 
533
575
  ## [0.67.4] - 2026-04-16
534
576
 
@@ -540,24 +582,24 @@
540
582
 
541
583
  ### Added
542
584
 
543
- - Added `--no-context-files` (`-nc`) to disable `AGENTS.md` and `CLAUDE.md` context file discovery and loading ([#3253](https://github.com/code-yeongyu/sanepi-mono/issues/3253))
544
- - Exported `loadProjectContextFiles()` as a standalone utility so extensions can discover project context files without instantiating a full `DefaultResourceLoader` ([#3142](https://github.com/code-yeongyu/sanepi-mono/issues/3142))
545
- - Added `after_provider_response` extension hook so extensions can inspect provider HTTP status codes and headers after each provider response is received and before stream consumption begins ([#3128](https://github.com/code-yeongyu/sanepi-mono/issues/3128))
585
+ - Added `--no-context-files` (`-nc`) to disable `AGENTS.md` and `CLAUDE.md` context file discovery and loading ([#3253](https://github.com/code-yeongyu/senpi-mono/issues/3253))
586
+ - Exported `loadProjectContextFiles()` as a standalone utility so extensions can discover project context files without instantiating a full `DefaultResourceLoader` ([#3142](https://github.com/code-yeongyu/senpi-mono/issues/3142))
587
+ - Added `after_provider_response` extension hook so extensions can inspect provider HTTP status codes and headers after each provider response is received and before stream consumption begins ([#3128](https://github.com/code-yeongyu/senpi-mono/issues/3128))
546
588
 
547
589
  ### Changed
548
590
 
549
591
  - Added `claude-opus-4-7` model for Anthropic.
550
- - Changed Anthropic prompt caching to add a `cache_control` breakpoint on the last tool definition, so tool schemas can be cached independently from transcript updates while preserving existing cache retention behavior ([#3260](https://github.com/code-yeongyu/sanepi-mono/issues/3260))
592
+ - Changed Anthropic prompt caching to add a `cache_control` breakpoint on the last tool definition, so tool schemas can be cached independently from transcript updates while preserving existing cache retention behavior ([#3260](https://github.com/code-yeongyu/senpi-mono/issues/3260))
551
593
 
552
594
  ### Fixed
553
595
 
554
596
  - Fixed markdown strikethrough parsing in interactive rendering and HTML export to require strict double-tilde delimiters (`~~text~~`) with non-whitespace boundaries.
555
597
  - Fixed shutdown handling to kill tracked detached `bash` tool child processes on exit signals, preventing orphaned background processes.
556
598
  - Fixed flaky `edit-tool-no-full-redraw` TUI tests by waiting for asynchronous preview and preflight error rendering instead of relying on fixed render ticks.
557
- - Fixed `kimi-coding` default model selection to use `kimi-for-coding` instead of `kimi-k2-thinking` ([#3242](https://github.com/code-yeongyu/sanepi-mono/issues/3242))
558
- - Fixed `ctrl+z` on native Windows to avoid crashing interactive mode, disable the default suspend binding there, and show a status message when suspend is invoked manually ([#3191](https://github.com/code-yeongyu/sanepi-mono/issues/3191))
559
- - Fixed `find` tool cancellation and responsiveness on broad searches by making `.gitignore` discovery and `fd` execution fully abort-aware and non-blocking ([#3148](https://github.com/code-yeongyu/sanepi-mono/issues/3148))
560
- - Fixed `grep` broad-search stalls when `context=0` by formatting match lines from ripgrep JSON output instead of doing synchronous per-match file reads ([#3205](https://github.com/code-yeongyu/sanepi-mono/issues/3205))
599
+ - Fixed `kimi-coding` default model selection to use `kimi-for-coding` instead of `kimi-k2-thinking` ([#3242](https://github.com/code-yeongyu/senpi-mono/issues/3242))
600
+ - Fixed `ctrl+z` on native Windows to avoid crashing interactive mode, disable the default suspend binding there, and show a status message when suspend is invoked manually ([#3191](https://github.com/code-yeongyu/senpi-mono/issues/3191))
601
+ - Fixed `find` tool cancellation and responsiveness on broad searches by making `.gitignore` discovery and `fd` execution fully abort-aware and non-blocking ([#3148](https://github.com/code-yeongyu/senpi-mono/issues/3148))
602
+ - Fixed `grep` broad-search stalls when `context=0` by formatting match lines from ripgrep JSON output instead of doing synchronous per-match file reads ([#3205](https://github.com/code-yeongyu/senpi-mono/issues/3205))
561
603
 
562
604
  ## [0.67.3] - 2026-04-15
563
605
 
@@ -568,19 +610,19 @@
568
610
 
569
611
  ### Added
570
612
 
571
- - Added `renderShell: "self"` for custom and built-in tool renderers so tools can own their outer shell instead of using the default boxed shell. This is useful for stable large previews such as edit diffs ([#3134](https://github.com/code-yeongyu/sanepi-mono/issues/3134))
613
+ - Added `renderShell: "self"` for custom and built-in tool renderers so tools can own their outer shell instead of using the default boxed shell. This is useful for stable large previews such as edit diffs ([#3134](https://github.com/code-yeongyu/senpi-mono/issues/3134))
572
614
 
573
615
  ### Fixed
574
616
 
575
- - Fixed edit diff previews to stay visible during edit permission dialogs and session replay without reintroducing large-result redraw flicker ([#3134](https://github.com/code-yeongyu/sanepi-mono/issues/3134))
617
+ - Fixed edit diff previews to stay visible during edit permission dialogs and session replay without reintroducing large-result redraw flicker ([#3134](https://github.com/code-yeongyu/senpi-mono/issues/3134))
576
618
  - Fixed `/reload` to render a static reload status box instead of an animated spinner, avoiding redraw instability during interactive reloads.
577
- - Fixed the `plan-mode` example extension to allow `eza` in the read-only bash allowlist instead of the deprecated `exa` command ([#3240](https://github.com/code-yeongyu/sanepi-mono/pull/3240) by [@rwachtler](https://github.com/rwachtler))
578
- - Fixed `google-vertex` API key resolution to treat `gcp-vertex-credentials` as an Application Default Credentials marker instead of a literal API key, so marker-based setups correctly fall back to ADC ([#3221](https://github.com/code-yeongyu/sanepi-mono/pull/3221) by [@deepkilo](https://github.com/deepkilo))
579
- - Fixed RPC `prompt` to wait for prompt preflight success before emitting its single authoritative response, while still treating handled and queued prompts as success ([#3049](https://github.com/code-yeongyu/sanepi-mono/issues/3049))
580
- - Fixed `/scoped-models` reordering to propagate into the `/model` scoped tab, preserving the user-defined scoped model order instead of re-sorting it ([#3217](https://github.com/code-yeongyu/sanepi-mono/issues/3217))
581
- - Fixed `session_shutdown` to fire on `SIGHUP` and `SIGTERM` in interactive, print, and RPC modes so extensions can run shutdown cleanup on those signal-driven exits ([#3212](https://github.com/code-yeongyu/sanepi-mono/issues/3212))
582
- - Fixed screenshot path parsing to handle lower case am/pm in macOS screenshot filenames ([#3194](https://github.com/code-yeongyu/sanepi-mono/pull/3194) by [@jay-aye-see-kay](https://github.com/jay-aye-see-kay))
583
- - Fixed interactive auto-retry status updates to show a live countdown during backoff instead of a static retry delay message ([#3187](https://github.com/code-yeongyu/sanepi-mono/issues/3187))
619
+ - Fixed the `plan-mode` example extension to allow `eza` in the read-only bash allowlist instead of the deprecated `exa` command ([#3240](https://github.com/code-yeongyu/senpi-mono/pull/3240) by [@rwachtler](https://github.com/rwachtler))
620
+ - Fixed `google-vertex` API key resolution to treat `gcp-vertex-credentials` as an Application Default Credentials marker instead of a literal API key, so marker-based setups correctly fall back to ADC ([#3221](https://github.com/code-yeongyu/senpi-mono/pull/3221) by [@deepkilo](https://github.com/deepkilo))
621
+ - Fixed RPC `prompt` to wait for prompt preflight success before emitting its single authoritative response, while still treating handled and queued prompts as success ([#3049](https://github.com/code-yeongyu/senpi-mono/issues/3049))
622
+ - Fixed `/scoped-models` reordering to propagate into the `/model` scoped tab, preserving the user-defined scoped model order instead of re-sorting it ([#3217](https://github.com/code-yeongyu/senpi-mono/issues/3217))
623
+ - Fixed `session_shutdown` to fire on `SIGHUP` and `SIGTERM` in interactive, print, and RPC modes so extensions can run shutdown cleanup on those signal-driven exits ([#3212](https://github.com/code-yeongyu/senpi-mono/issues/3212))
624
+ - Fixed screenshot path parsing to handle lower case am/pm in macOS screenshot filenames ([#3194](https://github.com/code-yeongyu/senpi-mono/pull/3194) by [@jay-aye-see-kay](https://github.com/jay-aye-see-kay))
625
+ - Fixed interactive auto-retry status updates to show a live countdown during backoff instead of a static retry delay message ([#3187](https://github.com/code-yeongyu/senpi-mono/issues/3187))
584
626
 
585
627
  ## [0.67.2] - 2026-04-14
586
628
 
@@ -592,16 +634,16 @@
592
634
 
593
635
  ### Added
594
636
 
595
- - Added support for multiple `--append-system-prompt` flags, each value is appended to the system prompt separated by double newlines ([#3171](https://github.com/code-yeongyu/sanepi-mono/pull/3171) by [@aliou](https://github.com/aliou))
596
- - Added interactive keybinding support for Kitty `super`-modified shortcuts such as `super+k`, `super+enter`, and `ctrl+super+k` ([#3111](https://github.com/code-yeongyu/sanepi-mono/pull/3111) by [@sudosubin](https://github.com/sudosubin))
597
- - Added support for passing inline extension factories to `main()` for embedded integrations and custom entrypoints ([#3099](https://github.com/code-yeongyu/sanepi-mono/pull/3099) by [@pmateusz](https://github.com/pmateusz))
637
+ - Added support for multiple `--append-system-prompt` flags, each value is appended to the system prompt separated by double newlines ([#3171](https://github.com/code-yeongyu/senpi-mono/pull/3171) by [@aliou](https://github.com/aliou))
638
+ - Added interactive keybinding support for Kitty `super`-modified shortcuts such as `super+k`, `super+enter`, and `ctrl+super+k` ([#3111](https://github.com/code-yeongyu/senpi-mono/pull/3111) by [@sudosubin](https://github.com/sudosubin))
639
+ - Added support for passing inline extension factories to `main()` for embedded integrations and custom entrypoints ([#3099](https://github.com/code-yeongyu/senpi-mono/pull/3099) by [@pmateusz](https://github.com/pmateusz))
598
640
 
599
641
  ### Fixed
600
642
 
601
- - Fixed direct OpenAI Responses and Codex SSE requests to align `prompt_cache_key`, `session_id`, and `x-client-request-id` values with the same session-derived identifier, improving prompt cache affinity for append-only sessions ([#3018](https://github.com/code-yeongyu/sanepi-mono/pull/3018) by [@steipete](https://github.com/steipete))
643
+ - Fixed direct OpenAI Responses and Codex SSE requests to align `prompt_cache_key`, `session_id`, and `x-client-request-id` values with the same session-derived identifier, improving prompt cache affinity for append-only sessions ([#3018](https://github.com/code-yeongyu/senpi-mono/pull/3018) by [@steipete](https://github.com/steipete))
602
644
  - Fixed streaming-only `partialJson` scratch buffers leaking into persisted OpenAI Responses tool calls, which could corrupt follow-up payloads on resumed conversations.
603
- - Fixed Ctrl+Alt letter key matching in tmux by falling through from legacy ESC-prefixed handling to CSI-u and xterm `modifyOtherKeys` parsing when the legacy form does not match ([#2989](https://github.com/code-yeongyu/sanepi-mono/pull/2989) by [@kaofelix](https://github.com/kaofelix))
604
- - Fixed the shipped `subagent` example to avoid leaking Bun virtual filesystem script paths into subagent prompts ([#3002](https://github.com/code-yeongyu/sanepi-mono/pull/3002) by [@nathyong](https://github.com/nathyong))
645
+ - Fixed Ctrl+Alt letter key matching in tmux by falling through from legacy ESC-prefixed handling to CSI-u and xterm `modifyOtherKeys` parsing when the legacy form does not match ([#2989](https://github.com/code-yeongyu/senpi-mono/pull/2989) by [@kaofelix](https://github.com/kaofelix))
646
+ - Fixed the shipped `subagent` example to avoid leaking Bun virtual filesystem script paths into subagent prompts ([#3002](https://github.com/code-yeongyu/senpi-mono/pull/3002) by [@nathyong](https://github.com/nathyong))
605
647
  - Fixed bordered loaders to stop their animation timer when disposed, preventing stale loader updates after teardown.
606
648
 
607
649
  ## [0.67.1] - 2026-04-13
@@ -636,13 +678,13 @@ How to disable it:
636
678
 
637
679
  - Full `openRouterRouting` support in `models.json`, including fallbacks, parameter requirements, data collection, ZDR, ignore lists, quantizations, provider sorting, max price, and preferred throughput and latency constraints. See [docs/models.md](docs/models.md).
638
680
  - `PI_CODING_AGENT=true` environment variable set at startup so subprocesses can detect they are running inside the coding agent.
639
- - Updated `antigravity-image-gen.ts` example extension to use User-Agent version `1.21.9` ([#2901](https://github.com/code-yeongyu/sanepi-mono/pull/2901) by [@aadishv](https://github.com/aadishv))
640
- - Fixed `--list-models` silently swallowing `models.json` load errors; errors are now printed to stderr ([#3072](https://github.com/code-yeongyu/sanepi-mono/issues/3072))
641
- - Fixed custom models for built-in providers (e.g. `openrouter`) being silently dropped from `--list-models` by inheriting `api`/`baseUrl` from built-in model definitions and no longer requiring `apiKey` for providers with existing auth ([#2921](https://github.com/code-yeongyu/sanepi-mono/issues/2921) and [#3072](https://github.com/code-yeongyu/sanepi-mono/issues/3072))
681
+ - Updated `antigravity-image-gen.ts` example extension to use User-Agent version `1.21.9` ([#2901](https://github.com/code-yeongyu/senpi-mono/pull/2901) by [@aadishv](https://github.com/aadishv))
682
+ - Fixed `--list-models` silently swallowing `models.json` load errors; errors are now printed to stderr ([#3072](https://github.com/code-yeongyu/senpi-mono/issues/3072))
683
+ - Fixed custom models for built-in providers (e.g. `openrouter`) being silently dropped from `--list-models` by inheriting `api`/`baseUrl` from built-in model definitions and no longer requiring `apiKey` for providers with existing auth ([#2921](https://github.com/code-yeongyu/senpi-mono/issues/2921) and [#3072](https://github.com/code-yeongyu/senpi-mono/issues/3072))
642
684
  ### Added
643
685
 
644
- - Added full `openRouterRouting` field support in `models.json`, including fallbacks, parameter requirements, data collection, ZDR, ignore lists, quantizations, provider sorting, max price, and preferred throughput and latency constraints ([#2904](https://github.com/code-yeongyu/sanepi-mono/pull/2904) by [@zmberber](https://github.com/zmberber))
645
- - Set `PI_CODING_AGENT=true` environment variable at startup so sub-processes can detect they are running inside the coding agent ([#2868](https://github.com/code-yeongyu/sanepi-mono/issues/2868))
686
+ - Added full `openRouterRouting` field support in `models.json`, including fallbacks, parameter requirements, data collection, ZDR, ignore lists, quantizations, provider sorting, max price, and preferred throughput and latency constraints ([#2904](https://github.com/code-yeongyu/senpi-mono/pull/2904) by [@zmberber](https://github.com/zmberber))
687
+ - Set `PI_CODING_AGENT=true` environment variable at startup so sub-processes can detect they are running inside the coding agent ([#2868](https://github.com/code-yeongyu/senpi-mono/issues/2868))
646
688
  - Permission system builtin extension: full port of opencode's permission system
647
689
  - Rule evaluation with wildcard matching (last-match-wins)
648
690
  - Bash command arity parsing for granular command-level permissions
@@ -659,8 +701,8 @@ How to disable it:
659
701
  ### Changed
660
702
 
661
703
  - agent-system extension: permission handling delegated to permission-system
662
- - sanepi-managed system conversation injections now use a unified `pi.events` envelope on
663
- `sanepi:conversation`, with route/action metadata and a standardized `[system:sanepi]` prefix for builtin
704
+ - senpi-managed system conversation injections now use a unified `pi.events` envelope on
705
+ `senpi:conversation`, with route/action metadata and a standardized `[system:senpi]` prefix for builtin
664
706
  continuation and background-task notifications
665
707
 
666
708
  ### Fixed
@@ -668,16 +710,16 @@ How to disable it:
668
710
  - `todotools` continuation prompting now explicitly forbids refusal/summary-only replies and requires verified
669
711
  todo cleanup when work is already complete or no longer actionable
670
712
  - Fixed interactive changelog rendering for the telemetry notes by moving the section under a `### Telemetry` heading, so startup shows the full release notes instead of only the version header.
671
- - Updated `antigravity-image-gen.ts` example extension to use User-Agent version `1.21.9` ([#2901](https://github.com/code-yeongyu/sanepi-mono/pull/2901) by [@aadishv](https://github.com/aadishv))
672
- - Bumped default Antigravity User-Agent version to `1.21.9` ([#2901](https://github.com/code-yeongyu/sanepi-mono/pull/2901) by [@aadishv](https://github.com/aadishv))
673
- - Fixed Gemma 4 thinking level mapping to route between `MINIMAL` and `HIGH`, and map Pi reasoning levels to the model's supported thinking levels ([#2903](https://github.com/code-yeongyu/sanepi-mono/pull/2903) by [@aadishv](https://github.com/aadishv))
674
- - Fixed Gemini 2.5 Flash Lite minimal thinking budget to use the model's supported 512-token minimum instead of the regular Flash 128-token minimum, avoiding invalid thinking budget errors ([#2861](https://github.com/code-yeongyu/sanepi-mono/pull/2861) by [@JasonOA888](https://github.com/JasonOA888))
675
- - Fixed OpenAI Codex Responses requests to forward configured `serviceTier` values, restoring service-tier selection for Codex sessions ([#2996](https://github.com/code-yeongyu/sanepi-mono/pull/2996) by [@markusylisiurunen](https://github.com/markusylisiurunen))
676
- - Fixed newly generated session IDs to use UUIDv7, improving time locality for session-based request routing ([#3018](https://github.com/code-yeongyu/sanepi-mono/pull/3018) by [@steipete](https://github.com/steipete))
677
- - Fixed `Container.render()` stack overflow on long sessions by replacing `Array.push(...spread)` with a loop-based push, preventing `RangeError: Maximum call stack size exceeded` when child output exceeds the V8 call stack argument limit ([#2651](https://github.com/code-yeongyu/sanepi-mono/issues/2651))
678
- - Fixed editor sticky-column tracking around paste markers so vertical cursor navigation restores the column from before the cursor entered a paste marker instead of jumping inside or past pasted content ([#3092](https://github.com/code-yeongyu/sanepi-mono/pull/3092) by [@Perlence](https://github.com/Perlence))
679
- - Fixed queued messages typed during `/tree` branch summarization to flush automatically after navigation completes, so they no longer remain stuck in the steering queue ([#3091](https://github.com/code-yeongyu/sanepi-mono/pull/3091) by [@Perlence](https://github.com/Perlence))
680
- - Fixed npm package update check to work with packages on non-default registries by using `npm view` instead of hardcoded `registry.npmjs.org` fetch ([#3164](https://github.com/code-yeongyu/sanepi-mono/pull/3164) by [@aliou](https://github.com/aliou))
713
+ - Updated `antigravity-image-gen.ts` example extension to use User-Agent version `1.21.9` ([#2901](https://github.com/code-yeongyu/senpi-mono/pull/2901) by [@aadishv](https://github.com/aadishv))
714
+ - Bumped default Antigravity User-Agent version to `1.21.9` ([#2901](https://github.com/code-yeongyu/senpi-mono/pull/2901) by [@aadishv](https://github.com/aadishv))
715
+ - Fixed Gemma 4 thinking level mapping to route between `MINIMAL` and `HIGH`, and map Pi reasoning levels to the model's supported thinking levels ([#2903](https://github.com/code-yeongyu/senpi-mono/pull/2903) by [@aadishv](https://github.com/aadishv))
716
+ - Fixed Gemini 2.5 Flash Lite minimal thinking budget to use the model's supported 512-token minimum instead of the regular Flash 128-token minimum, avoiding invalid thinking budget errors ([#2861](https://github.com/code-yeongyu/senpi-mono/pull/2861) by [@JasonOA888](https://github.com/JasonOA888))
717
+ - Fixed OpenAI Codex Responses requests to forward configured `serviceTier` values, restoring service-tier selection for Codex sessions ([#2996](https://github.com/code-yeongyu/senpi-mono/pull/2996) by [@markusylisiurunen](https://github.com/markusylisiurunen))
718
+ - Fixed newly generated session IDs to use UUIDv7, improving time locality for session-based request routing ([#3018](https://github.com/code-yeongyu/senpi-mono/pull/3018) by [@steipete](https://github.com/steipete))
719
+ - Fixed `Container.render()` stack overflow on long sessions by replacing `Array.push(...spread)` with a loop-based push, preventing `RangeError: Maximum call stack size exceeded` when child output exceeds the V8 call stack argument limit ([#2651](https://github.com/code-yeongyu/senpi-mono/issues/2651))
720
+ - Fixed editor sticky-column tracking around paste markers so vertical cursor navigation restores the column from before the cursor entered a paste marker instead of jumping inside or past pasted content ([#3092](https://github.com/code-yeongyu/senpi-mono/pull/3092) by [@Perlence](https://github.com/Perlence))
721
+ - Fixed queued messages typed during `/tree` branch summarization to flush automatically after navigation completes, so they no longer remain stuck in the steering queue ([#3091](https://github.com/code-yeongyu/senpi-mono/pull/3091) by [@Perlence](https://github.com/Perlence))
722
+ - Fixed npm package update check to work with packages on non-default registries by using `npm view` instead of hardcoded `registry.npmjs.org` fetch ([#3164](https://github.com/code-yeongyu/senpi-mono/pull/3164) by [@aliou](https://github.com/aliou))
681
723
 
682
724
  ## [0.67.0] - 2026-04-13
683
725
 
@@ -698,8 +740,8 @@ See [0.67.1]. Version 0.67.0 shipped with a changelog formatting error that caus
698
740
 
699
741
  ### Fixed
700
742
 
701
- - Fixed bare `readline` import to use `node:readline` prefix for Deno compatibility ([#2885](https://github.com/code-yeongyu/sanepi-mono/issues/2885) by [@milosv-vtool](https://github.com/milosv-vtool))
702
- - Fixed auto-retry to treat stream failures like `request ended without sending any chunks` as transient errors ([#2892](https://github.com/code-yeongyu/sanepi-mono/issues/2892))
743
+ - Fixed bare `readline` import to use `node:readline` prefix for Deno compatibility ([#2885](https://github.com/code-yeongyu/senpi-mono/issues/2885) by [@milosv-vtool](https://github.com/milosv-vtool))
744
+ - Fixed auto-retry to treat stream failures like `request ended without sending any chunks` as transient errors ([#2892](https://github.com/code-yeongyu/senpi-mono/issues/2892))
703
745
  - Fixed interactive startup notices to render after the initial resource listing, and added a bundled Earendil startup announcement with inline image rendering for April 8 and 9, 2026. Moved the blog link above the image to avoid overlap with terminal image rendering.
704
746
  - Fixed interactive mode to warn when Anthropic subscription auth is active, so users know Anthropic third-party usage draws from extra usage and is billed per token.
705
747
 
@@ -709,23 +751,23 @@ See [0.67.1]. Version 0.67.0 shipped with a changelog formatting error that caus
709
751
 
710
752
  ### Fixed
711
753
 
712
- - Fixed bash output truncation by line count to always persist full output to a temp file, preventing data loss when output exceeds 2000 lines but stays under the byte threshold ([#2852](https://github.com/code-yeongyu/sanepi-mono/issues/2852))
713
- - RpcClient now forwards subprocess stderr to parent process in real-time ([#2805](https://github.com/code-yeongyu/sanepi-mono/issues/2805))
714
- - Theme file watcher now handles async `fs.watch` error events instead of crashing the process ([#2791](https://github.com/code-yeongyu/sanepi-mono/issues/2791))
754
+ - Fixed bash output truncation by line count to always persist full output to a temp file, preventing data loss when output exceeds 2000 lines but stays under the byte threshold ([#2852](https://github.com/code-yeongyu/senpi-mono/issues/2852))
755
+ - RpcClient now forwards subprocess stderr to parent process in real-time ([#2805](https://github.com/code-yeongyu/senpi-mono/issues/2805))
756
+ - Theme file watcher now handles async `fs.watch` error events instead of crashing the process ([#2791](https://github.com/code-yeongyu/senpi-mono/issues/2791))
715
757
  - Fixed stored session cwd handling so resuming or importing a session whose original working directory no longer exists now prompts interactive users to continue in the current cwd, while non-interactive modes fail with a clear error.
716
- - Fixed resource collision precedence so project and user skills, prompt templates, and themes override package resources consistently, and CLI-provided paths take precedence over discovered resources ([#2781](https://github.com/code-yeongyu/sanepi-mono/issues/2781))
717
- - Fixed OpenAI-compatible completions streaming usage accounting to preserve `prompt_tokens_details.cache_write_tokens` and normalize OpenRouter `cached_tokens`, preventing incorrect cache read/write token and cost reporting in pi ([#2802](https://github.com/code-yeongyu/sanepi-mono/issues/2802))
718
- - Fixed CLI extension paths like `git:gist.github.com/...` being incorrectly resolved against cwd instead of being passed through to the package manager ([#2845](https://github.com/code-yeongyu/sanepi-mono/pull/2845) by [@aliou](https://github.com/aliou))
719
- - Fixed piped stdin runs with `--mode json` to preserve JSONL output instead of falling back to plain text ([#2848](https://github.com/code-yeongyu/sanepi-mono/pull/2848) by [@aliou](https://github.com/aliou))
720
- - Fixed interactive command docs to stop listing removed `/exit` as a supported quit command ([#2850](https://github.com/code-yeongyu/sanepi-mono/issues/2850))
758
+ - Fixed resource collision precedence so project and user skills, prompt templates, and themes override package resources consistently, and CLI-provided paths take precedence over discovered resources ([#2781](https://github.com/code-yeongyu/senpi-mono/issues/2781))
759
+ - Fixed OpenAI-compatible completions streaming usage accounting to preserve `prompt_tokens_details.cache_write_tokens` and normalize OpenRouter `cached_tokens`, preventing incorrect cache read/write token and cost reporting in pi ([#2802](https://github.com/code-yeongyu/senpi-mono/issues/2802))
760
+ - Fixed CLI extension paths like `git:gist.github.com/...` being incorrectly resolved against cwd instead of being passed through to the package manager ([#2845](https://github.com/code-yeongyu/senpi-mono/pull/2845) by [@aliou](https://github.com/aliou))
761
+ - Fixed piped stdin runs with `--mode json` to preserve JSONL output instead of falling back to plain text ([#2848](https://github.com/code-yeongyu/senpi-mono/pull/2848) by [@aliou](https://github.com/aliou))
762
+ - Fixed interactive command docs to stop listing removed `/exit` as a supported quit command ([#2850](https://github.com/code-yeongyu/senpi-mono/issues/2850))
721
763
 
722
764
  ## [0.65.0] - 2026-04-03
723
765
 
724
766
  ### New Features
725
767
 
726
768
  - **Session runtime API**: `createAgentSessionRuntime()` and `AgentSessionRuntime` provide a closure-based runtime that recreates cwd-bound services and session config on every session switch. Startup, `/new`, `/resume`, `/fork`, and import all use the same creation path. See [docs/sdk.md](docs/sdk.md) and [examples/sdk/13-session-runtime.ts](examples/sdk/13-session-runtime.ts).
727
- - **Label timestamps in `/tree`**: Toggle timestamps on tree entries with `Shift+T`, with smart date formatting and timestamp preservation through branching ([#2691](https://github.com/code-yeongyu/sanepi-mono/pull/2691) by [@w-winter](https://github.com/w-winter))
728
- - **`defineTool()` helper**: Create standalone custom tool definitions with full TypeScript parameter type inference, no manual casts needed ([#2746](https://github.com/code-yeongyu/sanepi-mono/issues/2746)). See [docs/extensions.md](docs/extensions.md).
769
+ - **Label timestamps in `/tree`**: Toggle timestamps on tree entries with `Shift+T`, with smart date formatting and timestamp preservation through branching ([#2691](https://github.com/code-yeongyu/senpi-mono/pull/2691) by [@w-winter](https://github.com/w-winter))
770
+ - **`defineTool()` helper**: Create standalone custom tool definitions with full TypeScript parameter type inference, no manual casts needed ([#2746](https://github.com/code-yeongyu/senpi-mono/issues/2746)). See [docs/extensions.md](docs/extensions.md).
729
771
  - **Unified diagnostics**: Arg parsing, service creation, session option resolution, and resource loading all return structured diagnostics (`info`/`warning`/`error`) instead of logging or exiting. The app layer decides presentation and exit behavior.
730
772
 
731
773
  ### Breaking Changes
@@ -803,24 +845,24 @@ await runtime.fork("entry-id");
803
845
  - Added unified diagnostics model (`info`/`warning`/`error`) for arg parsing, service creation, session option resolution, and resource loading. Creation logic no longer logs or exits. The app layer decides presentation and exit behavior.
804
846
  - Added error diagnostics for missing explicit CLI resource paths (`-e`, `--skill`, `--prompt-template`, `--theme`)
805
847
 
806
- - Added `defineTool()` so standalone and array-based custom tool definitions keep inferred parameter types without manual casts ([#2746](https://github.com/code-yeongyu/sanepi-mono/issues/2746))
848
+ - Added `defineTool()` so standalone and array-based custom tool definitions keep inferred parameter types without manual casts ([#2746](https://github.com/code-yeongyu/senpi-mono/issues/2746))
807
849
 
808
- - Added label timestamps to the session tree with a `Shift+T` toggle in `/tree`, smart date formatting, and timestamp preservation through branching ([#2691](https://github.com/code-yeongyu/sanepi-mono/pull/2691) by [@w-winter](https://github.com/w-winter))
850
+ - Added label timestamps to the session tree with a `Shift+T` toggle in `/tree`, smart date formatting, and timestamp preservation through branching ([#2691](https://github.com/code-yeongyu/senpi-mono/pull/2691) by [@w-winter](https://github.com/w-winter))
809
851
 
810
852
  ### Fixed
811
853
 
812
- - Fixed startup resource loading to reuse the initial `ResourceLoader` for the first runtime, so extensions are not loaded twice before session startup and `session_start` handlers still fire for singleton-style extensions ([#2766](https://github.com/code-yeongyu/sanepi-mono/issues/2766))
854
+ - Fixed startup resource loading to reuse the initial `ResourceLoader` for the first runtime, so extensions are not loaded twice before session startup and `session_start` handlers still fire for singleton-style extensions ([#2766](https://github.com/code-yeongyu/senpi-mono/issues/2766))
813
855
  - Fixed retry settlement so retried agent runs wait for the full retry cycle to complete before declaring idle, preventing stale state after transient errors
814
- - Fixed theme `export` colors to resolve theme variables the same way as `colors`, so `/export` HTML backgrounds now honor entries like `pageBg: "base"` instead of requiring inline hex values ([#2707](https://github.com/code-yeongyu/sanepi-mono/issues/2707))
815
- - Fixed Bedrock throttling errors being misidentified as context overflow, causing unnecessary compaction instead of retry ([#2699](https://github.com/code-yeongyu/sanepi-mono/pull/2699) by [@xu0o0](https://github.com/xu0o0))
816
- - Added tool streaming support for newer Z.ai models ([#2732](https://github.com/code-yeongyu/sanepi-mono/pull/2732) by [@kaofelix](https://github.com/kaofelix))
856
+ - Fixed theme `export` colors to resolve theme variables the same way as `colors`, so `/export` HTML backgrounds now honor entries like `pageBg: "base"` instead of requiring inline hex values ([#2707](https://github.com/code-yeongyu/senpi-mono/issues/2707))
857
+ - Fixed Bedrock throttling errors being misidentified as context overflow, causing unnecessary compaction instead of retry ([#2699](https://github.com/code-yeongyu/senpi-mono/pull/2699) by [@xu0o0](https://github.com/xu0o0))
858
+ - Added tool streaming support for newer Z.ai models ([#2732](https://github.com/code-yeongyu/senpi-mono/pull/2732) by [@kaofelix](https://github.com/kaofelix))
817
859
 
818
860
  ## [0.64.0] - 2026-03-29
819
861
 
820
862
  ### New Features
821
863
 
822
864
  - Extensions and SDK callers can attach a `prepareArguments` hook to any tool definition, letting them normalize or migrate raw model arguments before schema validation. The built-in `edit` tool uses this to transparently support sessions created with the old single-edit schema. See [docs/extensions.md](docs/extensions.md)
823
- - Extensions can customize the collapsed thinking block label via `ctx.ui.setHiddenThinkingLabel()`. See [examples/extensions/hidden-thinking-label.ts](examples/extensions/hidden-thinking-label.ts) ([#2673](https://github.com/code-yeongyu/sanepi-mono/issues/2673))
865
+ - Extensions can customize the collapsed thinking block label via `ctx.ui.setHiddenThinkingLabel()`. See [examples/extensions/hidden-thinking-label.ts](examples/extensions/hidden-thinking-label.ts) ([#2673](https://github.com/code-yeongyu/senpi-mono/issues/2673))
824
866
 
825
867
  ### Breaking Changes
826
868
 
@@ -830,56 +872,56 @@ await runtime.fork("entry-id");
830
872
 
831
873
  - Added `ToolDefinition.prepareArguments` hook to prepare raw tool call arguments before schema validation, enabling compatibility shims for resumed sessions with outdated tool schemas
832
874
  - Built-in `edit` tool now uses `prepareArguments` to silently fold legacy top-level `oldText`/`newText` into `edits[]` when resuming old sessions
833
- - Added `ctx.ui.setHiddenThinkingLabel()` so extensions can customize the collapsed thinking label in interactive mode, with a no-op in RPC mode and a runnable example extension in `examples/extensions/hidden-thinking-label.ts` ([#2673](https://github.com/code-yeongyu/sanepi-mono/issues/2673))
875
+ - Added `ctx.ui.setHiddenThinkingLabel()` so extensions can customize the collapsed thinking label in interactive mode, with a no-op in RPC mode and a runnable example extension in `examples/extensions/hidden-thinking-label.ts` ([#2673](https://github.com/code-yeongyu/senpi-mono/issues/2673))
834
876
 
835
877
  ### Fixed
836
878
 
837
- - Fixed extension-queued user messages to refresh the interactive pending-message list so messages submitted while a turn is active are no longer silently dropped ([#2674](https://github.com/code-yeongyu/sanepi-mono/pull/2674) by [@mrexodia](https://github.com/mrexodia))
838
- - Fixed monorepo `tsconfig.json` path mappings to resolve `@earendil-works/pi-ai` subpath exports to source files in development checkouts ([#2625](https://github.com/code-yeongyu/sanepi-mono/pull/2625) by [@ferologics](https://github.com/ferologics))
839
- - Fixed TUI cell size response handling to consume only exact `CSI 6 ; height ; width t` replies, so bare `Escape` is no longer swallowed while waiting for terminal image metadata ([#2661](https://github.com/code-yeongyu/sanepi-mono/issues/2661))
840
- - Fixed Kitty keyboard protocol keypad functional keys to normalize to logical digits, symbols, and navigation keys, so numpad input in terminals such as iTerm2 no longer inserts Private Use Area gibberish or gets ignored ([#2650](https://github.com/code-yeongyu/sanepi-mono/issues/2650))
879
+ - Fixed extension-queued user messages to refresh the interactive pending-message list so messages submitted while a turn is active are no longer silently dropped ([#2674](https://github.com/code-yeongyu/senpi-mono/pull/2674) by [@mrexodia](https://github.com/mrexodia))
880
+ - Fixed monorepo `tsconfig.json` path mappings to resolve `@earendil-works/pi-ai` subpath exports to source files in development checkouts ([#2625](https://github.com/code-yeongyu/senpi-mono/pull/2625) by [@ferologics](https://github.com/ferologics))
881
+ - Fixed TUI cell size response handling to consume only exact `CSI 6 ; height ; width t` replies, so bare `Escape` is no longer swallowed while waiting for terminal image metadata ([#2661](https://github.com/code-yeongyu/senpi-mono/issues/2661))
882
+ - Fixed Kitty keyboard protocol keypad functional keys to normalize to logical digits, symbols, and navigation keys, so numpad input in terminals such as iTerm2 no longer inserts Private Use Area gibberish or gets ignored ([#2650](https://github.com/code-yeongyu/senpi-mono/issues/2650))
841
883
 
842
884
  ## [0.63.2] - 2026-03-29
843
885
 
844
886
  ### New Features
845
887
 
846
- - Extension handlers can now use `ctx.signal` to forward cancellation into nested model calls, `fetch()`, and other abort-aware work. See [docs/extensions.md#ctxsignal](docs/extensions.md#ctxsignal) ([#2660](https://github.com/code-yeongyu/sanepi-mono/issues/2660))
847
- - Built-in `edit` tool input now uses `edits[]` as the only replacement shape, reducing invalid tool calls caused by mixed single-edit and multi-edit schemas ([#2639](https://github.com/code-yeongyu/sanepi-mono/issues/2639))
848
- - Large multi-edit results no longer trigger full-screen redraws in the interactive TUI when the final diff is rendered ([#2664](https://github.com/code-yeongyu/sanepi-mono/issues/2664))
888
+ - Extension handlers can now use `ctx.signal` to forward cancellation into nested model calls, `fetch()`, and other abort-aware work. See [docs/extensions.md#ctxsignal](docs/extensions.md#ctxsignal) ([#2660](https://github.com/code-yeongyu/senpi-mono/issues/2660))
889
+ - Built-in `edit` tool input now uses `edits[]` as the only replacement shape, reducing invalid tool calls caused by mixed single-edit and multi-edit schemas ([#2639](https://github.com/code-yeongyu/senpi-mono/issues/2639))
890
+ - Large multi-edit results no longer trigger full-screen redraws in the interactive TUI when the final diff is rendered ([#2664](https://github.com/code-yeongyu/senpi-mono/issues/2664))
849
891
 
850
892
  ### Added
851
893
 
852
- - Added `ctx.signal` to `ExtensionContext` and wired it to the active agent turn so extension handlers can forward cancellation into nested model calls, `fetch()`, and other abort-aware work ([#2660](https://github.com/code-yeongyu/sanepi-mono/issues/2660))
894
+ - Added `ctx.signal` to `ExtensionContext` and wired it to the active agent turn so extension handlers can forward cancellation into nested model calls, `fetch()`, and other abort-aware work ([#2660](https://github.com/code-yeongyu/senpi-mono/issues/2660))
853
895
 
854
896
  ### Fixed
855
897
 
856
- - Fixed built-in `edit` tool input to use `edits[]` as the only replacement shape, eliminating the mixed single-edit and multi-edit modes that caused repeated invalid tool calls and retries ([#2639](https://github.com/code-yeongyu/sanepi-mono/issues/2639))
857
- - Fixed edit tool TUI rendering to defer large multi-edit diffs to the settled result, avoiding full-screen redraws when the tool completes ([#2664](https://github.com/code-yeongyu/sanepi-mono/issues/2664))
898
+ - Fixed built-in `edit` tool input to use `edits[]` as the only replacement shape, eliminating the mixed single-edit and multi-edit modes that caused repeated invalid tool calls and retries ([#2639](https://github.com/code-yeongyu/senpi-mono/issues/2639))
899
+ - Fixed edit tool TUI rendering to defer large multi-edit diffs to the settled result, avoiding full-screen redraws when the tool completes ([#2664](https://github.com/code-yeongyu/senpi-mono/issues/2664))
858
900
 
859
901
  ## [0.63.1] - 2026-03-27
860
902
 
861
903
  ### Added
862
904
 
863
- - Added `gemini-3.1-pro-preview-customtools` model availability for the `google-vertex` provider ([#2610](https://github.com/code-yeongyu/sanepi-mono/pull/2610) by [@gordonhwc](https://github.com/gordonhwc))
905
+ - Added `gemini-3.1-pro-preview-customtools` model availability for the `google-vertex` provider ([#2610](https://github.com/code-yeongyu/senpi-mono/pull/2610) by [@gordonhwc](https://github.com/gordonhwc))
864
906
 
865
907
  ### Fixed
866
908
 
867
- - Documented `tool_call` input mutation as supported extension API behavior, clarified that post-mutation inputs are not re-validated, and added regression coverage for executing mutated tool arguments ([#2611](https://github.com/code-yeongyu/sanepi-mono/issues/2611))
868
- - Fixed repeated compactions dropping messages that were kept by an earlier compaction by re-summarizing from the previous kept boundary and recalculating `tokensBefore` from the rebuilt session context ([#2608](https://github.com/code-yeongyu/sanepi-mono/issues/2608))
869
- - Fixed interactive compaction UI updates so `ctx.compact()` rebuilds the chat through unified compaction events, manual compaction no longer duplicates the summary block, and the `trigger-compact` example only fires when context usage crosses its threshold ([#2617](https://github.com/code-yeongyu/sanepi-mono/issues/2617))
909
+ - Documented `tool_call` input mutation as supported extension API behavior, clarified that post-mutation inputs are not re-validated, and added regression coverage for executing mutated tool arguments ([#2611](https://github.com/code-yeongyu/senpi-mono/issues/2611))
910
+ - Fixed repeated compactions dropping messages that were kept by an earlier compaction by re-summarizing from the previous kept boundary and recalculating `tokensBefore` from the rebuilt session context ([#2608](https://github.com/code-yeongyu/senpi-mono/issues/2608))
911
+ - Fixed interactive compaction UI updates so `ctx.compact()` rebuilds the chat through unified compaction events, manual compaction no longer duplicates the summary block, and the `trigger-compact` example only fires when context usage crosses its threshold ([#2617](https://github.com/code-yeongyu/senpi-mono/issues/2617))
870
912
  - Fixed interactive compaction completion to append a synthetic compaction summary after rebuilding the chat so the latest compaction remains visible at the bottom
871
- - Fixed skill discovery to stop recursing once a directory contains `SKILL.md`, and to ignore root `*.md` files in `.agents/skills` while keeping root markdown skill files supported in `~/.senpi/agent/skills`, `.senpi/skills`, and package `skills/` directories ([#2603](https://github.com/code-yeongyu/sanepi-mono/issues/2603))
913
+ - Fixed skill discovery to stop recursing once a directory contains `SKILL.md`, and to ignore root `*.md` files in `.agents/skills` while keeping root markdown skill files supported in `~/.senpi/agent/skills`, `.senpi/skills`, and package `skills/` directories ([#2603](https://github.com/code-yeongyu/senpi-mono/issues/2603))
872
914
  - Fixed edit tool diff rendering for multi-edit operations with large unchanged gaps so distant edits collapse intermediate context instead of dumping the full unchanged middle block
873
915
  - Fixed edit tool error rendering to avoid repeating the same exact-match failure in both the preview and result blocks
874
- - Fixed auto-compaction overflow recovery for Ollama models when the backend returns explicit `prompt too long; exceeded max context length ...` errors instead of silently truncating input ([#2626](https://github.com/code-yeongyu/sanepi-mono/issues/2626))
875
- - Fixed built-in tool overrides that reuse built-in parameter schemas to still honor custom `renderCall` and `renderResult` renderers in the interactive TUI, restoring the `minimal-mode` example ([#2595](https://github.com/code-yeongyu/sanepi-mono/issues/2595))
916
+ - Fixed auto-compaction overflow recovery for Ollama models when the backend returns explicit `prompt too long; exceeded max context length ...` errors instead of silently truncating input ([#2626](https://github.com/code-yeongyu/senpi-mono/issues/2626))
917
+ - Fixed built-in tool overrides that reuse built-in parameter schemas to still honor custom `renderCall` and `renderResult` renderers in the interactive TUI, restoring the `minimal-mode` example ([#2595](https://github.com/code-yeongyu/senpi-mono/issues/2595))
876
918
 
877
919
  ## [0.63.0] - 2026-03-27
878
920
 
879
921
  ### Breaking Changes
880
922
 
881
- - `ModelRegistry.getApiKey(model)` has been replaced by `getApiKeyAndHeaders(model)` because `models.json` auth and header values can now resolve dynamically on every request. Extensions and SDK integrations that previously fetched only an API key must now fetch request auth per call and forward both `apiKey` and `headers`. Use `getApiKeyForProvider(provider)` only when you explicitly want provider-level API key lookup without model headers or `authHeader` handling ([#1835](https://github.com/code-yeongyu/sanepi-mono/issues/1835))
882
- - Removed deprecated direct `minimax` and `minimax-cn` model IDs, keeping only `MiniMax-M2.7` and `MiniMax-M2.7-highspeed`. Update pinned model IDs to one of those supported direct MiniMax models, or use another provider route that still exposes the older IDs ([#2596](https://github.com/code-yeongyu/sanepi-mono/pull/2596) by [@liyuan97](https://github.com/liyuan97))
923
+ - `ModelRegistry.getApiKey(model)` has been replaced by `getApiKeyAndHeaders(model)` because `models.json` auth and header values can now resolve dynamically on every request. Extensions and SDK integrations that previously fetched only an API key must now fetch request auth per call and forward both `apiKey` and `headers`. Use `getApiKeyForProvider(provider)` only when you explicitly want provider-level API key lookup without model headers or `authHeader` handling ([#1835](https://github.com/code-yeongyu/senpi-mono/issues/1835))
924
+ - Removed deprecated direct `minimax` and `minimax-cn` model IDs, keeping only `MiniMax-M2.7` and `MiniMax-M2.7-highspeed`. Update pinned model IDs to one of those supported direct MiniMax models, or use another provider route that still exposes the older IDs ([#2596](https://github.com/code-yeongyu/senpi-mono/pull/2596) by [@liyuan97](https://github.com/liyuan97))
883
925
 
884
926
  #### Migration Notes
885
927
 
@@ -903,29 +945,29 @@ return streamSimple(model, messages, {
903
945
 
904
946
  ### Added
905
947
 
906
- - Added `sessionDir` setting support in global and project `settings.json` so session storage can be configured without passing `--session-dir` on every invocation ([#2598](https://github.com/code-yeongyu/sanepi-mono/pull/2598) by [@smcllns](https://github.com/smcllns))
907
- - Added a startup onboarding hint in the interactive header telling users pi can explain its own features and documentation ([#2620](https://github.com/code-yeongyu/sanepi-mono/pull/2620) by [@ferologics](https://github.com/ferologics))
948
+ - Added `sessionDir` setting support in global and project `settings.json` so session storage can be configured without passing `--session-dir` on every invocation ([#2598](https://github.com/code-yeongyu/senpi-mono/pull/2598) by [@smcllns](https://github.com/smcllns))
949
+ - Added a startup onboarding hint in the interactive header telling users pi can explain its own features and documentation ([#2620](https://github.com/code-yeongyu/senpi-mono/pull/2620) by [@ferologics](https://github.com/ferologics))
908
950
  - Added `edit` tool multi-edit support so one call can update multiple separate, disjoint regions in the same file while matching all replacements against the original file content
909
- - Added support for `PI_TUI_WRITE_LOG` directory paths, creating a unique log file (`tui-<timestamp>-<pid>.log`) per instance for easier debugging of multiple pi sessions ([#2508](https://github.com/code-yeongyu/sanepi-mono/pull/2508) by [@mrexodia](https://github.com/mrexodia))
951
+ - Added support for `PI_TUI_WRITE_LOG` directory paths, creating a unique log file (`tui-<timestamp>-<pid>.log`) per instance for easier debugging of multiple pi sessions ([#2508](https://github.com/code-yeongyu/senpi-mono/pull/2508) by [@mrexodia](https://github.com/mrexodia))
910
952
 
911
953
  ### Changed
912
954
 
913
955
  ### Fixed
914
956
 
915
957
  - Fixed file mutation queue ordering so concurrent `edit` and `write` operations targeting the same file stay serialized in request order instead of being reordered during queue-key resolution
916
- - Fixed `models.json` shell-command auth and headers to resolve at request time instead of being cached into long-lived model state. pi now leaves TTL, caching, and recovery policy to user-provided wrapper commands because arbitrary shell commands need provider-specific strategies ([#1835](https://github.com/code-yeongyu/sanepi-mono/issues/1835))
917
- - Fixed Google and Vertex cost calculation to subtract cached prompt tokens from billable input tokens instead of double-counting them when providers report `cachedContentTokenCount` ([#2588](https://github.com/code-yeongyu/sanepi-mono/pull/2588) by [@sparkleMing](https://github.com/sparkleMing))
918
- - Added missing `ajv` direct dependency; previously relied on transitive install via `@earendil-works/pi-ai` which broke standalone installs ([#2252](https://github.com/code-yeongyu/sanepi-mono/issues/2252))
919
- - Fixed `/export` HTML backgrounds to honor `theme.export.pageBg`, `cardBg`, and `infoBg` instead of always deriving them from `userMessageBg` ([#2565](https://github.com/code-yeongyu/sanepi-mono/issues/2565))
920
- - Fixed interactive bash execution collapsed previews to recompute visual line wrapping at render time, so previews respect the current terminal width after resizes and split-pane width changes ([#2569](https://github.com/code-yeongyu/sanepi-mono/issues/2569))
921
- - Fixed RPC `get_session_stats` to expose `contextUsage`, so headless clients can read actual current context-window usage instead of deriving it from token totals ([#2550](https://github.com/code-yeongyu/sanepi-mono/issues/2550))
922
- - Fixed `pi update` for git packages to fetch only the tracked target branch with `--no-tags`, reducing unrelated branch and tag noise while preserving force-push-safe updates ([#2548](https://github.com/code-yeongyu/sanepi-mono/issues/2548))
923
- - Fixed print and JSON modes to emit `session_shutdown` before exit, so extensions can release long-lived resources and non-interactive runs terminate cleanly ([#2576](https://github.com/code-yeongyu/sanepi-mono/issues/2576))
924
- - Fixed GitHub Copilot OpenAI Responses requests to omit the `reasoning` field entirely when no reasoning effort is requested, avoiding `400` errors from Copilot `gpt-5-mini` rejecting `reasoning: { effort: "none" }` during internal summary calls ([#2567](https://github.com/code-yeongyu/sanepi-mono/issues/2567))
958
+ - Fixed `models.json` shell-command auth and headers to resolve at request time instead of being cached into long-lived model state. pi now leaves TTL, caching, and recovery policy to user-provided wrapper commands because arbitrary shell commands need provider-specific strategies ([#1835](https://github.com/code-yeongyu/senpi-mono/issues/1835))
959
+ - Fixed Google and Vertex cost calculation to subtract cached prompt tokens from billable input tokens instead of double-counting them when providers report `cachedContentTokenCount` ([#2588](https://github.com/code-yeongyu/senpi-mono/pull/2588) by [@sparkleMing](https://github.com/sparkleMing))
960
+ - Added missing `ajv` direct dependency; previously relied on transitive install via `@earendil-works/pi-ai` which broke standalone installs ([#2252](https://github.com/code-yeongyu/senpi-mono/issues/2252))
961
+ - Fixed `/export` HTML backgrounds to honor `theme.export.pageBg`, `cardBg`, and `infoBg` instead of always deriving them from `userMessageBg` ([#2565](https://github.com/code-yeongyu/senpi-mono/issues/2565))
962
+ - Fixed interactive bash execution collapsed previews to recompute visual line wrapping at render time, so previews respect the current terminal width after resizes and split-pane width changes ([#2569](https://github.com/code-yeongyu/senpi-mono/issues/2569))
963
+ - Fixed RPC `get_session_stats` to expose `contextUsage`, so headless clients can read actual current context-window usage instead of deriving it from token totals ([#2550](https://github.com/code-yeongyu/senpi-mono/issues/2550))
964
+ - Fixed `pi update` for git packages to fetch only the tracked target branch with `--no-tags`, reducing unrelated branch and tag noise while preserving force-push-safe updates ([#2548](https://github.com/code-yeongyu/senpi-mono/issues/2548))
965
+ - Fixed print and JSON modes to emit `session_shutdown` before exit, so extensions can release long-lived resources and non-interactive runs terminate cleanly ([#2576](https://github.com/code-yeongyu/senpi-mono/issues/2576))
966
+ - Fixed GitHub Copilot OpenAI Responses requests to omit the `reasoning` field entirely when no reasoning effort is requested, avoiding `400` errors from Copilot `gpt-5-mini` rejecting `reasoning: { effort: "none" }` during internal summary calls ([#2567](https://github.com/code-yeongyu/senpi-mono/issues/2567))
925
967
  - Fixed blockquote text color breaking after inline links (and other inline elements) due to missing style restoration prefix
926
- - Fixed slash-command Tab completion from immediately chaining into argument autocomplete after completing the command name, restoring flows like `/model` that submit into a selector dialog ([#2577](https://github.com/code-yeongyu/sanepi-mono/issues/2577))
927
- - Fixed stale content and incorrect viewport tracking after TUI content shrinks or transient components inflate the working area ([#2126](https://github.com/code-yeongyu/sanepi-mono/pull/2126) by [@Perlence](https://github.com/Perlence))
928
- - Fixed `@` autocomplete to debounce editor-triggered searches, cancel in-flight `fd` lookups cleanly, and keep suggestions visible while results refresh ([#1278](https://github.com/code-yeongyu/sanepi-mono/issues/1278))
968
+ - Fixed slash-command Tab completion from immediately chaining into argument autocomplete after completing the command name, restoring flows like `/model` that submit into a selector dialog ([#2577](https://github.com/code-yeongyu/senpi-mono/issues/2577))
969
+ - Fixed stale content and incorrect viewport tracking after TUI content shrinks or transient components inflate the working area ([#2126](https://github.com/code-yeongyu/senpi-mono/pull/2126) by [@Perlence](https://github.com/Perlence))
970
+ - Fixed `@` autocomplete to debounce editor-triggered searches, cancel in-flight `fd` lookups cleanly, and keep suggestions visible while results refresh ([#1278](https://github.com/code-yeongyu/senpi-mono/issues/1278))
929
971
 
930
972
  ## [0.62.0] - 2026-03-23
931
973
 
@@ -938,10 +980,10 @@ return streamSimple(model, messages, {
938
980
  ### Breaking Changes
939
981
 
940
982
  - Changed `ToolDefinition.renderCall` and `renderResult` semantics. Fallback rendering now happens only when a renderer is not defined for that slot. If `renderCall` or `renderResult` is defined, it must return a `Component`.
941
- - Changed slash command provenance to use `sourceInfo` consistently. RPC `get_commands`, `RpcSlashCommand`, and SDK `SlashCommandInfo` no longer expose `location` or `path`. Use `sourceInfo` instead ([#1734](https://github.com/code-yeongyu/sanepi-mono/issues/1734))
942
- - Removed legacy `source` fields from `Skill` and `PromptTemplate`. Use `sourceInfo.source` for provenance instead ([#1734](https://github.com/code-yeongyu/sanepi-mono/issues/1734))
943
- - Removed `ResourceLoader.getPathMetadata()`. Resource provenance is now attached directly to loaded resources via `sourceInfo` ([#1734](https://github.com/code-yeongyu/sanepi-mono/issues/1734))
944
- - Removed `extensionPath` from `RegisteredCommand` and `RegisteredTool`. Use `sourceInfo.path` for provenance instead ([#1734](https://github.com/code-yeongyu/sanepi-mono/issues/1734))
983
+ - Changed slash command provenance to use `sourceInfo` consistently. RPC `get_commands`, `RpcSlashCommand`, and SDK `SlashCommandInfo` no longer expose `location` or `path`. Use `sourceInfo` instead ([#1734](https://github.com/code-yeongyu/senpi-mono/issues/1734))
984
+ - Removed legacy `source` fields from `Skill` and `PromptTemplate`. Use `sourceInfo.source` for provenance instead ([#1734](https://github.com/code-yeongyu/senpi-mono/issues/1734))
985
+ - Removed `ResourceLoader.getPathMetadata()`. Resource provenance is now attached directly to loaded resources via `sourceInfo` ([#1734](https://github.com/code-yeongyu/senpi-mono/issues/1734))
986
+ - Removed `extensionPath` from `RegisteredCommand` and `RegisteredTool`. Use `sourceInfo.path` for provenance instead ([#1734](https://github.com/code-yeongyu/senpi-mono/issues/1734))
945
987
 
946
988
  #### Migration Notes
947
989
 
@@ -964,21 +1006,21 @@ Examples:
964
1006
 
965
1007
  - Built-in tools now work like custom tools in extensions. To get built-in tool definitions, import `readToolDefinition` / `createReadToolDefinition()` and the equivalent `bash`, `edit`, `write`, `grep`, `find`, and `ls` exports from `@code-yeongyu/senpi`.
966
1008
  - Cleaned up `buildSystemPrompt()` so built-in tool snippets and tool-local guidelines come from built-in `ToolDefinition` metadata, while cross-tool and global prompt rules stay in system prompt construction.
967
- - Added structured `sourceInfo` to `pi.getAllTools()` results for built-in, SDK, and extension tools ([#1734](https://github.com/code-yeongyu/sanepi-mono/issues/1734))
1009
+ - Added structured `sourceInfo` to `pi.getAllTools()` results for built-in, SDK, and extension tools ([#1734](https://github.com/code-yeongyu/senpi-mono/issues/1734))
968
1010
 
969
1011
  ### Fixed
970
1012
 
971
- - Fixed extension command name conflicts so extensions with duplicate command names can load together. Conflicting extension commands now get numeric invocation suffixes in load order, for example `/review:1` and `/review:2` ([#1061](https://github.com/code-yeongyu/sanepi-mono/issues/1061))
972
- - Fixed slash command source attribution for extension commands, prompt templates, and skills in autocomplete and command discovery ([#1734](https://github.com/code-yeongyu/sanepi-mono/issues/1734))
973
- - Fixed auto-resized image handling to enforce the inline image size limit on the final base64 payload, return text-only fallbacks when resizing cannot produce a safe image, and avoid falling back to the original image in `read` and `@file` auto-resize paths ([#2055](https://github.com/code-yeongyu/sanepi-mono/issues/2055))
974
- - Fixed `pi update` for git packages to skip destructive reset, clean, and reinstall steps when the fetched target already matches the local checkout ([#2503](https://github.com/code-yeongyu/sanepi-mono/issues/2503))
975
- - Fixed print and JSON mode to take over stdout during non-interactive startup, keeping package-manager and other incidental chatter off protocol/output stdout ([#2482](https://github.com/code-yeongyu/sanepi-mono/issues/2482))
1013
+ - Fixed extension command name conflicts so extensions with duplicate command names can load together. Conflicting extension commands now get numeric invocation suffixes in load order, for example `/review:1` and `/review:2` ([#1061](https://github.com/code-yeongyu/senpi-mono/issues/1061))
1014
+ - Fixed slash command source attribution for extension commands, prompt templates, and skills in autocomplete and command discovery ([#1734](https://github.com/code-yeongyu/senpi-mono/issues/1734))
1015
+ - Fixed auto-resized image handling to enforce the inline image size limit on the final base64 payload, return text-only fallbacks when resizing cannot produce a safe image, and avoid falling back to the original image in `read` and `@file` auto-resize paths ([#2055](https://github.com/code-yeongyu/senpi-mono/issues/2055))
1016
+ - Fixed `pi update` for git packages to skip destructive reset, clean, and reinstall steps when the fetched target already matches the local checkout ([#2503](https://github.com/code-yeongyu/senpi-mono/issues/2503))
1017
+ - Fixed print and JSON mode to take over stdout during non-interactive startup, keeping package-manager and other incidental chatter off protocol/output stdout ([#2482](https://github.com/code-yeongyu/senpi-mono/issues/2482))
976
1018
  - Fixed cli-highlight auto-detection for languageless code blocks that misidentified prose as programming languages and colored random English words as keywords
977
- - Fixed Anthropic thinking disable handling to send `thinking: { type: "disabled" }` for reasoning-capable models when thinking is explicitly off ([#2022](https://github.com/code-yeongyu/sanepi-mono/issues/2022))
978
- - Fixed explicit thinking disable handling across Google, Google Vertex, Gemini CLI, OpenAI Responses, Azure OpenAI Responses, and OpenRouter-backed OpenAI-compatible completions ([#2490](https://github.com/code-yeongyu/sanepi-mono/issues/2490))
1019
+ - Fixed Anthropic thinking disable handling to send `thinking: { type: "disabled" }` for reasoning-capable models when thinking is explicitly off ([#2022](https://github.com/code-yeongyu/senpi-mono/issues/2022))
1020
+ - Fixed explicit thinking disable handling across Google, Google Vertex, Gemini CLI, OpenAI Responses, Azure OpenAI Responses, and OpenRouter-backed OpenAI-compatible completions ([#2490](https://github.com/code-yeongyu/senpi-mono/issues/2490))
979
1021
  - Fixed OpenAI Responses replay for foreign tool-call item IDs by hashing foreign IDs into bounded `fc_<hash>` IDs
980
- - Fixed OpenAI-compatible completions streams to ignore null chunks instead of crashing ([#2466](https://github.com/code-yeongyu/sanepi-mono/pull/2466) by [@Cheng-Zi-Qing](https://github.com/Cheng-Zi-Qing))
981
- - Fixed `truncateToWidth()` performance for very large strings by streaming truncation ([#2447](https://github.com/code-yeongyu/sanepi-mono/issues/2447))
1022
+ - Fixed OpenAI-compatible completions streams to ignore null chunks instead of crashing ([#2466](https://github.com/code-yeongyu/senpi-mono/pull/2466) by [@Cheng-Zi-Qing](https://github.com/Cheng-Zi-Qing))
1023
+ - Fixed `truncateToWidth()` performance for very large strings by streaming truncation ([#2447](https://github.com/code-yeongyu/senpi-mono/issues/2447))
982
1024
  - Fixed markdown heading styling being lost after inline code spans within headings
983
1025
 
984
1026
  ## [0.61.1] - 2026-03-20
@@ -990,19 +1032,19 @@ Examples:
990
1032
 
991
1033
  ### Added
992
1034
 
993
- - Added `ToolCallEventResult` to the `@code-yeongyu/senpi` top-level and core extension exports so extension authors can type explicit `tool_call` handler return values ([#2458](https://github.com/code-yeongyu/sanepi-mono/issues/2458))
1035
+ - Added `ToolCallEventResult` to the `@code-yeongyu/senpi` top-level and core extension exports so extension authors can type explicit `tool_call` handler return values ([#2458](https://github.com/code-yeongyu/senpi-mono/issues/2458))
994
1036
 
995
1037
  ### Changed
996
1038
 
997
- - Changed the default models for `zai`, `cerebras`, `minimax`, and `minimax-cn` to match the current provider lineup, and added missing `MiniMax-M2.1-highspeed` model entries with normalized MiniMax context limits ([#2445](https://github.com/code-yeongyu/sanepi-mono/pull/2445) by [@1500256797](https://github.com/1500256797))
1039
+ - Changed the default models for `zai`, `cerebras`, `minimax`, and `minimax-cn` to match the current provider lineup, and added missing `MiniMax-M2.1-highspeed` model entries with normalized MiniMax context limits ([#2445](https://github.com/code-yeongyu/senpi-mono/pull/2445) by [@1500256797](https://github.com/1500256797))
998
1040
 
999
1041
  ### Fixed
1000
1042
 
1001
- - Fixed `ctrl+z` suspend and `fg` resume reliability by keeping the process alive until the `SIGCONT` handler restores the TUI, avoiding immediate process exit in environments with no other live event-loop handles ([#2454](https://github.com/code-yeongyu/sanepi-mono/issues/2454))
1002
- - Fixed `createAgentSession({ agentDir })` to derive the default persisted session path from the provided `agentDir`, keeping session storage aligned with settings, auth, models, and resource loading ([#2457](https://github.com/code-yeongyu/sanepi-mono/issues/2457))
1003
- - Fixed shared keybinding resolution to stop user overrides from evicting unrelated default shortcuts such as selector confirm and editor cursor keys ([#2455](https://github.com/code-yeongyu/sanepi-mono/issues/2455))
1004
- - Fixed Termux software keyboard height changes from forcing full-screen redraws and replaying TUI history on every toggle ([#2467](https://github.com/code-yeongyu/sanepi-mono/issues/2467))
1005
- - Fixed project-local npm package updates to install npm `latest` instead of reusing stale saved dependency ranges, and added `Did you mean ...?` suggestions when `pi update <source>` omits the configured npm or git source prefix ([#2459](https://github.com/code-yeongyu/sanepi-mono/issues/2459))
1043
+ - Fixed `ctrl+z` suspend and `fg` resume reliability by keeping the process alive until the `SIGCONT` handler restores the TUI, avoiding immediate process exit in environments with no other live event-loop handles ([#2454](https://github.com/code-yeongyu/senpi-mono/issues/2454))
1044
+ - Fixed `createAgentSession({ agentDir })` to derive the default persisted session path from the provided `agentDir`, keeping session storage aligned with settings, auth, models, and resource loading ([#2457](https://github.com/code-yeongyu/senpi-mono/issues/2457))
1045
+ - Fixed shared keybinding resolution to stop user overrides from evicting unrelated default shortcuts such as selector confirm and editor cursor keys ([#2455](https://github.com/code-yeongyu/senpi-mono/issues/2455))
1046
+ - Fixed Termux software keyboard height changes from forcing full-screen redraws and replaying TUI history on every toggle ([#2467](https://github.com/code-yeongyu/senpi-mono/issues/2467))
1047
+ - Fixed project-local npm package updates to install npm `latest` instead of reusing stale saved dependency ranges, and added `Did you mean ...?` suggestions when `pi update <source>` omits the configured npm or git source prefix ([#2459](https://github.com/code-yeongyu/senpi-mono/issues/2459))
1006
1048
 
1007
1049
  ## [0.61.0] - 2026-03-20
1008
1050
 
@@ -1014,35 +1056,35 @@ Examples:
1014
1056
 
1015
1057
  ### Breaking Changes
1016
1058
 
1017
- - Interactive keybinding ids are now namespaced, and `keybindings.json` now uses those same canonical namespaced ids. Older config files are migrated automatically on startup. Custom editors and extension UI components still receive an injected `keybindings: KeybindingsManager`. They do not call `getKeybindings()` or `setKeybindings()` themselves. Declaration merging applies to that injected type ([#2391](https://github.com/code-yeongyu/sanepi-mono/issues/2391))
1059
+ - Interactive keybinding ids are now namespaced, and `keybindings.json` now uses those same canonical namespaced ids. Older config files are migrated automatically on startup. Custom editors and extension UI components still receive an injected `keybindings: KeybindingsManager`. They do not call `getKeybindings()` or `setKeybindings()` themselves. Declaration merging applies to that injected type ([#2391](https://github.com/code-yeongyu/senpi-mono/issues/2391))
1018
1060
  - Extension author migration: update `keyHint()`, `keyText()`, and injected `keybindings.matches(...)` calls from old built-in names like `"expandTools"`, `"selectConfirm"`, and `"interrupt"` to namespaced ids like `"app.tools.expand"`, `"tui.select.confirm"`, and `"app.interrupt"`. See [docs/keybindings.md](docs/keybindings.md) for the full list. `pi.registerShortcut("ctrl+shift+p", ...)` is unchanged because extension shortcuts still use raw key combos, not keybinding ids.
1019
1061
 
1020
1062
  ### Added
1021
1063
 
1022
- - Added `gpt-5.4-mini` to the `openai-codex` model catalog ([#2334](https://github.com/code-yeongyu/sanepi-mono/pull/2334) by [@justram](https://github.com/justram))
1023
- - Added JSONL session export and import via `/export <path.jsonl>` and `/import <path.jsonl>` ([#2356](https://github.com/code-yeongyu/sanepi-mono/pull/2356) by [@hjanuschka](https://github.com/hjanuschka))
1024
- - Added a resizable sidebar to HTML share and export views ([#2435](https://github.com/code-yeongyu/sanepi-mono/pull/2435) by [@dmmulroy](https://github.com/dmmulroy))
1064
+ - Added `gpt-5.4-mini` to the `openai-codex` model catalog ([#2334](https://github.com/code-yeongyu/senpi-mono/pull/2334) by [@justram](https://github.com/justram))
1065
+ - Added JSONL session export and import via `/export <path.jsonl>` and `/import <path.jsonl>` ([#2356](https://github.com/code-yeongyu/senpi-mono/pull/2356) by [@hjanuschka](https://github.com/hjanuschka))
1066
+ - Added a resizable sidebar to HTML share and export views ([#2435](https://github.com/code-yeongyu/senpi-mono/pull/2435) by [@dmmulroy](https://github.com/dmmulroy))
1025
1067
 
1026
1068
  ### Fixed
1027
1069
 
1028
- - Tests for session-selector-rename and tree-selector are now keybinding-agnostic, resetting editor keybindings to defaults before each test so user `keybindings.json` cannot cause failures ([#2360](https://github.com/code-yeongyu/sanepi-mono/issues/2360))
1029
- - Fixed custom `keybindings.json` overrides to shadow conflicting default shortcuts globally, so bindings such as `cursorUp: ["up", "ctrl+p"]` no longer leave default actions like model cycling active ([#2391](https://github.com/code-yeongyu/sanepi-mono/issues/2391))
1030
- - Fixed concurrent `edit` and `write` mutations targeting the same file to run serially, preventing interleaved file writes from overwriting each other ([#2327](https://github.com/code-yeongyu/sanepi-mono/issues/2327))
1031
- - Fixed RPC mode to redirect unexpected stdout writes to stderr so JSONL responses remain parseable ([#2388](https://github.com/code-yeongyu/sanepi-mono/issues/2388))
1032
- - Fixed auto-retry with tool-using retry responses so `session.prompt()` waits for the full retry loop, including tool execution, before returning ([#2440](https://github.com/code-yeongyu/sanepi-mono/pull/2440) by [@pasky](https://github.com/pasky))
1033
- - Fixed `/model` to refresh scoped model lists after `models.json` changes, avoiding stale selector contents ([#2408](https://github.com/code-yeongyu/sanepi-mono/pull/2408) by [@Perlence](https://github.com/Perlence))
1034
- - Fixed `validateToolArguments()` to fall back gracefully when AJV schema compilation is blocked in restricted runtimes such as Cloudflare Workers, allowing tool execution to proceed without schema validation ([#2395](https://github.com/code-yeongyu/sanepi-mono/issues/2395))
1035
- - Fixed CLI startup to suppress process warnings from leaking into terminal, print, and RPC output ([#2404](https://github.com/code-yeongyu/sanepi-mono/issues/2404))
1036
- - Fixed bash tool rendering to show elapsed time at the bottom of the tool block ([#2406](https://github.com/code-yeongyu/sanepi-mono/issues/2406))
1037
- - Fixed custom theme file watching to reload updated theme contents from disk instead of keeping stale cached theme data ([#2417](https://github.com/code-yeongyu/sanepi-mono/issues/2417), [#2003](https://github.com/code-yeongyu/sanepi-mono/issues/2003))
1038
- - Fixed footer Git branch refreshes to run asynchronously so branch watcher updates do not block the UI ([#2418](https://github.com/code-yeongyu/sanepi-mono/issues/2418))
1039
- - Fixed invalid extension provider registrations to surface an extension error without preventing other providers from loading ([#2431](https://github.com/code-yeongyu/sanepi-mono/issues/2431))
1040
- - Fixed Windows bash execution hanging for commands that spawn detached descendants inheriting stdout/stderr handles, which caused `agent-browser` and similar commands to spin forever ([#2389](https://github.com/code-yeongyu/sanepi-mono/pull/2389) by [@mrexodia](https://github.com/mrexodia))
1041
- - Fixed `google-vertex` API key resolution to ignore placeholder auth markers like `<authenticated>` and fall back to ADC instead of sending them as literal API keys ([#2335](https://github.com/code-yeongyu/sanepi-mono/issues/2335))
1042
- - Fixed desktop clipboard text copy to prefer native OS clipboard integration before shell fallbacks, improving reliability on macOS and Windows ([#2347](https://github.com/code-yeongyu/sanepi-mono/issues/2347))
1043
- - Fixed Bun Bedrock provider registration to survive provider resets and session reloads in compiled binaries ([#2350](https://github.com/code-yeongyu/sanepi-mono/pull/2350) by [@unexge](https://github.com/unexge))
1044
- - Fixed OpenRouter reasoning requests to use the provider's nested reasoning payload, restoring thinking level support for OpenRouter models and custom compat settings ([#2298](https://github.com/code-yeongyu/sanepi-mono/pull/2298) by [@PriNova](https://github.com/PriNova))
1045
- - Fixed Bedrock application inference profiles to support prompt caching when `AWS_BEDROCK_FORCE_CACHE=1` is set, covering profile ARNs that do not expose the underlying Claude model name ([#2346](https://github.com/code-yeongyu/sanepi-mono/pull/2346) by [@haoqixu](https://github.com/haoqixu))
1070
+ - Tests for session-selector-rename and tree-selector are now keybinding-agnostic, resetting editor keybindings to defaults before each test so user `keybindings.json` cannot cause failures ([#2360](https://github.com/code-yeongyu/senpi-mono/issues/2360))
1071
+ - Fixed custom `keybindings.json` overrides to shadow conflicting default shortcuts globally, so bindings such as `cursorUp: ["up", "ctrl+p"]` no longer leave default actions like model cycling active ([#2391](https://github.com/code-yeongyu/senpi-mono/issues/2391))
1072
+ - Fixed concurrent `edit` and `write` mutations targeting the same file to run serially, preventing interleaved file writes from overwriting each other ([#2327](https://github.com/code-yeongyu/senpi-mono/issues/2327))
1073
+ - Fixed RPC mode to redirect unexpected stdout writes to stderr so JSONL responses remain parseable ([#2388](https://github.com/code-yeongyu/senpi-mono/issues/2388))
1074
+ - Fixed auto-retry with tool-using retry responses so `session.prompt()` waits for the full retry loop, including tool execution, before returning ([#2440](https://github.com/code-yeongyu/senpi-mono/pull/2440) by [@pasky](https://github.com/pasky))
1075
+ - Fixed `/model` to refresh scoped model lists after `models.json` changes, avoiding stale selector contents ([#2408](https://github.com/code-yeongyu/senpi-mono/pull/2408) by [@Perlence](https://github.com/Perlence))
1076
+ - Fixed `validateToolArguments()` to fall back gracefully when AJV schema compilation is blocked in restricted runtimes such as Cloudflare Workers, allowing tool execution to proceed without schema validation ([#2395](https://github.com/code-yeongyu/senpi-mono/issues/2395))
1077
+ - Fixed CLI startup to suppress process warnings from leaking into terminal, print, and RPC output ([#2404](https://github.com/code-yeongyu/senpi-mono/issues/2404))
1078
+ - Fixed bash tool rendering to show elapsed time at the bottom of the tool block ([#2406](https://github.com/code-yeongyu/senpi-mono/issues/2406))
1079
+ - Fixed custom theme file watching to reload updated theme contents from disk instead of keeping stale cached theme data ([#2417](https://github.com/code-yeongyu/senpi-mono/issues/2417), [#2003](https://github.com/code-yeongyu/senpi-mono/issues/2003))
1080
+ - Fixed footer Git branch refreshes to run asynchronously so branch watcher updates do not block the UI ([#2418](https://github.com/code-yeongyu/senpi-mono/issues/2418))
1081
+ - Fixed invalid extension provider registrations to surface an extension error without preventing other providers from loading ([#2431](https://github.com/code-yeongyu/senpi-mono/issues/2431))
1082
+ - Fixed Windows bash execution hanging for commands that spawn detached descendants inheriting stdout/stderr handles, which caused `agent-browser` and similar commands to spin forever ([#2389](https://github.com/code-yeongyu/senpi-mono/pull/2389) by [@mrexodia](https://github.com/mrexodia))
1083
+ - Fixed `google-vertex` API key resolution to ignore placeholder auth markers like `<authenticated>` and fall back to ADC instead of sending them as literal API keys ([#2335](https://github.com/code-yeongyu/senpi-mono/issues/2335))
1084
+ - Fixed desktop clipboard text copy to prefer native OS clipboard integration before shell fallbacks, improving reliability on macOS and Windows ([#2347](https://github.com/code-yeongyu/senpi-mono/issues/2347))
1085
+ - Fixed Bun Bedrock provider registration to survive provider resets and session reloads in compiled binaries ([#2350](https://github.com/code-yeongyu/senpi-mono/pull/2350) by [@unexge](https://github.com/unexge))
1086
+ - Fixed OpenRouter reasoning requests to use the provider's nested reasoning payload, restoring thinking level support for OpenRouter models and custom compat settings ([#2298](https://github.com/code-yeongyu/senpi-mono/pull/2298) by [@PriNova](https://github.com/PriNova))
1087
+ - Fixed Bedrock application inference profiles to support prompt caching when `AWS_BEDROCK_FORCE_CACHE=1` is set, covering profile ARNs that do not expose the underlying Claude model name ([#2346](https://github.com/code-yeongyu/senpi-mono/pull/2346) by [@haoqixu](https://github.com/haoqixu))
1046
1088
 
1047
1089
  ## [0.60.0] - 2026-03-18
1048
1090
 
@@ -1054,51 +1096,51 @@ Examples:
1054
1096
 
1055
1097
  ### Breaking Changes
1056
1098
 
1057
- - Changed package startup behavior so installed unpinned packages are no longer checked or updated during startup. Use `pi update` to apply npm/git package updates, while interactive mode now checks for available package updates in the background and notifies you when updates are available ([#1963](https://github.com/code-yeongyu/sanepi-mono/issues/1963))
1099
+ - Changed package startup behavior so installed unpinned packages are no longer checked or updated during startup. Use `pi update` to apply npm/git package updates, while interactive mode now checks for available package updates in the background and notifies you when updates are available ([#1963](https://github.com/code-yeongyu/senpi-mono/issues/1963))
1058
1100
 
1059
1101
  ### Added
1060
1102
 
1061
- - Added `--fork <path|id>` CLI flag to fork an existing session file or partial session UUID directly into a new session ([#2290](https://github.com/code-yeongyu/sanepi-mono/issues/2290))
1062
- - Added `createLocalBashOperations()` export so extensions and SDK callers can wrap pi's built-in local bash backend for `user_bash` handling and other custom bash integrations ([#2299](https://github.com/code-yeongyu/sanepi-mono/issues/2299))
1103
+ - Added `--fork <path|id>` CLI flag to fork an existing session file or partial session UUID directly into a new session ([#2290](https://github.com/code-yeongyu/senpi-mono/issues/2290))
1104
+ - Added `createLocalBashOperations()` export so extensions and SDK callers can wrap pi's built-in local bash backend for `user_bash` handling and other custom bash integrations ([#2299](https://github.com/code-yeongyu/senpi-mono/issues/2299))
1063
1105
 
1064
1106
  ### Fixed
1065
1107
 
1066
- - Fixed active model selection to refresh immediately after dynamic provider registrations or updates change the available model set ([#2291](https://github.com/code-yeongyu/sanepi-mono/issues/2291))
1067
- - Fixed tmux xterm `modifyOtherKeys` matching for `Backspace`, `Escape`, and `Space`, and resolved raw `\x08` backspace ambiguity by treating Windows Terminal sessions differently from legacy terminals ([#2293](https://github.com/code-yeongyu/sanepi-mono/issues/2293))
1068
- - Fixed Gemini 3 and Antigravity image tool results to stay inline as multimodal tool responses instead of being rerouted through separate follow-up messages ([#2052](https://github.com/code-yeongyu/sanepi-mono/issues/2052))
1069
- - Fixed bundled Bedrock Claude 4.6 model metadata to use the correct 200K context window instead of 1M ([#2305](https://github.com/code-yeongyu/sanepi-mono/issues/2305))
1070
- - Fixed `/reload` to reload keybindings from disk so changes in `keybindings.json` apply immediately ([#2309](https://github.com/code-yeongyu/sanepi-mono/issues/2309))
1071
- - Fixed lazy built-in provider registration so compiled Bun binaries can still load providers on first use without eagerly bundling provider SDKs ([#2314](https://github.com/code-yeongyu/sanepi-mono/issues/2314))
1072
- - Fixed built-in OAuth login flows to use aligned callback handling across Anthropic, Gemini CLI, Antigravity, and OpenAI Codex, and fixed OpenAI Codex login to complete immediately once the browser callback succeeds ([#2316](https://github.com/code-yeongyu/sanepi-mono/issues/2316))
1073
- - Fixed OpenAI-compatible z.ai `network_error` responses to trigger error handling and retries instead of being treated as successful assistant output ([#2313](https://github.com/code-yeongyu/sanepi-mono/issues/2313))
1074
- - Fixed print mode to merge piped stdin into the initial prompt when both stdin and an explicit prompt are provided ([#2315](https://github.com/code-yeongyu/sanepi-mono/issues/2315))
1075
- - Fixed OpenAI Responses replay in coding-agent to normalize oversized resumed tool call IDs before sending them back to OpenAI Codex and other Responses-compatible targets ([#2328](https://github.com/code-yeongyu/sanepi-mono/issues/2328))
1076
- - Fixed tmux extended-keys warning to stay hidden when the tmux server is unreachable, avoiding false startup warnings in sandboxed environments ([#2311](https://github.com/code-yeongyu/sanepi-mono/pull/2311) by [@kaffarell](https://github.com/kaffarell))
1108
+ - Fixed active model selection to refresh immediately after dynamic provider registrations or updates change the available model set ([#2291](https://github.com/code-yeongyu/senpi-mono/issues/2291))
1109
+ - Fixed tmux xterm `modifyOtherKeys` matching for `Backspace`, `Escape`, and `Space`, and resolved raw `\x08` backspace ambiguity by treating Windows Terminal sessions differently from legacy terminals ([#2293](https://github.com/code-yeongyu/senpi-mono/issues/2293))
1110
+ - Fixed Gemini 3 and Antigravity image tool results to stay inline as multimodal tool responses instead of being rerouted through separate follow-up messages ([#2052](https://github.com/code-yeongyu/senpi-mono/issues/2052))
1111
+ - Fixed bundled Bedrock Claude 4.6 model metadata to use the correct 200K context window instead of 1M ([#2305](https://github.com/code-yeongyu/senpi-mono/issues/2305))
1112
+ - Fixed `/reload` to reload keybindings from disk so changes in `keybindings.json` apply immediately ([#2309](https://github.com/code-yeongyu/senpi-mono/issues/2309))
1113
+ - Fixed lazy built-in provider registration so compiled Bun binaries can still load providers on first use without eagerly bundling provider SDKs ([#2314](https://github.com/code-yeongyu/senpi-mono/issues/2314))
1114
+ - Fixed built-in OAuth login flows to use aligned callback handling across Anthropic, Gemini CLI, Antigravity, and OpenAI Codex, and fixed OpenAI Codex login to complete immediately once the browser callback succeeds ([#2316](https://github.com/code-yeongyu/senpi-mono/issues/2316))
1115
+ - Fixed OpenAI-compatible z.ai `network_error` responses to trigger error handling and retries instead of being treated as successful assistant output ([#2313](https://github.com/code-yeongyu/senpi-mono/issues/2313))
1116
+ - Fixed print mode to merge piped stdin into the initial prompt when both stdin and an explicit prompt are provided ([#2315](https://github.com/code-yeongyu/senpi-mono/issues/2315))
1117
+ - Fixed OpenAI Responses replay in coding-agent to normalize oversized resumed tool call IDs before sending them back to OpenAI Codex and other Responses-compatible targets ([#2328](https://github.com/code-yeongyu/senpi-mono/issues/2328))
1118
+ - Fixed tmux extended-keys warning to stay hidden when the tmux server is unreachable, avoiding false startup warnings in sandboxed environments ([#2311](https://github.com/code-yeongyu/senpi-mono/pull/2311) by [@kaffarell](https://github.com/kaffarell))
1077
1119
 
1078
1120
  ## [0.59.0] - 2026-03-17
1079
1121
 
1080
1122
  ### New Features
1081
1123
 
1082
- - Faster startup by lazy-loading `@earendil-works/pi-ai` provider SDKs on first use instead of import time ([#2297](https://github.com/code-yeongyu/sanepi-mono/issues/2297))
1083
- - Better provider retry behavior when providers return error messages as responses ([#2264](https://github.com/code-yeongyu/sanepi-mono/issues/2264))
1084
- - Better terminal integration via OSC 133 command-executed markers ([#2242](https://github.com/code-yeongyu/sanepi-mono/issues/2242))
1085
- - Better Git footer branch detection for repositories using reftable storage ([#2300](https://github.com/code-yeongyu/sanepi-mono/issues/2300))
1124
+ - Faster startup by lazy-loading `@earendil-works/pi-ai` provider SDKs on first use instead of import time ([#2297](https://github.com/code-yeongyu/senpi-mono/issues/2297))
1125
+ - Better provider retry behavior when providers return error messages as responses ([#2264](https://github.com/code-yeongyu/senpi-mono/issues/2264))
1126
+ - Better terminal integration via OSC 133 command-executed markers ([#2242](https://github.com/code-yeongyu/senpi-mono/issues/2242))
1127
+ - Better Git footer branch detection for repositories using reftable storage ([#2300](https://github.com/code-yeongyu/senpi-mono/issues/2300))
1086
1128
 
1087
1129
  ### Breaking Changes
1088
1130
 
1089
- - Changed custom tool system prompt behavior so extension and SDK tools are included in the default `Available tools` section only when they provide `promptSnippet`. Omitting `promptSnippet` now leaves the tool out of that section instead of falling back to `description` ([#2285](https://github.com/code-yeongyu/sanepi-mono/issues/2285))
1131
+ - Changed custom tool system prompt behavior so extension and SDK tools are included in the default `Available tools` section only when they provide `promptSnippet`. Omitting `promptSnippet` now leaves the tool out of that section instead of falling back to `description` ([#2285](https://github.com/code-yeongyu/senpi-mono/issues/2285))
1090
1132
 
1091
1133
  ### Changed
1092
1134
 
1093
- - Lazy-load built-in `@earendil-works/pi-ai` provider modules and root provider wrappers so coding-agent startup no longer eagerly loads provider SDKs before first use ([#2297](https://github.com/code-yeongyu/sanepi-mono/issues/2297))
1135
+ - Lazy-load built-in `@earendil-works/pi-ai` provider modules and root provider wrappers so coding-agent startup no longer eagerly loads provider SDKs before first use ([#2297](https://github.com/code-yeongyu/senpi-mono/issues/2297))
1094
1136
 
1095
1137
  ### Fixed
1096
1138
 
1097
- - Fixed session title handling in `/tree`, compaction, and branch summarization so empty title clears render correctly and `session_info` entries stay out of summaries ([#2304](https://github.com/code-yeongyu/sanepi-mono/pull/2304) by [@aliou](https://github.com/aliou))
1098
- - Fixed footer branch detection for Git repositories using reftable storage so branch names still appear correctly in the footer ([#2300](https://github.com/code-yeongyu/sanepi-mono/issues/2300))
1099
- - Fixed rendered user messages to emit an OSC 133 command-executed marker after command output, improving terminal prompt integration ([#2242](https://github.com/code-yeongyu/sanepi-mono/issues/2242))
1100
- - Fixed provider retry handling to treat provider-returned error messages as retryable failures instead of successful responses ([#2264](https://github.com/code-yeongyu/sanepi-mono/issues/2264))
1101
- - Fixed Claude 4.6 context window overrides in bundled model metadata so coding-agent sees the intended model limits after generated catalogs are rebuilt ([#2286](https://github.com/code-yeongyu/sanepi-mono/issues/2286))
1139
+ - Fixed session title handling in `/tree`, compaction, and branch summarization so empty title clears render correctly and `session_info` entries stay out of summaries ([#2304](https://github.com/code-yeongyu/senpi-mono/pull/2304) by [@aliou](https://github.com/aliou))
1140
+ - Fixed footer branch detection for Git repositories using reftable storage so branch names still appear correctly in the footer ([#2300](https://github.com/code-yeongyu/senpi-mono/issues/2300))
1141
+ - Fixed rendered user messages to emit an OSC 133 command-executed marker after command output, improving terminal prompt integration ([#2242](https://github.com/code-yeongyu/senpi-mono/issues/2242))
1142
+ - Fixed provider retry handling to treat provider-returned error messages as retryable failures instead of successful responses ([#2264](https://github.com/code-yeongyu/senpi-mono/issues/2264))
1143
+ - Fixed Claude 4.6 context window overrides in bundled model metadata so coding-agent sees the intended model limits after generated catalogs are rebuilt ([#2286](https://github.com/code-yeongyu/senpi-mono/issues/2286))
1102
1144
 
1103
1145
  ## [0.58.4] - 2026-03-16
1104
1146
 
@@ -1112,15 +1154,15 @@ Examples:
1112
1154
 
1113
1155
  ### Added
1114
1156
 
1115
- - Improved settings, theme, thinking, and show-images selector layouts by using configurable select-list primary column sizing ([#2154](https://github.com/code-yeongyu/sanepi-mono/pull/2154) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1157
+ - Improved settings, theme, thinking, and show-images selector layouts by using configurable select-list primary column sizing ([#2154](https://github.com/code-yeongyu/senpi-mono/pull/2154) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1116
1158
 
1117
1159
  ### Fixed
1118
1160
 
1119
- - Fixed fuzzy `edit` matching to normalize Unicode compatibility variants before comparison, reducing false "oldText not found" failures for text such as CJK and full-width characters ([#2044](https://github.com/code-yeongyu/sanepi-mono/issues/2044))
1120
- - Fixed `/model <ref>` exact matching and picker search to recognize canonical `provider/model` references when model IDs themselves contain `/`, such as LM Studio models like `unsloth/qwen3.5-35b-a3b` ([#2174](https://github.com/code-yeongyu/sanepi-mono/issues/2174))
1121
- - Fixed Anthropic OAuth manual login and token refresh by using the localhost callback URI for pasted redirect/code flows and omitting `scope` from refresh-token requests ([#2169](https://github.com/code-yeongyu/sanepi-mono/issues/2169))
1122
- - Fixed stale scrollback remaining after session switches by clearing the screen before wiping scrollback ([#2155](https://github.com/code-yeongyu/sanepi-mono/pull/2155) by [@Perlence](https://github.com/Perlence))
1123
- - Fixed extra blank lines after markdown block elements in rendered output ([#2152](https://github.com/code-yeongyu/sanepi-mono/pull/2152) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1161
+ - Fixed fuzzy `edit` matching to normalize Unicode compatibility variants before comparison, reducing false "oldText not found" failures for text such as CJK and full-width characters ([#2044](https://github.com/code-yeongyu/senpi-mono/issues/2044))
1162
+ - Fixed `/model <ref>` exact matching and picker search to recognize canonical `provider/model` references when model IDs themselves contain `/`, such as LM Studio models like `unsloth/qwen3.5-35b-a3b` ([#2174](https://github.com/code-yeongyu/senpi-mono/issues/2174))
1163
+ - Fixed Anthropic OAuth manual login and token refresh by using the localhost callback URI for pasted redirect/code flows and omitting `scope` from refresh-token requests ([#2169](https://github.com/code-yeongyu/senpi-mono/issues/2169))
1164
+ - Fixed stale scrollback remaining after session switches by clearing the screen before wiping scrollback ([#2155](https://github.com/code-yeongyu/senpi-mono/pull/2155) by [@Perlence](https://github.com/Perlence))
1165
+ - Fixed extra blank lines after markdown block elements in rendered output ([#2152](https://github.com/code-yeongyu/senpi-mono/pull/2152) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1124
1166
 
1125
1167
  ## [0.58.1] - 2026-03-14
1126
1168
 
@@ -1130,61 +1172,61 @@ Examples:
1130
1172
 
1131
1173
  ### Fixed
1132
1174
 
1133
- - Fixed OpenAI Codex websocket protocol to include required headers and properly terminate SSE streams on connection close ([#1961](https://github.com/code-yeongyu/sanepi-mono/issues/1961))
1134
- - Fixed WSL clipboard image fallback to properly handle missing clipboard utilities and permission errors ([#1722](https://github.com/code-yeongyu/sanepi-mono/issues/1722))
1135
- - Fixed extension `session_start` hook firing before TUI was ready, causing UI operations in `session_start` handlers to fail ([#2035](https://github.com/code-yeongyu/sanepi-mono/issues/2035))
1175
+ - Fixed OpenAI Codex websocket protocol to include required headers and properly terminate SSE streams on connection close ([#1961](https://github.com/code-yeongyu/senpi-mono/issues/1961))
1176
+ - Fixed WSL clipboard image fallback to properly handle missing clipboard utilities and permission errors ([#1722](https://github.com/code-yeongyu/senpi-mono/issues/1722))
1177
+ - Fixed extension `session_start` hook firing before TUI was ready, causing UI operations in `session_start` handlers to fail ([#2035](https://github.com/code-yeongyu/senpi-mono/issues/2035))
1136
1178
  - Fixed Windows shell and path handling for package manager operations and autocomplete to properly handle drive letters and mixed path separators
1137
- - Fixed Bedrock prompt caching being enabled for non-Claude models, causing API errors ([#2053](https://github.com/code-yeongyu/sanepi-mono/issues/2053))
1138
- - Fixed Qwen models via OpenAI-compatible providers by adding `qwen-chat-template` compat mode that uses Qwen's native chat template format ([#2020](https://github.com/code-yeongyu/sanepi-mono/issues/2020))
1139
- - Fixed Bedrock unsigned thinking replay to handle edge cases with empty or malformed thinking blocks ([#2063](https://github.com/code-yeongyu/sanepi-mono/issues/2063))
1140
- - Fixed headless clipboard fallback logging spurious errors in non-interactive environments ([#2056](https://github.com/code-yeongyu/sanepi-mono/issues/2056))
1141
- - Fixed `models.json` provider compat flags not being honored when loading custom model definitions ([#2062](https://github.com/code-yeongyu/sanepi-mono/issues/2062))
1142
- - Fixed xhigh reasoning effort detection for Claude Opus 4.6 to match by model ID instead of requiring explicit capability flag ([#2040](https://github.com/code-yeongyu/sanepi-mono/issues/2040))
1143
- - Fixed prompt cwd containing Windows backslashes breaking bash tool execution by normalizing to forward slashes ([#2080](https://github.com/code-yeongyu/sanepi-mono/issues/2080))
1144
- - Fixed editor paste to preserve literal content instead of normalizing newlines, preventing content corruption for text with embedded escape sequences ([#2064](https://github.com/code-yeongyu/sanepi-mono/issues/2064))
1145
- - Fixed skill discovery recursing past skill root directories when nested SKILL.md files exist ([#2075](https://github.com/code-yeongyu/sanepi-mono/issues/2075))
1146
- - Fixed tab completion to preserve `./` prefix when completing relative paths ([#2087](https://github.com/code-yeongyu/sanepi-mono/issues/2087))
1147
- - Fixed npm package installs and lookups being tied to the active repository Node version by adding `npmCommand` as an argv-style settings override for package manager operations ([#2072](https://github.com/code-yeongyu/sanepi-mono/issues/2072))
1148
- - Fixed `ctx.ui.getEditorText()` in the extension API returning paste markers (e.g., `[paste #1 +24 lines]`) instead of the actual pasted content ([#2084](https://github.com/code-yeongyu/sanepi-mono/issues/2084))
1149
- - Fixed startup crash when downloading `fd`/`ripgrep` on first run by using `pipeline()` instead of `finished(readable.pipe(writable))` so stream errors from timeouts are caught properly, and increased the download timeout from 10s to 120s ([#2066](https://github.com/code-yeongyu/sanepi-mono/issues/2066))
1179
+ - Fixed Bedrock prompt caching being enabled for non-Claude models, causing API errors ([#2053](https://github.com/code-yeongyu/senpi-mono/issues/2053))
1180
+ - Fixed Qwen models via OpenAI-compatible providers by adding `qwen-chat-template` compat mode that uses Qwen's native chat template format ([#2020](https://github.com/code-yeongyu/senpi-mono/issues/2020))
1181
+ - Fixed Bedrock unsigned thinking replay to handle edge cases with empty or malformed thinking blocks ([#2063](https://github.com/code-yeongyu/senpi-mono/issues/2063))
1182
+ - Fixed headless clipboard fallback logging spurious errors in non-interactive environments ([#2056](https://github.com/code-yeongyu/senpi-mono/issues/2056))
1183
+ - Fixed `models.json` provider compat flags not being honored when loading custom model definitions ([#2062](https://github.com/code-yeongyu/senpi-mono/issues/2062))
1184
+ - Fixed xhigh reasoning effort detection for Claude Opus 4.6 to match by model ID instead of requiring explicit capability flag ([#2040](https://github.com/code-yeongyu/senpi-mono/issues/2040))
1185
+ - Fixed prompt cwd containing Windows backslashes breaking bash tool execution by normalizing to forward slashes ([#2080](https://github.com/code-yeongyu/senpi-mono/issues/2080))
1186
+ - Fixed editor paste to preserve literal content instead of normalizing newlines, preventing content corruption for text with embedded escape sequences ([#2064](https://github.com/code-yeongyu/senpi-mono/issues/2064))
1187
+ - Fixed skill discovery recursing past skill root directories when nested SKILL.md files exist ([#2075](https://github.com/code-yeongyu/senpi-mono/issues/2075))
1188
+ - Fixed tab completion to preserve `./` prefix when completing relative paths ([#2087](https://github.com/code-yeongyu/senpi-mono/issues/2087))
1189
+ - Fixed npm package installs and lookups being tied to the active repository Node version by adding `npmCommand` as an argv-style settings override for package manager operations ([#2072](https://github.com/code-yeongyu/senpi-mono/issues/2072))
1190
+ - Fixed `ctx.ui.getEditorText()` in the extension API returning paste markers (e.g., `[paste #1 +24 lines]`) instead of the actual pasted content ([#2084](https://github.com/code-yeongyu/senpi-mono/issues/2084))
1191
+ - Fixed startup crash when downloading `fd`/`ripgrep` on first run by using `pipeline()` instead of `finished(readable.pipe(writable))` so stream errors from timeouts are caught properly, and increased the download timeout from 10s to 120s ([#2066](https://github.com/code-yeongyu/senpi-mono/issues/2066))
1150
1192
 
1151
1193
  ## [0.58.0] - 2026-03-14
1152
1194
 
1153
1195
  ### New Features
1154
1196
 
1155
- - Claude Opus 4.6, Sonnet 4.6, and related Bedrock models now use a 1M token context window (up from 200K) ([#2135](https://github.com/code-yeongyu/sanepi-mono/pull/2135) by [@mitsuhiko](https://github.com/mitsuhiko)).
1197
+ - Claude Opus 4.6, Sonnet 4.6, and related Bedrock models now use a 1M token context window (up from 200K) ([#2135](https://github.com/code-yeongyu/senpi-mono/pull/2135) by [@mitsuhiko](https://github.com/mitsuhiko)).
1156
1198
  - Extension tool calls now execute in parallel by default, with sequential `tool_call` preflight preserved for extension interception.
1157
- - `GOOGLE_CLOUD_API_KEY` environment variable support for the `google-vertex` provider as an alternative to Application Default Credentials ([#1976](https://github.com/code-yeongyu/sanepi-mono/pull/1976) by [@gordonhwc](https://github.com/gordonhwc)).
1158
- - Extensions can supply deterministic session IDs via `newSession()` ([#2130](https://github.com/code-yeongyu/sanepi-mono/pull/2130) by [@zhahaoyu](https://github.com/zhahaoyu)).
1199
+ - `GOOGLE_CLOUD_API_KEY` environment variable support for the `google-vertex` provider as an alternative to Application Default Credentials ([#1976](https://github.com/code-yeongyu/senpi-mono/pull/1976) by [@gordonhwc](https://github.com/gordonhwc)).
1200
+ - Extensions can supply deterministic session IDs via `newSession()` ([#2130](https://github.com/code-yeongyu/senpi-mono/pull/2130) by [@zhahaoyu](https://github.com/zhahaoyu)).
1159
1201
 
1160
1202
  ### Added
1161
1203
 
1162
- - Added `GOOGLE_CLOUD_API_KEY` environment variable support for the `google-vertex` provider as an alternative to Application Default Credentials ([#1976](https://github.com/code-yeongyu/sanepi-mono/pull/1976) by [@gordonhwc](https://github.com/gordonhwc))
1163
- - Added custom session ID support in `newSession()` for extensions that need deterministic session paths ([#2130](https://github.com/code-yeongyu/sanepi-mono/pull/2130) by [@zhahaoyu](https://github.com/zhahaoyu))
1204
+ - Added `GOOGLE_CLOUD_API_KEY` environment variable support for the `google-vertex` provider as an alternative to Application Default Credentials ([#1976](https://github.com/code-yeongyu/senpi-mono/pull/1976) by [@gordonhwc](https://github.com/gordonhwc))
1205
+ - Added custom session ID support in `newSession()` for extensions that need deterministic session paths ([#2130](https://github.com/code-yeongyu/senpi-mono/pull/2130) by [@zhahaoyu](https://github.com/zhahaoyu))
1164
1206
 
1165
1207
  ### Changed
1166
1208
 
1167
1209
  - Changed extension tool interception to use agent-core `beforeToolCall` and `afterToolCall` hooks instead of wrapper-based interception. Tool calls now execute in parallel by default, extension `tool_call` preflight still runs sequentially, and final tool results are emitted in assistant source order.
1168
- - Raised Claude Opus 4.6, Sonnet 4.6, and related Bedrock model context windows from 200K to 1M tokens ([#2135](https://github.com/code-yeongyu/sanepi-mono/pull/2135) by [@mitsuhiko](https://github.com/mitsuhiko))
1210
+ - Raised Claude Opus 4.6, Sonnet 4.6, and related Bedrock model context windows from 200K to 1M tokens ([#2135](https://github.com/code-yeongyu/senpi-mono/pull/2135) by [@mitsuhiko](https://github.com/mitsuhiko))
1169
1211
 
1170
1212
  ### Fixed
1171
1213
 
1172
1214
  - Fixed `tool_call` extension handlers observing stale `sessionManager` state during multi-tool turns by draining queued agent events before each `tool_call` preflight. In parallel tool mode this guarantees state through the current assistant tool-calling message, but not sibling tool results from the same assistant message.
1173
- - Fixed interactive input fields backed by the TUI `Input` component to scroll by visual column width for wide Unicode text (CJK, fullwidth characters), preventing rendered line overflow and TUI crashes in places like search and filter inputs ([#1982](https://github.com/code-yeongyu/sanepi-mono/issues/1982))
1215
+ - Fixed interactive input fields backed by the TUI `Input` component to scroll by visual column width for wide Unicode text (CJK, fullwidth characters), preventing rendered line overflow and TUI crashes in places like search and filter inputs ([#1982](https://github.com/code-yeongyu/senpi-mono/issues/1982))
1174
1216
  - Fixed `shift+tab` and other modified Tab bindings in tmux when `extended-keys-format` is left at the default `xterm`
1175
- - Fixed EXIF orientation not being applied during image convert and resize, causing JPEG and WebP images from phone cameras to display rotated or mirrored ([#2105](https://github.com/code-yeongyu/sanepi-mono/pull/2105) by [@melihmucuk](https://github.com/melihmucuk))
1176
- - Fixed the default coding-agent system prompt to include only the current date in ISO format, not the current time, so prompt prefixes stay cacheable across reloads and resumed sessions ([#2131](https://github.com/code-yeongyu/sanepi-mono/issues/2131))
1177
- - Fixed retry regex to match `server_error` and `internal_error` error types from providers, improving automatic retry coverage ([#2117](https://github.com/code-yeongyu/sanepi-mono/pull/2117) by [@MadKangYu](https://github.com/MadKangYu))
1178
- - Fixed example extensions to support `PI_CODING_AGENT_DIR` environment variable for custom agent directory paths ([#2009](https://github.com/code-yeongyu/sanepi-mono/pull/2009) by [@smithbm2316](https://github.com/smithbm2316))
1179
- - Fixed tool result images not being sent in `function_call_output` items for OpenAI Responses API providers, causing image data to be silently dropped in tool results ([#2104](https://github.com/code-yeongyu/sanepi-mono/issues/2104))
1180
- - Fixed assistant content being sent as structured content blocks instead of plain strings in the `openai-completions` provider, causing errors with some OpenAI-compatible backends ([#2008](https://github.com/code-yeongyu/sanepi-mono/pull/2008) by [@geraldoaax](https://github.com/geraldoaax))
1181
- - Fixed error details in OpenAI Responses `response.failed` handler to include status code, error code, and message instead of a generic failure ([#1956](https://github.com/code-yeongyu/sanepi-mono/pull/1956) by [@drewburr](https://github.com/drewburr))
1217
+ - Fixed EXIF orientation not being applied during image convert and resize, causing JPEG and WebP images from phone cameras to display rotated or mirrored ([#2105](https://github.com/code-yeongyu/senpi-mono/pull/2105) by [@melihmucuk](https://github.com/melihmucuk))
1218
+ - Fixed the default coding-agent system prompt to include only the current date in ISO format, not the current time, so prompt prefixes stay cacheable across reloads and resumed sessions ([#2131](https://github.com/code-yeongyu/senpi-mono/issues/2131))
1219
+ - Fixed retry regex to match `server_error` and `internal_error` error types from providers, improving automatic retry coverage ([#2117](https://github.com/code-yeongyu/senpi-mono/pull/2117) by [@MadKangYu](https://github.com/MadKangYu))
1220
+ - Fixed example extensions to support `PI_CODING_AGENT_DIR` environment variable for custom agent directory paths ([#2009](https://github.com/code-yeongyu/senpi-mono/pull/2009) by [@smithbm2316](https://github.com/smithbm2316))
1221
+ - Fixed tool result images not being sent in `function_call_output` items for OpenAI Responses API providers, causing image data to be silently dropped in tool results ([#2104](https://github.com/code-yeongyu/senpi-mono/issues/2104))
1222
+ - Fixed assistant content being sent as structured content blocks instead of plain strings in the `openai-completions` provider, causing errors with some OpenAI-compatible backends ([#2008](https://github.com/code-yeongyu/senpi-mono/pull/2008) by [@geraldoaax](https://github.com/geraldoaax))
1223
+ - Fixed error details in OpenAI Responses `response.failed` handler to include status code, error code, and message instead of a generic failure ([#1956](https://github.com/code-yeongyu/senpi-mono/pull/1956) by [@drewburr](https://github.com/drewburr))
1182
1224
  - Fixed GitHub Copilot device-code login polling to respect OAuth slow-down intervals, wait before the first token poll, and include a clearer clock-drift hint in WSL/VM environments when repeated slow-downs lead to timeout
1183
- - Fixed usage statistics not being captured for OpenAI-compatible providers that return usage in `choice.usage` instead of the standard `chunk.usage` (e.g., Moonshot/Kimi) ([#2017](https://github.com/code-yeongyu/sanepi-mono/issues/2017))
1184
- - Fixed editor scroll indicator rendering crash in narrow terminal widths ([#2103](https://github.com/code-yeongyu/sanepi-mono/pull/2103) by [@haoqixu](https://github.com/haoqixu))
1185
- - Fixed tab characters in editor and input paste not being normalized to spaces ([#2027](https://github.com/code-yeongyu/sanepi-mono/pull/2027), [#1975](https://github.com/code-yeongyu/sanepi-mono/pull/1975) by [@haoqixu](https://github.com/haoqixu))
1186
- - Fixed `wordWrapLine` overflow when wide characters (CJK, fullwidth) fall exactly at the wrap boundary ([#2082](https://github.com/code-yeongyu/sanepi-mono/pull/2082) by [@haoqixu](https://github.com/haoqixu))
1187
- - Fixed paste markers not being treated as atomic segments in editor word wrapping and cursor navigation ([#2111](https://github.com/code-yeongyu/sanepi-mono/pull/2111) by [@haoqixu](https://github.com/haoqixu))
1225
+ - Fixed usage statistics not being captured for OpenAI-compatible providers that return usage in `choice.usage` instead of the standard `chunk.usage` (e.g., Moonshot/Kimi) ([#2017](https://github.com/code-yeongyu/senpi-mono/issues/2017))
1226
+ - Fixed editor scroll indicator rendering crash in narrow terminal widths ([#2103](https://github.com/code-yeongyu/senpi-mono/pull/2103) by [@haoqixu](https://github.com/haoqixu))
1227
+ - Fixed tab characters in editor and input paste not being normalized to spaces ([#2027](https://github.com/code-yeongyu/senpi-mono/pull/2027), [#1975](https://github.com/code-yeongyu/senpi-mono/pull/1975) by [@haoqixu](https://github.com/haoqixu))
1228
+ - Fixed `wordWrapLine` overflow when wide characters (CJK, fullwidth) fall exactly at the wrap boundary ([#2082](https://github.com/code-yeongyu/senpi-mono/pull/2082) by [@haoqixu](https://github.com/haoqixu))
1229
+ - Fixed paste markers not being treated as atomic segments in editor word wrapping and cursor navigation ([#2111](https://github.com/code-yeongyu/senpi-mono/pull/2111) by [@haoqixu](https://github.com/haoqixu))
1188
1230
 
1189
1231
  ## [0.57.1] - 2026-03-07
1190
1232
 
@@ -1194,18 +1236,18 @@ Examples:
1194
1236
  - Digit keybindings (`0-9`) in the TUI keybinding system, including modified combos like `ctrl+1`. See [docs/keybindings.md](docs/keybindings.md).
1195
1237
 
1196
1238
  ### Added
1197
- - Added `/tree` branch folding and segment-jump navigation with `Ctrl+←`/`Ctrl+→` and `Alt+←`/`Alt+→`, while keeping `←`/`→` and `Page Up`/`Page Down` for paging ([#1724](https://github.com/code-yeongyu/sanepi-mono/pull/1724) by [@Perlence](https://github.com/Perlence))
1198
- - Added `session_directory` extension event that fires before session manager creation, allowing extensions to customize the session directory path based on cwd and other factors. CLI `--session-dir` flag takes precedence over extension-provided paths ([#1730](https://github.com/code-yeongyu/sanepi-mono/pull/1730) by [@hjanuschka](https://github.com/hjanuschka)).
1199
- - Added digit keys (`0-9`) to the keybinding system, including Kitty CSI-u and xterm `modifyOtherKeys` support for bindings like `ctrl+1` ([#1905](https://github.com/code-yeongyu/sanepi-mono/issues/1905))
1239
+ - Added `/tree` branch folding and segment-jump navigation with `Ctrl+←`/`Ctrl+→` and `Alt+←`/`Alt+→`, while keeping `←`/`→` and `Page Up`/`Page Down` for paging ([#1724](https://github.com/code-yeongyu/senpi-mono/pull/1724) by [@Perlence](https://github.com/Perlence))
1240
+ - Added `session_directory` extension event that fires before session manager creation, allowing extensions to customize the session directory path based on cwd and other factors. CLI `--session-dir` flag takes precedence over extension-provided paths ([#1730](https://github.com/code-yeongyu/senpi-mono/pull/1730) by [@hjanuschka](https://github.com/hjanuschka)).
1241
+ - Added digit keys (`0-9`) to the keybinding system, including Kitty CSI-u and xterm `modifyOtherKeys` support for bindings like `ctrl+1` ([#1905](https://github.com/code-yeongyu/senpi-mono/issues/1905))
1200
1242
 
1201
1243
  ### Fixed
1202
- - Fixed custom tool collapsed/expanded rendering in HTML exports. Custom tools that define different collapsed vs expanded displays now render correctly in exported HTML, with expandable sections when both states differ and direct display when only expanded exists ([#1934](https://github.com/code-yeongyu/sanepi-mono/pull/1934) by [@aliou](https://github.com/aliou))
1203
- - Fixed tmux startup guidance and keyboard setup warnings for modified key handling, including Ghostty `shift+enter=text:\n` remap guidance and tmux `extended-keys-format` detection ([#1872](https://github.com/code-yeongyu/sanepi-mono/issues/1872))
1204
- - Fixed z.ai context overflow recovery so `model_context_window_exceeded` errors trigger auto-compaction instead of surfacing as unhandled stop reason failures ([#1937](https://github.com/code-yeongyu/sanepi-mono/issues/1937))
1205
- - Fixed autocomplete selection ignoring typed text: highlight now follows the first prefix match as the user types, and exact matches are always selected on Enter ([#1931](https://github.com/code-yeongyu/sanepi-mono/pull/1931) by [@aliou](https://github.com/aliou))
1206
- - Fixed slash-command Tab completion to immediately open argument completions when available ([#1481](https://github.com/code-yeongyu/sanepi-mono/pull/1481) by [@barapa](https://github.com/barapa))
1207
- - Fixed explicit `pi -e <path>` extensions losing command and tool conflicts to discovered extensions by giving CLI-loaded extensions higher precedence ([#1896](https://github.com/code-yeongyu/sanepi-mono/issues/1896))
1208
- - Fixed Windows external editor launch for `Ctrl+G` and `ctx.ui.editor()` so shell-based commands like `EDITOR="code --wait"` work correctly ([#1925](https://github.com/code-yeongyu/sanepi-mono/issues/1925))
1244
+ - Fixed custom tool collapsed/expanded rendering in HTML exports. Custom tools that define different collapsed vs expanded displays now render correctly in exported HTML, with expandable sections when both states differ and direct display when only expanded exists ([#1934](https://github.com/code-yeongyu/senpi-mono/pull/1934) by [@aliou](https://github.com/aliou))
1245
+ - Fixed tmux startup guidance and keyboard setup warnings for modified key handling, including Ghostty `shift+enter=text:\n` remap guidance and tmux `extended-keys-format` detection ([#1872](https://github.com/code-yeongyu/senpi-mono/issues/1872))
1246
+ - Fixed z.ai context overflow recovery so `model_context_window_exceeded` errors trigger auto-compaction instead of surfacing as unhandled stop reason failures ([#1937](https://github.com/code-yeongyu/senpi-mono/issues/1937))
1247
+ - Fixed autocomplete selection ignoring typed text: highlight now follows the first prefix match as the user types, and exact matches are always selected on Enter ([#1931](https://github.com/code-yeongyu/senpi-mono/pull/1931) by [@aliou](https://github.com/aliou))
1248
+ - Fixed slash-command Tab completion to immediately open argument completions when available ([#1481](https://github.com/code-yeongyu/senpi-mono/pull/1481) by [@barapa](https://github.com/barapa))
1249
+ - Fixed explicit `pi -e <path>` extensions losing command and tool conflicts to discovered extensions by giving CLI-loaded extensions higher precedence ([#1896](https://github.com/code-yeongyu/senpi-mono/issues/1896))
1250
+ - Fixed Windows external editor launch for `Ctrl+G` and `ctx.ui.editor()` so shell-based commands like `EDITOR="code --wait"` work correctly ([#1925](https://github.com/code-yeongyu/senpi-mono/issues/1925))
1209
1251
 
1210
1252
  ## [0.57.0] - 2026-03-07
1211
1253
 
@@ -1217,62 +1259,62 @@ Examples:
1217
1259
 
1218
1260
  ### Breaking Changes
1219
1261
 
1220
- - RPC mode now uses strict LF-delimited JSONL framing. Clients must split records on `\n` only instead of using generic line readers such as Node `readline`, which also split on Unicode separators inside JSON payloads ([#1911](https://github.com/code-yeongyu/sanepi-mono/issues/1911))
1262
+ - RPC mode now uses strict LF-delimited JSONL framing. Clients must split records on `\n` only instead of using generic line readers such as Node `readline`, which also split on Unicode separators inside JSON payloads ([#1911](https://github.com/code-yeongyu/senpi-mono/issues/1911))
1221
1263
 
1222
1264
  ### Added
1223
1265
 
1224
1266
  - Added `before_provider_request` extension hook so extensions can inspect or replace provider payloads before requests are sent, with an example in `examples/extensions/provider-payload.ts`
1225
- - Added non-capturing overlay focus control for extension UIs via `OverlayOptions.nonCapturing` and `OverlayHandle.focus()` / `unfocus()` / `isFocused()` ([#1916](https://github.com/code-yeongyu/sanepi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
1267
+ - Added non-capturing overlay focus control for extension UIs via `OverlayOptions.nonCapturing` and `OverlayHandle.focus()` / `unfocus()` / `isFocused()` ([#1916](https://github.com/code-yeongyu/senpi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
1226
1268
 
1227
1269
  ### Changed
1228
1270
 
1229
- - Overlay compositing in extension UIs now uses focus order so focused overlays render on top while preserving stack semantics for show/hide behavior ([#1916](https://github.com/code-yeongyu/sanepi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
1271
+ - Overlay compositing in extension UIs now uses focus order so focused overlays render on top while preserving stack semantics for show/hide behavior ([#1916](https://github.com/code-yeongyu/senpi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
1230
1272
 
1231
1273
  ### Fixed
1232
1274
 
1233
- - Fixed RPC mode stdin/stdout framing to use strict LF-delimited JSONL instead of `readline`, so payloads containing `U+2028` or `U+2029` no longer corrupt command or event streams ([#1911](https://github.com/code-yeongyu/sanepi-mono/issues/1911))
1234
- - Fixed automatic overlay focus restoration in extension UIs to skip non-capturing overlays, and fixed overlay hide behavior to only reassign focus when the hidden overlay had focus ([#1916](https://github.com/code-yeongyu/sanepi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
1235
- - Fixed `pi config` misclassifying `~/.agents/skills` as project-scoped in non-git directories under `$HOME`, so toggling those skills no longer writes project overrides to `.senpi/settings.json` ([#1915](https://github.com/code-yeongyu/sanepi-mono/issues/1915))
1275
+ - Fixed RPC mode stdin/stdout framing to use strict LF-delimited JSONL instead of `readline`, so payloads containing `U+2028` or `U+2029` no longer corrupt command or event streams ([#1911](https://github.com/code-yeongyu/senpi-mono/issues/1911))
1276
+ - Fixed automatic overlay focus restoration in extension UIs to skip non-capturing overlays, and fixed overlay hide behavior to only reassign focus when the hidden overlay had focus ([#1916](https://github.com/code-yeongyu/senpi-mono/pull/1916) by [@nicobailon](https://github.com/nicobailon))
1277
+ - Fixed `pi config` misclassifying `~/.agents/skills` as project-scoped in non-git directories under `$HOME`, so toggling those skills no longer writes project overrides to `.senpi/settings.json` ([#1915](https://github.com/code-yeongyu/senpi-mono/issues/1915))
1236
1278
 
1237
1279
  ## [0.56.3] - 2026-03-06
1238
1280
 
1239
1281
  ### New Features
1240
1282
 
1241
- - `claude-sonnet-4-6` model available via the `google-antigravity` provider ([#1859](https://github.com/code-yeongyu/sanepi-mono/issues/1859))
1242
- - Custom editors can now define their own `onEscape`/`onCtrlD` handlers without being overwritten by app defaults, enabling vim-mode extensions ([#1838](https://github.com/code-yeongyu/sanepi-mono/issues/1838))
1243
- - Shift+Enter and Ctrl+Enter now work inside tmux via xterm modifyOtherKeys fallback ([docs/tmux.md](docs/tmux.md), [#1872](https://github.com/code-yeongyu/sanepi-mono/issues/1872))
1244
- - Auto-compaction is now resilient to persistent API errors (e.g. 529 overloaded) and no longer retriggers spuriously after compaction ([#1834](https://github.com/code-yeongyu/sanepi-mono/issues/1834), [#1860](https://github.com/code-yeongyu/sanepi-mono/issues/1860))
1283
+ - `claude-sonnet-4-6` model available via the `google-antigravity` provider ([#1859](https://github.com/code-yeongyu/senpi-mono/issues/1859))
1284
+ - Custom editors can now define their own `onEscape`/`onCtrlD` handlers without being overwritten by app defaults, enabling vim-mode extensions ([#1838](https://github.com/code-yeongyu/senpi-mono/issues/1838))
1285
+ - Shift+Enter and Ctrl+Enter now work inside tmux via xterm modifyOtherKeys fallback ([docs/tmux.md](docs/tmux.md), [#1872](https://github.com/code-yeongyu/senpi-mono/issues/1872))
1286
+ - Auto-compaction is now resilient to persistent API errors (e.g. 529 overloaded) and no longer retriggers spuriously after compaction ([#1834](https://github.com/code-yeongyu/senpi-mono/issues/1834), [#1860](https://github.com/code-yeongyu/senpi-mono/issues/1860))
1245
1287
 
1246
1288
  ### Added
1247
1289
 
1248
- - Added `claude-sonnet-4-6` model for the `google-antigravity` provider ([#1859](https://github.com/code-yeongyu/sanepi-mono/issues/1859)).
1249
- - Added [tmux setup documentation](docs/tmux.md) for modified enter key support ([#1872](https://github.com/code-yeongyu/sanepi-mono/issues/1872))
1290
+ - Added `claude-sonnet-4-6` model for the `google-antigravity` provider ([#1859](https://github.com/code-yeongyu/senpi-mono/issues/1859)).
1291
+ - Added [tmux setup documentation](docs/tmux.md) for modified enter key support ([#1872](https://github.com/code-yeongyu/senpi-mono/issues/1872))
1250
1292
 
1251
1293
  ### Fixed
1252
1294
 
1253
- - Fixed custom editors having their `onEscape`/`onCtrlD` handlers unconditionally overwritten by app-level defaults, making vim-style escape handling impossible ([#1838](https://github.com/code-yeongyu/sanepi-mono/issues/1838))
1254
- - Fixed auto-compaction retriggering on the first prompt after compaction due to stale pre-compaction assistant usage ([#1860](https://github.com/code-yeongyu/sanepi-mono/issues/1860) by [@joelhooks](https://github.com/joelhooks))
1255
- - Fixed sessions never auto-compacting when hitting persistent API errors (e.g. 529 overloaded) by estimating context size from the last successful response ([#1834](https://github.com/code-yeongyu/sanepi-mono/issues/1834))
1256
- - Fixed compaction summarization requests exceeding context limits by truncating tool results to 2k chars ([#1796](https://github.com/code-yeongyu/sanepi-mono/issues/1796))
1257
- - Fixed `/new` leaving startup header content, including the changelog, visible after starting a fresh session ([#1880](https://github.com/code-yeongyu/sanepi-mono/issues/1880))
1258
- - Fixed misleading docs and example implying that returning `{ isError: true }` from a tool's `execute` function marks the execution as failed; errors must be signaled by throwing ([#1881](https://github.com/code-yeongyu/sanepi-mono/issues/1881))
1259
- - Fixed model switches through non-reasoning models to preserve the saved default thinking level instead of persisting a capability-forced `off` clamp ([#1864](https://github.com/code-yeongyu/sanepi-mono/issues/1864))
1260
- - Fixed parallel pi processes failing with false "No API key found" errors due to immediate lockfile contention on `auth.json` and `settings.json` ([#1871](https://github.com/code-yeongyu/sanepi-mono/issues/1871))
1261
- - Fixed OpenAI Responses reasoning replay regression that broke multi-turn reasoning continuity ([#1878](https://github.com/code-yeongyu/sanepi-mono/issues/1878))
1295
+ - Fixed custom editors having their `onEscape`/`onCtrlD` handlers unconditionally overwritten by app-level defaults, making vim-style escape handling impossible ([#1838](https://github.com/code-yeongyu/senpi-mono/issues/1838))
1296
+ - Fixed auto-compaction retriggering on the first prompt after compaction due to stale pre-compaction assistant usage ([#1860](https://github.com/code-yeongyu/senpi-mono/issues/1860) by [@joelhooks](https://github.com/joelhooks))
1297
+ - Fixed sessions never auto-compacting when hitting persistent API errors (e.g. 529 overloaded) by estimating context size from the last successful response ([#1834](https://github.com/code-yeongyu/senpi-mono/issues/1834))
1298
+ - Fixed compaction summarization requests exceeding context limits by truncating tool results to 2k chars ([#1796](https://github.com/code-yeongyu/senpi-mono/issues/1796))
1299
+ - Fixed `/new` leaving startup header content, including the changelog, visible after starting a fresh session ([#1880](https://github.com/code-yeongyu/senpi-mono/issues/1880))
1300
+ - Fixed misleading docs and example implying that returning `{ isError: true }` from a tool's `execute` function marks the execution as failed; errors must be signaled by throwing ([#1881](https://github.com/code-yeongyu/senpi-mono/issues/1881))
1301
+ - Fixed model switches through non-reasoning models to preserve the saved default thinking level instead of persisting a capability-forced `off` clamp ([#1864](https://github.com/code-yeongyu/senpi-mono/issues/1864))
1302
+ - Fixed parallel pi processes failing with false "No API key found" errors due to immediate lockfile contention on `auth.json` and `settings.json` ([#1871](https://github.com/code-yeongyu/senpi-mono/issues/1871))
1303
+ - Fixed OpenAI Responses reasoning replay regression that broke multi-turn reasoning continuity ([#1878](https://github.com/code-yeongyu/senpi-mono/issues/1878))
1262
1304
 
1263
1305
  ## [0.56.2] - 2026-03-05
1264
1306
 
1265
1307
  ### New Features
1266
1308
 
1267
1309
  - GPT-5.4 support across `openai`, `openai-codex`, `azure-openai-responses`, and `opencode`, with `gpt-5.4` now the default for `openai` and `openai-codex` ([README.md](README.md), [docs/providers.md](docs/providers.md)).
1268
- - `treeFilterMode` setting to choose the default `/tree` filter mode (`default`, `no-tools`, `user-only`, `labeled-only`, `all`) ([docs/settings.md](docs/settings.md), [#1852](https://github.com/code-yeongyu/sanepi-mono/pull/1852) by [@lajarre](https://github.com/lajarre)).
1269
- - Mistral native conversations integration with SDK-backed provider behavior, preserving Mistral-specific thinking and replay semantics ([README.md](README.md), [docs/providers.md](docs/providers.md), [#1716](https://github.com/code-yeongyu/sanepi-mono/issues/1716)).
1310
+ - `treeFilterMode` setting to choose the default `/tree` filter mode (`default`, `no-tools`, `user-only`, `labeled-only`, `all`) ([docs/settings.md](docs/settings.md), [#1852](https://github.com/code-yeongyu/senpi-mono/pull/1852) by [@lajarre](https://github.com/lajarre)).
1311
+ - Mistral native conversations integration with SDK-backed provider behavior, preserving Mistral-specific thinking and replay semantics ([README.md](README.md), [docs/providers.md](docs/providers.md), [#1716](https://github.com/code-yeongyu/senpi-mono/issues/1716)).
1270
1312
 
1271
1313
  ### Added
1272
1314
 
1273
1315
  - Added `gpt-5.4` model availability for `openai`, `openai-codex`, `azure-openai-responses`, and `opencode` providers.
1274
- - Added `gpt-5.3-codex` fallback model availability for `github-copilot` until upstream model catalogs include it ([#1853](https://github.com/code-yeongyu/sanepi-mono/issues/1853)).
1275
- - Added `treeFilterMode` setting to choose the default `/tree` filter mode (`default`, `no-tools`, `user-only`, `labeled-only`, `all`) ([#1852](https://github.com/code-yeongyu/sanepi-mono/pull/1852) by [@lajarre](https://github.com/lajarre)).
1316
+ - Added `gpt-5.3-codex` fallback model availability for `github-copilot` until upstream model catalogs include it ([#1853](https://github.com/code-yeongyu/senpi-mono/issues/1853)).
1317
+ - Added `treeFilterMode` setting to choose the default `/tree` filter mode (`default`, `no-tools`, `user-only`, `labeled-only`, `all`) ([#1852](https://github.com/code-yeongyu/senpi-mono/pull/1852) by [@lajarre](https://github.com/lajarre)).
1276
1318
 
1277
1319
  ### Changed
1278
1320
 
@@ -1280,42 +1322,42 @@ Examples:
1280
1322
 
1281
1323
  ### Fixed
1282
1324
 
1283
- - Fixed GPT-5.3 Codex follow-up turns dropping OpenAI Responses assistant `phase` metadata by preserving replayable signatures in session history and forwarding `phase` back to the Responses API ([#1819](https://github.com/code-yeongyu/sanepi-mono/issues/1819)).
1325
+ - Fixed GPT-5.3 Codex follow-up turns dropping OpenAI Responses assistant `phase` metadata by preserving replayable signatures in session history and forwarding `phase` back to the Responses API ([#1819](https://github.com/code-yeongyu/senpi-mono/issues/1819)).
1284
1326
  - Fixed OpenAI Responses replay to omit empty thinking blocks, avoiding invalid no-op reasoning items in follow-up turns.
1285
- - Updated Mistral integration to use the native SDK-backed provider and conversations API, including coding-agent model/provider wiring and Mistral setup documentation ([#1716](https://github.com/code-yeongyu/sanepi-mono/issues/1716)).
1286
- - Fixed Antigravity reliability: endpoint cascade on 403/404, added autopush sandbox fallback, removed extra fingerprint headers ([#1830](https://github.com/code-yeongyu/sanepi-mono/issues/1830)).
1287
- - Fixed `@earendil-works/pi-ai/oauth` extension imports in published installs by resolving the subpath directly from built `dist` files instead of package-root wrapper shims ([#1856](https://github.com/code-yeongyu/sanepi-mono/issues/1856)).
1288
- - Fixed Gemini 3 multi-turn tool use losing structured context by using `skip_thought_signature_validator` sentinel for unsigned function calls instead of text fallback ([#1829](https://github.com/code-yeongyu/sanepi-mono/issues/1829)).
1289
- - Fixed model selector filter not accepting typed characters in VS Code 1.110+ due to missing Kitty CSI-u printable decoding in the `Input` component ([#1857](https://github.com/code-yeongyu/sanepi-mono/issues/1857))
1290
- - Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/code-yeongyu/sanepi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
1291
- - Fixed footer width truncation for wide Unicode text (session name, model, provider) to prevent TUI crashes from rendered lines exceeding terminal width ([#1833](https://github.com/code-yeongyu/sanepi-mono/issues/1833)).
1292
- - Fixed Windows write preview background artifacts by normalizing CRLF content (`\r\n`) to LF for display rendering in tool output previews ([#1854](https://github.com/code-yeongyu/sanepi-mono/issues/1854)).
1327
+ - Updated Mistral integration to use the native SDK-backed provider and conversations API, including coding-agent model/provider wiring and Mistral setup documentation ([#1716](https://github.com/code-yeongyu/senpi-mono/issues/1716)).
1328
+ - Fixed Antigravity reliability: endpoint cascade on 403/404, added autopush sandbox fallback, removed extra fingerprint headers ([#1830](https://github.com/code-yeongyu/senpi-mono/issues/1830)).
1329
+ - Fixed `@earendil-works/pi-ai/oauth` extension imports in published installs by resolving the subpath directly from built `dist` files instead of package-root wrapper shims ([#1856](https://github.com/code-yeongyu/senpi-mono/issues/1856)).
1330
+ - Fixed Gemini 3 multi-turn tool use losing structured context by using `skip_thought_signature_validator` sentinel for unsigned function calls instead of text fallback ([#1829](https://github.com/code-yeongyu/senpi-mono/issues/1829)).
1331
+ - Fixed model selector filter not accepting typed characters in VS Code 1.110+ due to missing Kitty CSI-u printable decoding in the `Input` component ([#1857](https://github.com/code-yeongyu/senpi-mono/issues/1857))
1332
+ - Fixed editor/footer visibility drift during terminal resize by forcing full redraws when terminal width or height changes ([#1844](https://github.com/code-yeongyu/senpi-mono/pull/1844) by [@ghoulr](https://github.com/ghoulr)).
1333
+ - Fixed footer width truncation for wide Unicode text (session name, model, provider) to prevent TUI crashes from rendered lines exceeding terminal width ([#1833](https://github.com/code-yeongyu/senpi-mono/issues/1833)).
1334
+ - Fixed Windows write preview background artifacts by normalizing CRLF content (`\r\n`) to LF for display rendering in tool output previews ([#1854](https://github.com/code-yeongyu/senpi-mono/issues/1854)).
1293
1335
 
1294
1336
  ## [0.56.1] - 2026-03-05
1295
1337
 
1296
1338
  ### Fixed
1297
1339
 
1298
- - Fixed extension alias fallback resolution to use ESM-aware resolution for `jiti` aliases in global installs ([#1821](https://github.com/code-yeongyu/sanepi-mono/pull/1821) by [@Perlence](https://github.com/Perlence))
1340
+ - Fixed extension alias fallback resolution to use ESM-aware resolution for `jiti` aliases in global installs ([#1821](https://github.com/code-yeongyu/senpi-mono/pull/1821) by [@Perlence](https://github.com/Perlence))
1299
1341
  - Fixed markdown blockquote rendering to isolate blockquote styling from default text style, preventing style leakage.
1300
1342
 
1301
1343
  ## [0.56.0] - 2026-03-04
1302
1344
 
1303
1345
  ### New Features
1304
1346
 
1305
- - Added OpenCode Go provider support with `opencode-go` model defaults and `OPENCODE_API_KEY` environment variable support ([docs/providers.md](docs/providers.md), [#1757](https://github.com/code-yeongyu/sanepi-mono/issues/1757)).
1306
- - Added `branchSummary.skipPrompt` setting to skip branch summarization prompts during tree navigation ([docs/settings.md](docs/settings.md), [#1792](https://github.com/code-yeongyu/sanepi-mono/issues/1792)).
1307
- - Added `gemini-3.1-flash-lite-preview` fallback model availability for Google provider catalogs when upstream model metadata lags ([README.md](README.md), [#1785](https://github.com/code-yeongyu/sanepi-mono/issues/1785)).
1347
+ - Added OpenCode Go provider support with `opencode-go` model defaults and `OPENCODE_API_KEY` environment variable support ([docs/providers.md](docs/providers.md), [#1757](https://github.com/code-yeongyu/senpi-mono/issues/1757)).
1348
+ - Added `branchSummary.skipPrompt` setting to skip branch summarization prompts during tree navigation ([docs/settings.md](docs/settings.md), [#1792](https://github.com/code-yeongyu/senpi-mono/issues/1792)).
1349
+ - Added `gemini-3.1-flash-lite-preview` fallback model availability for Google provider catalogs when upstream model metadata lags ([README.md](README.md), [#1785](https://github.com/code-yeongyu/senpi-mono/issues/1785)).
1308
1350
 
1309
1351
  ### Breaking Changes
1310
1352
 
1311
1353
  - Changed scoped model thinking semantics. Scoped entries without an explicit `:<thinking>` suffix now inherit the current session thinking level when selected, instead of applying a startup-captured default.
1312
- - Moved Node OAuth runtime exports off the top-level `@earendil-works/pi-ai` entry. OAuth login and refresh must be imported from `@earendil-works/pi-ai/oauth` ([#1814](https://github.com/code-yeongyu/sanepi-mono/issues/1814)).
1354
+ - Moved Node OAuth runtime exports off the top-level `@earendil-works/pi-ai` entry. OAuth login and refresh must be imported from `@earendil-works/pi-ai/oauth` ([#1814](https://github.com/code-yeongyu/senpi-mono/issues/1814)).
1313
1355
 
1314
1356
  ### Added
1315
1357
 
1316
- - Added `branchSummary.skipPrompt` setting to skip the summary prompt when navigating branches ([#1792](https://github.com/code-yeongyu/sanepi-mono/issues/1792)).
1317
- - Added OpenCode Go provider support with `opencode-go` model defaults and `OPENCODE_API_KEY` environment variable support ([#1757](https://github.com/code-yeongyu/sanepi-mono/issues/1757)).
1318
- - Added `gemini-3.1-flash-lite-preview` fallback model availability in provider catalogs when upstream catalogs lag ([#1785](https://github.com/code-yeongyu/sanepi-mono/issues/1785)).
1358
+ - Added `branchSummary.skipPrompt` setting to skip the summary prompt when navigating branches ([#1792](https://github.com/code-yeongyu/senpi-mono/issues/1792)).
1359
+ - Added OpenCode Go provider support with `opencode-go` model defaults and `OPENCODE_API_KEY` environment variable support ([#1757](https://github.com/code-yeongyu/senpi-mono/issues/1757)).
1360
+ - Added `gemini-3.1-flash-lite-preview` fallback model availability in provider catalogs when upstream catalogs lag ([#1785](https://github.com/code-yeongyu/senpi-mono/issues/1785)).
1319
1361
 
1320
1362
  ### Changed
1321
1363
 
@@ -1324,86 +1366,86 @@ Examples:
1324
1366
  ### Fixed
1325
1367
 
1326
1368
  - Fixed IME hardware cursor positioning in the custom extension editor (`ctx.ui.editor()` / extension editor dialog) by propagating focus to the internal `Editor`, preventing the terminal cursor from getting stuck at the bottom-right during composition.
1327
- - Added OSC 133 semantic zone markers around rendered user messages to support terminal navigation between prompts in iTerm2, WezTerm, Kitty, Ghostty, and other compatible terminals ([#1805](https://github.com/code-yeongyu/sanepi-mono/issues/1805)).
1328
- - Fixed markdown blockquotes dropping nested list content in the TUI renderer ([#1787](https://github.com/code-yeongyu/sanepi-mono/issues/1787)).
1329
- - Fixed TUI width handling for regional indicator symbols to prevent wrap drift and stale characters during streaming ([#1783](https://github.com/code-yeongyu/sanepi-mono/issues/1783)).
1330
- - Fixed Kitty CSI-u handling to ignore unsupported modifiers so modifier-only events do not insert printable characters ([#1807](https://github.com/code-yeongyu/sanepi-mono/issues/1807)).
1331
- - Fixed single-line paste handling to insert text atomically and avoid repeated `@` autocomplete scans on large pastes ([#1812](https://github.com/code-yeongyu/sanepi-mono/issues/1812)).
1332
- - Fixed extension loading with the new `@earendil-works/pi-ai/oauth` export path by aliasing the oauth subpath in the extension loader and development path mapping ([#1814](https://github.com/code-yeongyu/sanepi-mono/issues/1814)).
1333
- - Fixed browser-safe provider loading regressions by preloading the Bedrock provider module in compiled Bun binaries and rebuilding binaries against fresh workspace dependencies ([#1814](https://github.com/code-yeongyu/sanepi-mono/issues/1814)).
1334
- - Fixed GNU screen terminal detection by downgrading theme output to 256-color mode for `screen*` TERM values ([#1809](https://github.com/code-yeongyu/sanepi-mono/issues/1809)).
1335
- - Fixed branch summarization queue handling so messages typed while summaries are generated are processed correctly ([#1803](https://github.com/code-yeongyu/sanepi-mono/issues/1803)).
1336
- - Fixed compaction summary requests to avoid reasoning output for non-reasoning models ([#1793](https://github.com/code-yeongyu/sanepi-mono/issues/1793)).
1369
+ - Added OSC 133 semantic zone markers around rendered user messages to support terminal navigation between prompts in iTerm2, WezTerm, Kitty, Ghostty, and other compatible terminals ([#1805](https://github.com/code-yeongyu/senpi-mono/issues/1805)).
1370
+ - Fixed markdown blockquotes dropping nested list content in the TUI renderer ([#1787](https://github.com/code-yeongyu/senpi-mono/issues/1787)).
1371
+ - Fixed TUI width handling for regional indicator symbols to prevent wrap drift and stale characters during streaming ([#1783](https://github.com/code-yeongyu/senpi-mono/issues/1783)).
1372
+ - Fixed Kitty CSI-u handling to ignore unsupported modifiers so modifier-only events do not insert printable characters ([#1807](https://github.com/code-yeongyu/senpi-mono/issues/1807)).
1373
+ - Fixed single-line paste handling to insert text atomically and avoid repeated `@` autocomplete scans on large pastes ([#1812](https://github.com/code-yeongyu/senpi-mono/issues/1812)).
1374
+ - Fixed extension loading with the new `@earendil-works/pi-ai/oauth` export path by aliasing the oauth subpath in the extension loader and development path mapping ([#1814](https://github.com/code-yeongyu/senpi-mono/issues/1814)).
1375
+ - Fixed browser-safe provider loading regressions by preloading the Bedrock provider module in compiled Bun binaries and rebuilding binaries against fresh workspace dependencies ([#1814](https://github.com/code-yeongyu/senpi-mono/issues/1814)).
1376
+ - Fixed GNU screen terminal detection by downgrading theme output to 256-color mode for `screen*` TERM values ([#1809](https://github.com/code-yeongyu/senpi-mono/issues/1809)).
1377
+ - Fixed branch summarization queue handling so messages typed while summaries are generated are processed correctly ([#1803](https://github.com/code-yeongyu/senpi-mono/issues/1803)).
1378
+ - Fixed compaction summary requests to avoid reasoning output for non-reasoning models ([#1793](https://github.com/code-yeongyu/senpi-mono/issues/1793)).
1337
1379
  - Fixed overflow auto-compaction cascades so a single overflow does not trigger repeated compaction loops.
1338
- - Fixed `models.json` to allow provider-scoped custom model ids and model-level `baseUrl` overrides ([#1759](https://github.com/code-yeongyu/sanepi-mono/issues/1759), [#1777](https://github.com/code-yeongyu/sanepi-mono/issues/1777)).
1339
- - Fixed session selector display sanitization by stripping control characters from session display text ([#1747](https://github.com/code-yeongyu/sanepi-mono/issues/1747)).
1340
- - Fixed Groq Qwen3 reasoning effort mapping for OpenAI-compatible models ([#1745](https://github.com/code-yeongyu/sanepi-mono/issues/1745)).
1341
- - Fixed Bedrock `AWS_PROFILE` region resolution by honoring profile `region` values ([#1800](https://github.com/code-yeongyu/sanepi-mono/issues/1800)).
1342
- - Fixed Gemini 3.1 thinking-level detection for `google` and `google-vertex` providers ([#1785](https://github.com/code-yeongyu/sanepi-mono/issues/1785)).
1343
- - Fixed browser bundling compatibility for `@earendil-works/pi-ai` by removing Node-only side effects from default browser import paths ([#1814](https://github.com/code-yeongyu/sanepi-mono/issues/1814)).
1380
+ - Fixed `models.json` to allow provider-scoped custom model ids and model-level `baseUrl` overrides ([#1759](https://github.com/code-yeongyu/senpi-mono/issues/1759), [#1777](https://github.com/code-yeongyu/senpi-mono/issues/1777)).
1381
+ - Fixed session selector display sanitization by stripping control characters from session display text ([#1747](https://github.com/code-yeongyu/senpi-mono/issues/1747)).
1382
+ - Fixed Groq Qwen3 reasoning effort mapping for OpenAI-compatible models ([#1745](https://github.com/code-yeongyu/senpi-mono/issues/1745)).
1383
+ - Fixed Bedrock `AWS_PROFILE` region resolution by honoring profile `region` values ([#1800](https://github.com/code-yeongyu/senpi-mono/issues/1800)).
1384
+ - Fixed Gemini 3.1 thinking-level detection for `google` and `google-vertex` providers ([#1785](https://github.com/code-yeongyu/senpi-mono/issues/1785)).
1385
+ - Fixed browser bundling compatibility for `@earendil-works/pi-ai` by removing Node-only side effects from default browser import paths ([#1814](https://github.com/code-yeongyu/senpi-mono/issues/1814)).
1344
1386
  ## [0.55.4] - 2026-03-02
1345
1387
 
1346
1388
  ### New Features
1347
1389
 
1348
- - Runtime tool registration now applies immediately in active sessions. Tools registered via `pi.registerTool()` after startup are available to `pi.getAllTools()` and the LLM without `/reload` ([docs/extensions.md](docs/extensions.md), [examples/extensions/dynamic-tools.ts](examples/extensions/dynamic-tools.ts), [#1720](https://github.com/code-yeongyu/sanepi-mono/issues/1720)).
1349
- - Tool definitions can customize the default system prompt with `promptSnippet` (`Available tools`) and `promptGuidelines` (`Guidelines`) while the tool is active ([docs/extensions.md](docs/extensions.md), [#1720](https://github.com/code-yeongyu/sanepi-mono/issues/1720)).
1350
- - Custom tool renderers can suppress transcript output without leaving extra spacing or empty transcript footprint in interactive rendering ([docs/extensions.md](docs/extensions.md), [#1719](https://github.com/code-yeongyu/sanepi-mono/pull/1719)).
1390
+ - Runtime tool registration now applies immediately in active sessions. Tools registered via `pi.registerTool()` after startup are available to `pi.getAllTools()` and the LLM without `/reload` ([docs/extensions.md](docs/extensions.md), [examples/extensions/dynamic-tools.ts](examples/extensions/dynamic-tools.ts), [#1720](https://github.com/code-yeongyu/senpi-mono/issues/1720)).
1391
+ - Tool definitions can customize the default system prompt with `promptSnippet` (`Available tools`) and `promptGuidelines` (`Guidelines`) while the tool is active ([docs/extensions.md](docs/extensions.md), [#1720](https://github.com/code-yeongyu/senpi-mono/issues/1720)).
1392
+ - Custom tool renderers can suppress transcript output without leaving extra spacing or empty transcript footprint in interactive rendering ([docs/extensions.md](docs/extensions.md), [#1719](https://github.com/code-yeongyu/senpi-mono/pull/1719)).
1351
1393
 
1352
1394
  ### Added
1353
1395
 
1354
- - Added optional `promptSnippet` to `ToolDefinition` for one-line entries in the default system prompt's `Available tools` section. Active extension tools appear there when registered and active ([#1237](https://github.com/code-yeongyu/sanepi-mono/pull/1237) by [@semtexzv](https://github.com/semtexzv)).
1355
- - Added optional `promptGuidelines` to `ToolDefinition` so active tools can append tool-specific bullets to the default system prompt `Guidelines` section ([#1720](https://github.com/code-yeongyu/sanepi-mono/issues/1720)).
1396
+ - Added optional `promptSnippet` to `ToolDefinition` for one-line entries in the default system prompt's `Available tools` section. Active extension tools appear there when registered and active ([#1237](https://github.com/code-yeongyu/senpi-mono/pull/1237) by [@semtexzv](https://github.com/semtexzv)).
1397
+ - Added optional `promptGuidelines` to `ToolDefinition` so active tools can append tool-specific bullets to the default system prompt `Guidelines` section ([#1720](https://github.com/code-yeongyu/senpi-mono/issues/1720)).
1356
1398
 
1357
1399
  ### Fixed
1358
1400
 
1359
- - Fixed `pi.registerTool()` dynamic registration after session initialization. Tools registered in `session_start` and later handlers now refresh immediately, become active, and are visible to the LLM without `/reload` ([#1720](https://github.com/code-yeongyu/sanepi-mono/issues/1720))
1360
- - Fixed session message persistence ordering by serializing `AgentSession` event processing, preventing `toolResult` entries from being written before their corresponding assistant tool-call messages when extension handlers are asynchronous ([#1717](https://github.com/code-yeongyu/sanepi-mono/issues/1717))
1361
- - Fixed spacing artifacts when custom tool renderers intentionally suppress per-call transcript output, including extra blank rows in interactive streaming and non-zero transcript footprint for empty custom renders ([#1719](https://github.com/code-yeongyu/sanepi-mono/pull/1719) by [@alasano](https://github.com/alasano))
1362
- - Fixed `session.prompt()` returning before retry completion by creating the retry promise synchronously at `agent_end` dispatch, which closes a race when earlier queued event handlers are async ([#1726](https://github.com/code-yeongyu/sanepi-mono/pull/1726) by [@pasky](https://github.com/pasky))
1401
+ - Fixed `pi.registerTool()` dynamic registration after session initialization. Tools registered in `session_start` and later handlers now refresh immediately, become active, and are visible to the LLM without `/reload` ([#1720](https://github.com/code-yeongyu/senpi-mono/issues/1720))
1402
+ - Fixed session message persistence ordering by serializing `AgentSession` event processing, preventing `toolResult` entries from being written before their corresponding assistant tool-call messages when extension handlers are asynchronous ([#1717](https://github.com/code-yeongyu/senpi-mono/issues/1717))
1403
+ - Fixed spacing artifacts when custom tool renderers intentionally suppress per-call transcript output, including extra blank rows in interactive streaming and non-zero transcript footprint for empty custom renders ([#1719](https://github.com/code-yeongyu/senpi-mono/pull/1719) by [@alasano](https://github.com/alasano))
1404
+ - Fixed `session.prompt()` returning before retry completion by creating the retry promise synchronously at `agent_end` dispatch, which closes a race when earlier queued event handlers are async ([#1726](https://github.com/code-yeongyu/senpi-mono/pull/1726) by [@pasky](https://github.com/pasky))
1363
1405
 
1364
1406
  ## [0.55.3] - 2026-02-27
1365
1407
 
1366
1408
  ### Fixed
1367
1409
 
1368
- - Changed the default image paste keybinding on Windows to `alt+v` to avoid `ctrl+v` conflicts with terminal paste behavior ([#1682](https://github.com/code-yeongyu/sanepi-mono/pull/1682) by [@mrexodia](https://github.com/mrexodia)).
1410
+ - Changed the default image paste keybinding on Windows to `alt+v` to avoid `ctrl+v` conflicts with terminal paste behavior ([#1682](https://github.com/code-yeongyu/senpi-mono/pull/1682) by [@mrexodia](https://github.com/mrexodia)).
1369
1411
 
1370
1412
  ## [0.55.2] - 2026-02-27
1371
1413
 
1372
1414
  ### New Features
1373
1415
 
1374
- - Extensions can dynamically remove custom providers via `pi.unregisterProvider(name)`, restoring any built-in models that were overridden, without requiring `/reload` ([docs](https://github.com/code-yeongyu/sanepi-mono/blob/main/packages/coding-agent/docs/custom-provider.md)).
1416
+ - Extensions can dynamically remove custom providers via `pi.unregisterProvider(name)`, restoring any built-in models that were overridden, without requiring `/reload` ([docs](https://github.com/code-yeongyu/senpi-mono/blob/main/packages/coding-agent/docs/custom-provider.md)).
1375
1417
  - `pi.registerProvider()` now takes effect immediately when called outside the initial extension load phase (e.g. from a command handler), removing the need for `/reload` after late registrations.
1376
1418
 
1377
1419
  ### Added
1378
1420
 
1379
- - `pi.unregisterProvider(name)` removes a dynamically registered provider and its models from the registry without requiring `/reload`. Built-in models that were overridden by the provider are restored ([#1669](https://github.com/code-yeongyu/sanepi-mono/pull/1669) by [@aliou](https://github.com/aliou)).
1421
+ - `pi.unregisterProvider(name)` removes a dynamically registered provider and its models from the registry without requiring `/reload`. Built-in models that were overridden by the provider are restored ([#1669](https://github.com/code-yeongyu/senpi-mono/pull/1669) by [@aliou](https://github.com/aliou)).
1380
1422
 
1381
1423
  ### Fixed
1382
1424
 
1383
- - `pi.registerProvider()` now takes effect immediately when called after the initial extension load phase (e.g. from a command handler). Previously the registration sat in a pending queue that was never flushed until the next `/reload` ([#1669](https://github.com/code-yeongyu/sanepi-mono/pull/1669) by [@aliou](https://github.com/aliou)).
1384
- - Fixed duplicate session headers when forking from a point before any assistant message. `createBranchedSession` now defers file creation to `_persist()` when the branched path has no assistant message, matching the `newSession()` contract ([#1672](https://github.com/code-yeongyu/sanepi-mono/pull/1672) by [@w-winter](https://github.com/w-winter)).
1385
- - Fixed SIGINT being delivered to pi while the process is suspended (e.g. via `ctrl+z`), which could corrupt terminal state on resume ([#1668](https://github.com/code-yeongyu/sanepi-mono/pull/1668) by [@aliou](https://github.com/aliou)).
1386
- - Fixed Z.ai thinking control using wrong parameter name, causing thinking to always be enabled and wasting tokens/latency ([#1674](https://github.com/code-yeongyu/sanepi-mono/pull/1674) by [@okuyam2y](https://github.com/okuyam2y))
1387
- - Fixed `redacted_thinking` blocks being silently dropped during Anthropic streaming, and related issues with interleaved-thinking beta headers and temperature being sent alongside extended thinking ([#1665](https://github.com/code-yeongyu/sanepi-mono/pull/1665) by [@tctev](https://github.com/tctev))
1388
- - Fixed `(external, cli)` user-agent flag causing 401 errors on Anthropic setup-token endpoint ([#1677](https://github.com/code-yeongyu/sanepi-mono/pull/1677) by [@LazerLance777](https://github.com/LazerLance777))
1389
- - Fixed crash when OpenAI-compatible provider returns a chunk with no `choices` array ([#1671](https://github.com/code-yeongyu/sanepi-mono/issues/1671))
1425
+ - `pi.registerProvider()` now takes effect immediately when called after the initial extension load phase (e.g. from a command handler). Previously the registration sat in a pending queue that was never flushed until the next `/reload` ([#1669](https://github.com/code-yeongyu/senpi-mono/pull/1669) by [@aliou](https://github.com/aliou)).
1426
+ - Fixed duplicate session headers when forking from a point before any assistant message. `createBranchedSession` now defers file creation to `_persist()` when the branched path has no assistant message, matching the `newSession()` contract ([#1672](https://github.com/code-yeongyu/senpi-mono/pull/1672) by [@w-winter](https://github.com/w-winter)).
1427
+ - Fixed SIGINT being delivered to pi while the process is suspended (e.g. via `ctrl+z`), which could corrupt terminal state on resume ([#1668](https://github.com/code-yeongyu/senpi-mono/pull/1668) by [@aliou](https://github.com/aliou)).
1428
+ - Fixed Z.ai thinking control using wrong parameter name, causing thinking to always be enabled and wasting tokens/latency ([#1674](https://github.com/code-yeongyu/senpi-mono/pull/1674) by [@okuyam2y](https://github.com/okuyam2y))
1429
+ - Fixed `redacted_thinking` blocks being silently dropped during Anthropic streaming, and related issues with interleaved-thinking beta headers and temperature being sent alongside extended thinking ([#1665](https://github.com/code-yeongyu/senpi-mono/pull/1665) by [@tctev](https://github.com/tctev))
1430
+ - Fixed `(external, cli)` user-agent flag causing 401 errors on Anthropic setup-token endpoint ([#1677](https://github.com/code-yeongyu/senpi-mono/pull/1677) by [@LazerLance777](https://github.com/LazerLance777))
1431
+ - Fixed crash when OpenAI-compatible provider returns a chunk with no `choices` array ([#1671](https://github.com/code-yeongyu/senpi-mono/issues/1671))
1390
1432
 
1391
1433
  ## [0.55.1] - 2026-02-26
1392
1434
 
1393
1435
  ### New Features
1394
1436
 
1395
1437
  - Added offline startup mode via `--offline` (or `PI_OFFLINE`) to disable startup network operations, with startup network timeouts to avoid hangs in restricted or offline environments.
1396
- - Added `gemini-3.1-pro-preview` model support to the `google-gemini-cli` provider ([#1599](https://github.com/code-yeongyu/sanepi-mono/pull/1599) by [@audichuang](https://github.com/audichuang)).
1438
+ - Added `gemini-3.1-pro-preview` model support to the `google-gemini-cli` provider ([#1599](https://github.com/code-yeongyu/senpi-mono/pull/1599) by [@audichuang](https://github.com/audichuang)).
1397
1439
 
1398
1440
  ### Fixed
1399
1441
 
1400
- - Fixed offline startup hangs by adding offline startup behavior and network timeouts during managed tool setup ([#1631](https://github.com/code-yeongyu/sanepi-mono/pull/1631) by [@mcollina](https://github.com/mcollina))
1401
- - Fixed Windows VT input initialization in ESM by loading koffi via createRequire, avoiding runtime and bundling issues in end-user environments ([#1627](https://github.com/code-yeongyu/sanepi-mono/pull/1627) by [@kaste](https://github.com/kaste))
1402
- - Fixed managed `fd`/`rg` bootstrap on Windows in Git Bash by using `extract-zip` for `.zip` archives, searching extracted layouts more robustly, and isolating extraction temp directories to avoid concurrent download races ([#1348](https://github.com/code-yeongyu/sanepi-mono/issues/1348))
1442
+ - Fixed offline startup hangs by adding offline startup behavior and network timeouts during managed tool setup ([#1631](https://github.com/code-yeongyu/senpi-mono/pull/1631) by [@mcollina](https://github.com/mcollina))
1443
+ - Fixed Windows VT input initialization in ESM by loading koffi via createRequire, avoiding runtime and bundling issues in end-user environments ([#1627](https://github.com/code-yeongyu/senpi-mono/pull/1627) by [@kaste](https://github.com/kaste))
1444
+ - Fixed managed `fd`/`rg` bootstrap on Windows in Git Bash by using `extract-zip` for `.zip` archives, searching extracted layouts more robustly, and isolating extraction temp directories to avoid concurrent download races ([#1348](https://github.com/code-yeongyu/senpi-mono/issues/1348))
1403
1445
  - Fixed extension loading on Windows when resolving `@sinclair/typebox` aliases so subpath imports like `@sinclair/typebox/compiler` resolve correctly.
1404
- - Fixed adaptive thinking for Claude Sonnet 4.6 in Anthropic and Bedrock providers, and clamped unsupported `xhigh` effort values to supported levels ([#1548](https://github.com/code-yeongyu/sanepi-mono/pull/1548) by [@tctev](https://github.com/tctev))
1405
- - Fixed Vertex ADC credential detection race by avoiding caching a false negative during async import initialization ([#1550](https://github.com/code-yeongyu/sanepi-mono/pull/1550) by [@jeremiahgaylord-web](https://github.com/jeremiahgaylord-web))
1406
- - Fixed subagent extension example to resolve user agents from the configured agent directory instead of hardcoded paths ([#1559](https://github.com/code-yeongyu/sanepi-mono/pull/1559) by [@tianshuwang](https://github.com/tianshuwang))
1446
+ - Fixed adaptive thinking for Claude Sonnet 4.6 in Anthropic and Bedrock providers, and clamped unsupported `xhigh` effort values to supported levels ([#1548](https://github.com/code-yeongyu/senpi-mono/pull/1548) by [@tctev](https://github.com/tctev))
1447
+ - Fixed Vertex ADC credential detection race by avoiding caching a false negative during async import initialization ([#1550](https://github.com/code-yeongyu/senpi-mono/pull/1550) by [@jeremiahgaylord-web](https://github.com/jeremiahgaylord-web))
1448
+ - Fixed subagent extension example to resolve user agents from the configured agent directory instead of hardcoded paths ([#1559](https://github.com/code-yeongyu/senpi-mono/pull/1559) by [@tianshuwang](https://github.com/tianshuwang))
1407
1449
 
1408
1450
  ## [0.55.0] - 2026-02-24
1409
1451
 
@@ -1417,7 +1459,7 @@ Examples:
1417
1459
  ### Fixed
1418
1460
 
1419
1461
  - Fixed `.pi` folder being created unnecessarily when only reading settings. The folder is now only created when writing project-specific settings.
1420
- - Fixed extension-driven runtime theme changes to persist in settings so `/settings` reflects the active `currentTheme` after `ctx.ui.setTheme(...)` ([#1483](https://github.com/code-yeongyu/sanepi-mono/pull/1483) by [@ferologics](https://github.com/ferologics))
1462
+ - Fixed extension-driven runtime theme changes to persist in settings so `/settings` reflects the active `currentTheme` after `ctx.ui.setTheme(...)` ([#1483](https://github.com/code-yeongyu/senpi-mono/pull/1483) by [@ferologics](https://github.com/ferologics))
1421
1463
  - Fixed interactive mode freezes during large streaming `write` tool calls by using incremental syntax highlighting while partial arguments stream, with a final full re-highlight after tool-call arguments complete.
1422
1464
 
1423
1465
  ## [0.54.1] - 2026-02-22
@@ -1492,12 +1534,12 @@ Examples:
1492
1534
 
1493
1535
  ### Breaking Changes
1494
1536
 
1495
- - `ContextUsage.tokens` and `ContextUsage.percent` are now `number | null`. After compaction, context token count is unknown until the next LLM response, so these fields return `null`. Extensions that read `ContextUsage` must handle the `null` case. Removed `usageTokens`, `trailingTokens`, and `lastUsageIndex` fields from `ContextUsage` (implementation details that should not have been public) ([#1382](https://github.com/code-yeongyu/sanepi-mono/pull/1382) by [@ferologics](https://github.com/ferologics))
1496
- - Git source parsing is now strict without `git:` prefix: only protocol URLs are treated as git (`https://`, `http://`, `ssh://`, `git://`). Shorthand sources like `github.com/org/repo` and `git@github.com:org/repo` now require the `git:` prefix. ([#1426](https://github.com/code-yeongyu/sanepi-mono/issues/1426))
1537
+ - `ContextUsage.tokens` and `ContextUsage.percent` are now `number | null`. After compaction, context token count is unknown until the next LLM response, so these fields return `null`. Extensions that read `ContextUsage` must handle the `null` case. Removed `usageTokens`, `trailingTokens`, and `lastUsageIndex` fields from `ContextUsage` (implementation details that should not have been public) ([#1382](https://github.com/code-yeongyu/senpi-mono/pull/1382) by [@ferologics](https://github.com/ferologics))
1538
+ - Git source parsing is now strict without `git:` prefix: only protocol URLs are treated as git (`https://`, `http://`, `ssh://`, `git://`). Shorthand sources like `github.com/org/repo` and `git@github.com:org/repo` now require the `git:` prefix. ([#1426](https://github.com/code-yeongyu/senpi-mono/issues/1426))
1497
1539
 
1498
1540
  ### Added
1499
1541
 
1500
- - Added extension event forwarding for message and tool execution lifecycles (`message_start`, `message_update`, `message_end`, `tool_execution_start`, `tool_execution_update`, `tool_execution_end`) ([#1375](https://github.com/code-yeongyu/sanepi-mono/pull/1375) by [@sumeet](https://github.com/sumeet))
1542
+ - Added extension event forwarding for message and tool execution lifecycles (`message_start`, `message_update`, `message_end`, `tool_execution_start`, `tool_execution_update`, `tool_execution_end`) ([#1375](https://github.com/code-yeongyu/senpi-mono/pull/1375) by [@sumeet](https://github.com/sumeet))
1501
1543
  - Added `terminal_input` extension event to intercept, consume, or transform raw terminal input before normal TUI handling.
1502
1544
  - Added `gpt-5.3-codex-spark` model definition for OpenAI and OpenAI Codex providers (research preview).
1503
1545
 
@@ -1507,69 +1549,69 @@ Examples:
1507
1549
 
1508
1550
  ### Fixed
1509
1551
 
1510
- - Fixed context usage percentage in footer showing stale pre-compaction values. After compaction the footer now shows `?/200k` until the next LLM response provides accurate usage ([#1382](https://github.com/code-yeongyu/sanepi-mono/pull/1382) by [@ferologics](https://github.com/ferologics))
1511
- - Fixed `_checkCompaction()` using the first compaction entry instead of the latest, which could cause incorrect overflow detection with multiple compactions ([#1382](https://github.com/code-yeongyu/sanepi-mono/pull/1382) by [@ferologics](https://github.com/ferologics))
1512
- - `--model` now works without `--provider`, supports `provider/id` syntax, fuzzy matching, and `:<thinking>` suffix (e.g., `--model sonnet:high`, `--model openai/gpt-4o`) ([#1350](https://github.com/code-yeongyu/sanepi-mono/pull/1350) by [@mitsuhiko](https://github.com/mitsuhiko))
1513
- - Fixed local package path normalization for extension sources while tightening git source parsing rules ([#1426](https://github.com/code-yeongyu/sanepi-mono/issues/1426))
1552
+ - Fixed context usage percentage in footer showing stale pre-compaction values. After compaction the footer now shows `?/200k` until the next LLM response provides accurate usage ([#1382](https://github.com/code-yeongyu/senpi-mono/pull/1382) by [@ferologics](https://github.com/ferologics))
1553
+ - Fixed `_checkCompaction()` using the first compaction entry instead of the latest, which could cause incorrect overflow detection with multiple compactions ([#1382](https://github.com/code-yeongyu/senpi-mono/pull/1382) by [@ferologics](https://github.com/ferologics))
1554
+ - `--model` now works without `--provider`, supports `provider/id` syntax, fuzzy matching, and `:<thinking>` suffix (e.g., `--model sonnet:high`, `--model openai/gpt-4o`) ([#1350](https://github.com/code-yeongyu/senpi-mono/pull/1350) by [@mitsuhiko](https://github.com/mitsuhiko))
1555
+ - Fixed local package path normalization for extension sources while tightening git source parsing rules ([#1426](https://github.com/code-yeongyu/senpi-mono/issues/1426))
1514
1556
  - Fixed extension terminal input listeners not being cleared during session resets, which could leave stale handlers active.
1515
- - Fixed Termux bootstrap package name for `fd` installation ([#1433](https://github.com/code-yeongyu/sanepi-mono/pull/1433))
1516
- - Fixed `@` file autocomplete fuzzy matching to prioritize path-prefix and segment matches for nested paths ([#1423](https://github.com/code-yeongyu/sanepi-mono/issues/1423))
1517
- - Fixed OpenAI streaming tool-call parsing to tolerate malformed trailing JSON in partial chunks ([#1424](https://github.com/code-yeongyu/sanepi-mono/issues/1424))
1557
+ - Fixed Termux bootstrap package name for `fd` installation ([#1433](https://github.com/code-yeongyu/senpi-mono/pull/1433))
1558
+ - Fixed `@` file autocomplete fuzzy matching to prioritize path-prefix and segment matches for nested paths ([#1423](https://github.com/code-yeongyu/senpi-mono/issues/1423))
1559
+ - Fixed OpenAI streaming tool-call parsing to tolerate malformed trailing JSON in partial chunks ([#1424](https://github.com/code-yeongyu/senpi-mono/issues/1424))
1518
1560
 
1519
1561
  ## [0.52.9] - 2026-02-08
1520
1562
 
1521
1563
  ### New Features
1522
1564
 
1523
- - Extensions can trigger a full runtime reload via `ctx.reload()`, useful for hot-reloading configuration or restarting the agent. See [docs/extensions.md](docs/extensions.md) and the [`reload-runtime` example](examples/extensions/reload-runtime.ts) ([#1371](https://github.com/code-yeongyu/sanepi-mono/issues/1371))
1565
+ - Extensions can trigger a full runtime reload via `ctx.reload()`, useful for hot-reloading configuration or restarting the agent. See [docs/extensions.md](docs/extensions.md) and the [`reload-runtime` example](examples/extensions/reload-runtime.ts) ([#1371](https://github.com/code-yeongyu/senpi-mono/issues/1371))
1524
1566
  - Short CLI disable aliases: `-ne` (`--no-extensions`), `-ns` (`--no-skills`), and `-np` (`--no-prompt-templates`) for faster interactive usage and scripting.
1525
- - `/export` HTML now includes collapsible tool input schemas (parameter names, types, and descriptions), improving session review and sharing workflows ([#1416](https://github.com/code-yeongyu/sanepi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev)).
1526
- - `pi.getAllTools()` now exposes tool parameters in addition to name and description, enabling richer extension integrations ([#1416](https://github.com/code-yeongyu/sanepi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev)).
1567
+ - `/export` HTML now includes collapsible tool input schemas (parameter names, types, and descriptions), improving session review and sharing workflows ([#1416](https://github.com/code-yeongyu/senpi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev)).
1568
+ - `pi.getAllTools()` now exposes tool parameters in addition to name and description, enabling richer extension integrations ([#1416](https://github.com/code-yeongyu/senpi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev)).
1527
1569
 
1528
1570
  ### Added
1529
1571
 
1530
- - Added `ctx.reload()` to the extension API for programmatic runtime reload ([#1371](https://github.com/code-yeongyu/sanepi-mono/issues/1371))
1572
+ - Added `ctx.reload()` to the extension API for programmatic runtime reload ([#1371](https://github.com/code-yeongyu/senpi-mono/issues/1371))
1531
1573
  - Added short aliases for disable flags: `-ne` for `--no-extensions`, `-ns` for `--no-skills`, `-np` for `--no-prompt-templates`
1532
- - `/export` HTML now includes tool input schema (parameter names, types, descriptions) in a collapsible section under each tool ([#1416](https://github.com/code-yeongyu/sanepi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev))
1533
- - `pi.getAllTools()` now returns tool parameters in addition to name and description ([#1416](https://github.com/code-yeongyu/sanepi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev))
1574
+ - `/export` HTML now includes tool input schema (parameter names, types, descriptions) in a collapsible section under each tool ([#1416](https://github.com/code-yeongyu/senpi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev))
1575
+ - `pi.getAllTools()` now returns tool parameters in addition to name and description ([#1416](https://github.com/code-yeongyu/senpi-mono/pull/1416) by [@marchellodev](https://github.com/marchellodev))
1534
1576
 
1535
1577
  ### Fixed
1536
1578
 
1537
1579
  - Fixed extension source parsing so dot-prefixed local paths (for example `.senpi/extensions/foo.ts`) are treated as local paths instead of git URLs
1538
- - Fixed fd/rg download failing on Windows due to `unzip` not being available; now uses `tar` for both `.tar.gz` and `.zip` extraction, with proper error reporting ([#1348](https://github.com/code-yeongyu/sanepi-mono/issues/1348))
1539
- - Fixed RPC mode documentation incorrectly stating `ctx.hasUI` is `false`; it is `true` because dialog and fire-and-forget UI methods work via the RPC sub-protocol. Also documented missing unsupported/degraded methods (`pasteToEditor`, `getAllThemes`, `getTheme`, `setTheme`) ([#1411](https://github.com/code-yeongyu/sanepi-mono/pull/1411) by [@aliou](https://github.com/aliou))
1540
- - Fixed `rg` not available in bash tool by downloading it at startup alongside `fd` ([#1348](https://github.com/code-yeongyu/sanepi-mono/issues/1348))
1541
- - Fixed `custom-compaction` example to use `ModelRegistry` ([#1387](https://github.com/code-yeongyu/sanepi-mono/issues/1387))
1542
- - Google providers now support full JSON Schema in tool declarations (anyOf, oneOf, const, etc.) ([#1398](https://github.com/code-yeongyu/sanepi-mono/issues/1398) by [@jarib](https://github.com/jarib))
1580
+ - Fixed fd/rg download failing on Windows due to `unzip` not being available; now uses `tar` for both `.tar.gz` and `.zip` extraction, with proper error reporting ([#1348](https://github.com/code-yeongyu/senpi-mono/issues/1348))
1581
+ - Fixed RPC mode documentation incorrectly stating `ctx.hasUI` is `false`; it is `true` because dialog and fire-and-forget UI methods work via the RPC sub-protocol. Also documented missing unsupported/degraded methods (`pasteToEditor`, `getAllThemes`, `getTheme`, `setTheme`) ([#1411](https://github.com/code-yeongyu/senpi-mono/pull/1411) by [@aliou](https://github.com/aliou))
1582
+ - Fixed `rg` not available in bash tool by downloading it at startup alongside `fd` ([#1348](https://github.com/code-yeongyu/senpi-mono/issues/1348))
1583
+ - Fixed `custom-compaction` example to use `ModelRegistry` ([#1387](https://github.com/code-yeongyu/senpi-mono/issues/1387))
1584
+ - Google providers now support full JSON Schema in tool declarations (anyOf, oneOf, const, etc.) ([#1398](https://github.com/code-yeongyu/senpi-mono/issues/1398) by [@jarib](https://github.com/jarib))
1543
1585
  - Reverted incorrect Antigravity model change: `claude-opus-4-6-thinking` back to `claude-opus-4-5-thinking` (model does not exist on Antigravity endpoint)
1544
1586
  - Updated the Antigravity system instruction to a more compact version for Google Gemini CLI compatibility
1545
- - Corrected opencode context windows for Claude Sonnet 4 and 4.5 ([#1383](https://github.com/code-yeongyu/sanepi-mono/issues/1383))
1546
- - Fixed subagent example unknown-agent errors to include available agent names ([#1414](https://github.com/code-yeongyu/sanepi-mono/pull/1414) by [@dnouri](https://github.com/dnouri))
1587
+ - Corrected opencode context windows for Claude Sonnet 4 and 4.5 ([#1383](https://github.com/code-yeongyu/senpi-mono/issues/1383))
1588
+ - Fixed subagent example unknown-agent errors to include available agent names ([#1414](https://github.com/code-yeongyu/senpi-mono/pull/1414) by [@dnouri](https://github.com/dnouri))
1547
1589
 
1548
1590
  ## [0.52.8] - 2026-02-07
1549
1591
 
1550
1592
  ### New Features
1551
1593
 
1552
- - Emacs-style kill ring (`ctrl+k`/`ctrl+y`/`alt+y`) and undo (`ctrl+z`) in the editor input ([#1373](https://github.com/code-yeongyu/sanepi-mono/pull/1373) by [@Perlence](https://github.com/Perlence))
1553
- - OpenRouter `auto` model alias (`openrouter:auto`) for automatic model routing ([#1361](https://github.com/code-yeongyu/sanepi-mono/pull/1361) by [@yogasanas](https://github.com/yogasanas))
1554
- - Extensions can programmatically paste content into the editor via `pasteToEditor` in the extension UI context. See [docs/extensions.md](docs/extensions.md) ([#1351](https://github.com/code-yeongyu/sanepi-mono/pull/1351) by [@kaofelix](https://github.com/kaofelix))
1555
- - `pi <package> --help` and invalid subcommands now show helpful output instead of failing silently ([#1347](https://github.com/code-yeongyu/sanepi-mono/pull/1347) by [@ferologics](https://github.com/ferologics))
1594
+ - Emacs-style kill ring (`ctrl+k`/`ctrl+y`/`alt+y`) and undo (`ctrl+z`) in the editor input ([#1373](https://github.com/code-yeongyu/senpi-mono/pull/1373) by [@Perlence](https://github.com/Perlence))
1595
+ - OpenRouter `auto` model alias (`openrouter:auto`) for automatic model routing ([#1361](https://github.com/code-yeongyu/senpi-mono/pull/1361) by [@yogasanas](https://github.com/yogasanas))
1596
+ - Extensions can programmatically paste content into the editor via `pasteToEditor` in the extension UI context. See [docs/extensions.md](docs/extensions.md) ([#1351](https://github.com/code-yeongyu/senpi-mono/pull/1351) by [@kaofelix](https://github.com/kaofelix))
1597
+ - `pi <package> --help` and invalid subcommands now show helpful output instead of failing silently ([#1347](https://github.com/code-yeongyu/senpi-mono/pull/1347) by [@ferologics](https://github.com/ferologics))
1556
1598
 
1557
1599
  ### Added
1558
1600
 
1559
- - Added `pasteToEditor` to extension UI context for programmatic editor paste ([#1351](https://github.com/code-yeongyu/sanepi-mono/pull/1351) by [@kaofelix](https://github.com/kaofelix))
1560
- - Added package subcommand help and friendly error messages for invalid commands ([#1347](https://github.com/code-yeongyu/sanepi-mono/pull/1347) by [@ferologics](https://github.com/ferologics))
1561
- - Added OpenRouter `auto` model alias for automatic model routing ([#1361](https://github.com/code-yeongyu/sanepi-mono/pull/1361) by [@yogasanas](https://github.com/yogasanas))
1562
- - Added kill ring (ctrl+k/ctrl+y/alt+y) and undo (ctrl+z) support to the editor input ([#1373](https://github.com/code-yeongyu/sanepi-mono/pull/1373) by [@Perlence](https://github.com/Perlence))
1601
+ - Added `pasteToEditor` to extension UI context for programmatic editor paste ([#1351](https://github.com/code-yeongyu/senpi-mono/pull/1351) by [@kaofelix](https://github.com/kaofelix))
1602
+ - Added package subcommand help and friendly error messages for invalid commands ([#1347](https://github.com/code-yeongyu/senpi-mono/pull/1347) by [@ferologics](https://github.com/ferologics))
1603
+ - Added OpenRouter `auto` model alias for automatic model routing ([#1361](https://github.com/code-yeongyu/senpi-mono/pull/1361) by [@yogasanas](https://github.com/yogasanas))
1604
+ - Added kill ring (ctrl+k/ctrl+y/alt+y) and undo (ctrl+z) support to the editor input ([#1373](https://github.com/code-yeongyu/senpi-mono/pull/1373) by [@Perlence](https://github.com/Perlence))
1563
1605
 
1564
1606
  ### Changed
1565
1607
 
1566
- - Replaced Claude Opus 4.5 with Opus 4.6 as default model ([#1345](https://github.com/code-yeongyu/sanepi-mono/pull/1345) by [@calvin-hpnet](https://github.com/calvin-hpnet))
1608
+ - Replaced Claude Opus 4.5 with Opus 4.6 as default model ([#1345](https://github.com/code-yeongyu/senpi-mono/pull/1345) by [@calvin-hpnet](https://github.com/calvin-hpnet))
1567
1609
 
1568
1610
  ### Fixed
1569
1611
 
1570
1612
  - Fixed temporary git package caches (`-e <git-url>`) to refresh on cache hits for unpinned sources, including detached/no-upstream checkouts
1571
- - Fixed aborting retries when an extension customizes the editor ([#1364](https://github.com/code-yeongyu/sanepi-mono/pull/1364) by [@Perlence](https://github.com/Perlence))
1572
- - Fixed autocomplete not propagating to custom editors created by extensions ([#1372](https://github.com/code-yeongyu/sanepi-mono/pull/1372) by [@Perlence](https://github.com/Perlence))
1613
+ - Fixed aborting retries when an extension customizes the editor ([#1364](https://github.com/code-yeongyu/senpi-mono/pull/1364) by [@Perlence](https://github.com/Perlence))
1614
+ - Fixed autocomplete not propagating to custom editors created by extensions ([#1372](https://github.com/code-yeongyu/senpi-mono/pull/1372) by [@Perlence](https://github.com/Perlence))
1573
1615
  - Fixed extension shutdown to use clean TUI shutdown path, preventing orphaned processes
1574
1616
 
1575
1617
  ## [0.52.7] - 2026-02-06
@@ -1586,30 +1628,30 @@ Examples:
1586
1628
 
1587
1629
  ### Added
1588
1630
 
1589
- - Added `modelOverrides` in `models.json` to customize individual built-in models per provider without full provider replacement ([#1332](https://github.com/code-yeongyu/sanepi-mono/pull/1332) by [@charles-cooper](https://github.com/charles-cooper))
1590
- - Added `AWS_BEDROCK_SKIP_AUTH` and `AWS_BEDROCK_FORCE_HTTP1` environment variables for connecting to unauthenticated Bedrock proxies ([#1320](https://github.com/code-yeongyu/sanepi-mono/pull/1320) by [@virtuald](https://github.com/virtuald))
1631
+ - Added `modelOverrides` in `models.json` to customize individual built-in models per provider without full provider replacement ([#1332](https://github.com/code-yeongyu/senpi-mono/pull/1332) by [@charles-cooper](https://github.com/charles-cooper))
1632
+ - Added `AWS_BEDROCK_SKIP_AUTH` and `AWS_BEDROCK_FORCE_HTTP1` environment variables for connecting to unauthenticated Bedrock proxies ([#1320](https://github.com/code-yeongyu/senpi-mono/pull/1320) by [@virtuald](https://github.com/virtuald))
1591
1633
 
1592
1634
  ### Fixed
1593
1635
 
1594
1636
  - Fixed extra spacing between thinking-only assistant content and subsequent tool execution blocks when assistant messages contain no text
1595
- - Fixed queued steering/follow-up/custom messages remaining stuck after threshold auto-compaction by resuming the agent loop when Agent-level queues still contain pending messages ([#1312](https://github.com/code-yeongyu/sanepi-mono/pull/1312) by [@ferologics](https://github.com/ferologics))
1596
- - Fixed `tool_result` extension handlers to chain result patches across handlers instead of last-handler-wins behavior ([#1280](https://github.com/code-yeongyu/sanepi-mono/issues/1280))
1597
- - Fixed compromised auth lock files being handled gracefully instead of crashing auth storage initialization ([#1322](https://github.com/code-yeongyu/sanepi-mono/issues/1322))
1598
- - Fixed Bedrock adaptive thinking handling for Claude Opus 4.6 with interleaved thinking beta responses ([#1323](https://github.com/code-yeongyu/sanepi-mono/pull/1323) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1599
- - Fixed OpenAI Responses API requests to use `store: false` by default to avoid server-side history logging ([#1308](https://github.com/code-yeongyu/sanepi-mono/issues/1308))
1600
- - Fixed interactive mode startup by initializing autocomplete after resources are loaded ([#1328](https://github.com/code-yeongyu/sanepi-mono/issues/1328))
1601
- - Fixed `modelOverrides` merge behavior for nested objects and documented usage details ([#1062](https://github.com/code-yeongyu/sanepi-mono/issues/1062))
1637
+ - Fixed queued steering/follow-up/custom messages remaining stuck after threshold auto-compaction by resuming the agent loop when Agent-level queues still contain pending messages ([#1312](https://github.com/code-yeongyu/senpi-mono/pull/1312) by [@ferologics](https://github.com/ferologics))
1638
+ - Fixed `tool_result` extension handlers to chain result patches across handlers instead of last-handler-wins behavior ([#1280](https://github.com/code-yeongyu/senpi-mono/issues/1280))
1639
+ - Fixed compromised auth lock files being handled gracefully instead of crashing auth storage initialization ([#1322](https://github.com/code-yeongyu/senpi-mono/issues/1322))
1640
+ - Fixed Bedrock adaptive thinking handling for Claude Opus 4.6 with interleaved thinking beta responses ([#1323](https://github.com/code-yeongyu/senpi-mono/pull/1323) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1641
+ - Fixed OpenAI Responses API requests to use `store: false` by default to avoid server-side history logging ([#1308](https://github.com/code-yeongyu/senpi-mono/issues/1308))
1642
+ - Fixed interactive mode startup by initializing autocomplete after resources are loaded ([#1328](https://github.com/code-yeongyu/senpi-mono/issues/1328))
1643
+ - Fixed `modelOverrides` merge behavior for nested objects and documented usage details ([#1062](https://github.com/code-yeongyu/senpi-mono/issues/1062))
1602
1644
 
1603
1645
  ## [0.52.6] - 2026-02-05
1604
1646
 
1605
1647
  ### Breaking Changes
1606
1648
 
1607
- - Removed `/exit` command handling. Use `/quit` to exit ([#1303](https://github.com/code-yeongyu/sanepi-mono/issues/1303))
1649
+ - Removed `/exit` command handling. Use `/quit` to exit ([#1303](https://github.com/code-yeongyu/senpi-mono/issues/1303))
1608
1650
 
1609
1651
  ### Fixed
1610
1652
 
1611
- - Fixed `/quit` being shadowed by fuzzy slash command autocomplete matches from skills by adding `/quit` to built-in command autocomplete ([#1303](https://github.com/code-yeongyu/sanepi-mono/issues/1303))
1612
- - Fixed local package source parsing and settings normalization regression that misclassified relative paths as git URLs and prevented globally installed local packages from loading after restart ([#1304](https://github.com/code-yeongyu/sanepi-mono/issues/1304))
1653
+ - Fixed `/quit` being shadowed by fuzzy slash command autocomplete matches from skills by adding `/quit` to built-in command autocomplete ([#1303](https://github.com/code-yeongyu/senpi-mono/issues/1303))
1654
+ - Fixed local package source parsing and settings normalization regression that misclassified relative paths as git URLs and prevented globally installed local packages from loading after restart ([#1304](https://github.com/code-yeongyu/senpi-mono/issues/1304))
1613
1655
 
1614
1656
  ## [0.52.5] - 2026-02-05
1615
1657
 
@@ -1621,7 +1663,7 @@ Examples:
1621
1663
 
1622
1664
  ### Fixed
1623
1665
 
1624
- - Fixed extensions setting not respecting `package.json` `pi.extensions` manifest when directory is specified directly ([#1302](https://github.com/code-yeongyu/sanepi-mono/pull/1302) by [@hjanuschka](https://github.com/hjanuschka))
1666
+ - Fixed extensions setting not respecting `package.json` `pi.extensions` manifest when directory is specified directly ([#1302](https://github.com/code-yeongyu/senpi-mono/pull/1302) by [@hjanuschka](https://github.com/hjanuschka))
1625
1667
 
1626
1668
  ## [0.52.3] - 2026-02-05
1627
1669
 
@@ -1661,52 +1703,52 @@ Examples:
1661
1703
  - Added `minimal-mode.ts` example extension demonstrating how to override built-in tool rendering for a minimal display mode
1662
1704
  - Added Claude Opus 4.6 model to the model catalog
1663
1705
  - Added GPT-5.3 Codex model to the model catalog (OpenAI Codex provider only)
1664
- - Added SSH URL support for git packages ([#1287](https://github.com/code-yeongyu/sanepi-mono/pull/1287) by [@markusn](https://github.com/markusn))
1665
- - Model selectors now display the selected model name ([#1275](https://github.com/code-yeongyu/sanepi-mono/pull/1275) by [@haoqixu](https://github.com/haoqixu))
1706
+ - Added SSH URL support for git packages ([#1287](https://github.com/code-yeongyu/senpi-mono/pull/1287) by [@markusn](https://github.com/markusn))
1707
+ - Model selectors now display the selected model name ([#1275](https://github.com/code-yeongyu/senpi-mono/pull/1275) by [@haoqixu](https://github.com/haoqixu))
1666
1708
 
1667
1709
  ### Fixed
1668
1710
 
1669
- - Fixed HTML export losing indentation in ANSI-rendered tool output (e.g. JSON code blocks in custom tool results) ([#1269](https://github.com/code-yeongyu/sanepi-mono/pull/1269) by [@aliou](https://github.com/aliou))
1670
- - Fixed images being silently dropped when `prompt()` is called with both `images` and `streamingBehavior` during streaming. `steer()`, `followUp()`, and the corresponding RPC commands now accept optional images. ([#1271](https://github.com/code-yeongyu/sanepi-mono/pull/1271) by [@aliou](https://github.com/aliou))
1671
- - CLI `--help`, `--version`, `--list-models`, and `--export` now exit even if extensions keep the event loop alive ([#1285](https://github.com/code-yeongyu/sanepi-mono/pull/1285) by [@ferologics](https://github.com/ferologics))
1672
- - Fixed crash when models send malformed tool arguments (objects instead of strings) ([#1259](https://github.com/code-yeongyu/sanepi-mono/issues/1259))
1673
- - Fixed custom message expand state not being respected ([#1258](https://github.com/code-yeongyu/sanepi-mono/pull/1258) by [@Gurpartap](https://github.com/Gurpartap))
1711
+ - Fixed HTML export losing indentation in ANSI-rendered tool output (e.g. JSON code blocks in custom tool results) ([#1269](https://github.com/code-yeongyu/senpi-mono/pull/1269) by [@aliou](https://github.com/aliou))
1712
+ - Fixed images being silently dropped when `prompt()` is called with both `images` and `streamingBehavior` during streaming. `steer()`, `followUp()`, and the corresponding RPC commands now accept optional images. ([#1271](https://github.com/code-yeongyu/senpi-mono/pull/1271) by [@aliou](https://github.com/aliou))
1713
+ - CLI `--help`, `--version`, `--list-models`, and `--export` now exit even if extensions keep the event loop alive ([#1285](https://github.com/code-yeongyu/senpi-mono/pull/1285) by [@ferologics](https://github.com/ferologics))
1714
+ - Fixed crash when models send malformed tool arguments (objects instead of strings) ([#1259](https://github.com/code-yeongyu/senpi-mono/issues/1259))
1715
+ - Fixed custom message expand state not being respected ([#1258](https://github.com/code-yeongyu/senpi-mono/pull/1258) by [@Gurpartap](https://github.com/Gurpartap))
1674
1716
  - Fixed skill loader to respect .gitignore, .ignore, and .fdignore when scanning directories
1675
1717
 
1676
1718
  ## [0.51.6] - 2026-02-04
1677
1719
 
1678
1720
  ### New Features
1679
1721
 
1680
- - Configurable resume keybinding action for opening the session resume selector. See [docs/keybindings.md](docs/keybindings.md). ([#1249](https://github.com/code-yeongyu/sanepi-mono/pull/1249) by [@juanibiapina](https://github.com/juanibiapina))
1722
+ - Configurable resume keybinding action for opening the session resume selector. See [docs/keybindings.md](docs/keybindings.md). ([#1249](https://github.com/code-yeongyu/senpi-mono/pull/1249) by [@juanibiapina](https://github.com/juanibiapina))
1681
1723
 
1682
1724
  ### Added
1683
1725
 
1684
- - Added `resume` as a configurable keybinding action, allowing users to bind a key to open the session resume selector (like `newSession`, `tree`, and `fork`) ([#1249](https://github.com/code-yeongyu/sanepi-mono/pull/1249) by [@juanibiapina](https://github.com/juanibiapina))
1726
+ - Added `resume` as a configurable keybinding action, allowing users to bind a key to open the session resume selector (like `newSession`, `tree`, and `fork`) ([#1249](https://github.com/code-yeongyu/senpi-mono/pull/1249) by [@juanibiapina](https://github.com/juanibiapina))
1685
1727
 
1686
1728
  ### Changed
1687
1729
 
1688
- - Slash command menu now triggers on the first line even when other lines have content, allowing commands to be prepended to existing text ([#1227](https://github.com/code-yeongyu/sanepi-mono/pull/1227) by [@aliou](https://github.com/aliou))
1730
+ - Slash command menu now triggers on the first line even when other lines have content, allowing commands to be prepended to existing text ([#1227](https://github.com/code-yeongyu/senpi-mono/pull/1227) by [@aliou](https://github.com/aliou))
1689
1731
 
1690
1732
  ### Fixed
1691
1733
 
1692
1734
  - Ignored unknown skill frontmatter fields when loading skills
1693
- - Fixed `/reload` not picking up changes in global settings.json ([#1241](https://github.com/code-yeongyu/sanepi-mono/issues/1241))
1735
+ - Fixed `/reload` not picking up changes in global settings.json ([#1241](https://github.com/code-yeongyu/senpi-mono/issues/1241))
1694
1736
  - Fixed forked sessions to persist the user message after forking
1695
- - Fixed forked sessions to write to new session files instead of the parent ([#1242](https://github.com/code-yeongyu/sanepi-mono/issues/1242))
1696
- - Fixed local package removal to normalize paths before comparison ([#1243](https://github.com/code-yeongyu/sanepi-mono/issues/1243))
1697
- - Fixed OpenAI Codex Responses provider to respect configured baseUrl ([#1244](https://github.com/code-yeongyu/sanepi-mono/issues/1244))
1698
- - Fixed `/settings` crashing in narrow terminals by handling small widths in the settings list ([#1246](https://github.com/code-yeongyu/sanepi-mono/pull/1246) by [@haoqixu](https://github.com/haoqixu))
1699
- - Fixed Unix bash detection to fall back to PATH lookup when `/bin/bash` is unavailable, including Termux setups ([#1230](https://github.com/code-yeongyu/sanepi-mono/pull/1230) by [@VaclavSynacek](https://github.com/VaclavSynacek))
1737
+ - Fixed forked sessions to write to new session files instead of the parent ([#1242](https://github.com/code-yeongyu/senpi-mono/issues/1242))
1738
+ - Fixed local package removal to normalize paths before comparison ([#1243](https://github.com/code-yeongyu/senpi-mono/issues/1243))
1739
+ - Fixed OpenAI Codex Responses provider to respect configured baseUrl ([#1244](https://github.com/code-yeongyu/senpi-mono/issues/1244))
1740
+ - Fixed `/settings` crashing in narrow terminals by handling small widths in the settings list ([#1246](https://github.com/code-yeongyu/senpi-mono/pull/1246) by [@haoqixu](https://github.com/haoqixu))
1741
+ - Fixed Unix bash detection to fall back to PATH lookup when `/bin/bash` is unavailable, including Termux setups ([#1230](https://github.com/code-yeongyu/senpi-mono/pull/1230) by [@VaclavSynacek](https://github.com/VaclavSynacek))
1700
1742
 
1701
1743
  ## [0.51.5] - 2026-02-04
1702
1744
 
1703
1745
  ### Changed
1704
1746
 
1705
- - Changed Bedrock model generation to drop legacy workarounds now handled upstream ([#1239](https://github.com/code-yeongyu/sanepi-mono/pull/1239) by [@unexge](https://github.com/unexge))
1747
+ - Changed Bedrock model generation to drop legacy workarounds now handled upstream ([#1239](https://github.com/code-yeongyu/senpi-mono/pull/1239) by [@unexge](https://github.com/unexge))
1706
1748
 
1707
1749
  ### Fixed
1708
1750
 
1709
- - Fixed Windows package installs regression by using shell execution instead of `.cmd` resolution ([#1220](https://github.com/code-yeongyu/sanepi-mono/issues/1220))
1751
+ - Fixed Windows package installs regression by using shell execution instead of `.cmd` resolution ([#1220](https://github.com/code-yeongyu/senpi-mono/issues/1220))
1710
1752
 
1711
1753
  ## [0.51.4] - 2026-02-03
1712
1754
 
@@ -1720,7 +1762,7 @@ Examples:
1720
1762
 
1721
1763
  ### Fixed
1722
1764
 
1723
- - Fixed input scrolling to avoid splitting emoji sequences ([#1228](https://github.com/code-yeongyu/sanepi-mono/pull/1228) by [@haoqixu](https://github.com/haoqixu))
1765
+ - Fixed input scrolling to avoid splitting emoji sequences ([#1228](https://github.com/code-yeongyu/senpi-mono/pull/1228) by [@haoqixu](https://github.com/haoqixu))
1724
1766
 
1725
1767
  ## [0.51.3] - 2026-02-03
1726
1768
 
@@ -1735,15 +1777,15 @@ Examples:
1735
1777
 
1736
1778
  ### Added
1737
1779
 
1738
- - Added `ExtensionAPI.getCommands()` to let extensions list available slash commands (extensions, prompt templates, skills) for invocation via `prompt` ([#1210](https://github.com/code-yeongyu/sanepi-mono/pull/1210) by [@w-winter](https://github.com/w-winter))
1739
- - Added `commands.ts` example extension and exported `SlashCommandInfo` types for command discovery integrations ([#1210](https://github.com/code-yeongyu/sanepi-mono/pull/1210) by [@w-winter](https://github.com/w-winter))
1740
- - Added local path support for `pi install` and `pi remove` with relative paths stored against the target settings file ([#1216](https://github.com/code-yeongyu/sanepi-mono/issues/1216))
1780
+ - Added `ExtensionAPI.getCommands()` to let extensions list available slash commands (extensions, prompt templates, skills) for invocation via `prompt` ([#1210](https://github.com/code-yeongyu/senpi-mono/pull/1210) by [@w-winter](https://github.com/w-winter))
1781
+ - Added `commands.ts` example extension and exported `SlashCommandInfo` types for command discovery integrations ([#1210](https://github.com/code-yeongyu/senpi-mono/pull/1210) by [@w-winter](https://github.com/w-winter))
1782
+ - Added local path support for `pi install` and `pi remove` with relative paths stored against the target settings file ([#1216](https://github.com/code-yeongyu/senpi-mono/issues/1216))
1741
1783
 
1742
1784
  ### Fixed
1743
1785
 
1744
1786
  - Fixed default thinking level persistence so settings-derived defaults are saved and restored correctly
1745
- - Fixed Windows package installs by resolving `npm.cmd` when `npm` is not directly executable ([#1220](https://github.com/code-yeongyu/sanepi-mono/issues/1220))
1746
- - Fixed xhigh thinking level support check to accept gpt-5.2 model IDs ([#1209](https://github.com/code-yeongyu/sanepi-mono/issues/1209))
1787
+ - Fixed Windows package installs by resolving `npm.cmd` when `npm` is not directly executable ([#1220](https://github.com/code-yeongyu/senpi-mono/issues/1220))
1788
+ - Fixed xhigh thinking level support check to accept gpt-5.2 model IDs ([#1209](https://github.com/code-yeongyu/senpi-mono/issues/1209))
1747
1789
 
1748
1790
  ## [0.51.2] - 2026-02-03
1749
1791
 
@@ -1753,31 +1795,31 @@ Examples:
1753
1795
 
1754
1796
  ### Added
1755
1797
 
1756
- - Added ExtensionUIContext getToolsExpanded and setToolsExpanded for controlling tool output expansion ([#1199](https://github.com/code-yeongyu/sanepi-mono/pull/1199) by [@academo](https://github.com/academo))
1757
- - Added install method detection to show package manager specific update instructions ([#1203](https://github.com/code-yeongyu/sanepi-mono/pull/1203) by [@Itsnotaka](https://github.com/Itsnotaka))
1798
+ - Added ExtensionUIContext getToolsExpanded and setToolsExpanded for controlling tool output expansion ([#1199](https://github.com/code-yeongyu/senpi-mono/pull/1199) by [@academo](https://github.com/academo))
1799
+ - Added install method detection to show package manager specific update instructions ([#1203](https://github.com/code-yeongyu/senpi-mono/pull/1203) by [@Itsnotaka](https://github.com/Itsnotaka))
1758
1800
 
1759
1801
  ### Fixed
1760
1802
 
1761
- - Fixed Kitty key release events leaking to parent shell over slow SSH connections by draining stdin for up to 1s on exit ([#1204](https://github.com/code-yeongyu/sanepi-mono/issues/1204))
1803
+ - Fixed Kitty key release events leaking to parent shell over slow SSH connections by draining stdin for up to 1s on exit ([#1204](https://github.com/code-yeongyu/senpi-mono/issues/1204))
1762
1804
  - Fixed legacy newline handling in the editor to preserve previous newline behavior
1763
1805
  - Fixed @ autocomplete to include hidden paths
1764
1806
  - Fixed submit fallback to honor configured keybindings
1765
- - Fixed extension commands conflicting with built-in commands by skipping them ([#1196](https://github.com/code-yeongyu/sanepi-mono/pull/1196) by [@haoqixu](https://github.com/haoqixu))
1766
- - Fixed @-prefixed tool paths failing to resolve by stripping the prefix ([#1206](https://github.com/code-yeongyu/sanepi-mono/issues/1206))
1807
+ - Fixed extension commands conflicting with built-in commands by skipping them ([#1196](https://github.com/code-yeongyu/senpi-mono/pull/1196) by [@haoqixu](https://github.com/haoqixu))
1808
+ - Fixed @-prefixed tool paths failing to resolve by stripping the prefix ([#1206](https://github.com/code-yeongyu/senpi-mono/issues/1206))
1767
1809
  - Fixed install method detection to avoid stale cached results
1768
1810
 
1769
1811
  ## [0.51.1] - 2026-02-02
1770
1812
 
1771
1813
  ### New Features
1772
1814
 
1773
- - **Extension API switchSession**: Extensions can now programmatically switch sessions via `ctx.switchSession(sessionPath)`. See [docs/extensions.md](docs/extensions.md). ([#1187](https://github.com/code-yeongyu/sanepi-mono/issues/1187))
1815
+ - **Extension API switchSession**: Extensions can now programmatically switch sessions via `ctx.switchSession(sessionPath)`. See [docs/extensions.md](docs/extensions.md). ([#1187](https://github.com/code-yeongyu/senpi-mono/issues/1187))
1774
1816
  - **Clear on shrink setting**: New `terminal.clearOnShrink` setting keeps the editor and footer pinned to the bottom of the terminal when content shrinks. May cause some flicker due to redraws. Disabled by default. Enable via `/settings` or `PI_CLEAR_ON_SHRINK=1` env var.
1775
1817
 
1776
1818
  ### Fixed
1777
1819
 
1778
- - Fixed scoped models not finding valid credentials after logout ([#1194](https://github.com/code-yeongyu/sanepi-mono/pull/1194) by [@terrorobe](https://github.com/terrorobe))
1779
- - Fixed Ctrl+D exit closing the parent SSH session due to stdin buffer race condition ([#1185](https://github.com/code-yeongyu/sanepi-mono/issues/1185))
1780
- - Fixed emoji cursor positioning in editor input ([#1183](https://github.com/code-yeongyu/sanepi-mono/pull/1183) by [@haoqixu](https://github.com/haoqixu))
1820
+ - Fixed scoped models not finding valid credentials after logout ([#1194](https://github.com/code-yeongyu/senpi-mono/pull/1194) by [@terrorobe](https://github.com/terrorobe))
1821
+ - Fixed Ctrl+D exit closing the parent SSH session due to stdin buffer race condition ([#1185](https://github.com/code-yeongyu/senpi-mono/issues/1185))
1822
+ - Fixed emoji cursor positioning in editor input ([#1183](https://github.com/code-yeongyu/senpi-mono/pull/1183) by [@haoqixu](https://github.com/haoqixu))
1781
1823
 
1782
1824
  ## [0.51.0] - 2026-02-01
1783
1825
 
@@ -1801,81 +1843,81 @@ Examples:
1801
1843
  mkdir -p ~/.senpi/agent
1802
1844
  echo "You are running on Android in Termux." > ~/.senpi/agent/AGENTS.md
1803
1845
  ```
1804
- Clipboard operations fall back gracefully when `termux-api` is unavailable. ([#1164](https://github.com/code-yeongyu/sanepi-mono/issues/1164))
1805
- - **Bash spawn hook**: Extensions can now intercept and modify bash commands before execution via `pi.setBashSpawnHook()`. Adjust the command string, working directory, or environment variables. See [docs/extensions.md](docs/extensions.md). ([#1160](https://github.com/code-yeongyu/sanepi-mono/pull/1160) by [@mitsuhiko](https://github.com/mitsuhiko))
1846
+ Clipboard operations fall back gracefully when `termux-api` is unavailable. ([#1164](https://github.com/code-yeongyu/senpi-mono/issues/1164))
1847
+ - **Bash spawn hook**: Extensions can now intercept and modify bash commands before execution via `pi.setBashSpawnHook()`. Adjust the command string, working directory, or environment variables. See [docs/extensions.md](docs/extensions.md). ([#1160](https://github.com/code-yeongyu/senpi-mono/pull/1160) by [@mitsuhiko](https://github.com/mitsuhiko))
1806
1848
  - **Linux ARM64 musl support**: Pi now runs on Alpine Linux ARM64 (linux-arm64-musl) via updated clipboard dependency.
1807
- - **Nix/Guix support**: `PI_PACKAGE_DIR` environment variable overrides the package path for content-addressed package managers where store paths tokenize poorly. See [README.md#environment-variables](README.md#environment-variables). ([#1153](https://github.com/code-yeongyu/sanepi-mono/pull/1153) by [@odysseus0](https://github.com/odysseus0))
1808
- - **Named session filter**: `/resume` picker now supports filtering to show only named sessions via Ctrl+N. Configurable via `toggleSessionNamedFilter` keybinding. See [docs/keybindings.md](docs/keybindings.md). ([#1128](https://github.com/code-yeongyu/sanepi-mono/pull/1128) by [@w-winter](https://github.com/w-winter))
1809
- - **Typed tool call events**: Extension developers can narrow `ToolCallEvent` types using `isToolCallEventType()` for better TypeScript support. See [docs/extensions.md#tool-call-events](docs/extensions.md#tool-call-events). ([#1147](https://github.com/code-yeongyu/sanepi-mono/pull/1147) by [@giuseppeg](https://github.com/giuseppeg))
1810
- - **Extension UI Protocol**: Full RPC documentation and examples for extension dialogs and notifications, enabling headless clients to support interactive extensions. See [docs/rpc.md#extension-ui-protocol](docs/rpc.md#extension-ui-protocol). ([#1144](https://github.com/code-yeongyu/sanepi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1849
+ - **Nix/Guix support**: `PI_PACKAGE_DIR` environment variable overrides the package path for content-addressed package managers where store paths tokenize poorly. See [README.md#environment-variables](README.md#environment-variables). ([#1153](https://github.com/code-yeongyu/senpi-mono/pull/1153) by [@odysseus0](https://github.com/odysseus0))
1850
+ - **Named session filter**: `/resume` picker now supports filtering to show only named sessions via Ctrl+N. Configurable via `toggleSessionNamedFilter` keybinding. See [docs/keybindings.md](docs/keybindings.md). ([#1128](https://github.com/code-yeongyu/senpi-mono/pull/1128) by [@w-winter](https://github.com/w-winter))
1851
+ - **Typed tool call events**: Extension developers can narrow `ToolCallEvent` types using `isToolCallEventType()` for better TypeScript support. See [docs/extensions.md#tool-call-events](docs/extensions.md#tool-call-events). ([#1147](https://github.com/code-yeongyu/senpi-mono/pull/1147) by [@giuseppeg](https://github.com/giuseppeg))
1852
+ - **Extension UI Protocol**: Full RPC documentation and examples for extension dialogs and notifications, enabling headless clients to support interactive extensions. See [docs/rpc.md#extension-ui-protocol](docs/rpc.md#extension-ui-protocol). ([#1144](https://github.com/code-yeongyu/senpi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1811
1853
 
1812
1854
  ### Added
1813
1855
 
1814
1856
  - Added Linux ARM64 musl (Alpine Linux) support via clipboard dependency update
1815
- - Added Android/Termux support with graceful clipboard fallback ([#1164](https://github.com/code-yeongyu/sanepi-mono/issues/1164))
1816
- - Added bash tool spawn hook support for adjusting command, cwd, and env before execution ([#1160](https://github.com/code-yeongyu/sanepi-mono/pull/1160) by [@mitsuhiko](https://github.com/mitsuhiko))
1817
- - Added typed `ToolCallEvent.input` per tool with `isToolCallEventType()` type guard for narrowing built-in tool events ([#1147](https://github.com/code-yeongyu/sanepi-mono/pull/1147) by [@giuseppeg](https://github.com/giuseppeg))
1818
- - Exported `discoverAndLoadExtensions` from package to enable extension testing without a local repo clone ([#1148](https://github.com/code-yeongyu/sanepi-mono/issues/1148))
1819
- - Added Extension UI Protocol documentation to RPC docs covering all request/response types for extension dialogs and notifications ([#1144](https://github.com/code-yeongyu/sanepi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1820
- - Added `rpc-demo.ts` example extension exercising all RPC-supported extension UI methods ([#1144](https://github.com/code-yeongyu/sanepi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1821
- - Added `rpc-extension-ui.ts` TUI example client demonstrating the extension UI protocol with interactive dialogs ([#1144](https://github.com/code-yeongyu/sanepi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1822
- - Added `PI_PACKAGE_DIR` environment variable to override package path for content-addressed package managers (Nix, Guix) where store paths tokenize poorly ([#1153](https://github.com/code-yeongyu/sanepi-mono/pull/1153) by [@odysseus0](https://github.com/odysseus0))
1823
- - `/resume` session picker now supports named-only filter toggle (default Ctrl+N, configurable via `toggleSessionNamedFilter`) to show only named sessions ([#1128](https://github.com/code-yeongyu/sanepi-mono/pull/1128) by [@w-winter](https://github.com/w-winter))
1824
-
1825
- ### Fixed
1826
-
1827
- - Fixed `pi update` not updating npm/git packages when called without arguments ([#1151](https://github.com/code-yeongyu/sanepi-mono/issues/1151))
1828
- - Fixed `models.json` validation requiring fields documented as optional. Model definitions now only require `id`; all other fields (`name`, `reasoning`, `input`, `cost`, `contextWindow`, `maxTokens`) have sensible defaults. ([#1146](https://github.com/code-yeongyu/sanepi-mono/issues/1146))
1829
- - Fixed models resolving relative paths in skill files from cwd instead of skill directory by adding explicit guidance to skills preamble ([#1136](https://github.com/code-yeongyu/sanepi-mono/issues/1136))
1830
- - Fixed tree selector losing focus state when navigating entries ([#1142](https://github.com/code-yeongyu/sanepi-mono/pull/1142) by [@Perlence](https://github.com/Perlence))
1831
- - Fixed `cacheRetention` option not being passed through in `buildBaseOptions` ([#1154](https://github.com/code-yeongyu/sanepi-mono/issues/1154))
1832
- - Fixed OAuth login/refresh not using HTTP proxy settings (`HTTP_PROXY`, `HTTPS_PROXY` env vars) ([#1132](https://github.com/code-yeongyu/sanepi-mono/issues/1132))
1833
- - Fixed `pi update <source>` installing packages locally when the source is only registered globally ([#1163](https://github.com/code-yeongyu/sanepi-mono/pull/1163) by [@aliou](https://github.com/aliou))
1834
- - Fixed tree navigation with summarization overwriting editor content typed during the summarization wait ([#1169](https://github.com/code-yeongyu/sanepi-mono/pull/1169) by [@aliou](https://github.com/aliou))
1857
+ - Added Android/Termux support with graceful clipboard fallback ([#1164](https://github.com/code-yeongyu/senpi-mono/issues/1164))
1858
+ - Added bash tool spawn hook support for adjusting command, cwd, and env before execution ([#1160](https://github.com/code-yeongyu/senpi-mono/pull/1160) by [@mitsuhiko](https://github.com/mitsuhiko))
1859
+ - Added typed `ToolCallEvent.input` per tool with `isToolCallEventType()` type guard for narrowing built-in tool events ([#1147](https://github.com/code-yeongyu/senpi-mono/pull/1147) by [@giuseppeg](https://github.com/giuseppeg))
1860
+ - Exported `discoverAndLoadExtensions` from package to enable extension testing without a local repo clone ([#1148](https://github.com/code-yeongyu/senpi-mono/issues/1148))
1861
+ - Added Extension UI Protocol documentation to RPC docs covering all request/response types for extension dialogs and notifications ([#1144](https://github.com/code-yeongyu/senpi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1862
+ - Added `rpc-demo.ts` example extension exercising all RPC-supported extension UI methods ([#1144](https://github.com/code-yeongyu/senpi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1863
+ - Added `rpc-extension-ui.ts` TUI example client demonstrating the extension UI protocol with interactive dialogs ([#1144](https://github.com/code-yeongyu/senpi-mono/pull/1144) by [@aliou](https://github.com/aliou))
1864
+ - Added `PI_PACKAGE_DIR` environment variable to override package path for content-addressed package managers (Nix, Guix) where store paths tokenize poorly ([#1153](https://github.com/code-yeongyu/senpi-mono/pull/1153) by [@odysseus0](https://github.com/odysseus0))
1865
+ - `/resume` session picker now supports named-only filter toggle (default Ctrl+N, configurable via `toggleSessionNamedFilter`) to show only named sessions ([#1128](https://github.com/code-yeongyu/senpi-mono/pull/1128) by [@w-winter](https://github.com/w-winter))
1866
+
1867
+ ### Fixed
1868
+
1869
+ - Fixed `pi update` not updating npm/git packages when called without arguments ([#1151](https://github.com/code-yeongyu/senpi-mono/issues/1151))
1870
+ - Fixed `models.json` validation requiring fields documented as optional. Model definitions now only require `id`; all other fields (`name`, `reasoning`, `input`, `cost`, `contextWindow`, `maxTokens`) have sensible defaults. ([#1146](https://github.com/code-yeongyu/senpi-mono/issues/1146))
1871
+ - Fixed models resolving relative paths in skill files from cwd instead of skill directory by adding explicit guidance to skills preamble ([#1136](https://github.com/code-yeongyu/senpi-mono/issues/1136))
1872
+ - Fixed tree selector losing focus state when navigating entries ([#1142](https://github.com/code-yeongyu/senpi-mono/pull/1142) by [@Perlence](https://github.com/Perlence))
1873
+ - Fixed `cacheRetention` option not being passed through in `buildBaseOptions` ([#1154](https://github.com/code-yeongyu/senpi-mono/issues/1154))
1874
+ - Fixed OAuth login/refresh not using HTTP proxy settings (`HTTP_PROXY`, `HTTPS_PROXY` env vars) ([#1132](https://github.com/code-yeongyu/senpi-mono/issues/1132))
1875
+ - Fixed `pi update <source>` installing packages locally when the source is only registered globally ([#1163](https://github.com/code-yeongyu/senpi-mono/pull/1163) by [@aliou](https://github.com/aliou))
1876
+ - Fixed tree navigation with summarization overwriting editor content typed during the summarization wait ([#1169](https://github.com/code-yeongyu/senpi-mono/pull/1169) by [@aliou](https://github.com/aliou))
1835
1877
 
1836
1878
  ## [0.50.9] - 2026-02-01
1837
1879
 
1838
1880
  ### Added
1839
1881
 
1840
1882
  - Added `titlebar-spinner.ts` example extension that shows a braille spinner animation in the terminal title while the agent is working.
1841
- - Added `PI_AI_ANTIGRAVITY_VERSION` environment variable documentation to help text ([#1129](https://github.com/code-yeongyu/sanepi-mono/issues/1129))
1842
- - Added `cacheRetention` stream option with provider-specific mappings for prompt cache controls, defaulting to short retention ([#1134](https://github.com/code-yeongyu/sanepi-mono/issues/1134))
1883
+ - Added `PI_AI_ANTIGRAVITY_VERSION` environment variable documentation to help text ([#1129](https://github.com/code-yeongyu/senpi-mono/issues/1129))
1884
+ - Added `cacheRetention` stream option with provider-specific mappings for prompt cache controls, defaulting to short retention ([#1134](https://github.com/code-yeongyu/senpi-mono/issues/1134))
1843
1885
 
1844
1886
  ## [0.50.8] - 2026-02-01
1845
1887
 
1846
1888
  ### Added
1847
1889
 
1848
- - Added `newSession`, `tree`, and `fork` keybinding actions for `/new`, `/tree`, and `/fork` commands. All unbound by default. ([#1114](https://github.com/code-yeongyu/sanepi-mono/pull/1114) by [@juanibiapina](https://github.com/juanibiapina))
1849
- - Added `retry.maxDelayMs` setting to cap maximum server-requested retry delay. When a provider requests a longer delay (e.g., Google's "quota will reset after 5h"), the request fails immediately with an informative error instead of waiting silently. Default: 60000ms (60 seconds). ([#1123](https://github.com/code-yeongyu/sanepi-mono/issues/1123))
1850
- - `/resume` session picker: new "Threaded" sort mode (now default) displays sessions in a tree structure based on fork relationships. Compact one-line format with message count and age on the right. ([#1124](https://github.com/code-yeongyu/sanepi-mono/pull/1124) by [@pasky](https://github.com/pasky))
1851
- - Added Qwen CLI OAuth provider extension example. ([#940](https://github.com/code-yeongyu/sanepi-mono/pull/940) by [@4h9fbZ](https://github.com/4h9fbZ))
1852
- - Added OAuth `modifyModels` hook support for extension-registered providers at registration time. ([#940](https://github.com/code-yeongyu/sanepi-mono/pull/940) by [@4h9fbZ](https://github.com/4h9fbZ))
1853
- - Added Qwen thinking format support for OpenAI-compatible completions via `enable_thinking`. ([#940](https://github.com/code-yeongyu/sanepi-mono/pull/940) by [@4h9fbZ](https://github.com/4h9fbZ))
1854
- - Added sticky column tracking for vertical cursor navigation so the editor restores the preferred column when moving across short lines. ([#1120](https://github.com/code-yeongyu/sanepi-mono/pull/1120) by [@Perlence](https://github.com/Perlence))
1890
+ - Added `newSession`, `tree`, and `fork` keybinding actions for `/new`, `/tree`, and `/fork` commands. All unbound by default. ([#1114](https://github.com/code-yeongyu/senpi-mono/pull/1114) by [@juanibiapina](https://github.com/juanibiapina))
1891
+ - Added `retry.maxDelayMs` setting to cap maximum server-requested retry delay. When a provider requests a longer delay (e.g., Google's "quota will reset after 5h"), the request fails immediately with an informative error instead of waiting silently. Default: 60000ms (60 seconds). ([#1123](https://github.com/code-yeongyu/senpi-mono/issues/1123))
1892
+ - `/resume` session picker: new "Threaded" sort mode (now default) displays sessions in a tree structure based on fork relationships. Compact one-line format with message count and age on the right. ([#1124](https://github.com/code-yeongyu/senpi-mono/pull/1124) by [@pasky](https://github.com/pasky))
1893
+ - Added Qwen CLI OAuth provider extension example. ([#940](https://github.com/code-yeongyu/senpi-mono/pull/940) by [@4h9fbZ](https://github.com/4h9fbZ))
1894
+ - Added OAuth `modifyModels` hook support for extension-registered providers at registration time. ([#940](https://github.com/code-yeongyu/senpi-mono/pull/940) by [@4h9fbZ](https://github.com/4h9fbZ))
1895
+ - Added Qwen thinking format support for OpenAI-compatible completions via `enable_thinking`. ([#940](https://github.com/code-yeongyu/senpi-mono/pull/940) by [@4h9fbZ](https://github.com/4h9fbZ))
1896
+ - Added sticky column tracking for vertical cursor navigation so the editor restores the preferred column when moving across short lines. ([#1120](https://github.com/code-yeongyu/senpi-mono/pull/1120) by [@Perlence](https://github.com/Perlence))
1855
1897
  - Added `resources_discover` extension hook to supply additional skills, prompts, and themes on startup and reload.
1856
1898
 
1857
1899
  ### Fixed
1858
1900
 
1859
- - Fixed `switchSession()` appending spurious `thinking_level_change` entry to session log on resume. `setThinkingLevel()` is now idempotent. ([#1118](https://github.com/code-yeongyu/sanepi-mono/issues/1118))
1860
- - Fixed clipboard image paste on WSL2/WSLg writing invalid PNG files when clipboard provides `image/bmp` format. BMP images are now converted to PNG before saving. ([#1112](https://github.com/code-yeongyu/sanepi-mono/pull/1112) by [@lightningRalf](https://github.com/lightningRalf))
1861
- - Fixed Kitty keyboard protocol base layout fallback so non-QWERTY layouts do not trigger wrong shortcuts ([#1096](https://github.com/code-yeongyu/sanepi-mono/pull/1096) by [@rytswd](https://github.com/rytswd))
1901
+ - Fixed `switchSession()` appending spurious `thinking_level_change` entry to session log on resume. `setThinkingLevel()` is now idempotent. ([#1118](https://github.com/code-yeongyu/senpi-mono/issues/1118))
1902
+ - Fixed clipboard image paste on WSL2/WSLg writing invalid PNG files when clipboard provides `image/bmp` format. BMP images are now converted to PNG before saving. ([#1112](https://github.com/code-yeongyu/senpi-mono/pull/1112) by [@lightningRalf](https://github.com/lightningRalf))
1903
+ - Fixed Kitty keyboard protocol base layout fallback so non-QWERTY layouts do not trigger wrong shortcuts ([#1096](https://github.com/code-yeongyu/senpi-mono/pull/1096) by [@rytswd](https://github.com/rytswd))
1862
1904
 
1863
1905
  ## [0.50.7] - 2026-01-31
1864
1906
 
1865
1907
  ### Fixed
1866
1908
 
1867
- - Multi-file extensions in packages now work correctly. Package resolution now uses the same discovery logic as local extensions: only `index.ts` (or manifest-declared entries) are loaded from subdirectories, not helper modules. ([#1102](https://github.com/code-yeongyu/sanepi-mono/issues/1102))
1909
+ - Multi-file extensions in packages now work correctly. Package resolution now uses the same discovery logic as local extensions: only `index.ts` (or manifest-declared entries) are loaded from subdirectories, not helper modules. ([#1102](https://github.com/code-yeongyu/senpi-mono/issues/1102))
1868
1910
 
1869
1911
  ## [0.50.6] - 2026-01-30
1870
1912
 
1871
1913
  ### Added
1872
1914
 
1873
- - Added `ctx.getSystemPrompt()` to extension context for accessing the current effective system prompt ([#1098](https://github.com/code-yeongyu/sanepi-mono/pull/1098) by [@kaofelix](https://github.com/kaofelix))
1915
+ - Added `ctx.getSystemPrompt()` to extension context for accessing the current effective system prompt ([#1098](https://github.com/code-yeongyu/senpi-mono/pull/1098) by [@kaofelix](https://github.com/kaofelix))
1874
1916
 
1875
1917
  ### Fixed
1876
1918
 
1877
- - Fixed empty rows appearing below footer when content shrinks (e.g., closing `/tree`, clearing multi-line editor) ([#1095](https://github.com/code-yeongyu/sanepi-mono/pull/1095) by [@marckrenn](https://github.com/marckrenn))
1878
- - Fixed terminal cursor remaining hidden after exiting TUI via `stop()` when a render was pending ([#1099](https://github.com/code-yeongyu/sanepi-mono/pull/1099) by [@haoqixu](https://github.com/haoqixu))
1919
+ - Fixed empty rows appearing below footer when content shrinks (e.g., closing `/tree`, clearing multi-line editor) ([#1095](https://github.com/code-yeongyu/senpi-mono/pull/1095) by [@marckrenn](https://github.com/marckrenn))
1920
+ - Fixed terminal cursor remaining hidden after exiting TUI via `stop()` when a render was pending ([#1099](https://github.com/code-yeongyu/senpi-mono/pull/1099) by [@haoqixu](https://github.com/haoqixu))
1879
1921
 
1880
1922
  ## [0.50.5] - 2026-01-30
1881
1923
 
@@ -1883,33 +1925,33 @@ Examples:
1883
1925
 
1884
1926
  ### New Features
1885
1927
 
1886
- - **OSC 52 clipboard support for SSH/mosh** - The `/copy` command now works over remote connections using the OSC 52 terminal escape sequence. No more clipboard frustration when using pi over SSH. ([#1069](https://github.com/code-yeongyu/sanepi-mono/issues/1069) by [@gturkoglu](https://github.com/gturkoglu))
1887
- - **Vercel AI Gateway routing** - Route requests through Vercel's AI Gateway with provider failover and load balancing. Configure via `vercelGatewayRouting` in models.json. ([#1051](https://github.com/code-yeongyu/sanepi-mono/pull/1051) by [@ben-vargas](https://github.com/ben-vargas))
1888
- - **Character jump navigation** - Bash/Readline-style character search: Ctrl+] jumps forward to the next occurrence of a character, Ctrl+Alt+] jumps backward. ([#1074](https://github.com/code-yeongyu/sanepi-mono/pull/1074) by [@Perlence](https://github.com/Perlence))
1889
- - **Emacs-style Ctrl+B/Ctrl+F navigation** - Alternative keybindings for word navigation (cursor word left/right) in the editor. ([#1053](https://github.com/code-yeongyu/sanepi-mono/pull/1053) by [@ninlds](https://github.com/ninlds))
1890
- - **Line boundary navigation** - Editor jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line. ([#1050](https://github.com/code-yeongyu/sanepi-mono/pull/1050) by [@4h9fbZ](https://github.com/4h9fbZ))
1891
- - **Performance improvements** - Optimized image line detection and box rendering cache in the TUI for better rendering performance. ([#1084](https://github.com/code-yeongyu/sanepi-mono/pull/1084) by [@can1357](https://github.com/can1357))
1892
- - **`set_session_name` RPC command** - Headless clients can now set the session display name programmatically. ([#1075](https://github.com/code-yeongyu/sanepi-mono/pull/1075) by [@dnouri](https://github.com/dnouri))
1893
- - **Disable double-escape behavior** - New `"none"` option for `doubleEscapeAction` setting completely disables the double-escape shortcut. ([#973](https://github.com/code-yeongyu/sanepi-mono/issues/973) by [@juanibiapina](https://github.com/juanibiapina))
1928
+ - **OSC 52 clipboard support for SSH/mosh** - The `/copy` command now works over remote connections using the OSC 52 terminal escape sequence. No more clipboard frustration when using pi over SSH. ([#1069](https://github.com/code-yeongyu/senpi-mono/issues/1069) by [@gturkoglu](https://github.com/gturkoglu))
1929
+ - **Vercel AI Gateway routing** - Route requests through Vercel's AI Gateway with provider failover and load balancing. Configure via `vercelGatewayRouting` in models.json. ([#1051](https://github.com/code-yeongyu/senpi-mono/pull/1051) by [@ben-vargas](https://github.com/ben-vargas))
1930
+ - **Character jump navigation** - Bash/Readline-style character search: Ctrl+] jumps forward to the next occurrence of a character, Ctrl+Alt+] jumps backward. ([#1074](https://github.com/code-yeongyu/senpi-mono/pull/1074) by [@Perlence](https://github.com/Perlence))
1931
+ - **Emacs-style Ctrl+B/Ctrl+F navigation** - Alternative keybindings for word navigation (cursor word left/right) in the editor. ([#1053](https://github.com/code-yeongyu/senpi-mono/pull/1053) by [@ninlds](https://github.com/ninlds))
1932
+ - **Line boundary navigation** - Editor jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line. ([#1050](https://github.com/code-yeongyu/senpi-mono/pull/1050) by [@4h9fbZ](https://github.com/4h9fbZ))
1933
+ - **Performance improvements** - Optimized image line detection and box rendering cache in the TUI for better rendering performance. ([#1084](https://github.com/code-yeongyu/senpi-mono/pull/1084) by [@can1357](https://github.com/can1357))
1934
+ - **`set_session_name` RPC command** - Headless clients can now set the session display name programmatically. ([#1075](https://github.com/code-yeongyu/senpi-mono/pull/1075) by [@dnouri](https://github.com/dnouri))
1935
+ - **Disable double-escape behavior** - New `"none"` option for `doubleEscapeAction` setting completely disables the double-escape shortcut. ([#973](https://github.com/code-yeongyu/senpi-mono/issues/973) by [@juanibiapina](https://github.com/juanibiapina))
1894
1936
 
1895
1937
  ### Added
1896
1938
 
1897
- - Added "none" option to `doubleEscapeAction` setting to disable double-escape behavior entirely ([#973](https://github.com/code-yeongyu/sanepi-mono/issues/973) by [@juanibiapina](https://github.com/juanibiapina))
1898
- - Added OSC 52 clipboard support for SSH/mosh sessions. `/copy` now works over remote connections. ([#1069](https://github.com/code-yeongyu/sanepi-mono/issues/1069) by [@gturkoglu](https://github.com/gturkoglu))
1899
- - Added Vercel AI Gateway routing support via `vercelGatewayRouting` in models.json ([#1051](https://github.com/code-yeongyu/sanepi-mono/pull/1051) by [@ben-vargas](https://github.com/ben-vargas))
1900
- - Added Ctrl+B and Ctrl+F keybindings for cursor word left/right navigation in the editor ([#1053](https://github.com/code-yeongyu/sanepi-mono/pull/1053) by [@ninlds](https://github.com/ninlds))
1901
- - Added character jump navigation: Ctrl+] jumps forward to next character, Ctrl+Alt+] jumps backward ([#1074](https://github.com/code-yeongyu/sanepi-mono/pull/1074) by [@Perlence](https://github.com/Perlence))
1902
- - Editor now jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line ([#1050](https://github.com/code-yeongyu/sanepi-mono/pull/1050) by [@4h9fbZ](https://github.com/4h9fbZ))
1903
- - Optimized image line detection and box rendering cache for better TUI performance ([#1084](https://github.com/code-yeongyu/sanepi-mono/pull/1084) by [@can1357](https://github.com/can1357))
1904
- - Added `set_session_name` RPC command for headless clients to set session display name ([#1075](https://github.com/code-yeongyu/sanepi-mono/pull/1075) by [@dnouri](https://github.com/dnouri))
1939
+ - Added "none" option to `doubleEscapeAction` setting to disable double-escape behavior entirely ([#973](https://github.com/code-yeongyu/senpi-mono/issues/973) by [@juanibiapina](https://github.com/juanibiapina))
1940
+ - Added OSC 52 clipboard support for SSH/mosh sessions. `/copy` now works over remote connections. ([#1069](https://github.com/code-yeongyu/senpi-mono/issues/1069) by [@gturkoglu](https://github.com/gturkoglu))
1941
+ - Added Vercel AI Gateway routing support via `vercelGatewayRouting` in models.json ([#1051](https://github.com/code-yeongyu/senpi-mono/pull/1051) by [@ben-vargas](https://github.com/ben-vargas))
1942
+ - Added Ctrl+B and Ctrl+F keybindings for cursor word left/right navigation in the editor ([#1053](https://github.com/code-yeongyu/senpi-mono/pull/1053) by [@ninlds](https://github.com/ninlds))
1943
+ - Added character jump navigation: Ctrl+] jumps forward to next character, Ctrl+Alt+] jumps backward ([#1074](https://github.com/code-yeongyu/senpi-mono/pull/1074) by [@Perlence](https://github.com/Perlence))
1944
+ - Editor now jumps to line start when pressing Up at first visual line, and line end when pressing Down at last visual line ([#1050](https://github.com/code-yeongyu/senpi-mono/pull/1050) by [@4h9fbZ](https://github.com/4h9fbZ))
1945
+ - Optimized image line detection and box rendering cache for better TUI performance ([#1084](https://github.com/code-yeongyu/senpi-mono/pull/1084) by [@can1357](https://github.com/can1357))
1946
+ - Added `set_session_name` RPC command for headless clients to set session display name ([#1075](https://github.com/code-yeongyu/senpi-mono/pull/1075) by [@dnouri](https://github.com/dnouri))
1905
1947
 
1906
1948
  ### Fixed
1907
1949
 
1908
- - Read tool now handles macOS filenames with curly quotes (U+2019) and NFD Unicode normalization ([#1078](https://github.com/code-yeongyu/sanepi-mono/issues/1078))
1909
- - Respect .gitignore, .ignore, and .fdignore files when scanning package resources for skills, prompts, themes, and extensions ([#1072](https://github.com/code-yeongyu/sanepi-mono/issues/1072))
1910
- - Fixed tool call argument defaults when providers omit inputs ([#1065](https://github.com/code-yeongyu/sanepi-mono/issues/1065))
1911
- - Invalid JSON in settings.json no longer causes the file to be overwritten with empty settings ([#1054](https://github.com/code-yeongyu/sanepi-mono/issues/1054))
1912
- - Config selector now shows folder name for extensions with duplicate display names ([#1064](https://github.com/code-yeongyu/sanepi-mono/pull/1064) by [@Graffioh](https://github.com/Graffioh))
1950
+ - Read tool now handles macOS filenames with curly quotes (U+2019) and NFD Unicode normalization ([#1078](https://github.com/code-yeongyu/senpi-mono/issues/1078))
1951
+ - Respect .gitignore, .ignore, and .fdignore files when scanning package resources for skills, prompts, themes, and extensions ([#1072](https://github.com/code-yeongyu/senpi-mono/issues/1072))
1952
+ - Fixed tool call argument defaults when providers omit inputs ([#1065](https://github.com/code-yeongyu/senpi-mono/issues/1065))
1953
+ - Invalid JSON in settings.json no longer causes the file to be overwritten with empty settings ([#1054](https://github.com/code-yeongyu/senpi-mono/issues/1054))
1954
+ - Config selector now shows folder name for extensions with duplicate display names ([#1064](https://github.com/code-yeongyu/senpi-mono/pull/1064) by [@Graffioh](https://github.com/Graffioh))
1913
1955
 
1914
1956
  ## [0.50.3] - 2026-01-29
1915
1957
 
@@ -1937,45 +1979,45 @@ Examples:
1937
1979
 
1938
1980
  ### Added
1939
1981
 
1940
- - Added Hugging Face provider support via OpenAI-compatible Inference Router ([#994](https://github.com/code-yeongyu/sanepi-mono/issues/994))
1941
- - Added `PI_CACHE_RETENTION` environment variable to control cache TTL for Anthropic (5m vs 1h) and OpenAI (in-memory vs 24h). Set to `long` for extended retention. ([#967](https://github.com/code-yeongyu/sanepi-mono/issues/967))
1942
- - Added `autocompleteMaxVisible` setting for configurable autocomplete dropdown height (3-20 items, default 5) ([#972](https://github.com/code-yeongyu/sanepi-mono/pull/972) by [@masonc15](https://github.com/masonc15))
1982
+ - Added Hugging Face provider support via OpenAI-compatible Inference Router ([#994](https://github.com/code-yeongyu/senpi-mono/issues/994))
1983
+ - Added `PI_CACHE_RETENTION` environment variable to control cache TTL for Anthropic (5m vs 1h) and OpenAI (in-memory vs 24h). Set to `long` for extended retention. ([#967](https://github.com/code-yeongyu/senpi-mono/issues/967))
1984
+ - Added `autocompleteMaxVisible` setting for configurable autocomplete dropdown height (3-20 items, default 5) ([#972](https://github.com/code-yeongyu/senpi-mono/pull/972) by [@masonc15](https://github.com/masonc15))
1943
1985
  - Added `/files` command to list all file operations (read, write, edit) in the current session
1944
- - Added shell-style keybindings: `alt+b`/`alt+f` for word navigation, `ctrl+d` for delete character forward (when editor has text) ([#1043](https://github.com/code-yeongyu/sanepi-mono/issues/1043) by [@jasonish](https://github.com/jasonish))
1945
- - Added `get_commands` RPC method for headless clients to list available commands ([#995](https://github.com/code-yeongyu/sanepi-mono/pull/995) by [@dnouri](https://github.com/dnouri))
1986
+ - Added shell-style keybindings: `alt+b`/`alt+f` for word navigation, `ctrl+d` for delete character forward (when editor has text) ([#1043](https://github.com/code-yeongyu/senpi-mono/issues/1043) by [@jasonish](https://github.com/jasonish))
1987
+ - Added `get_commands` RPC method for headless clients to list available commands ([#995](https://github.com/code-yeongyu/senpi-mono/pull/995) by [@dnouri](https://github.com/dnouri))
1946
1988
 
1947
1989
  ### Changed
1948
1990
 
1949
- - Improved `extractCursorPosition` performance in TUI: scans lines in reverse order, early-outs when cursor is above viewport ([#1004](https://github.com/code-yeongyu/sanepi-mono/pull/1004) by [@can1357](https://github.com/can1357))
1950
- - Autocomplete improvements: better handling of partial matches and edge cases ([#1024](https://github.com/code-yeongyu/sanepi-mono/pull/1024) by [@Perlence](https://github.com/Perlence))
1991
+ - Improved `extractCursorPosition` performance in TUI: scans lines in reverse order, early-outs when cursor is above viewport ([#1004](https://github.com/code-yeongyu/senpi-mono/pull/1004) by [@can1357](https://github.com/can1357))
1992
+ - Autocomplete improvements: better handling of partial matches and edge cases ([#1024](https://github.com/code-yeongyu/senpi-mono/pull/1024) by [@Perlence](https://github.com/Perlence))
1951
1993
 
1952
1994
  ### Fixed
1953
1995
 
1954
1996
  - External edits to `settings.json` are now preserved when pi reloads or saves unrelated settings. Previously, editing settings.json directly (e.g., removing a package from `packages` array) would be silently reverted on next pi startup when automatic setters like `setLastChangelogVersion()` triggered a save.
1955
- - Fixed custom header not displaying correctly with `quietStartup` enabled ([#1039](https://github.com/code-yeongyu/sanepi-mono/pull/1039) by [@tudoroancea](https://github.com/tudoroancea))
1956
- - Empty array in package filter now disables all resources instead of falling back to manifest defaults ([#1044](https://github.com/code-yeongyu/sanepi-mono/issues/1044))
1957
- - Auto-retry counter now resets after each successful LLM response instead of accumulating across tool-use turns ([#1019](https://github.com/code-yeongyu/sanepi-mono/issues/1019))
1958
- - Fixed incorrect `.md` file names in warning messages ([#1041](https://github.com/code-yeongyu/sanepi-mono/issues/1041) by [@llimllib](https://github.com/llimllib))
1959
- - Fixed provider name hidden in footer when terminal is narrow ([#981](https://github.com/code-yeongyu/sanepi-mono/pull/981) by [@Perlence](https://github.com/Perlence))
1960
- - Fixed backslash input buffering causing delayed character display in editor ([#1037](https://github.com/code-yeongyu/sanepi-mono/pull/1037) by [@Perlence](https://github.com/Perlence))
1961
- - Fixed markdown table rendering with proper row dividers and minimum column width ([#997](https://github.com/code-yeongyu/sanepi-mono/pull/997) by [@tmustier](https://github.com/tmustier))
1962
- - Fixed OpenAI completions `toolChoice` handling ([#998](https://github.com/code-yeongyu/sanepi-mono/pull/998) by [@williamtwomey](https://github.com/williamtwomey))
1963
- - Fixed cross-provider handoff failing when switching from OpenAI Responses API providers due to pipe-separated tool call IDs ([#1022](https://github.com/code-yeongyu/sanepi-mono/issues/1022))
1964
- - Fixed 429 rate limit errors incorrectly triggering auto-compaction instead of retry with backoff ([#1038](https://github.com/code-yeongyu/sanepi-mono/issues/1038))
1965
- - Fixed Anthropic provider to handle `sensitive` stop_reason returned by API ([#978](https://github.com/code-yeongyu/sanepi-mono/issues/978))
1966
- - Fixed DeepSeek API compatibility by detecting `deepseek.com` URLs and disabling unsupported `developer` role ([#1048](https://github.com/code-yeongyu/sanepi-mono/issues/1048))
1967
- - Fixed Anthropic provider to preserve input token counts when proxies omit them in `message_delta` events ([#1045](https://github.com/code-yeongyu/sanepi-mono/issues/1045))
1997
+ - Fixed custom header not displaying correctly with `quietStartup` enabled ([#1039](https://github.com/code-yeongyu/senpi-mono/pull/1039) by [@tudoroancea](https://github.com/tudoroancea))
1998
+ - Empty array in package filter now disables all resources instead of falling back to manifest defaults ([#1044](https://github.com/code-yeongyu/senpi-mono/issues/1044))
1999
+ - Auto-retry counter now resets after each successful LLM response instead of accumulating across tool-use turns ([#1019](https://github.com/code-yeongyu/senpi-mono/issues/1019))
2000
+ - Fixed incorrect `.md` file names in warning messages ([#1041](https://github.com/code-yeongyu/senpi-mono/issues/1041) by [@llimllib](https://github.com/llimllib))
2001
+ - Fixed provider name hidden in footer when terminal is narrow ([#981](https://github.com/code-yeongyu/senpi-mono/pull/981) by [@Perlence](https://github.com/Perlence))
2002
+ - Fixed backslash input buffering causing delayed character display in editor ([#1037](https://github.com/code-yeongyu/senpi-mono/pull/1037) by [@Perlence](https://github.com/Perlence))
2003
+ - Fixed markdown table rendering with proper row dividers and minimum column width ([#997](https://github.com/code-yeongyu/senpi-mono/pull/997) by [@tmustier](https://github.com/tmustier))
2004
+ - Fixed OpenAI completions `toolChoice` handling ([#998](https://github.com/code-yeongyu/senpi-mono/pull/998) by [@williamtwomey](https://github.com/williamtwomey))
2005
+ - Fixed cross-provider handoff failing when switching from OpenAI Responses API providers due to pipe-separated tool call IDs ([#1022](https://github.com/code-yeongyu/senpi-mono/issues/1022))
2006
+ - Fixed 429 rate limit errors incorrectly triggering auto-compaction instead of retry with backoff ([#1038](https://github.com/code-yeongyu/senpi-mono/issues/1038))
2007
+ - Fixed Anthropic provider to handle `sensitive` stop_reason returned by API ([#978](https://github.com/code-yeongyu/senpi-mono/issues/978))
2008
+ - Fixed DeepSeek API compatibility by detecting `deepseek.com` URLs and disabling unsupported `developer` role ([#1048](https://github.com/code-yeongyu/senpi-mono/issues/1048))
2009
+ - Fixed Anthropic provider to preserve input token counts when proxies omit them in `message_delta` events ([#1045](https://github.com/code-yeongyu/senpi-mono/issues/1045))
1968
2010
  - Fixed `autocompleteMaxVisible` setting not persisting to `settings.json`
1969
2011
 
1970
2012
  ## [0.50.1] - 2026-01-26
1971
2013
 
1972
2014
  ### Fixed
1973
2015
 
1974
- - Git extension updates now handle force-pushed remotes gracefully instead of failing ([#961](https://github.com/code-yeongyu/sanepi-mono/pull/961) by [@aliou](https://github.com/aliou))
1975
- - Extension `ctx.newSession({ setup })` now properly syncs agent state and renders messages after setup callback runs ([#968](https://github.com/code-yeongyu/sanepi-mono/issues/968))
2016
+ - Git extension updates now handle force-pushed remotes gracefully instead of failing ([#961](https://github.com/code-yeongyu/senpi-mono/pull/961) by [@aliou](https://github.com/aliou))
2017
+ - Extension `ctx.newSession({ setup })` now properly syncs agent state and renders messages after setup callback runs ([#968](https://github.com/code-yeongyu/senpi-mono/issues/968))
1976
2018
  - Fixed extension UI bindings not initializing when starting with no extensions, which broke UI methods after `/reload`
1977
- - Fixed `/hotkeys` output to title-case extension hotkeys ([#969](https://github.com/code-yeongyu/sanepi-mono/pull/969) by [@Perlence](https://github.com/Perlence))
1978
- - Fixed model catalog generation to exclude deprecated OpenCode Zen models ([#970](https://github.com/code-yeongyu/sanepi-mono/pull/970) by [@DanielTatarkin](https://github.com/DanielTatarkin))
2019
+ - Fixed `/hotkeys` output to title-case extension hotkeys ([#969](https://github.com/code-yeongyu/senpi-mono/pull/969) by [@Perlence](https://github.com/Perlence))
2020
+ - Fixed model catalog generation to exclude deprecated OpenCode Zen models ([#970](https://github.com/code-yeongyu/senpi-mono/pull/970) by [@DanielTatarkin](https://github.com/DanielTatarkin))
1979
2021
  - Fixed git extension removal to prune empty directories
1980
2022
 
1981
2023
  ## [0.50.0] - 2026-01-26
@@ -2000,125 +2042,125 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2000
2042
 
2001
2043
  ### Breaking Changes
2002
2044
 
2003
- - Header values in `models.json` now resolve environment variables (if a header value matches an env var name, the env var value is used). This may change behavior if a literal header value accidentally matches an env var name. ([#909](https://github.com/code-yeongyu/sanepi-mono/issues/909))
2004
- - External packages (npm/git) are now configured via `packages` array in settings.json instead of `extensions`. Existing npm:/git: entries in `extensions` are auto-migrated. ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2005
- - Resource loading now uses `ResourceLoader` only and settings.json uses arrays for extensions, skills, prompts, and themes ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2006
- - Removed `discoverAuthStorage` and `discoverModels` from the SDK. `AuthStorage` and `ModelRegistry` now default to `~/.senpi/agent` paths unless you pass an `agentDir` ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2045
+ - Header values in `models.json` now resolve environment variables (if a header value matches an env var name, the env var value is used). This may change behavior if a literal header value accidentally matches an env var name. ([#909](https://github.com/code-yeongyu/senpi-mono/issues/909))
2046
+ - External packages (npm/git) are now configured via `packages` array in settings.json instead of `extensions`. Existing npm:/git: entries in `extensions` are auto-migrated. ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2047
+ - Resource loading now uses `ResourceLoader` only and settings.json uses arrays for extensions, skills, prompts, and themes ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2048
+ - Removed `discoverAuthStorage` and `discoverModels` from the SDK. `AuthStorage` and `ModelRegistry` now default to `~/.senpi/agent` paths unless you pass an `agentDir` ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2007
2049
 
2008
2050
  ### Added
2009
2051
 
2010
- - Session renaming in `/resume` picker via `Ctrl+R` without opening the session ([#863](https://github.com/code-yeongyu/sanepi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
2011
- - Session selector keybindings are now configurable ([#948](https://github.com/code-yeongyu/sanepi-mono/pull/948) by [@aos](https://github.com/aos))
2012
- - `disable-model-invocation` frontmatter field for skills to prevent agentic invocation while still allowing explicit `/skill:name` commands ([#927](https://github.com/code-yeongyu/sanepi-mono/issues/927))
2013
- - Exposed `copyToClipboard` utility for extensions ([#926](https://github.com/code-yeongyu/sanepi-mono/issues/926) by [@mitsuhiko](https://github.com/mitsuhiko))
2014
- - Skill invocation messages are now collapsible in chat output, showing collapsed by default with skill name and expand hint ([#894](https://github.com/code-yeongyu/sanepi-mono/issues/894))
2015
- - Header values in `models.json` now support environment variables and shell commands, matching `apiKey` resolution ([#909](https://github.com/code-yeongyu/sanepi-mono/issues/909))
2016
- - Added HTTP proxy environment variable support for API requests ([#942](https://github.com/code-yeongyu/sanepi-mono/pull/942) by [@haoqixu](https://github.com/haoqixu))
2017
- - Added OpenRouter provider routing support for custom models via `openRouterRouting` compat field ([#859](https://github.com/code-yeongyu/sanepi-mono/pull/859) by [@v01dpr1mr0s3](https://github.com/v01dpr1mr0s3))
2018
- - Added `azure-openai-responses` provider support for Azure OpenAI Responses API. ([#890](https://github.com/code-yeongyu/sanepi-mono/pull/890) by [@markusylisiurunen](https://github.com/markusylisiurunen))
2019
- - Added changelog link to update notifications ([#925](https://github.com/code-yeongyu/sanepi-mono/pull/925) by [@dannote](https://github.com/dannote))
2020
- - Added `--verbose` CLI flag to override quietStartup setting ([#906](https://github.com/code-yeongyu/sanepi-mono/pull/906) by [@Perlence](https://github.com/Perlence))
2052
+ - Session renaming in `/resume` picker via `Ctrl+R` without opening the session ([#863](https://github.com/code-yeongyu/senpi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
2053
+ - Session selector keybindings are now configurable ([#948](https://github.com/code-yeongyu/senpi-mono/pull/948) by [@aos](https://github.com/aos))
2054
+ - `disable-model-invocation` frontmatter field for skills to prevent agentic invocation while still allowing explicit `/skill:name` commands ([#927](https://github.com/code-yeongyu/senpi-mono/issues/927))
2055
+ - Exposed `copyToClipboard` utility for extensions ([#926](https://github.com/code-yeongyu/senpi-mono/issues/926) by [@mitsuhiko](https://github.com/mitsuhiko))
2056
+ - Skill invocation messages are now collapsible in chat output, showing collapsed by default with skill name and expand hint ([#894](https://github.com/code-yeongyu/senpi-mono/issues/894))
2057
+ - Header values in `models.json` now support environment variables and shell commands, matching `apiKey` resolution ([#909](https://github.com/code-yeongyu/senpi-mono/issues/909))
2058
+ - Added HTTP proxy environment variable support for API requests ([#942](https://github.com/code-yeongyu/senpi-mono/pull/942) by [@haoqixu](https://github.com/haoqixu))
2059
+ - Added OpenRouter provider routing support for custom models via `openRouterRouting` compat field ([#859](https://github.com/code-yeongyu/senpi-mono/pull/859) by [@v01dpr1mr0s3](https://github.com/v01dpr1mr0s3))
2060
+ - Added `azure-openai-responses` provider support for Azure OpenAI Responses API. ([#890](https://github.com/code-yeongyu/senpi-mono/pull/890) by [@markusylisiurunen](https://github.com/markusylisiurunen))
2061
+ - Added changelog link to update notifications ([#925](https://github.com/code-yeongyu/senpi-mono/pull/925) by [@dannote](https://github.com/dannote))
2062
+ - Added `--verbose` CLI flag to override quietStartup setting ([#906](https://github.com/code-yeongyu/senpi-mono/pull/906) by [@Perlence](https://github.com/Perlence))
2021
2063
  - `markdown.codeBlockIndent` setting to customize code block indentation in rendered output
2022
- - Extension package management with `pi install`, `pi remove`, `pi update`, and `pi list` commands ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2023
- - Package filtering: selectively load resources from packages using object form in `packages` array ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2024
- - Glob pattern support with minimatch in package filters, top-level settings arrays, and pi manifest (e.g., `"!funky.json"`, `"*.ts"`) ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2025
- - `/reload` command to reload extensions, skills, prompts, and themes ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2026
- - `pi config` command with TUI to enable/disable package and top-level resources via patterns ([#938](https://github.com/code-yeongyu/sanepi-mono/issues/938))
2027
- - CLI flags for `--skill`, `--prompt-template`, `--theme`, `--no-prompt-templates`, and `--no-themes` ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2028
- - Package deduplication: if same package appears in global and project settings, project wins ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2029
- - Unified collision reporting with `ResourceDiagnostic` type for all resource types ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2064
+ - Extension package management with `pi install`, `pi remove`, `pi update`, and `pi list` commands ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2065
+ - Package filtering: selectively load resources from packages using object form in `packages` array ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2066
+ - Glob pattern support with minimatch in package filters, top-level settings arrays, and pi manifest (e.g., `"!funky.json"`, `"*.ts"`) ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2067
+ - `/reload` command to reload extensions, skills, prompts, and themes ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2068
+ - `pi config` command with TUI to enable/disable package and top-level resources via patterns ([#938](https://github.com/code-yeongyu/senpi-mono/issues/938))
2069
+ - CLI flags for `--skill`, `--prompt-template`, `--theme`, `--no-prompt-templates`, and `--no-themes` ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2070
+ - Package deduplication: if same package appears in global and project settings, project wins ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2071
+ - Unified collision reporting with `ResourceDiagnostic` type for all resource types ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2030
2072
  - Show provider alongside the model in the footer if multiple providers are available
2031
2073
  - Custom provider support via `pi.registerProvider()` with `streamSimple` for custom API implementations
2032
2074
  - Added `custom-provider.ts` example extension demonstrating custom Anthropic provider with OAuth
2033
2075
 
2034
2076
  ### Changed
2035
2077
 
2036
- - `/resume` picker sort toggle moved to `Ctrl+S` to free `Ctrl+R` for rename ([#863](https://github.com/code-yeongyu/sanepi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
2037
- - HTML export: clicking a sidebar message now navigates to its newest leaf and scrolls to it, instead of truncating the branch ([#853](https://github.com/code-yeongyu/sanepi-mono/pull/853) by [@mitsuhiko](https://github.com/mitsuhiko))
2038
- - HTML export: active path is now visually highlighted with dimmed off-path nodes ([#929](https://github.com/code-yeongyu/sanepi-mono/pull/929) by [@hewliyang](https://github.com/hewliyang))
2078
+ - `/resume` picker sort toggle moved to `Ctrl+S` to free `Ctrl+R` for rename ([#863](https://github.com/code-yeongyu/senpi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
2079
+ - HTML export: clicking a sidebar message now navigates to its newest leaf and scrolls to it, instead of truncating the branch ([#853](https://github.com/code-yeongyu/senpi-mono/pull/853) by [@mitsuhiko](https://github.com/mitsuhiko))
2080
+ - HTML export: active path is now visually highlighted with dimmed off-path nodes ([#929](https://github.com/code-yeongyu/senpi-mono/pull/929) by [@hewliyang](https://github.com/hewliyang))
2039
2081
  - Azure OpenAI Responses provider now uses base URL configuration with deployment-aware model mapping and no longer includes service tier handling
2040
- - `/reload` now re-renders the entire scrollback so updated extension components are visible immediately ([#928](https://github.com/code-yeongyu/sanepi-mono/pull/928) by [@ferologics](https://github.com/ferologics))
2041
- - Skill, prompt template, and theme discovery now use settings and CLI path arrays instead of legacy filters ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2082
+ - `/reload` now re-renders the entire scrollback so updated extension components are visible immediately ([#928](https://github.com/code-yeongyu/senpi-mono/pull/928) by [@ferologics](https://github.com/ferologics))
2083
+ - Skill, prompt template, and theme discovery now use settings and CLI path arrays instead of legacy filters ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2042
2084
 
2043
2085
  ### Fixed
2044
2086
 
2045
- - Extension `setWorkingMessage()` calls in `agent_start` handlers now work correctly; previously the message was silently ignored because the loading animation didn't exist yet ([#935](https://github.com/code-yeongyu/sanepi-mono/issues/935))
2087
+ - Extension `setWorkingMessage()` calls in `agent_start` handlers now work correctly; previously the message was silently ignored because the loading animation didn't exist yet ([#935](https://github.com/code-yeongyu/senpi-mono/issues/935))
2046
2088
  - Fixed package auto-discovery to respect loader rules, config overrides, and force-exclude patterns
2047
- - Fixed /reload restoring the correct editor after reload ([#949](https://github.com/code-yeongyu/sanepi-mono/pull/949) by [@Perlence](https://github.com/Perlence))
2048
- - Fixed distributed themes breaking `/export` ([#946](https://github.com/code-yeongyu/sanepi-mono/pull/946) by [@mitsuhiko](https://github.com/mitsuhiko))
2089
+ - Fixed /reload restoring the correct editor after reload ([#949](https://github.com/code-yeongyu/senpi-mono/pull/949) by [@Perlence](https://github.com/Perlence))
2090
+ - Fixed distributed themes breaking `/export` ([#946](https://github.com/code-yeongyu/senpi-mono/pull/946) by [@mitsuhiko](https://github.com/mitsuhiko))
2049
2091
  - Fixed startup hints to clarify thinking level selection and expanded thinking guidance
2050
2092
  - Fixed SDK initial model resolution to use `findInitialModel` and default to Claude Opus 4.5 for Anthropic models
2051
2093
  - Fixed no-models warning to include the `/model` instruction
2052
2094
  - Fixed authentication error messages to point to the authentication documentation
2053
2095
  - Fixed bash output hint lines to truncate to terminal width
2054
- - Fixed custom editors to honor the `paddingX` setting ([#936](https://github.com/code-yeongyu/sanepi-mono/pull/936) by [@Perlence](https://github.com/Perlence))
2096
+ - Fixed custom editors to honor the `paddingX` setting ([#936](https://github.com/code-yeongyu/senpi-mono/pull/936) by [@Perlence](https://github.com/Perlence))
2055
2097
  - Fixed system prompt tool list to show only built-in tools
2056
2098
  - Fixed package manager to check npm package versions before using cached copies
2057
2099
  - Fixed package manager to run `npm install` after cloning git repositories with a package.json
2058
2100
  - Fixed extension provider registrations to apply before model resolution
2059
- - Fixed editor multi-line insertion handling and lastAction tracking ([#945](https://github.com/code-yeongyu/sanepi-mono/pull/945) by [@Perlence](https://github.com/Perlence))
2060
- - Fixed editor word wrapping to reserve a cursor column ([#934](https://github.com/code-yeongyu/sanepi-mono/pull/934) by [@Perlence](https://github.com/Perlence))
2061
- - Fixed editor word wrapping to use single-pass backtracking for whitespace handling ([#924](https://github.com/code-yeongyu/sanepi-mono/pull/924) by [@Perlence](https://github.com/Perlence))
2101
+ - Fixed editor multi-line insertion handling and lastAction tracking ([#945](https://github.com/code-yeongyu/senpi-mono/pull/945) by [@Perlence](https://github.com/Perlence))
2102
+ - Fixed editor word wrapping to reserve a cursor column ([#934](https://github.com/code-yeongyu/senpi-mono/pull/934) by [@Perlence](https://github.com/Perlence))
2103
+ - Fixed editor word wrapping to use single-pass backtracking for whitespace handling ([#924](https://github.com/code-yeongyu/senpi-mono/pull/924) by [@Perlence](https://github.com/Perlence))
2062
2104
  - Fixed Kitty image ID allocation and cleanup to prevent image ID collisions
2063
- - Fixed overlays staying centered after terminal resizes ([#950](https://github.com/code-yeongyu/sanepi-mono/pull/950) by [@nicobailon](https://github.com/nicobailon))
2105
+ - Fixed overlays staying centered after terminal resizes ([#950](https://github.com/code-yeongyu/senpi-mono/pull/950) by [@nicobailon](https://github.com/nicobailon))
2064
2106
  - Fixed streaming dispatch to use the model api type instead of hardcoded API defaults
2065
2107
  - Fixed Google providers to default tool call arguments to an empty object when omitted
2066
- - Fixed OpenAI Responses streaming to handle `arguments.done` events on OpenAI-compatible endpoints ([#917](https://github.com/code-yeongyu/sanepi-mono/pull/917) by [@williballenthin](https://github.com/williballenthin))
2108
+ - Fixed OpenAI Responses streaming to handle `arguments.done` events on OpenAI-compatible endpoints ([#917](https://github.com/code-yeongyu/senpi-mono/pull/917) by [@williballenthin](https://github.com/williballenthin))
2067
2109
  - Fixed OpenAI Codex Responses tool strictness handling after the shared responses refactor
2068
2110
  - Fixed Azure OpenAI Responses streaming to guard deltas before content parts and correct metadata and handoff gating
2069
- - Fixed OpenAI completions tool-result image batching after consecutive tool results ([#902](https://github.com/code-yeongyu/sanepi-mono/pull/902) by [@terrorobe](https://github.com/terrorobe))
2070
- - Off-by-one error in bash output "earlier lines" count caused by counting spacing newline as hidden content ([#921](https://github.com/code-yeongyu/sanepi-mono/issues/921))
2071
- - User package filters now layer on top of manifest filters instead of replacing them ([#645](https://github.com/code-yeongyu/sanepi-mono/issues/645))
2111
+ - Fixed OpenAI completions tool-result image batching after consecutive tool results ([#902](https://github.com/code-yeongyu/senpi-mono/pull/902) by [@terrorobe](https://github.com/terrorobe))
2112
+ - Off-by-one error in bash output "earlier lines" count caused by counting spacing newline as hidden content ([#921](https://github.com/code-yeongyu/senpi-mono/issues/921))
2113
+ - User package filters now layer on top of manifest filters instead of replacing them ([#645](https://github.com/code-yeongyu/senpi-mono/issues/645))
2072
2114
  - Auto-retry now handles "terminated" errors from Codex API mid-stream failures
2073
- - Follow-up queue (Alt+Enter) now sends full paste content instead of `[paste #N ...]` markers ([#912](https://github.com/code-yeongyu/sanepi-mono/issues/912))
2074
- - Fixed Alt-Up not restoring messages queued during compaction ([#923](https://github.com/code-yeongyu/sanepi-mono/pull/923) by [@aliou](https://github.com/aliou))
2075
- - Fixed session corruption when loading empty or invalid session files via `--session` flag ([#932](https://github.com/code-yeongyu/sanepi-mono/issues/932) by [@armanddp](https://github.com/armanddp))
2076
- - Fixed extension shortcuts not firing when extension also uses `setEditorComponent()` ([#947](https://github.com/code-yeongyu/sanepi-mono/pull/947) by [@Perlence](https://github.com/Perlence))
2077
- - Session "modified" time now uses last message timestamp instead of file mtime, so renaming doesn't reorder the recent list ([#863](https://github.com/code-yeongyu/sanepi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
2115
+ - Follow-up queue (Alt+Enter) now sends full paste content instead of `[paste #N ...]` markers ([#912](https://github.com/code-yeongyu/senpi-mono/issues/912))
2116
+ - Fixed Alt-Up not restoring messages queued during compaction ([#923](https://github.com/code-yeongyu/senpi-mono/pull/923) by [@aliou](https://github.com/aliou))
2117
+ - Fixed session corruption when loading empty or invalid session files via `--session` flag ([#932](https://github.com/code-yeongyu/senpi-mono/issues/932) by [@armanddp](https://github.com/armanddp))
2118
+ - Fixed extension shortcuts not firing when extension also uses `setEditorComponent()` ([#947](https://github.com/code-yeongyu/senpi-mono/pull/947) by [@Perlence](https://github.com/Perlence))
2119
+ - Session "modified" time now uses last message timestamp instead of file mtime, so renaming doesn't reorder the recent list ([#863](https://github.com/code-yeongyu/senpi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
2078
2120
 
2079
2121
  ## [0.49.3] - 2026-01-22
2080
2122
 
2081
2123
  ### Added
2082
2124
 
2083
- - `markdown.codeBlockIndent` setting to customize code block indentation in rendered output ([#855](https://github.com/code-yeongyu/sanepi-mono/pull/855) by [@terrorobe](https://github.com/terrorobe))
2084
- - Added `inline-bash.ts` example extension for expanding `!{command}` patterns in prompts ([#881](https://github.com/code-yeongyu/sanepi-mono/pull/881) by [@scutifer](https://github.com/scutifer))
2085
- - Added `antigravity-image-gen.ts` example extension for AI image generation via Google Antigravity ([#893](https://github.com/code-yeongyu/sanepi-mono/pull/893) by [@ben-vargas](https://github.com/ben-vargas))
2086
- - Added `PI_SHARE_VIEWER_URL` environment variable for custom share viewer URLs ([#889](https://github.com/code-yeongyu/sanepi-mono/pull/889) by [@andresaraujo](https://github.com/andresaraujo))
2087
- - Added Alt+Delete as hotkey for delete word forwards ([#878](https://github.com/code-yeongyu/sanepi-mono/pull/878) by [@Perlence](https://github.com/Perlence))
2125
+ - `markdown.codeBlockIndent` setting to customize code block indentation in rendered output ([#855](https://github.com/code-yeongyu/senpi-mono/pull/855) by [@terrorobe](https://github.com/terrorobe))
2126
+ - Added `inline-bash.ts` example extension for expanding `!{command}` patterns in prompts ([#881](https://github.com/code-yeongyu/senpi-mono/pull/881) by [@scutifer](https://github.com/scutifer))
2127
+ - Added `antigravity-image-gen.ts` example extension for AI image generation via Google Antigravity ([#893](https://github.com/code-yeongyu/senpi-mono/pull/893) by [@ben-vargas](https://github.com/ben-vargas))
2128
+ - Added `PI_SHARE_VIEWER_URL` environment variable for custom share viewer URLs ([#889](https://github.com/code-yeongyu/senpi-mono/pull/889) by [@andresaraujo](https://github.com/andresaraujo))
2129
+ - Added Alt+Delete as hotkey for delete word forwards ([#878](https://github.com/code-yeongyu/senpi-mono/pull/878) by [@Perlence](https://github.com/Perlence))
2088
2130
 
2089
2131
  ### Changed
2090
2132
 
2091
- - Tree selector: changed label filter shortcut from `l` to `Shift+L` so users can search for entries containing "l" ([#861](https://github.com/code-yeongyu/sanepi-mono/pull/861) by [@mitsuhiko](https://github.com/mitsuhiko))
2092
- - Fuzzy matching now scores consecutive matches higher for better search relevance ([#860](https://github.com/code-yeongyu/sanepi-mono/pull/860) by [@mitsuhiko](https://github.com/mitsuhiko))
2133
+ - Tree selector: changed label filter shortcut from `l` to `Shift+L` so users can search for entries containing "l" ([#861](https://github.com/code-yeongyu/senpi-mono/pull/861) by [@mitsuhiko](https://github.com/mitsuhiko))
2134
+ - Fuzzy matching now scores consecutive matches higher for better search relevance ([#860](https://github.com/code-yeongyu/senpi-mono/pull/860) by [@mitsuhiko](https://github.com/mitsuhiko))
2093
2135
 
2094
2136
  ### Fixed
2095
2137
 
2096
- - Fixed error messages showing hardcoded `~/.senpi/agent/` paths instead of respecting `PI_CODING_AGENT_DIR` ([#887](https://github.com/code-yeongyu/sanepi-mono/pull/887) by [@aliou](https://github.com/aliou))
2097
- - Fixed `write` tool not displaying errors in the UI when execution fails ([#856](https://github.com/code-yeongyu/sanepi-mono/issues/856))
2098
- - Fixed HTML export using default theme instead of user's active theme ([#870](https://github.com/code-yeongyu/sanepi-mono/pull/870) by [@scutifer](https://github.com/scutifer))
2099
- - Show session name in the footer and terminal / tab title ([#876](https://github.com/code-yeongyu/sanepi-mono/pull/876) by [@scutifer](https://github.com/scutifer))
2100
- - Fixed 256color fallback in Terminal.app to prevent color rendering issues ([#869](https://github.com/code-yeongyu/sanepi-mono/pull/869) by [@Perlence](https://github.com/Perlence))
2138
+ - Fixed error messages showing hardcoded `~/.senpi/agent/` paths instead of respecting `PI_CODING_AGENT_DIR` ([#887](https://github.com/code-yeongyu/senpi-mono/pull/887) by [@aliou](https://github.com/aliou))
2139
+ - Fixed `write` tool not displaying errors in the UI when execution fails ([#856](https://github.com/code-yeongyu/senpi-mono/issues/856))
2140
+ - Fixed HTML export using default theme instead of user's active theme ([#870](https://github.com/code-yeongyu/senpi-mono/pull/870) by [@scutifer](https://github.com/scutifer))
2141
+ - Show session name in the footer and terminal / tab title ([#876](https://github.com/code-yeongyu/senpi-mono/pull/876) by [@scutifer](https://github.com/scutifer))
2142
+ - Fixed 256color fallback in Terminal.app to prevent color rendering issues ([#869](https://github.com/code-yeongyu/senpi-mono/pull/869) by [@Perlence](https://github.com/Perlence))
2101
2143
  - Fixed viewport tracking and cursor positioning for overlays and content shrink scenarios
2102
- - Fixed autocomplete to allow searches with `/` characters (e.g., `folder1/folder2`) ([#882](https://github.com/code-yeongyu/sanepi-mono/pull/882) by [@richardgill](https://github.com/richardgill))
2103
- - Fixed autolinked emails displaying redundant `(mailto:...)` suffix ([#888](https://github.com/code-yeongyu/sanepi-mono/pull/888) by [@terrorobe](https://github.com/terrorobe))
2144
+ - Fixed autocomplete to allow searches with `/` characters (e.g., `folder1/folder2`) ([#882](https://github.com/code-yeongyu/senpi-mono/pull/882) by [@richardgill](https://github.com/richardgill))
2145
+ - Fixed autolinked emails displaying redundant `(mailto:...)` suffix ([#888](https://github.com/code-yeongyu/senpi-mono/pull/888) by [@terrorobe](https://github.com/terrorobe))
2104
2146
  - Fixed `@` file autocomplete adding space after directories, breaking continued autocomplete into subdirectories
2105
2147
 
2106
2148
  ## [0.49.2] - 2026-01-19
2107
2149
 
2108
2150
  ### Added
2109
2151
 
2110
- - Added widget placement option for extension widgets via `widgetPlacement` in `pi.addWidget()` ([#850](https://github.com/code-yeongyu/sanepi-mono/pull/850) by [@marckrenn](https://github.com/marckrenn))
2111
- - Added AWS credential detection for ECS/Kubernetes environments: `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`, `AWS_CONTAINER_CREDENTIALS_FULL_URI`, `AWS_WEB_IDENTITY_TOKEN_FILE` ([#848](https://github.com/code-yeongyu/sanepi-mono/issues/848))
2112
- - Add "quiet startup" setting to `/settings` ([#847](https://github.com/code-yeongyu/sanepi-mono/pull/847) by [@unexge](https://github.com/unexge))
2152
+ - Added widget placement option for extension widgets via `widgetPlacement` in `pi.addWidget()` ([#850](https://github.com/code-yeongyu/senpi-mono/pull/850) by [@marckrenn](https://github.com/marckrenn))
2153
+ - Added AWS credential detection for ECS/Kubernetes environments: `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`, `AWS_CONTAINER_CREDENTIALS_FULL_URI`, `AWS_WEB_IDENTITY_TOKEN_FILE` ([#848](https://github.com/code-yeongyu/senpi-mono/issues/848))
2154
+ - Add "quiet startup" setting to `/settings` ([#847](https://github.com/code-yeongyu/senpi-mono/pull/847) by [@unexge](https://github.com/unexge))
2113
2155
 
2114
2156
  ### Changed
2115
2157
 
2116
- - HTML export now includes JSONL download button, jump-to-last-message on click, and fixed missing labels ([#853](https://github.com/code-yeongyu/sanepi-mono/pull/853) by [@mitsuhiko](https://github.com/mitsuhiko))
2117
- - Improved error message for OAuth authentication failures (expired credentials, offline) instead of generic 'No API key found' ([#849](https://github.com/code-yeongyu/sanepi-mono/pull/849) by [@zedrdave](https://github.com/zedrdave))
2158
+ - HTML export now includes JSONL download button, jump-to-last-message on click, and fixed missing labels ([#853](https://github.com/code-yeongyu/senpi-mono/pull/853) by [@mitsuhiko](https://github.com/mitsuhiko))
2159
+ - Improved error message for OAuth authentication failures (expired credentials, offline) instead of generic 'No API key found' ([#849](https://github.com/code-yeongyu/senpi-mono/pull/849) by [@zedrdave](https://github.com/zedrdave))
2118
2160
 
2119
2161
  ### Fixed
2120
- - Fixed `/model` selector scope toggle so you can switch between all and scoped models when scoped models are saved ([#844](https://github.com/code-yeongyu/sanepi-mono/issues/844))
2121
- - Fixed OpenAI Responses 400 error "reasoning without following item" when replaying aborted turns ([#838](https://github.com/code-yeongyu/sanepi-mono/pull/838))
2162
+ - Fixed `/model` selector scope toggle so you can switch between all and scoped models when scoped models are saved ([#844](https://github.com/code-yeongyu/senpi-mono/issues/844))
2163
+ - Fixed OpenAI Responses 400 error "reasoning without following item" when replaying aborted turns ([#838](https://github.com/code-yeongyu/senpi-mono/pull/838))
2122
2164
  - Fixed pi exiting with code 0 when cancelling resume session selection
2123
2165
 
2124
2166
  ### Removed
@@ -2129,33 +2171,33 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2129
2171
 
2130
2172
  ### Added
2131
2173
 
2132
- - Added `strictResponsesPairing` compat option for custom OpenAI Responses models on Azure ([#768](https://github.com/code-yeongyu/sanepi-mono/pull/768) by [@prateekmedia](https://github.com/prateekmedia))
2133
- - Session selector (`/resume`) now supports path display toggle (`Ctrl+P`) and session deletion (`Ctrl+D`) with inline confirmation ([#816](https://github.com/code-yeongyu/sanepi-mono/pull/816) by [@w-winter](https://github.com/w-winter))
2134
- - Added undo support in interactive mode with Ctrl+- hotkey. ([#831](https://github.com/code-yeongyu/sanepi-mono/pull/831) by [@Perlence](https://github.com/Perlence))
2174
+ - Added `strictResponsesPairing` compat option for custom OpenAI Responses models on Azure ([#768](https://github.com/code-yeongyu/senpi-mono/pull/768) by [@prateekmedia](https://github.com/prateekmedia))
2175
+ - Session selector (`/resume`) now supports path display toggle (`Ctrl+P`) and session deletion (`Ctrl+D`) with inline confirmation ([#816](https://github.com/code-yeongyu/senpi-mono/pull/816) by [@w-winter](https://github.com/w-winter))
2176
+ - Added undo support in interactive mode with Ctrl+- hotkey. ([#831](https://github.com/code-yeongyu/senpi-mono/pull/831) by [@Perlence](https://github.com/Perlence))
2135
2177
 
2136
2178
  ### Changed
2137
2179
 
2138
- - Share URLs now use hash fragments (`#`) instead of query strings (`?`) to prevent session IDs from being sent to buildwithpi.ai ([#829](https://github.com/code-yeongyu/sanepi-mono/pull/829) by [@terrorobe](https://github.com/terrorobe))
2139
- - API keys in `models.json` can now be retrieved via shell command using `!` prefix (e.g., `"apiKey": "!security find-generic-password -ws 'anthropic'"` for macOS Keychain) ([#762](https://github.com/code-yeongyu/sanepi-mono/pull/762) by [@cv](https://github.com/cv))
2180
+ - Share URLs now use hash fragments (`#`) instead of query strings (`?`) to prevent session IDs from being sent to buildwithpi.ai ([#829](https://github.com/code-yeongyu/senpi-mono/pull/829) by [@terrorobe](https://github.com/terrorobe))
2181
+ - API keys in `models.json` can now be retrieved via shell command using `!` prefix (e.g., `"apiKey": "!security find-generic-password -ws 'anthropic'"` for macOS Keychain) ([#762](https://github.com/code-yeongyu/senpi-mono/pull/762) by [@cv](https://github.com/cv))
2140
2182
 
2141
2183
  ### Fixed
2142
2184
 
2143
- - Fixed IME candidate window appearing in wrong position when filtering menus with Input Method Editor (e.g., Chinese IME). Components with search inputs now properly propagate focus state for cursor positioning. ([#827](https://github.com/code-yeongyu/sanepi-mono/issues/827))
2144
- - Fixed extension shortcut conflicts to respect user keybindings when built-in actions are remapped. ([#826](https://github.com/code-yeongyu/sanepi-mono/pull/826) by [@richardgill](https://github.com/richardgill))
2185
+ - Fixed IME candidate window appearing in wrong position when filtering menus with Input Method Editor (e.g., Chinese IME). Components with search inputs now properly propagate focus state for cursor positioning. ([#827](https://github.com/code-yeongyu/senpi-mono/issues/827))
2186
+ - Fixed extension shortcut conflicts to respect user keybindings when built-in actions are remapped. ([#826](https://github.com/code-yeongyu/senpi-mono/pull/826) by [@richardgill](https://github.com/richardgill))
2145
2187
  - Fixed photon WASM loading in standalone compiled binaries.
2146
- - Fixed tool call ID normalization for cross-provider handoffs (e.g., Codex to Antigravity Claude) ([#821](https://github.com/code-yeongyu/sanepi-mono/issues/821))
2188
+ - Fixed tool call ID normalization for cross-provider handoffs (e.g., Codex to Antigravity Claude) ([#821](https://github.com/code-yeongyu/senpi-mono/issues/821))
2147
2189
 
2148
2190
  ## [0.49.0] - 2026-01-17
2149
2191
 
2150
2192
  ### Added
2151
2193
 
2152
- - `pi.setLabel(entryId, label)` in ExtensionAPI for setting per-entry labels from extensions ([#806](https://github.com/code-yeongyu/sanepi-mono/issues/806))
2153
- - Export `keyHint`, `appKeyHint`, `editorKey`, `appKey`, `rawKeyHint` for extensions to format keybinding hints consistently ([#802](https://github.com/code-yeongyu/sanepi-mono/pull/802) by [@dannote](https://github.com/dannote))
2154
- - Exported `VERSION` from the package index and updated the custom-header example. ([#798](https://github.com/code-yeongyu/sanepi-mono/pull/798) by [@tallshort](https://github.com/tallshort))
2155
- - Added `showHardwareCursor` setting to control cursor visibility while still positioning it for IME support. ([#800](https://github.com/code-yeongyu/sanepi-mono/pull/800) by [@ghoulr](https://github.com/ghoulr))
2156
- - Added Emacs-style kill ring editing with yank and yank-pop keybindings, plus legacy Alt+letter handling and Alt+D delete word forward support in the interactive editor. ([#810](https://github.com/code-yeongyu/sanepi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
2194
+ - `pi.setLabel(entryId, label)` in ExtensionAPI for setting per-entry labels from extensions ([#806](https://github.com/code-yeongyu/senpi-mono/issues/806))
2195
+ - Export `keyHint`, `appKeyHint`, `editorKey`, `appKey`, `rawKeyHint` for extensions to format keybinding hints consistently ([#802](https://github.com/code-yeongyu/senpi-mono/pull/802) by [@dannote](https://github.com/dannote))
2196
+ - Exported `VERSION` from the package index and updated the custom-header example. ([#798](https://github.com/code-yeongyu/senpi-mono/pull/798) by [@tallshort](https://github.com/tallshort))
2197
+ - Added `showHardwareCursor` setting to control cursor visibility while still positioning it for IME support. ([#800](https://github.com/code-yeongyu/senpi-mono/pull/800) by [@ghoulr](https://github.com/ghoulr))
2198
+ - Added Emacs-style kill ring editing with yank and yank-pop keybindings, plus legacy Alt+letter handling and Alt+D delete word forward support in the interactive editor. ([#810](https://github.com/code-yeongyu/senpi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
2157
2199
  - Added `ctx.compact()` and `ctx.getContextUsage()` to extension contexts for programmatic compaction and context usage checks.
2158
- - Added documentation for delete word forward and kill ring keybindings in interactive mode. ([#810](https://github.com/code-yeongyu/sanepi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
2200
+ - Added documentation for delete word forward and kill ring keybindings in interactive mode. ([#810](https://github.com/code-yeongyu/senpi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
2159
2201
 
2160
2202
  ### Changed
2161
2203
 
@@ -2164,10 +2206,10 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2164
2206
 
2165
2207
  ### Fixed
2166
2208
 
2167
- - Fixed photon module failing to load in ESM context with "require is not defined" error ([#795](https://github.com/code-yeongyu/sanepi-mono/pull/795) by [@dannote](https://github.com/dannote))
2209
+ - Fixed photon module failing to load in ESM context with "require is not defined" error ([#795](https://github.com/code-yeongyu/senpi-mono/pull/795) by [@dannote](https://github.com/dannote))
2168
2210
  - Fixed compaction UI not showing when extensions trigger compaction.
2169
- - Fixed orphaned tool results after errored assistant messages causing Codex API errors. When an assistant message has `stopReason: "error"`, its tool calls are now excluded from pending tool tracking, preventing synthetic tool results from being generated for calls that will be dropped by provider-specific converters. ([#812](https://github.com/code-yeongyu/sanepi-mono/issues/812))
2170
- - Fixed Bedrock Claude max_tokens handling to always exceed thinking budget tokens, preventing compaction failures. ([#797](https://github.com/code-yeongyu/sanepi-mono/pull/797) by [@pjtf93](https://github.com/pjtf93))
2211
+ - Fixed orphaned tool results after errored assistant messages causing Codex API errors. When an assistant message has `stopReason: "error"`, its tool calls are now excluded from pending tool tracking, preventing synthetic tool results from being generated for calls that will be dropped by provider-specific converters. ([#812](https://github.com/code-yeongyu/senpi-mono/issues/812))
2212
+ - Fixed Bedrock Claude max_tokens handling to always exceed thinking budget tokens, preventing compaction failures. ([#797](https://github.com/code-yeongyu/senpi-mono/pull/797) by [@pjtf93](https://github.com/pjtf93))
2171
2213
  - Fixed Claude Code tool name normalization to match the Claude Code tool list case-insensitively and remove invalid mappings.
2172
2214
 
2173
2215
  ### Removed
@@ -2178,28 +2220,28 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2178
2220
 
2179
2221
  ### Added
2180
2222
 
2181
- - Added `quietStartup` setting to silence startup output (version header, loaded context info, model scope line). Changelog notifications are still shown. ([#777](https://github.com/code-yeongyu/sanepi-mono/pull/777) by [@ribelo](https://github.com/ribelo))
2223
+ - Added `quietStartup` setting to silence startup output (version header, loaded context info, model scope line). Changelog notifications are still shown. ([#777](https://github.com/code-yeongyu/senpi-mono/pull/777) by [@ribelo](https://github.com/ribelo))
2182
2224
  - Added `editorPaddingX` setting for horizontal padding in input editor (0-3, default: 0)
2183
- - Added `shellCommandPrefix` setting to prepend commands to every bash execution, enabling alias expansion in non-interactive shells (e.g., `"shellCommandPrefix": "shopt -s expand_aliases"`) ([#790](https://github.com/code-yeongyu/sanepi-mono/pull/790) by [@richardgill](https://github.com/richardgill))
2184
- - Added bash-style argument slicing for prompt templates ([#770](https://github.com/code-yeongyu/sanepi-mono/pull/770) by [@airtonix](https://github.com/airtonix))
2185
- - Extension commands can provide argument auto-completions via `getArgumentCompletions` in `pi.registerCommand()` ([#775](https://github.com/code-yeongyu/sanepi-mono/pull/775) by [@ribelo](https://github.com/ribelo))
2186
- - Bash tool now displays the timeout value in the UI when a timeout is set ([#780](https://github.com/code-yeongyu/sanepi-mono/pull/780) by [@dannote](https://github.com/dannote))
2187
- - Export `getShellConfig` for extensions to detect user's shell environment ([#766](https://github.com/code-yeongyu/sanepi-mono/pull/766) by [@dannote](https://github.com/dannote))
2188
- - Added `thinkingText` and `selectedBg` to theme schema ([#763](https://github.com/code-yeongyu/sanepi-mono/pull/763) by [@scutifer](https://github.com/scutifer))
2189
- - `navigateTree()` now supports `replaceInstructions` option to replace the default summarization prompt entirely, and `label` option to attach a label to the branch summary entry ([#787](https://github.com/code-yeongyu/sanepi-mono/pull/787) by [@mitsuhiko](https://github.com/mitsuhiko))
2190
-
2191
- ### Fixed
2192
-
2193
- - Fixed crash during auto-compaction when summarization fails (e.g., quota exceeded). Now displays error message instead of crashing ([#792](https://github.com/code-yeongyu/sanepi-mono/issues/792))
2194
- - Fixed `--session <UUID>` to search globally across projects if not found locally, with option to fork sessions from other projects ([#785](https://github.com/code-yeongyu/sanepi-mono/pull/785) by [@ribelo](https://github.com/ribelo))
2195
- - Fixed standalone binary WASM loading on Linux ([#784](https://github.com/code-yeongyu/sanepi-mono/issues/784))
2196
- - Fixed string numbers in tool arguments not being coerced to numbers during validation ([#786](https://github.com/code-yeongyu/sanepi-mono/pull/786) by [@dannote](https://github.com/dannote))
2197
- - Fixed `--no-extensions` flag not preventing extension discovery ([#776](https://github.com/code-yeongyu/sanepi-mono/issues/776))
2198
- - Fixed extension messages rendering twice on startup when `pi.sendMessage({ display: true })` is called during `session_start` ([#765](https://github.com/code-yeongyu/sanepi-mono/pull/765) by [@dannote](https://github.com/dannote))
2199
- - Fixed `PI_CODING_AGENT_DIR` env var not expanding tilde (`~`) to home directory ([#778](https://github.com/code-yeongyu/sanepi-mono/pull/778) by [@aliou](https://github.com/aliou))
2200
- - Fixed session picker hint text overflow ([#764](https://github.com/code-yeongyu/sanepi-mono/issues/764))
2201
- - Fixed Kitty keyboard protocol shifted symbol keys (e.g., `@`, `?`) not working in editor ([#779](https://github.com/code-yeongyu/sanepi-mono/pull/779) by [@iamd3vil](https://github.com/iamd3vil))
2202
- - Fixed Bedrock tool call IDs causing API errors from invalid characters ([#781](https://github.com/code-yeongyu/sanepi-mono/pull/781) by [@pjtf93](https://github.com/pjtf93))
2225
+ - Added `shellCommandPrefix` setting to prepend commands to every bash execution, enabling alias expansion in non-interactive shells (e.g., `"shellCommandPrefix": "shopt -s expand_aliases"`) ([#790](https://github.com/code-yeongyu/senpi-mono/pull/790) by [@richardgill](https://github.com/richardgill))
2226
+ - Added bash-style argument slicing for prompt templates ([#770](https://github.com/code-yeongyu/senpi-mono/pull/770) by [@airtonix](https://github.com/airtonix))
2227
+ - Extension commands can provide argument auto-completions via `getArgumentCompletions` in `pi.registerCommand()` ([#775](https://github.com/code-yeongyu/senpi-mono/pull/775) by [@ribelo](https://github.com/ribelo))
2228
+ - Bash tool now displays the timeout value in the UI when a timeout is set ([#780](https://github.com/code-yeongyu/senpi-mono/pull/780) by [@dannote](https://github.com/dannote))
2229
+ - Export `getShellConfig` for extensions to detect user's shell environment ([#766](https://github.com/code-yeongyu/senpi-mono/pull/766) by [@dannote](https://github.com/dannote))
2230
+ - Added `thinkingText` and `selectedBg` to theme schema ([#763](https://github.com/code-yeongyu/senpi-mono/pull/763) by [@scutifer](https://github.com/scutifer))
2231
+ - `navigateTree()` now supports `replaceInstructions` option to replace the default summarization prompt entirely, and `label` option to attach a label to the branch summary entry ([#787](https://github.com/code-yeongyu/senpi-mono/pull/787) by [@mitsuhiko](https://github.com/mitsuhiko))
2232
+
2233
+ ### Fixed
2234
+
2235
+ - Fixed crash during auto-compaction when summarization fails (e.g., quota exceeded). Now displays error message instead of crashing ([#792](https://github.com/code-yeongyu/senpi-mono/issues/792))
2236
+ - Fixed `--session <UUID>` to search globally across projects if not found locally, with option to fork sessions from other projects ([#785](https://github.com/code-yeongyu/senpi-mono/pull/785) by [@ribelo](https://github.com/ribelo))
2237
+ - Fixed standalone binary WASM loading on Linux ([#784](https://github.com/code-yeongyu/senpi-mono/issues/784))
2238
+ - Fixed string numbers in tool arguments not being coerced to numbers during validation ([#786](https://github.com/code-yeongyu/senpi-mono/pull/786) by [@dannote](https://github.com/dannote))
2239
+ - Fixed `--no-extensions` flag not preventing extension discovery ([#776](https://github.com/code-yeongyu/senpi-mono/issues/776))
2240
+ - Fixed extension messages rendering twice on startup when `pi.sendMessage({ display: true })` is called during `session_start` ([#765](https://github.com/code-yeongyu/senpi-mono/pull/765) by [@dannote](https://github.com/dannote))
2241
+ - Fixed `PI_CODING_AGENT_DIR` env var not expanding tilde (`~`) to home directory ([#778](https://github.com/code-yeongyu/senpi-mono/pull/778) by [@aliou](https://github.com/aliou))
2242
+ - Fixed session picker hint text overflow ([#764](https://github.com/code-yeongyu/senpi-mono/issues/764))
2243
+ - Fixed Kitty keyboard protocol shifted symbol keys (e.g., `@`, `?`) not working in editor ([#779](https://github.com/code-yeongyu/senpi-mono/pull/779) by [@iamd3vil](https://github.com/iamd3vil))
2244
+ - Fixed Bedrock tool call IDs causing API errors from invalid characters ([#781](https://github.com/code-yeongyu/senpi-mono/pull/781) by [@pjtf93](https://github.com/pjtf93))
2203
2245
 
2204
2246
  ### Changed
2205
2247
 
@@ -2209,16 +2251,16 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2209
2251
 
2210
2252
  ### Breaking Changes
2211
2253
 
2212
- - Extensions using `Editor` directly must now pass `TUI` as the first constructor argument: `new Editor(tui, theme)`. The `tui` parameter is available in extension factory functions. ([#732](https://github.com/code-yeongyu/sanepi-mono/issues/732))
2254
+ - Extensions using `Editor` directly must now pass `TUI` as the first constructor argument: `new Editor(tui, theme)`. The `tui` parameter is available in extension factory functions. ([#732](https://github.com/code-yeongyu/senpi-mono/issues/732))
2213
2255
 
2214
2256
  ### Added
2215
2257
 
2216
- - **OpenAI Codex official support**: Full compatibility with OpenAI's Codex CLI models (`gpt-5.1`, `gpt-5.2`, `gpt-5.1-codex-mini`, `gpt-5.2-codex`). Features include static system prompt for OpenAI allowlisting, prompt caching via session ID, and reasoning signature retention across turns. Set `OPENAI_API_KEY` and use `--provider openai-codex` or select a Codex model. ([#737](https://github.com/code-yeongyu/sanepi-mono/pull/737))
2258
+ - **OpenAI Codex official support**: Full compatibility with OpenAI's Codex CLI models (`gpt-5.1`, `gpt-5.2`, `gpt-5.1-codex-mini`, `gpt-5.2-codex`). Features include static system prompt for OpenAI allowlisting, prompt caching via session ID, and reasoning signature retention across turns. Set `OPENAI_API_KEY` and use `--provider openai-codex` or select a Codex model. ([#737](https://github.com/code-yeongyu/senpi-mono/pull/737))
2217
2259
  - `pi-internal://` URL scheme in read tool for accessing internal documentation. The model can read files from the coding-agent package (README, docs, examples) to learn about extending pi.
2218
- - New `input` event in extension system for intercepting, transforming, or handling user input before the agent processes it. Supports three result types: `continue` (pass through), `transform` (modify text/images), `handled` (respond without LLM). Handlers chain transforms and short-circuit on handled. ([#761](https://github.com/code-yeongyu/sanepi-mono/pull/761) by [@nicobailon](https://github.com/nicobailon))
2219
- - Extension example: `input-transform.ts` demonstrating input interception patterns (quick mode, instant commands, source routing) ([#761](https://github.com/code-yeongyu/sanepi-mono/pull/761) by [@nicobailon](https://github.com/nicobailon))
2220
- - Custom tool HTML export: extensions with `renderCall`/`renderResult` now render in `/share` and `/export` output with ANSI-to-HTML color conversion ([#702](https://github.com/code-yeongyu/sanepi-mono/pull/702) by [@aliou](https://github.com/aliou))
2221
- - Direct filter shortcuts in Tree mode: Ctrl+D (default), Ctrl+T (no-tools), Ctrl+U (user-only), Ctrl+L (labeled-only), Ctrl+A (all) ([#747](https://github.com/code-yeongyu/sanepi-mono/pull/747) by [@kaofelix](https://github.com/kaofelix))
2260
+ - New `input` event in extension system for intercepting, transforming, or handling user input before the agent processes it. Supports three result types: `continue` (pass through), `transform` (modify text/images), `handled` (respond without LLM). Handlers chain transforms and short-circuit on handled. ([#761](https://github.com/code-yeongyu/senpi-mono/pull/761) by [@nicobailon](https://github.com/nicobailon))
2261
+ - Extension example: `input-transform.ts` demonstrating input interception patterns (quick mode, instant commands, source routing) ([#761](https://github.com/code-yeongyu/senpi-mono/pull/761) by [@nicobailon](https://github.com/nicobailon))
2262
+ - Custom tool HTML export: extensions with `renderCall`/`renderResult` now render in `/share` and `/export` output with ANSI-to-HTML color conversion ([#702](https://github.com/code-yeongyu/senpi-mono/pull/702) by [@aliou](https://github.com/aliou))
2263
+ - Direct filter shortcuts in Tree mode: Ctrl+D (default), Ctrl+T (no-tools), Ctrl+U (user-only), Ctrl+L (labeled-only), Ctrl+A (all) ([#747](https://github.com/code-yeongyu/senpi-mono/pull/747) by [@kaofelix](https://github.com/kaofelix))
2222
2264
 
2223
2265
  ### Changed
2224
2266
 
@@ -2226,58 +2268,58 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2226
2268
 
2227
2269
  ### Fixed
2228
2270
 
2229
- - Editor no longer corrupts terminal display when loading large prompts via `setEditorText`. Content now scrolls vertically with indicators showing lines above/below the viewport. ([#732](https://github.com/code-yeongyu/sanepi-mono/issues/732))
2230
- - Piped stdin now works correctly: `echo foo | pi` is equivalent to `pi -p foo`. When stdin is piped, print mode is automatically enabled since interactive mode requires a TTY ([#708](https://github.com/code-yeongyu/sanepi-mono/issues/708))
2231
- - Session tree now preserves branch connectors and indentation when filters hide intermediate entries so descendants attach to the nearest visible ancestor and sibling branches align. Fixed in both TUI and HTML export ([#739](https://github.com/code-yeongyu/sanepi-mono/pull/739) by [@w-winter](https://github.com/w-winter))
2232
- - Added `upstream connect`, `connection refused`, and `reset before headers` patterns to auto-retry error detection ([#733](https://github.com/code-yeongyu/sanepi-mono/issues/733))
2233
- - Multi-line YAML frontmatter in skills and prompt templates now parses correctly. Centralized frontmatter parsing using the `yaml` library. ([#728](https://github.com/code-yeongyu/sanepi-mono/pull/728) by [@richardgill](https://github.com/richardgill))
2234
- - `ctx.shutdown()` now waits for pending UI renders to complete before exiting, ensuring notifications and final output are visible ([#756](https://github.com/code-yeongyu/sanepi-mono/issues/756))
2235
- - OpenAI Codex provider now retries on transient errors (429, 5xx, connection failures) with exponential backoff ([#733](https://github.com/code-yeongyu/sanepi-mono/issues/733))
2271
+ - Editor no longer corrupts terminal display when loading large prompts via `setEditorText`. Content now scrolls vertically with indicators showing lines above/below the viewport. ([#732](https://github.com/code-yeongyu/senpi-mono/issues/732))
2272
+ - Piped stdin now works correctly: `echo foo | pi` is equivalent to `pi -p foo`. When stdin is piped, print mode is automatically enabled since interactive mode requires a TTY ([#708](https://github.com/code-yeongyu/senpi-mono/issues/708))
2273
+ - Session tree now preserves branch connectors and indentation when filters hide intermediate entries so descendants attach to the nearest visible ancestor and sibling branches align. Fixed in both TUI and HTML export ([#739](https://github.com/code-yeongyu/senpi-mono/pull/739) by [@w-winter](https://github.com/w-winter))
2274
+ - Added `upstream connect`, `connection refused`, and `reset before headers` patterns to auto-retry error detection ([#733](https://github.com/code-yeongyu/senpi-mono/issues/733))
2275
+ - Multi-line YAML frontmatter in skills and prompt templates now parses correctly. Centralized frontmatter parsing using the `yaml` library. ([#728](https://github.com/code-yeongyu/senpi-mono/pull/728) by [@richardgill](https://github.com/richardgill))
2276
+ - `ctx.shutdown()` now waits for pending UI renders to complete before exiting, ensuring notifications and final output are visible ([#756](https://github.com/code-yeongyu/senpi-mono/issues/756))
2277
+ - OpenAI Codex provider now retries on transient errors (429, 5xx, connection failures) with exponential backoff ([#733](https://github.com/code-yeongyu/senpi-mono/issues/733))
2236
2278
 
2237
2279
  ## [0.46.0] - 2026-01-15
2238
2280
 
2239
2281
  ### Fixed
2240
2282
 
2241
- - Scoped models (`--models` or `enabledModels`) now remember the last selected model across sessions instead of always starting with the first model in the scope ([#736](https://github.com/code-yeongyu/sanepi-mono/pull/736) by [@ogulcancelik](https://github.com/ogulcancelik))
2242
- - Show `bun install` instead of `npm install` in update notification when running under Bun ([#714](https://github.com/code-yeongyu/sanepi-mono/pull/714) by [@dannote](https://github.com/dannote))
2243
- - `/skill` prompts now include the skill path ([#711](https://github.com/code-yeongyu/sanepi-mono/pull/711) by [@jblwilliams](https://github.com/jblwilliams))
2244
- - Use configurable `expandTools` keybinding instead of hardcoded Ctrl+O ([#717](https://github.com/code-yeongyu/sanepi-mono/pull/717) by [@dannote](https://github.com/dannote))
2245
- - Compaction turn prefix summaries now merge correctly ([#738](https://github.com/code-yeongyu/sanepi-mono/pull/738) by [@vsabavat](https://github.com/vsabavat))
2246
- - Avoid unsigned Gemini 3 tool calls ([#741](https://github.com/code-yeongyu/sanepi-mono/pull/741) by [@roshanasingh4](https://github.com/roshanasingh4))
2247
- - Fixed signature support for non-Anthropic models in Amazon Bedrock provider ([#727](https://github.com/code-yeongyu/sanepi-mono/pull/727) by [@unexge](https://github.com/unexge))
2248
- - Keyboard shortcuts (Ctrl+C, Ctrl+D, etc.) now work on non-Latin keyboard layouts (Russian, Ukrainian, Bulgarian, etc.) in terminals supporting Kitty keyboard protocol with alternate key reporting ([#718](https://github.com/code-yeongyu/sanepi-mono/pull/718) by [@dannote](https://github.com/dannote))
2283
+ - Scoped models (`--models` or `enabledModels`) now remember the last selected model across sessions instead of always starting with the first model in the scope ([#736](https://github.com/code-yeongyu/senpi-mono/pull/736) by [@ogulcancelik](https://github.com/ogulcancelik))
2284
+ - Show `bun install` instead of `npm install` in update notification when running under Bun ([#714](https://github.com/code-yeongyu/senpi-mono/pull/714) by [@dannote](https://github.com/dannote))
2285
+ - `/skill` prompts now include the skill path ([#711](https://github.com/code-yeongyu/senpi-mono/pull/711) by [@jblwilliams](https://github.com/jblwilliams))
2286
+ - Use configurable `expandTools` keybinding instead of hardcoded Ctrl+O ([#717](https://github.com/code-yeongyu/senpi-mono/pull/717) by [@dannote](https://github.com/dannote))
2287
+ - Compaction turn prefix summaries now merge correctly ([#738](https://github.com/code-yeongyu/senpi-mono/pull/738) by [@vsabavat](https://github.com/vsabavat))
2288
+ - Avoid unsigned Gemini 3 tool calls ([#741](https://github.com/code-yeongyu/senpi-mono/pull/741) by [@roshanasingh4](https://github.com/roshanasingh4))
2289
+ - Fixed signature support for non-Anthropic models in Amazon Bedrock provider ([#727](https://github.com/code-yeongyu/senpi-mono/pull/727) by [@unexge](https://github.com/unexge))
2290
+ - Keyboard shortcuts (Ctrl+C, Ctrl+D, etc.) now work on non-Latin keyboard layouts (Russian, Ukrainian, Bulgarian, etc.) in terminals supporting Kitty keyboard protocol with alternate key reporting ([#718](https://github.com/code-yeongyu/senpi-mono/pull/718) by [@dannote](https://github.com/dannote))
2249
2291
 
2250
2292
  ### Added
2251
2293
 
2252
- - Edit tool now uses fuzzy matching as fallback when exact match fails, tolerating trailing whitespace, smart quotes, Unicode dashes, and special spaces ([#713](https://github.com/code-yeongyu/sanepi-mono/pull/713) by [@dannote](https://github.com/dannote))
2253
- - Support `APPEND_SYSTEM.md` to append instructions to the system prompt ([#716](https://github.com/code-yeongyu/sanepi-mono/pull/716) by [@tallshort](https://github.com/tallshort))
2254
- - Session picker search: Ctrl+R toggles sorting between fuzzy match (default) and most recent; supports quoted phrase matching and `re:` regex mode ([#731](https://github.com/code-yeongyu/sanepi-mono/pull/731) by [@ogulcancelik](https://github.com/ogulcancelik))
2255
- - Export `getAgentDir` for extensions ([#749](https://github.com/code-yeongyu/sanepi-mono/pull/749) by [@dannote](https://github.com/dannote))
2256
- - Show loaded prompt templates on startup ([#743](https://github.com/code-yeongyu/sanepi-mono/pull/743) by [@tallshort](https://github.com/tallshort))
2257
- - MiniMax China (`minimax-cn`) provider support ([#725](https://github.com/code-yeongyu/sanepi-mono/pull/725) by [@tallshort](https://github.com/tallshort))
2258
- - `gpt-5.2-codex` models for GitHub Copilot and OpenCode Zen providers ([#734](https://github.com/code-yeongyu/sanepi-mono/pull/734) by [@aadishv](https://github.com/aadishv))
2294
+ - Edit tool now uses fuzzy matching as fallback when exact match fails, tolerating trailing whitespace, smart quotes, Unicode dashes, and special spaces ([#713](https://github.com/code-yeongyu/senpi-mono/pull/713) by [@dannote](https://github.com/dannote))
2295
+ - Support `APPEND_SYSTEM.md` to append instructions to the system prompt ([#716](https://github.com/code-yeongyu/senpi-mono/pull/716) by [@tallshort](https://github.com/tallshort))
2296
+ - Session picker search: Ctrl+R toggles sorting between fuzzy match (default) and most recent; supports quoted phrase matching and `re:` regex mode ([#731](https://github.com/code-yeongyu/senpi-mono/pull/731) by [@ogulcancelik](https://github.com/ogulcancelik))
2297
+ - Export `getAgentDir` for extensions ([#749](https://github.com/code-yeongyu/senpi-mono/pull/749) by [@dannote](https://github.com/dannote))
2298
+ - Show loaded prompt templates on startup ([#743](https://github.com/code-yeongyu/senpi-mono/pull/743) by [@tallshort](https://github.com/tallshort))
2299
+ - MiniMax China (`minimax-cn`) provider support ([#725](https://github.com/code-yeongyu/senpi-mono/pull/725) by [@tallshort](https://github.com/tallshort))
2300
+ - `gpt-5.2-codex` models for GitHub Copilot and OpenCode Zen providers ([#734](https://github.com/code-yeongyu/senpi-mono/pull/734) by [@aadishv](https://github.com/aadishv))
2259
2301
 
2260
2302
  ### Changed
2261
2303
 
2262
- - Replaced `wasm-vips` with `@silvia-odwyer/photon-node` for image processing ([#710](https://github.com/code-yeongyu/sanepi-mono/pull/710) by [@can1357](https://github.com/can1357))
2263
- - Extension example: `plan-mode/` shortcut changed from Shift+P to Ctrl+Alt+P to avoid conflict with typing capital P ([#746](https://github.com/code-yeongyu/sanepi-mono/pull/746) by [@ferologics](https://github.com/ferologics))
2264
- - UI keybinding hints now respect configured keybindings across components ([#724](https://github.com/code-yeongyu/sanepi-mono/pull/724) by [@dannote](https://github.com/dannote))
2265
- - CLI process title is now set to `pi` for easier process identification ([#742](https://github.com/code-yeongyu/sanepi-mono/pull/742) by [@richardgill](https://github.com/richardgill))
2304
+ - Replaced `wasm-vips` with `@silvia-odwyer/photon-node` for image processing ([#710](https://github.com/code-yeongyu/senpi-mono/pull/710) by [@can1357](https://github.com/can1357))
2305
+ - Extension example: `plan-mode/` shortcut changed from Shift+P to Ctrl+Alt+P to avoid conflict with typing capital P ([#746](https://github.com/code-yeongyu/senpi-mono/pull/746) by [@ferologics](https://github.com/ferologics))
2306
+ - UI keybinding hints now respect configured keybindings across components ([#724](https://github.com/code-yeongyu/senpi-mono/pull/724) by [@dannote](https://github.com/dannote))
2307
+ - CLI process title is now set to `pi` for easier process identification ([#742](https://github.com/code-yeongyu/senpi-mono/pull/742) by [@richardgill](https://github.com/richardgill))
2266
2308
 
2267
2309
  ## [0.45.7] - 2026-01-13
2268
2310
 
2269
2311
  ### Added
2270
2312
 
2271
- - Exported `highlightCode` and `getLanguageFromPath` for extensions ([#703](https://github.com/code-yeongyu/sanepi-mono/pull/703) by [@dannote](https://github.com/dannote))
2313
+ - Exported `highlightCode` and `getLanguageFromPath` for extensions ([#703](https://github.com/code-yeongyu/senpi-mono/pull/703) by [@dannote](https://github.com/dannote))
2272
2314
 
2273
2315
  ## [0.45.6] - 2026-01-13
2274
2316
 
2275
2317
  ### Added
2276
2318
 
2277
- - `ctx.ui.custom()` now accepts `overlayOptions` for overlay positioning and sizing (anchor, margins, offsets, percentages, absolute positioning) ([#667](https://github.com/code-yeongyu/sanepi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2278
- - `ctx.ui.custom()` now accepts `onHandle` callback to receive the `OverlayHandle` for controlling overlay visibility ([#667](https://github.com/code-yeongyu/sanepi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2279
- - Extension example: `overlay-qa-tests.ts` with 10 commands for testing overlay positioning, animation, and toggle scenarios ([#667](https://github.com/code-yeongyu/sanepi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2280
- - Extension example: `doom-overlay/` - DOOM game running as an overlay at 35 FPS (auto-downloads WAD on first run) ([#667](https://github.com/code-yeongyu/sanepi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2319
+ - `ctx.ui.custom()` now accepts `overlayOptions` for overlay positioning and sizing (anchor, margins, offsets, percentages, absolute positioning) ([#667](https://github.com/code-yeongyu/senpi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2320
+ - `ctx.ui.custom()` now accepts `onHandle` callback to receive the `OverlayHandle` for controlling overlay visibility ([#667](https://github.com/code-yeongyu/senpi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2321
+ - Extension example: `overlay-qa-tests.ts` with 10 commands for testing overlay positioning, animation, and toggle scenarios ([#667](https://github.com/code-yeongyu/senpi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2322
+ - Extension example: `doom-overlay/` - DOOM game running as an overlay at 35 FPS (auto-downloads WAD on first run) ([#667](https://github.com/code-yeongyu/senpi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
2281
2323
 
2282
2324
  ## [0.45.5] - 2026-01-13
2283
2325
 
@@ -2290,22 +2332,22 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2290
2332
  ### Changed
2291
2333
 
2292
2334
  - Light theme colors adjusted for WCAG AA compliance (4.5:1 contrast ratio against white backgrounds)
2293
- - Replaced `sharp` with `wasm-vips` for image processing (resize, PNG conversion). Eliminates native build requirements that caused installation failures on some systems. ([#696](https://github.com/code-yeongyu/sanepi-mono/issues/696))
2335
+ - Replaced `sharp` with `wasm-vips` for image processing (resize, PNG conversion). Eliminates native build requirements that caused installation failures on some systems. ([#696](https://github.com/code-yeongyu/senpi-mono/issues/696))
2294
2336
 
2295
2337
  ### Added
2296
2338
 
2297
- - Extension example: `summarize.ts` for summarizing conversations using custom UI and an external model ([#684](https://github.com/code-yeongyu/sanepi-mono/pull/684) by [@scutifer](https://github.com/scutifer))
2298
- - Extension example: `question.ts` enhanced with custom UI for asking user questions ([#693](https://github.com/code-yeongyu/sanepi-mono/pull/693) by [@ferologics](https://github.com/ferologics))
2299
- - Extension example: `plan-mode/` enhanced with explicit step tracking and progress widget ([#694](https://github.com/code-yeongyu/sanepi-mono/pull/694) by [@ferologics](https://github.com/ferologics))
2300
- - Extension example: `questionnaire.ts` for multi-question input with tab bar navigation ([#695](https://github.com/code-yeongyu/sanepi-mono/pull/695) by [@ferologics](https://github.com/ferologics))
2301
- - Experimental Vercel AI Gateway provider support: set `AI_GATEWAY_API_KEY` and use `--provider vercel-ai-gateway`. Token usage is currently reported incorrectly by Anthropic Messages compatible endpoint. ([#689](https://github.com/code-yeongyu/sanepi-mono/pull/689) by [@timolins](https://github.com/timolins))
2339
+ - Extension example: `summarize.ts` for summarizing conversations using custom UI and an external model ([#684](https://github.com/code-yeongyu/senpi-mono/pull/684) by [@scutifer](https://github.com/scutifer))
2340
+ - Extension example: `question.ts` enhanced with custom UI for asking user questions ([#693](https://github.com/code-yeongyu/senpi-mono/pull/693) by [@ferologics](https://github.com/ferologics))
2341
+ - Extension example: `plan-mode/` enhanced with explicit step tracking and progress widget ([#694](https://github.com/code-yeongyu/senpi-mono/pull/694) by [@ferologics](https://github.com/ferologics))
2342
+ - Extension example: `questionnaire.ts` for multi-question input with tab bar navigation ([#695](https://github.com/code-yeongyu/senpi-mono/pull/695) by [@ferologics](https://github.com/ferologics))
2343
+ - Experimental Vercel AI Gateway provider support: set `AI_GATEWAY_API_KEY` and use `--provider vercel-ai-gateway`. Token usage is currently reported incorrectly by Anthropic Messages compatible endpoint. ([#689](https://github.com/code-yeongyu/senpi-mono/pull/689) by [@timolins](https://github.com/timolins))
2302
2344
 
2303
2345
  ### Fixed
2304
2346
 
2305
- - Fix API key resolution after model switches by using provider argument ([#691](https://github.com/code-yeongyu/sanepi-mono/pull/691) by [@joshp123](https://github.com/joshp123))
2306
- - Fixed z.ai thinking/reasoning: thinking toggle now correctly enables/disables thinking for z.ai models ([#688](https://github.com/code-yeongyu/sanepi-mono/issues/688))
2307
- - Fixed extension loading in compiled Bun binary: extensions with local file imports now work correctly. Updated `@mariozechner/jiti` to v2.6.5 which bundles babel for Bun binary compatibility. ([#681](https://github.com/code-yeongyu/sanepi-mono/issues/681))
2308
- - Fixed theme loading when installed via mise: use wrapper directory in release tarballs for compatibility with mise's `strip_components=1` extraction. ([#681](https://github.com/code-yeongyu/sanepi-mono/issues/681))
2347
+ - Fix API key resolution after model switches by using provider argument ([#691](https://github.com/code-yeongyu/senpi-mono/pull/691) by [@joshp123](https://github.com/joshp123))
2348
+ - Fixed z.ai thinking/reasoning: thinking toggle now correctly enables/disables thinking for z.ai models ([#688](https://github.com/code-yeongyu/senpi-mono/issues/688))
2349
+ - Fixed extension loading in compiled Bun binary: extensions with local file imports now work correctly. Updated `@mariozechner/jiti` to v2.6.5 which bundles babel for Bun binary compatibility. ([#681](https://github.com/code-yeongyu/senpi-mono/issues/681))
2350
+ - Fixed theme loading when installed via mise: use wrapper directory in release tarballs for compatibility with mise's `strip_components=1` extraction. ([#681](https://github.com/code-yeongyu/senpi-mono/issues/681))
2309
2351
 
2310
2352
  ## [0.45.3] - 2026-01-13
2311
2353
 
@@ -2325,79 +2367,79 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2325
2367
 
2326
2368
  ### Added
2327
2369
 
2328
- - MiniMax provider support: set `MINIMAX_API_KEY` and use `minimax/MiniMax-M2.1` ([#656](https://github.com/code-yeongyu/sanepi-mono/pull/656) by [@dannote](https://github.com/dannote))
2329
- - `/scoped-models`: Alt+Up/Down to reorder enabled models. Order is preserved when saving with Ctrl+S and determines Ctrl+P cycling order. ([#676](https://github.com/code-yeongyu/sanepi-mono/pull/676) by [@thomasmhr](https://github.com/thomasmhr))
2330
- - Amazon Bedrock provider support (experimental, tested with Anthropic Claude models only) ([#494](https://github.com/code-yeongyu/sanepi-mono/pull/494) by [@unexge](https://github.com/unexge))
2331
- - Extension example: `sandbox/` for OS-level bash sandboxing using `@anthropic-ai/sandbox-runtime` with per-project config ([#673](https://github.com/code-yeongyu/sanepi-mono/pull/673) by [@dannote](https://github.com/dannote))
2370
+ - MiniMax provider support: set `MINIMAX_API_KEY` and use `minimax/MiniMax-M2.1` ([#656](https://github.com/code-yeongyu/senpi-mono/pull/656) by [@dannote](https://github.com/dannote))
2371
+ - `/scoped-models`: Alt+Up/Down to reorder enabled models. Order is preserved when saving with Ctrl+S and determines Ctrl+P cycling order. ([#676](https://github.com/code-yeongyu/senpi-mono/pull/676) by [@thomasmhr](https://github.com/thomasmhr))
2372
+ - Amazon Bedrock provider support (experimental, tested with Anthropic Claude models only) ([#494](https://github.com/code-yeongyu/senpi-mono/pull/494) by [@unexge](https://github.com/unexge))
2373
+ - Extension example: `sandbox/` for OS-level bash sandboxing using `@anthropic-ai/sandbox-runtime` with per-project config ([#673](https://github.com/code-yeongyu/senpi-mono/pull/673) by [@dannote](https://github.com/dannote))
2332
2374
  - Print mode JSON output now emits the session header as the first line.
2333
2375
 
2334
2376
  ## [0.44.0] - 2026-01-12
2335
2377
 
2336
2378
  ### Breaking Changes
2337
2379
 
2338
- - `pi.getAllTools()` now returns `ToolInfo[]` (with `name` and `description`) instead of `string[]`. Extensions that only need names can use `.map(t => t.name)`. ([#648](https://github.com/code-yeongyu/sanepi-mono/pull/648) by [@carsonfarmer](https://github.com/carsonfarmer))
2380
+ - `pi.getAllTools()` now returns `ToolInfo[]` (with `name` and `description`) instead of `string[]`. Extensions that only need names can use `.map(t => t.name)`. ([#648](https://github.com/code-yeongyu/senpi-mono/pull/648) by [@carsonfarmer](https://github.com/carsonfarmer))
2339
2381
 
2340
2382
  ### Added
2341
2383
 
2342
- - Session naming: `/name <name>` command sets a display name shown in the session selector instead of the first message. Useful for distinguishing forked sessions. Extensions can use `pi.setSessionName()` and `pi.getSessionName()`. ([#650](https://github.com/code-yeongyu/sanepi-mono/pull/650) by [@scutifer](https://github.com/scutifer))
2343
- - Extension example: `notify.ts` for desktop notifications via OSC 777 escape sequence ([#658](https://github.com/code-yeongyu/sanepi-mono/pull/658) by [@ferologics](https://github.com/ferologics))
2344
- - Inline hint for queued messages showing the `Alt+Up` restore shortcut ([#657](https://github.com/code-yeongyu/sanepi-mono/pull/657) by [@tmustier](https://github.com/tmustier))
2345
- - Page-up/down navigation in `/resume` session selector to jump by 5 items ([#662](https://github.com/code-yeongyu/sanepi-mono/pull/662) by [@aliou](https://github.com/aliou))
2346
- - Fuzzy search in `/settings` menu: type to filter settings by label ([#643](https://github.com/code-yeongyu/sanepi-mono/pull/643) by [@ninlds](https://github.com/ninlds))
2384
+ - Session naming: `/name <name>` command sets a display name shown in the session selector instead of the first message. Useful for distinguishing forked sessions. Extensions can use `pi.setSessionName()` and `pi.getSessionName()`. ([#650](https://github.com/code-yeongyu/senpi-mono/pull/650) by [@scutifer](https://github.com/scutifer))
2385
+ - Extension example: `notify.ts` for desktop notifications via OSC 777 escape sequence ([#658](https://github.com/code-yeongyu/senpi-mono/pull/658) by [@ferologics](https://github.com/ferologics))
2386
+ - Inline hint for queued messages showing the `Alt+Up` restore shortcut ([#657](https://github.com/code-yeongyu/senpi-mono/pull/657) by [@tmustier](https://github.com/tmustier))
2387
+ - Page-up/down navigation in `/resume` session selector to jump by 5 items ([#662](https://github.com/code-yeongyu/senpi-mono/pull/662) by [@aliou](https://github.com/aliou))
2388
+ - Fuzzy search in `/settings` menu: type to filter settings by label ([#643](https://github.com/code-yeongyu/senpi-mono/pull/643) by [@ninlds](https://github.com/ninlds))
2347
2389
 
2348
2390
  ### Fixed
2349
2391
 
2350
- - Session selector now stays open when current folder has no sessions, allowing Tab to switch to "all" scope ([#661](https://github.com/code-yeongyu/sanepi-mono/pull/661) by [@aliou](https://github.com/aliou))
2392
+ - Session selector now stays open when current folder has no sessions, allowing Tab to switch to "all" scope ([#661](https://github.com/code-yeongyu/senpi-mono/pull/661) by [@aliou](https://github.com/aliou))
2351
2393
  - Extensions using theme utilities like `getSettingsListTheme()` now work in dev mode with tsx
2352
2394
 
2353
2395
  ## [0.43.0] - 2026-01-11
2354
2396
 
2355
2397
  ### Breaking Changes
2356
2398
 
2357
- - Extension editor (`ctx.ui.editor()`) now uses Enter to submit and Shift+Enter for newlines, matching the main editor. Previously used Ctrl+Enter to submit. Extensions with hardcoded "ctrl+enter" hints need updating. ([#642](https://github.com/code-yeongyu/sanepi-mono/pull/642) by [@mitsuhiko](https://github.com/mitsuhiko))
2358
- - Renamed `/branch` command to `/fork` ([#641](https://github.com/code-yeongyu/sanepi-mono/issues/641))
2399
+ - Extension editor (`ctx.ui.editor()`) now uses Enter to submit and Shift+Enter for newlines, matching the main editor. Previously used Ctrl+Enter to submit. Extensions with hardcoded "ctrl+enter" hints need updating. ([#642](https://github.com/code-yeongyu/senpi-mono/pull/642) by [@mitsuhiko](https://github.com/mitsuhiko))
2400
+ - Renamed `/branch` command to `/fork` ([#641](https://github.com/code-yeongyu/senpi-mono/issues/641))
2359
2401
  - RPC: `branch` → `fork`, `get_branch_messages` → `get_fork_messages`
2360
2402
  - SDK: `branch()` → `fork()`, `getBranchMessages()` → `getForkMessages()`
2361
2403
  - AgentSession: `branch()` → `fork()`, `getUserMessagesForBranching()` → `getUserMessagesForForking()`
2362
2404
  - Extension events: `session_before_branch` → `session_before_fork`, `session_branch` → `session_fork`
2363
2405
  - Settings: `doubleEscapeAction: "branch" | "tree"` → `"fork" | "tree"`
2364
- - `SessionManager.list()` and `SessionManager.listAll()` are now async, returning `Promise<SessionInfo[]>`. Callers must await them. ([#620](https://github.com/code-yeongyu/sanepi-mono/pull/620) by [@tmustier](https://github.com/tmustier))
2406
+ - `SessionManager.list()` and `SessionManager.listAll()` are now async, returning `Promise<SessionInfo[]>`. Callers must await them. ([#620](https://github.com/code-yeongyu/senpi-mono/pull/620) by [@tmustier](https://github.com/tmustier))
2365
2407
 
2366
2408
  ### Added
2367
- - `/resume` selector now toggles between current-folder and all sessions with Tab, showing the session cwd in the All view and loading progress. ([#620](https://github.com/code-yeongyu/sanepi-mono/pull/620) by [@tmustier](https://github.com/tmustier))
2409
+ - `/resume` selector now toggles between current-folder and all sessions with Tab, showing the session cwd in the All view and loading progress. ([#620](https://github.com/code-yeongyu/senpi-mono/pull/620) by [@tmustier](https://github.com/tmustier))
2368
2410
  - `SessionManager.list()` and `SessionManager.listAll()` accept optional `onProgress` callback for progress updates
2369
2411
  - `SessionInfo.cwd` field containing the session's working directory (empty string for old sessions)
2370
2412
  - `SessionListProgress` type export for progress callbacks
2371
- - `/scoped-models` command to enable/disable models for Ctrl+P cycling. Changes are session-only by default; press Ctrl+S to persist to settings.json. ([#626](https://github.com/code-yeongyu/sanepi-mono/pull/626) by [@CarlosGtrz](https://github.com/CarlosGtrz))
2372
- - `model_select` extension hook fires when model changes via `/model`, model cycling, or session restore with `source` field and `previousModel` ([#628](https://github.com/code-yeongyu/sanepi-mono/pull/628) by [@marckrenn](https://github.com/marckrenn))
2373
- - `ctx.ui.setWorkingMessage()` extension API to customize the "Working..." message during streaming ([#625](https://github.com/code-yeongyu/sanepi-mono/pull/625) by [@nicobailon](https://github.com/nicobailon))
2374
- - Skill slash commands: loaded skills are registered as `/skill:name` commands for quick access. Toggle via `/settings` or `skills.enableSkillCommands` in settings.json. ([#630](https://github.com/code-yeongyu/sanepi-mono/pull/630) by [@Dwsy](https://github.com/Dwsy))
2413
+ - `/scoped-models` command to enable/disable models for Ctrl+P cycling. Changes are session-only by default; press Ctrl+S to persist to settings.json. ([#626](https://github.com/code-yeongyu/senpi-mono/pull/626) by [@CarlosGtrz](https://github.com/CarlosGtrz))
2414
+ - `model_select` extension hook fires when model changes via `/model`, model cycling, or session restore with `source` field and `previousModel` ([#628](https://github.com/code-yeongyu/senpi-mono/pull/628) by [@marckrenn](https://github.com/marckrenn))
2415
+ - `ctx.ui.setWorkingMessage()` extension API to customize the "Working..." message during streaming ([#625](https://github.com/code-yeongyu/senpi-mono/pull/625) by [@nicobailon](https://github.com/nicobailon))
2416
+ - Skill slash commands: loaded skills are registered as `/skill:name` commands for quick access. Toggle via `/settings` or `skills.enableSkillCommands` in settings.json. ([#630](https://github.com/code-yeongyu/senpi-mono/pull/630) by [@Dwsy](https://github.com/Dwsy))
2375
2417
  - Slash command autocomplete now uses fuzzy matching (type `/skbra` to match `/skill:brave-search`)
2376
- - `/tree` branch summarization now offers three options: "No summary", "Summarize", and "Summarize with custom prompt". Custom prompts are appended as additional focus to the default summarization instructions. ([#642](https://github.com/code-yeongyu/sanepi-mono/pull/642) by [@mitsuhiko](https://github.com/mitsuhiko))
2418
+ - `/tree` branch summarization now offers three options: "No summary", "Summarize", and "Summarize with custom prompt". Custom prompts are appended as additional focus to the default summarization instructions. ([#642](https://github.com/code-yeongyu/senpi-mono/pull/642) by [@mitsuhiko](https://github.com/mitsuhiko))
2377
2419
 
2378
2420
  ### Fixed
2379
2421
 
2380
- - Missing spacer between assistant message and text editor ([#655](https://github.com/code-yeongyu/sanepi-mono/issues/655))
2381
- - Session picker respects custom keybindings when using `--resume` ([#633](https://github.com/code-yeongyu/sanepi-mono/pull/633) by [@aos](https://github.com/aos))
2382
- - Custom footer extensions now see model changes: `ctx.model` is now a getter that returns the current model instead of a snapshot from when the context was created ([#634](https://github.com/code-yeongyu/sanepi-mono/pull/634) by [@ogulcancelik](https://github.com/ogulcancelik))
2422
+ - Missing spacer between assistant message and text editor ([#655](https://github.com/code-yeongyu/senpi-mono/issues/655))
2423
+ - Session picker respects custom keybindings when using `--resume` ([#633](https://github.com/code-yeongyu/senpi-mono/pull/633) by [@aos](https://github.com/aos))
2424
+ - Custom footer extensions now see model changes: `ctx.model` is now a getter that returns the current model instead of a snapshot from when the context was created ([#634](https://github.com/code-yeongyu/senpi-mono/pull/634) by [@ogulcancelik](https://github.com/ogulcancelik))
2383
2425
  - Footer git branch not updating after external branch switches. Git uses atomic writes (temp file + rename), which changes the inode and breaks `fs.watch` on the file. Now watches the directory instead.
2384
- - Extension loading errors are now displayed to the user instead of being silently ignored ([#639](https://github.com/code-yeongyu/sanepi-mono/pull/639) by [@aliou](https://github.com/aliou))
2426
+ - Extension loading errors are now displayed to the user instead of being silently ignored ([#639](https://github.com/code-yeongyu/senpi-mono/pull/639) by [@aliou](https://github.com/aliou))
2385
2427
 
2386
2428
  ## [0.42.5] - 2026-01-11
2387
2429
 
2388
2430
  ### Fixed
2389
2431
 
2390
- - Reduced flicker by only re-rendering changed lines ([#617](https://github.com/code-yeongyu/sanepi-mono/pull/617) by [@ogulcancelik](https://github.com/ogulcancelik)). No worries tho, there's still a little flicker in the VS Code Terminal. Praise the flicker.
2432
+ - Reduced flicker by only re-rendering changed lines ([#617](https://github.com/code-yeongyu/senpi-mono/pull/617) by [@ogulcancelik](https://github.com/ogulcancelik)). No worries tho, there's still a little flicker in the VS Code Terminal. Praise the flicker.
2391
2433
  - Cursor position tracking when content shrinks with unchanged remaining lines
2392
- - TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended ([#599](https://github.com/code-yeongyu/sanepi-mono/issues/599))
2393
- - Pasted content containing Kitty key release patterns (e.g., `:3F` in MAC addresses) was incorrectly filtered out ([#623](https://github.com/code-yeongyu/sanepi-mono/pull/623) by [@ogulcancelik](https://github.com/ogulcancelik))
2434
+ - TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended ([#599](https://github.com/code-yeongyu/senpi-mono/issues/599))
2435
+ - Pasted content containing Kitty key release patterns (e.g., `:3F` in MAC addresses) was incorrectly filtered out ([#623](https://github.com/code-yeongyu/senpi-mono/pull/623) by [@ogulcancelik](https://github.com/ogulcancelik))
2394
2436
 
2395
2437
  ## [0.42.4] - 2026-01-10
2396
2438
 
2397
2439
  ### Fixed
2398
2440
 
2399
- - Bash output expanded hint now says "(ctrl+o to collapse)" ([#610](https://github.com/code-yeongyu/sanepi-mono/pull/610) by [@tallshort](https://github.com/tallshort))
2400
- - Fixed UTF-8 text corruption in remote bash execution (SSH, containers) by using streaming TextDecoder ([#608](https://github.com/code-yeongyu/sanepi-mono/issues/608))
2441
+ - Bash output expanded hint now says "(ctrl+o to collapse)" ([#610](https://github.com/code-yeongyu/senpi-mono/pull/610) by [@tallshort](https://github.com/tallshort))
2442
+ - Fixed UTF-8 text corruption in remote bash execution (SSH, containers) by using streaming TextDecoder ([#608](https://github.com/code-yeongyu/senpi-mono/issues/608))
2401
2443
 
2402
2444
  ## [0.42.3] - 2026-01-10
2403
2445
 
@@ -2409,19 +2451,19 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2409
2451
 
2410
2452
  ### Added
2411
2453
 
2412
- - `/model <search>` now pre-filters the model selector or auto-selects on exact match. Use `provider/model` syntax to disambiguate (e.g., `/model openai/gpt-4`). ([#587](https://github.com/code-yeongyu/sanepi-mono/pull/587) by [@zedrdave](https://github.com/zedrdave))
2413
- - `FooterDataProvider` for custom footers: `ctx.ui.setFooter()` now receives a third `footerData` parameter providing `getGitBranch()`, `getExtensionStatuses()`, and `onBranchChange()` for reactive updates ([#600](https://github.com/code-yeongyu/sanepi-mono/pull/600) by [@nicobailon](https://github.com/nicobailon))
2414
- - `Alt+Up` hotkey to restore queued steering/follow-up messages back into the editor without aborting the current run ([#604](https://github.com/code-yeongyu/sanepi-mono/pull/604) by [@tmustier](https://github.com/tmustier))
2454
+ - `/model <search>` now pre-filters the model selector or auto-selects on exact match. Use `provider/model` syntax to disambiguate (e.g., `/model openai/gpt-4`). ([#587](https://github.com/code-yeongyu/senpi-mono/pull/587) by [@zedrdave](https://github.com/zedrdave))
2455
+ - `FooterDataProvider` for custom footers: `ctx.ui.setFooter()` now receives a third `footerData` parameter providing `getGitBranch()`, `getExtensionStatuses()`, and `onBranchChange()` for reactive updates ([#600](https://github.com/code-yeongyu/senpi-mono/pull/600) by [@nicobailon](https://github.com/nicobailon))
2456
+ - `Alt+Up` hotkey to restore queued steering/follow-up messages back into the editor without aborting the current run ([#604](https://github.com/code-yeongyu/senpi-mono/pull/604) by [@tmustier](https://github.com/tmustier))
2415
2457
 
2416
2458
  ### Fixed
2417
2459
 
2418
- - Fixed LM Studio compatibility for OpenAI Responses tool strict mapping in the ai provider ([#598](https://github.com/code-yeongyu/sanepi-mono/pull/598) by [@gnattu](https://github.com/gnattu))
2460
+ - Fixed LM Studio compatibility for OpenAI Responses tool strict mapping in the ai provider ([#598](https://github.com/code-yeongyu/senpi-mono/pull/598) by [@gnattu](https://github.com/gnattu))
2419
2461
 
2420
2462
  ## [0.42.1] - 2026-01-09
2421
2463
 
2422
2464
  ### Fixed
2423
2465
 
2424
- - Symlinked directories in `prompts/` folders are now followed when loading prompt templates ([#601](https://github.com/code-yeongyu/sanepi-mono/pull/601) by [@aliou](https://github.com/aliou))
2466
+ - Symlinked directories in `prompts/` folders are now followed when loading prompt templates ([#601](https://github.com/code-yeongyu/senpi-mono/pull/601) by [@aliou](https://github.com/aliou))
2425
2467
 
2426
2468
  ## [0.42.0] - 2026-01-09
2427
2469
 
@@ -2462,32 +2504,32 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2462
2504
 
2463
2505
  ### Breaking Changes
2464
2506
 
2465
- - `before_agent_start` event now receives `systemPrompt` in the event object and returns `systemPrompt` (full replacement) instead of `systemPromptAppend`. Extensions that were appending must now use `event.systemPrompt + extra` pattern. ([#575](https://github.com/code-yeongyu/sanepi-mono/issues/575))
2466
- - `discoverSkills()` now returns `{ skills: Skill[], warnings: SkillWarning[] }` instead of `Skill[]`. This allows callers to handle skill loading warnings. ([#577](https://github.com/code-yeongyu/sanepi-mono/pull/577) by [@cv](https://github.com/cv))
2507
+ - `before_agent_start` event now receives `systemPrompt` in the event object and returns `systemPrompt` (full replacement) instead of `systemPromptAppend`. Extensions that were appending must now use `event.systemPrompt + extra` pattern. ([#575](https://github.com/code-yeongyu/senpi-mono/issues/575))
2508
+ - `discoverSkills()` now returns `{ skills: Skill[], warnings: SkillWarning[] }` instead of `Skill[]`. This allows callers to handle skill loading warnings. ([#577](https://github.com/code-yeongyu/senpi-mono/pull/577) by [@cv](https://github.com/cv))
2467
2509
 
2468
2510
  ### Added
2469
2511
 
2470
- - `ctx.ui.getAllThemes()`, `ctx.ui.getTheme(name)`, and `ctx.ui.setTheme(name | Theme)` methods for extensions to list, load, and switch themes at runtime ([#576](https://github.com/code-yeongyu/sanepi-mono/pull/576))
2471
- - `--no-tools` flag to disable all built-in tools, allowing extension-only tool setups ([#557](https://github.com/code-yeongyu/sanepi-mono/pull/557) by [@cv](https://github.com/cv))
2472
- - Pluggable operations for built-in tools enabling remote execution via SSH or other transports ([#564](https://github.com/code-yeongyu/sanepi-mono/issues/564)). Interfaces: `ReadOperations`, `WriteOperations`, `EditOperations`, `BashOperations`, `LsOperations`, `GrepOperations`, `FindOperations`
2473
- - `user_bash` event for intercepting user `!`/`!!` commands, allowing extensions to redirect to remote systems ([#528](https://github.com/code-yeongyu/sanepi-mono/issues/528))
2512
+ - `ctx.ui.getAllThemes()`, `ctx.ui.getTheme(name)`, and `ctx.ui.setTheme(name | Theme)` methods for extensions to list, load, and switch themes at runtime ([#576](https://github.com/code-yeongyu/senpi-mono/pull/576))
2513
+ - `--no-tools` flag to disable all built-in tools, allowing extension-only tool setups ([#557](https://github.com/code-yeongyu/senpi-mono/pull/557) by [@cv](https://github.com/cv))
2514
+ - Pluggable operations for built-in tools enabling remote execution via SSH or other transports ([#564](https://github.com/code-yeongyu/senpi-mono/issues/564)). Interfaces: `ReadOperations`, `WriteOperations`, `EditOperations`, `BashOperations`, `LsOperations`, `GrepOperations`, `FindOperations`
2515
+ - `user_bash` event for intercepting user `!`/`!!` commands, allowing extensions to redirect to remote systems ([#528](https://github.com/code-yeongyu/senpi-mono/issues/528))
2474
2516
  - `setActiveTools()` in ExtensionAPI for dynamic tool management
2475
2517
  - Built-in renderers used automatically for tool overrides without custom `renderCall`/`renderResult`
2476
2518
  - `ssh.ts` example: remote tool execution via `--ssh user@host:/path`
2477
2519
  - `interactive-shell.ts` example: run interactive commands (vim, git rebase, htop) with full terminal access via `!i` prefix or auto-detection
2478
- - Wayland clipboard support for `/copy` command using wl-copy with xclip/xsel fallback ([#570](https://github.com/code-yeongyu/sanepi-mono/pull/570) by [@OgulcanCelik](https://github.com/OgulcanCelik))
2479
- - **Experimental:** `ctx.ui.custom()` now accepts `{ overlay: true }` option for floating modal components that composite over existing content without clearing the screen ([#558](https://github.com/code-yeongyu/sanepi-mono/pull/558) by [@nicobailon](https://github.com/nicobailon))
2480
- - `AgentSession.skills` and `AgentSession.skillWarnings` properties to access loaded skills without rediscovery ([#577](https://github.com/code-yeongyu/sanepi-mono/pull/577) by [@cv](https://github.com/cv))
2520
+ - Wayland clipboard support for `/copy` command using wl-copy with xclip/xsel fallback ([#570](https://github.com/code-yeongyu/senpi-mono/pull/570) by [@OgulcanCelik](https://github.com/OgulcanCelik))
2521
+ - **Experimental:** `ctx.ui.custom()` now accepts `{ overlay: true }` option for floating modal components that composite over existing content without clearing the screen ([#558](https://github.com/code-yeongyu/senpi-mono/pull/558) by [@nicobailon](https://github.com/nicobailon))
2522
+ - `AgentSession.skills` and `AgentSession.skillWarnings` properties to access loaded skills without rediscovery ([#577](https://github.com/code-yeongyu/senpi-mono/pull/577) by [@cv](https://github.com/cv))
2481
2523
 
2482
2524
  ### Fixed
2483
2525
 
2484
- - String `systemPrompt` in `createAgentSession()` now works as a full replacement instead of having context files and skills appended, matching documented behavior ([#543](https://github.com/code-yeongyu/sanepi-mono/issues/543))
2485
- - Update notification for bun binary installs now shows release download URL instead of npm command ([#567](https://github.com/code-yeongyu/sanepi-mono/pull/567) by [@ferologics](https://github.com/ferologics))
2486
- - ESC key now works during "Working..." state after auto-retry ([#568](https://github.com/code-yeongyu/sanepi-mono/pull/568) by [@tmustier](https://github.com/tmustier))
2487
- - Abort messages now show correct retry attempt count (e.g., "Aborted after 2 retry attempts") ([#568](https://github.com/code-yeongyu/sanepi-mono/pull/568) by [@tmustier](https://github.com/tmustier))
2488
- - Fixed Antigravity provider returning 429 errors despite available quota ([#571](https://github.com/code-yeongyu/sanepi-mono/pull/571) by [@ben-vargas](https://github.com/ben-vargas))
2489
- - Fixed malformed thinking text in Gemini/Antigravity responses where thinking content appeared as regular text or vice versa. Cross-model conversations now properly convert thinking blocks to plain text. ([#561](https://github.com/code-yeongyu/sanepi-mono/issues/561))
2490
- - `--no-skills` flag now correctly prevents skills from loading in interactive mode ([#577](https://github.com/code-yeongyu/sanepi-mono/pull/577) by [@cv](https://github.com/cv))
2526
+ - String `systemPrompt` in `createAgentSession()` now works as a full replacement instead of having context files and skills appended, matching documented behavior ([#543](https://github.com/code-yeongyu/senpi-mono/issues/543))
2527
+ - Update notification for bun binary installs now shows release download URL instead of npm command ([#567](https://github.com/code-yeongyu/senpi-mono/pull/567) by [@ferologics](https://github.com/ferologics))
2528
+ - ESC key now works during "Working..." state after auto-retry ([#568](https://github.com/code-yeongyu/senpi-mono/pull/568) by [@tmustier](https://github.com/tmustier))
2529
+ - Abort messages now show correct retry attempt count (e.g., "Aborted after 2 retry attempts") ([#568](https://github.com/code-yeongyu/senpi-mono/pull/568) by [@tmustier](https://github.com/tmustier))
2530
+ - Fixed Antigravity provider returning 429 errors despite available quota ([#571](https://github.com/code-yeongyu/senpi-mono/pull/571) by [@ben-vargas](https://github.com/ben-vargas))
2531
+ - Fixed malformed thinking text in Gemini/Antigravity responses where thinking content appeared as regular text or vice versa. Cross-model conversations now properly convert thinking blocks to plain text. ([#561](https://github.com/code-yeongyu/senpi-mono/issues/561))
2532
+ - `--no-skills` flag now correctly prevents skills from loading in interactive mode ([#577](https://github.com/code-yeongyu/senpi-mono/pull/577) by [@cv](https://github.com/cv))
2491
2533
 
2492
2534
  ## [0.38.0] - 2026-01-08
2493
2535
 
@@ -2499,28 +2541,28 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2499
2541
  - `ExtensionRunner` constructor now requires `runtime: ExtensionRuntime` as second parameter
2500
2542
  - `ExtensionRunner.initialize()` signature changed from options object to positional params `(actions, contextActions, commandContextActions?, uiContext?)`
2501
2543
  - `ExtensionRunner.getHasUI()` renamed to `hasUI()`
2502
- - OpenAI Codex model aliases removed (`gpt-5`, `gpt-5-mini`, `gpt-5-nano`, `codex-mini-latest`). Use canonical IDs: `gpt-5.1`, `gpt-5.1-codex-mini`, `gpt-5.2`, `gpt-5.2-codex`. ([#536](https://github.com/code-yeongyu/sanepi-mono/pull/536) by [@ghoulr](https://github.com/ghoulr))
2544
+ - OpenAI Codex model aliases removed (`gpt-5`, `gpt-5-mini`, `gpt-5-nano`, `codex-mini-latest`). Use canonical IDs: `gpt-5.1`, `gpt-5.1-codex-mini`, `gpt-5.2`, `gpt-5.2-codex`. ([#536](https://github.com/code-yeongyu/senpi-mono/pull/536) by [@ghoulr](https://github.com/ghoulr))
2503
2545
 
2504
2546
  ### Added
2505
2547
 
2506
- - `--no-extensions` flag to disable extension discovery while still allowing explicit `-e` paths ([#524](https://github.com/code-yeongyu/sanepi-mono/pull/524) by [@cv](https://github.com/cv))
2548
+ - `--no-extensions` flag to disable extension discovery while still allowing explicit `-e` paths ([#524](https://github.com/code-yeongyu/senpi-mono/pull/524) by [@cv](https://github.com/cv))
2507
2549
  - SDK: `InteractiveMode`, `runPrintMode()`, `runRpcMode()` exported for building custom run modes. See `docs/sdk.md`.
2508
- - `PI_SKIP_VERSION_CHECK` environment variable to disable new version notifications at startup ([#549](https://github.com/code-yeongyu/sanepi-mono/pull/549) by [@aos](https://github.com/aos))
2509
- - `thinkingBudgets` setting to customize token budgets per thinking level for token-based providers ([#529](https://github.com/code-yeongyu/sanepi-mono/pull/529) by [@melihmucuk](https://github.com/melihmucuk))
2510
- - Extension UI dialogs (`ctx.ui.select()`, `ctx.ui.confirm()`, `ctx.ui.input()`) now support a `timeout` option with live countdown display ([#522](https://github.com/code-yeongyu/sanepi-mono/pull/522) by [@nicobailon](https://github.com/nicobailon))
2550
+ - `PI_SKIP_VERSION_CHECK` environment variable to disable new version notifications at startup ([#549](https://github.com/code-yeongyu/senpi-mono/pull/549) by [@aos](https://github.com/aos))
2551
+ - `thinkingBudgets` setting to customize token budgets per thinking level for token-based providers ([#529](https://github.com/code-yeongyu/senpi-mono/pull/529) by [@melihmucuk](https://github.com/melihmucuk))
2552
+ - Extension UI dialogs (`ctx.ui.select()`, `ctx.ui.confirm()`, `ctx.ui.input()`) now support a `timeout` option with live countdown display ([#522](https://github.com/code-yeongyu/senpi-mono/pull/522) by [@nicobailon](https://github.com/nicobailon))
2511
2553
  - Extensions can now provide custom editor components via `ctx.ui.setEditorComponent()`. See `examples/extensions/modal-editor.ts` and `docs/tui.md` Pattern 7.
2512
- - Extension factories can now be async, enabling dynamic imports and lazy-loaded dependencies ([#513](https://github.com/code-yeongyu/sanepi-mono/pull/513) by [@austinm911](https://github.com/austinm911))
2513
- - `ctx.shutdown()` is now available in extension contexts for requesting a graceful shutdown. In interactive mode, shutdown is deferred until the agent becomes idle (after processing all queued steering and follow-up messages). In RPC mode, shutdown is deferred until after completing the current command response. In print mode, shutdown is a no-op as the process exits automatically when prompts complete. ([#542](https://github.com/code-yeongyu/sanepi-mono/pull/542) by [@kaofelix](https://github.com/kaofelix))
2554
+ - Extension factories can now be async, enabling dynamic imports and lazy-loaded dependencies ([#513](https://github.com/code-yeongyu/senpi-mono/pull/513) by [@austinm911](https://github.com/austinm911))
2555
+ - `ctx.shutdown()` is now available in extension contexts for requesting a graceful shutdown. In interactive mode, shutdown is deferred until the agent becomes idle (after processing all queued steering and follow-up messages). In RPC mode, shutdown is deferred until after completing the current command response. In print mode, shutdown is a no-op as the process exits automatically when prompts complete. ([#542](https://github.com/code-yeongyu/senpi-mono/pull/542) by [@kaofelix](https://github.com/kaofelix))
2514
2556
 
2515
2557
  ### Fixed
2516
2558
 
2517
- - Default thinking level from settings now applies correctly when `enabledModels` is configured ([#540](https://github.com/code-yeongyu/sanepi-mono/pull/540) by [@ferologics](https://github.com/ferologics))
2518
- - External edits to `settings.json` while pi is running are now preserved when pi saves settings ([#527](https://github.com/code-yeongyu/sanepi-mono/pull/527) by [@ferologics](https://github.com/ferologics))
2519
- - Overflow-based compaction now skips if error came from a different model or was already handled by a previous compaction ([#535](https://github.com/code-yeongyu/sanepi-mono/pull/535) by [@mitsuhiko](https://github.com/mitsuhiko))
2520
- - OpenAI Codex context window reduced from 400k to 272k tokens to match Codex CLI defaults and prevent 400 errors ([#536](https://github.com/code-yeongyu/sanepi-mono/pull/536) by [@ghoulr](https://github.com/ghoulr))
2559
+ - Default thinking level from settings now applies correctly when `enabledModels` is configured ([#540](https://github.com/code-yeongyu/senpi-mono/pull/540) by [@ferologics](https://github.com/ferologics))
2560
+ - External edits to `settings.json` while pi is running are now preserved when pi saves settings ([#527](https://github.com/code-yeongyu/senpi-mono/pull/527) by [@ferologics](https://github.com/ferologics))
2561
+ - Overflow-based compaction now skips if error came from a different model or was already handled by a previous compaction ([#535](https://github.com/code-yeongyu/senpi-mono/pull/535) by [@mitsuhiko](https://github.com/mitsuhiko))
2562
+ - OpenAI Codex context window reduced from 400k to 272k tokens to match Codex CLI defaults and prevent 400 errors ([#536](https://github.com/code-yeongyu/senpi-mono/pull/536) by [@ghoulr](https://github.com/ghoulr))
2521
2563
  - Context overflow detection now recognizes `context_length_exceeded` errors.
2522
- - Key presses no longer dropped when input is batched over SSH ([#538](https://github.com/code-yeongyu/sanepi-mono/issues/538))
2523
- - Clipboard image support now works on Alpine Linux and other musl-based distros ([#533](https://github.com/code-yeongyu/sanepi-mono/issues/533))
2564
+ - Key presses no longer dropped when input is batched over SSH ([#538](https://github.com/code-yeongyu/senpi-mono/issues/538))
2565
+ - Clipboard image support now works on Alpine Linux and other musl-based distros ([#533](https://github.com/code-yeongyu/senpi-mono/issues/533))
2524
2566
 
2525
2567
  ## [0.37.8] - 2026-01-07
2526
2568
 
@@ -2530,17 +2572,17 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2530
2572
 
2531
2573
  ### Added
2532
2574
 
2533
- - Extension UI dialogs (`ctx.ui.select()`, `ctx.ui.confirm()`, `ctx.ui.input()`) now accept an optional `AbortSignal` to programmatically dismiss dialogs. Useful for implementing timeouts. See `examples/extensions/timed-confirm.ts`. ([#474](https://github.com/code-yeongyu/sanepi-mono/issues/474))
2534
- - HTML export now shows bridge prompts in model change messages for Codex sessions ([#510](https://github.com/code-yeongyu/sanepi-mono/pull/510) by [@mitsuhiko](https://github.com/mitsuhiko))
2575
+ - Extension UI dialogs (`ctx.ui.select()`, `ctx.ui.confirm()`, `ctx.ui.input()`) now accept an optional `AbortSignal` to programmatically dismiss dialogs. Useful for implementing timeouts. See `examples/extensions/timed-confirm.ts`. ([#474](https://github.com/code-yeongyu/senpi-mono/issues/474))
2576
+ - HTML export now shows bridge prompts in model change messages for Codex sessions ([#510](https://github.com/code-yeongyu/senpi-mono/pull/510) by [@mitsuhiko](https://github.com/mitsuhiko))
2535
2577
 
2536
2578
  ## [0.37.5] - 2026-01-06
2537
2579
 
2538
2580
  ### Added
2539
2581
 
2540
- - ExtensionAPI: `setModel()`, `getThinkingLevel()`, `setThinkingLevel()` methods for extensions to change model and thinking level at runtime ([#509](https://github.com/code-yeongyu/sanepi-mono/issues/509))
2582
+ - ExtensionAPI: `setModel()`, `getThinkingLevel()`, `setThinkingLevel()` methods for extensions to change model and thinking level at runtime ([#509](https://github.com/code-yeongyu/senpi-mono/issues/509))
2541
2583
  - Exported truncation utilities for custom tools: `truncateHead`, `truncateTail`, `truncateLine`, `formatSize`, `DEFAULT_MAX_BYTES`, `DEFAULT_MAX_LINES`, `TruncationOptions`, `TruncationResult`
2542
2584
  - New example `truncated-tool.ts` demonstrating proper output truncation with custom rendering for extensions
2543
- - New example `preset.ts` demonstrating preset configurations with model/thinking/tools switching ([#347](https://github.com/code-yeongyu/sanepi-mono/issues/347))
2585
+ - New example `preset.ts` demonstrating preset configurations with model/thinking/tools switching ([#347](https://github.com/code-yeongyu/senpi-mono/issues/347))
2544
2586
  - Documentation for output truncation best practices in `docs/extensions.md`
2545
2587
  - Exported all UI components for extensions: `ArminComponent`, `AssistantMessageComponent`, `BashExecutionComponent`, `BorderedLoader`, `BranchSummaryMessageComponent`, `CompactionSummaryMessageComponent`, `CustomEditor`, `CustomMessageComponent`, `DynamicBorder`, `ExtensionEditorComponent`, `ExtensionInputComponent`, `ExtensionSelectorComponent`, `FooterComponent`, `LoginDialogComponent`, `ModelSelectorComponent`, `OAuthSelectorComponent`, `SessionSelectorComponent`, `SettingsSelectorComponent`, `ShowImagesSelectorComponent`, `ThemeSelectorComponent`, `ThinkingSelectorComponent`, `ToolExecutionComponent`, `TreeSelectorComponent`, `UserMessageComponent`, `UserMessageSelectorComponent`, plus utilities `renderDiff`, `truncateToVisualLines`
2546
2588
  - `docs/tui.md`: Common Patterns section with copy-paste code for SelectList, BorderedLoader, SettingsList, setStatus, setWidget, setFooter
@@ -2552,8 +2594,8 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2552
2594
 
2553
2595
  ### Added
2554
2596
 
2555
- - Session picker (`pi -r`) and `--session` flag now support searching/resuming by session ID (UUID prefix) ([#495](https://github.com/code-yeongyu/sanepi-mono/issues/495) by [@arunsathiya](https://github.com/arunsathiya))
2556
- - Extensions can now replace the startup header with `ctx.ui.setHeader()`, see `examples/extensions/custom-header.ts` ([#500](https://github.com/code-yeongyu/sanepi-mono/pull/500) by [@tudoroancea](https://github.com/tudoroancea))
2597
+ - Session picker (`pi -r`) and `--session` flag now support searching/resuming by session ID (UUID prefix) ([#495](https://github.com/code-yeongyu/senpi-mono/issues/495) by [@arunsathiya](https://github.com/arunsathiya))
2598
+ - Extensions can now replace the startup header with `ctx.ui.setHeader()`, see `examples/extensions/custom-header.ts` ([#500](https://github.com/code-yeongyu/senpi-mono/pull/500) by [@tudoroancea](https://github.com/tudoroancea))
2557
2599
 
2558
2600
  ### Changed
2559
2601
 
@@ -2562,31 +2604,31 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2562
2604
 
2563
2605
  ### Fixed
2564
2606
 
2565
- - Queued steering/follow-up messages no longer wipe unsent editor input ([#503](https://github.com/code-yeongyu/sanepi-mono/pull/503) by [@tmustier](https://github.com/tmustier))
2566
- - OAuth token refresh failure no longer crashes app at startup, allowing user to `/login` to re-authenticate ([#498](https://github.com/code-yeongyu/sanepi-mono/issues/498))
2607
+ - Queued steering/follow-up messages no longer wipe unsent editor input ([#503](https://github.com/code-yeongyu/senpi-mono/pull/503) by [@tmustier](https://github.com/tmustier))
2608
+ - OAuth token refresh failure no longer crashes app at startup, allowing user to `/login` to re-authenticate ([#498](https://github.com/code-yeongyu/senpi-mono/issues/498))
2567
2609
 
2568
2610
  ## [0.37.3] - 2026-01-06
2569
2611
 
2570
2612
  ### Added
2571
2613
 
2572
- - Extensions can now replace the footer with `ctx.ui.setFooter()`, see `examples/extensions/custom-footer.ts` ([#481](https://github.com/code-yeongyu/sanepi-mono/issues/481))
2614
+ - Extensions can now replace the footer with `ctx.ui.setFooter()`, see `examples/extensions/custom-footer.ts` ([#481](https://github.com/code-yeongyu/senpi-mono/issues/481))
2573
2615
  - Session ID is now forwarded to LLM providers for session-based caching (used by OpenAI Codex for prompt caching).
2574
- - Added `blockImages` setting to prevent images from being sent to LLM providers ([#492](https://github.com/code-yeongyu/sanepi-mono/pull/492) by [@jsinge97](https://github.com/jsinge97))
2575
- - Extensions can now send user messages via `pi.sendUserMessage()` ([#483](https://github.com/code-yeongyu/sanepi-mono/issues/483))
2616
+ - Added `blockImages` setting to prevent images from being sent to LLM providers ([#492](https://github.com/code-yeongyu/senpi-mono/pull/492) by [@jsinge97](https://github.com/jsinge97))
2617
+ - Extensions can now send user messages via `pi.sendUserMessage()` ([#483](https://github.com/code-yeongyu/senpi-mono/issues/483))
2576
2618
 
2577
2619
  ### Fixed
2578
2620
 
2579
2621
  - Add `minimatch` as a direct dependency for explicit imports.
2580
- - Status bar now shows correct git branch when running in a git worktree ([#490](https://github.com/code-yeongyu/sanepi-mono/pull/490) by [@kcosr](https://github.com/kcosr))
2581
- - Interactive mode: Ctrl+V clipboard image paste now works on Wayland sessions by using `wl-paste` with `xclip` fallback ([#488](https://github.com/code-yeongyu/sanepi-mono/pull/488) by [@ghoulr](https://github.com/ghoulr))
2622
+ - Status bar now shows correct git branch when running in a git worktree ([#490](https://github.com/code-yeongyu/senpi-mono/pull/490) by [@kcosr](https://github.com/kcosr))
2623
+ - Interactive mode: Ctrl+V clipboard image paste now works on Wayland sessions by using `wl-paste` with `xclip` fallback ([#488](https://github.com/code-yeongyu/senpi-mono/pull/488) by [@ghoulr](https://github.com/ghoulr))
2582
2624
 
2583
2625
  ## [0.37.2] - 2026-01-05
2584
2626
 
2585
2627
  ### Fixed
2586
2628
 
2587
- - Extension directories in `settings.json` now respect `package.json` manifests, matching global extension behavior ([#480](https://github.com/code-yeongyu/sanepi-mono/pull/480) by [@prateekmedia](https://github.com/prateekmedia))
2629
+ - Extension directories in `settings.json` now respect `package.json` manifests, matching global extension behavior ([#480](https://github.com/code-yeongyu/senpi-mono/pull/480) by [@prateekmedia](https://github.com/prateekmedia))
2588
2630
  - Share viewer: deep links now scroll to the target message when opened via `/share`
2589
- - Bash tool now handles spawn errors gracefully instead of crashing the agent (missing cwd, invalid shell path) ([#479](https://github.com/code-yeongyu/sanepi-mono/pull/479) by [@robinwander](https://github.com/robinwander))
2631
+ - Bash tool now handles spawn errors gracefully instead of crashing the agent (missing cwd, invalid shell path) ([#479](https://github.com/code-yeongyu/senpi-mono/pull/479) by [@robinwander](https://github.com/robinwander))
2590
2632
 
2591
2633
  ## [0.37.1] - 2026-01-05
2592
2634
 
@@ -2598,35 +2640,35 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
2598
2640
 
2599
2641
  ### Added
2600
2642
 
2601
- - Share viewer: copy-link button on messages to share URLs that navigate directly to a specific message ([#477](https://github.com/code-yeongyu/sanepi-mono/pull/477) by [@lockmeister](https://github.com/lockmeister))
2602
- - Extension example: add `claude-rules` to load `.claude/rules/` entries into the system prompt ([#461](https://github.com/code-yeongyu/sanepi-mono/pull/461) by [@vaayne](https://github.com/vaayne))
2603
- - Headless OAuth login: all providers now show paste input for manual URL/code entry, works over SSH without DISPLAY ([#428](https://github.com/code-yeongyu/sanepi-mono/pull/428) by [@ben-vargas](https://github.com/ben-vargas), [#468](https://github.com/code-yeongyu/sanepi-mono/pull/468) by [@crcatala](https://github.com/crcatala))
2643
+ - Share viewer: copy-link button on messages to share URLs that navigate directly to a specific message ([#477](https://github.com/code-yeongyu/senpi-mono/pull/477) by [@lockmeister](https://github.com/lockmeister))
2644
+ - Extension example: add `claude-rules` to load `.claude/rules/` entries into the system prompt ([#461](https://github.com/code-yeongyu/senpi-mono/pull/461) by [@vaayne](https://github.com/vaayne))
2645
+ - Headless OAuth login: all providers now show paste input for manual URL/code entry, works over SSH without DISPLAY ([#428](https://github.com/code-yeongyu/senpi-mono/pull/428) by [@ben-vargas](https://github.com/ben-vargas), [#468](https://github.com/code-yeongyu/senpi-mono/pull/468) by [@crcatala](https://github.com/crcatala))
2604
2646
 
2605
2647
  ### Changed
2606
2648
 
2607
2649
  - OAuth login UI now uses dedicated dialog component with consistent borders
2608
2650
  - Assume truecolor support for all terminals except `dumb`, empty, or `linux` (fixes colors over SSH)
2609
- - OpenAI Codex clean-up: removed per-thinking-level model variants, thinking level is now set separately and the provider clamps to what each model supports internally (initial implementation in [#472](https://github.com/code-yeongyu/sanepi-mono/pull/472) by [@ben-vargas](https://github.com/ben-vargas))
2651
+ - OpenAI Codex clean-up: removed per-thinking-level model variants, thinking level is now set separately and the provider clamps to what each model supports internally (initial implementation in [#472](https://github.com/code-yeongyu/senpi-mono/pull/472) by [@ben-vargas](https://github.com/ben-vargas))
2610
2652
 
2611
2653
  ### Fixed
2612
2654
 
2613
- - Messages submitted during compaction are queued and delivered after compaction completes, preserving steering and follow-up behavior. Extension commands execute immediately during compaction. ([#476](https://github.com/code-yeongyu/sanepi-mono/pull/476) by [@tmustier](https://github.com/tmustier))
2614
- - Managed binaries (`fd`, `rg`) now stored in `~/.senpi/agent/bin/` instead of `tools/`, eliminating false deprecation warnings ([#470](https://github.com/code-yeongyu/sanepi-mono/pull/470) by [@mcinteerj](https://github.com/mcinteerj))
2615
- - Extensions defined in `settings.json` were not loaded ([#463](https://github.com/code-yeongyu/sanepi-mono/pull/463) by [@melihmucuk](https://github.com/melihmucuk))
2616
- - OAuth refresh no longer logs users out when multiple pi instances are running ([#466](https://github.com/code-yeongyu/sanepi-mono/pull/466) by [@Cursivez](https://github.com/Cursivez))
2617
- - Migration warnings now ignore `fd.exe` and `rg.exe` in `tools/` on Windows ([#458](https://github.com/code-yeongyu/sanepi-mono/pull/458) by [@carlosgtrz](https://github.com/carlosgtrz))
2618
- - CI: add `examples/extensions/with-deps` to workspaces to fix typecheck ([#467](https://github.com/code-yeongyu/sanepi-mono/pull/467) by [@aliou](https://github.com/aliou))
2619
- - SDK: passing `extensions: []` now disables extension discovery as documented ([#465](https://github.com/code-yeongyu/sanepi-mono/pull/465) by [@aliou](https://github.com/aliou))
2655
+ - Messages submitted during compaction are queued and delivered after compaction completes, preserving steering and follow-up behavior. Extension commands execute immediately during compaction. ([#476](https://github.com/code-yeongyu/senpi-mono/pull/476) by [@tmustier](https://github.com/tmustier))
2656
+ - Managed binaries (`fd`, `rg`) now stored in `~/.senpi/agent/bin/` instead of `tools/`, eliminating false deprecation warnings ([#470](https://github.com/code-yeongyu/senpi-mono/pull/470) by [@mcinteerj](https://github.com/mcinteerj))
2657
+ - Extensions defined in `settings.json` were not loaded ([#463](https://github.com/code-yeongyu/senpi-mono/pull/463) by [@melihmucuk](https://github.com/melihmucuk))
2658
+ - OAuth refresh no longer logs users out when multiple pi instances are running ([#466](https://github.com/code-yeongyu/senpi-mono/pull/466) by [@Cursivez](https://github.com/Cursivez))
2659
+ - Migration warnings now ignore `fd.exe` and `rg.exe` in `tools/` on Windows ([#458](https://github.com/code-yeongyu/senpi-mono/pull/458) by [@carlosgtrz](https://github.com/carlosgtrz))
2660
+ - CI: add `examples/extensions/with-deps` to workspaces to fix typecheck ([#467](https://github.com/code-yeongyu/senpi-mono/pull/467) by [@aliou](https://github.com/aliou))
2661
+ - SDK: passing `extensions: []` now disables extension discovery as documented ([#465](https://github.com/code-yeongyu/senpi-mono/pull/465) by [@aliou](https://github.com/aliou))
2620
2662
 
2621
2663
  ## [0.36.0] - 2026-01-05
2622
2664
 
2623
2665
  ### Added
2624
2666
 
2625
- - Experimental: OpenAI Codex OAuth provider support: access Codex models via ChatGPT Plus/Pro subscription using `/login openai-codex` ([#451](https://github.com/code-yeongyu/sanepi-mono/pull/451) by [@kim0](https://github.com/kim0))
2667
+ - Experimental: OpenAI Codex OAuth provider support: access Codex models via ChatGPT Plus/Pro subscription using `/login openai-codex` ([#451](https://github.com/code-yeongyu/senpi-mono/pull/451) by [@kim0](https://github.com/kim0))
2626
2668
 
2627
2669
  ## [0.35.0] - 2026-01-05
2628
2670
 
2629
- This release unifies hooks and custom tools into a single "extensions" system and renames "slash commands" to "prompt templates". ([#454](https://github.com/code-yeongyu/sanepi-mono/issues/454))
2671
+ This release unifies hooks and custom tools into a single "extensions" system and renames "slash commands" to "prompt templates". ([#454](https://github.com/code-yeongyu/senpi-mono/issues/454))
2630
2672
 
2631
2673
  **Before migrating, read:**
2632
2674
 
@@ -2849,11 +2891,11 @@ pi --extension ./safety.ts -e ./todo.ts
2849
2891
 
2850
2892
  ### Added
2851
2893
 
2852
- - Hook API: `ctx.ui.setTitle(title)` allows hooks to set the terminal window/tab title ([#446](https://github.com/code-yeongyu/sanepi-mono/pull/446) by [@aliou](https://github.com/aliou))
2894
+ - Hook API: `ctx.ui.setTitle(title)` allows hooks to set the terminal window/tab title ([#446](https://github.com/code-yeongyu/senpi-mono/pull/446) by [@aliou](https://github.com/aliou))
2853
2895
 
2854
2896
  ### Changed
2855
2897
 
2856
- - Expanded keybinding documentation to list all 32 supported symbol keys with notes on ctrl+symbol behavior ([#450](https://github.com/code-yeongyu/sanepi-mono/pull/450) by [@kaofelix](https://github.com/kaofelix))
2898
+ - Expanded keybinding documentation to list all 32 supported symbol keys with notes on ctrl+symbol behavior ([#450](https://github.com/code-yeongyu/senpi-mono/pull/450) by [@kaofelix](https://github.com/kaofelix))
2857
2899
 
2858
2900
  ## [0.34.0] - 2026-01-04
2859
2901
 
@@ -2890,28 +2932,28 @@ pi --extension ./safety.ts -e ./todo.ts
2890
2932
 
2891
2933
  ### Changed
2892
2934
 
2893
- - Removed image placeholders after copy & paste, replaced with inserting image file paths directly. ([#442](https://github.com/code-yeongyu/sanepi-mono/pull/442) by [@mitsuhiko](https://github.com/mitsuhiko))
2935
+ - Removed image placeholders after copy & paste, replaced with inserting image file paths directly. ([#442](https://github.com/code-yeongyu/senpi-mono/pull/442) by [@mitsuhiko](https://github.com/mitsuhiko))
2894
2936
 
2895
2937
  ### Fixed
2896
2938
 
2897
2939
  - Fixed potential text decoding issues in bash executor by using streaming TextDecoder instead of Buffer.toString()
2898
- - External editor (Ctrl-G) now shows full pasted content instead of `[paste #N ...]` placeholders ([#444](https://github.com/code-yeongyu/sanepi-mono/pull/444) by [@aliou](https://github.com/aliou))
2940
+ - External editor (Ctrl-G) now shows full pasted content instead of `[paste #N ...]` placeholders ([#444](https://github.com/code-yeongyu/senpi-mono/pull/444) by [@aliou](https://github.com/aliou))
2899
2941
 
2900
2942
  ## [0.33.0] - 2026-01-04
2901
2943
 
2902
2944
  ### Breaking Changes
2903
2945
 
2904
- - **Key detection functions removed from `@earendil-works/pi-tui`**: All `isXxx()` key detection functions (`isEnter()`, `isEscape()`, `isCtrlC()`, etc.) have been removed. Use `matchesKey(data, keyId)` instead (e.g., `matchesKey(data, "enter")`, `matchesKey(data, "ctrl+c")`). This affects hooks and custom tools that use `ctx.ui.custom()` with keyboard input handling. ([#405](https://github.com/code-yeongyu/sanepi-mono/pull/405))
2946
+ - **Key detection functions removed from `@earendil-works/pi-tui`**: All `isXxx()` key detection functions (`isEnter()`, `isEscape()`, `isCtrlC()`, etc.) have been removed. Use `matchesKey(data, keyId)` instead (e.g., `matchesKey(data, "enter")`, `matchesKey(data, "ctrl+c")`). This affects hooks and custom tools that use `ctx.ui.custom()` with keyboard input handling. ([#405](https://github.com/code-yeongyu/senpi-mono/pull/405))
2905
2947
 
2906
2948
  ### Added
2907
2949
 
2908
- - Clipboard image paste support via `Ctrl+V`. Images are saved to a temp file and attached to the message. Works on macOS, Windows, and Linux (X11). ([#419](https://github.com/code-yeongyu/sanepi-mono/issues/419))
2909
- - Configurable keybindings via `~/.senpi/agent/keybindings.json`. All keyboard shortcuts (editor navigation, deletion, app actions like model cycling, etc.) can now be customized. Supports multiple bindings per action. ([#405](https://github.com/code-yeongyu/sanepi-mono/pull/405) by [@hjanuschka](https://github.com/hjanuschka))
2910
- - `/quit` and `/exit` slash commands to gracefully exit the application. Unlike double Ctrl+C, these properly await hook and custom tool cleanup handlers before exiting. ([#426](https://github.com/code-yeongyu/sanepi-mono/pull/426) by [@ben-vargas](https://github.com/ben-vargas))
2950
+ - Clipboard image paste support via `Ctrl+V`. Images are saved to a temp file and attached to the message. Works on macOS, Windows, and Linux (X11). ([#419](https://github.com/code-yeongyu/senpi-mono/issues/419))
2951
+ - Configurable keybindings via `~/.senpi/agent/keybindings.json`. All keyboard shortcuts (editor navigation, deletion, app actions like model cycling, etc.) can now be customized. Supports multiple bindings per action. ([#405](https://github.com/code-yeongyu/senpi-mono/pull/405) by [@hjanuschka](https://github.com/hjanuschka))
2952
+ - `/quit` and `/exit` slash commands to gracefully exit the application. Unlike double Ctrl+C, these properly await hook and custom tool cleanup handlers before exiting. ([#426](https://github.com/code-yeongyu/senpi-mono/pull/426) by [@ben-vargas](https://github.com/ben-vargas))
2911
2953
 
2912
2954
  ### Fixed
2913
2955
 
2914
- - Subagent example README referenced incorrect filename `subagent.ts` instead of `index.ts` ([#427](https://github.com/code-yeongyu/sanepi-mono/pull/427) by [@Whamp](https://github.com/Whamp))
2956
+ - Subagent example README referenced incorrect filename `subagent.ts` instead of `index.ts` ([#427](https://github.com/code-yeongyu/senpi-mono/pull/427) by [@Whamp](https://github.com/Whamp))
2915
2957
 
2916
2958
  ## [0.32.3] - 2026-01-03
2917
2959
 
@@ -2919,14 +2961,14 @@ pi --extension ./safety.ts -e ./todo.ts
2919
2961
 
2920
2962
  - `--list-models` no longer shows Google Vertex AI models without explicit authentication configured
2921
2963
  - JPEG/GIF/WebP images not displaying in terminals using Kitty graphics protocol (Kitty, Ghostty, WezTerm). The protocol requires PNG format, so non-PNG images are now converted before display.
2922
- - Version check URL typo preventing update notifications from working ([#423](https://github.com/code-yeongyu/sanepi-mono/pull/423) by [@skuridin](https://github.com/skuridin))
2923
- - Large images exceeding Anthropic's 5MB limit now retry with progressive quality/size reduction ([#424](https://github.com/code-yeongyu/sanepi-mono/pull/424) by [@mitsuhiko](https://github.com/mitsuhiko))
2964
+ - Version check URL typo preventing update notifications from working ([#423](https://github.com/code-yeongyu/senpi-mono/pull/423) by [@skuridin](https://github.com/skuridin))
2965
+ - Large images exceeding Anthropic's 5MB limit now retry with progressive quality/size reduction ([#424](https://github.com/code-yeongyu/senpi-mono/pull/424) by [@mitsuhiko](https://github.com/mitsuhiko))
2924
2966
 
2925
2967
  ## [0.32.2] - 2026-01-03
2926
2968
 
2927
2969
  ### Added
2928
2970
 
2929
- - `$ARGUMENTS` syntax for custom slash commands as alternative to `$@` for all arguments joined. Aligns with patterns used by Claude, Codex, and OpenCode. Both syntaxes remain fully supported. ([#418](https://github.com/code-yeongyu/sanepi-mono/pull/418) by [@skuridin](https://github.com/skuridin))
2971
+ - `$ARGUMENTS` syntax for custom slash commands as alternative to `$@` for all arguments joined. Aligns with patterns used by Claude, Codex, and OpenCode. Both syntaxes remain fully supported. ([#418](https://github.com/code-yeongyu/senpi-mono/pull/418) by [@skuridin](https://github.com/skuridin))
2930
2972
 
2931
2973
  ### Changed
2932
2974
 
@@ -2936,17 +2978,17 @@ pi --extension ./safety.ts -e ./todo.ts
2936
2978
  - `steer()` and `followUp()` now expand file-based slash commands and error on hook commands (hook commands cannot be queued)
2937
2979
  - `prompt()` accepts new `streamingBehavior` option (`"steer"` or `"followUp"`) to specify queueing behavior during streaming
2938
2980
  - RPC `prompt` command now accepts optional `streamingBehavior` field
2939
- ([#420](https://github.com/code-yeongyu/sanepi-mono/issues/420))
2981
+ ([#420](https://github.com/code-yeongyu/senpi-mono/issues/420))
2940
2982
 
2941
2983
  ### Fixed
2942
2984
 
2943
- - Slash command argument substitution now processes positional arguments (`$1`, `$2`, etc.) before all-arguments (`$@`, `$ARGUMENTS`) to prevent recursive substitution when argument values contain dollar-digit patterns like `$100`. ([#418](https://github.com/code-yeongyu/sanepi-mono/pull/418) by [@skuridin](https://github.com/skuridin))
2985
+ - Slash command argument substitution now processes positional arguments (`$1`, `$2`, etc.) before all-arguments (`$@`, `$ARGUMENTS`) to prevent recursive substitution when argument values contain dollar-digit patterns like `$100`. ([#418](https://github.com/code-yeongyu/senpi-mono/pull/418) by [@skuridin](https://github.com/skuridin))
2944
2986
 
2945
2987
  ## [0.32.1] - 2026-01-03
2946
2988
 
2947
2989
  ### Added
2948
2990
 
2949
- - Shell commands without context contribution: use `!!command` to execute a bash command that is shown in the TUI and saved to session history but excluded from LLM context. Useful for running commands you don't want the AI to see. ([#414](https://github.com/code-yeongyu/sanepi-mono/issues/414))
2991
+ - Shell commands without context contribution: use `!!command` to execute a bash command that is shown in the TUI and saved to session history but excluded from LLM context. Useful for running commands you don't want the AI to see. ([#414](https://github.com/code-yeongyu/senpi-mono/issues/414))
2950
2992
 
2951
2993
  ### Fixed
2952
2994
 
@@ -2956,7 +2998,7 @@ pi --extension ./safety.ts -e ./todo.ts
2956
2998
 
2957
2999
  ### Breaking Changes
2958
3000
 
2959
- - **Queue API replaced with steer/followUp**: The `queueMessage()` method has been split into two methods with different delivery semantics ([#403](https://github.com/code-yeongyu/sanepi-mono/issues/403)):
3001
+ - **Queue API replaced with steer/followUp**: The `queueMessage()` method has been split into two methods with different delivery semantics ([#403](https://github.com/code-yeongyu/senpi-mono/issues/403)):
2960
3002
  - `steer(text)`: Interrupts the agent mid-run (Enter while streaming). Delivered after current tool execution.
2961
3003
  - `followUp(text)`: Waits until the agent finishes (Alt+Enter while streaming). Delivered only when agent stops.
2962
3004
  - **Settings renamed**: `queueMode` setting renamed to `steeringMode`. Added new `followUpMode` setting. Old settings.json files are migrated automatically.
@@ -2977,31 +3019,31 @@ pi --extension ./safety.ts -e ./todo.ts
2977
3019
 
2978
3020
  ### Added
2979
3021
 
2980
- - Configurable double-escape action: choose whether double-escape with empty editor opens `/tree` (default) or `/branch`. Configure via `/settings` or `doubleEscapeAction` in settings.json ([#404](https://github.com/code-yeongyu/sanepi-mono/issues/404))
2981
- - Vertex AI provider (`google-vertex`): access Gemini models via Google Cloud Vertex AI using Application Default Credentials ([#300](https://github.com/code-yeongyu/sanepi-mono/pull/300) by [@default-anton](https://github.com/default-anton))
2982
- - Built-in provider overrides in `models.json`: override just `baseUrl` to route a built-in provider through a proxy while keeping all its models, or define `models` to fully replace the provider ([#406](https://github.com/code-yeongyu/sanepi-mono/pull/406) by [@yevhen](https://github.com/yevhen))
2983
- - Automatic image resizing: images larger than 2000x2000 are resized for better model compatibility. Original dimensions are injected into the prompt. Controlled via `/settings` or `images.autoResize` in settings.json. ([#402](https://github.com/code-yeongyu/sanepi-mono/pull/402) by [@mitsuhiko](https://github.com/mitsuhiko))
3022
+ - Configurable double-escape action: choose whether double-escape with empty editor opens `/tree` (default) or `/branch`. Configure via `/settings` or `doubleEscapeAction` in settings.json ([#404](https://github.com/code-yeongyu/senpi-mono/issues/404))
3023
+ - Vertex AI provider (`google-vertex`): access Gemini models via Google Cloud Vertex AI using Application Default Credentials ([#300](https://github.com/code-yeongyu/senpi-mono/pull/300) by [@default-anton](https://github.com/default-anton))
3024
+ - Built-in provider overrides in `models.json`: override just `baseUrl` to route a built-in provider through a proxy while keeping all its models, or define `models` to fully replace the provider ([#406](https://github.com/code-yeongyu/senpi-mono/pull/406) by [@yevhen](https://github.com/yevhen))
3025
+ - Automatic image resizing: images larger than 2000x2000 are resized for better model compatibility. Original dimensions are injected into the prompt. Controlled via `/settings` or `images.autoResize` in settings.json. ([#402](https://github.com/code-yeongyu/senpi-mono/pull/402) by [@mitsuhiko](https://github.com/mitsuhiko))
2984
3026
  - Alt+Enter keybind to queue follow-up messages while agent is streaming
2985
3027
  - `Theme` and `ThemeColor` types now exported for hooks using `ctx.ui.custom()`
2986
- - Terminal window title now displays "pi - dirname" to identify which project session you're in ([#407](https://github.com/code-yeongyu/sanepi-mono/pull/407) by [@kaofelix](https://github.com/kaofelix))
3028
+ - Terminal window title now displays "pi - dirname" to identify which project session you're in ([#407](https://github.com/code-yeongyu/senpi-mono/pull/407) by [@kaofelix](https://github.com/kaofelix))
2987
3029
 
2988
3030
  ### Changed
2989
3031
 
2990
- - Editor component now uses word wrapping instead of character-level wrapping for better readability ([#382](https://github.com/code-yeongyu/sanepi-mono/pull/382) by [@nickseelert](https://github.com/nickseelert))
3032
+ - Editor component now uses word wrapping instead of character-level wrapping for better readability ([#382](https://github.com/code-yeongyu/senpi-mono/pull/382) by [@nickseelert](https://github.com/nickseelert))
2991
3033
 
2992
3034
  ### Fixed
2993
3035
 
2994
3036
  - `/model` selector now opens instantly instead of waiting for OAuth token refresh. Token refresh is deferred until a model is actually used.
2995
- - Shift+Space, Shift+Backspace, and Shift+Delete now work correctly in Kitty-protocol terminals (Kitty, WezTerm, etc.) instead of being silently ignored ([#411](https://github.com/code-yeongyu/sanepi-mono/pull/411) by [@nathyong](https://github.com/nathyong))
3037
+ - Shift+Space, Shift+Backspace, and Shift+Delete now work correctly in Kitty-protocol terminals (Kitty, WezTerm, etc.) instead of being silently ignored ([#411](https://github.com/code-yeongyu/senpi-mono/pull/411) by [@nathyong](https://github.com/nathyong))
2996
3038
  - `AgentSession.prompt()` now throws if called while the agent is already streaming, preventing race conditions. Use `steer()` or `followUp()` to queue messages during streaming.
2997
- - Ctrl+C now works like Escape in selector components, so mashing Ctrl+C will eventually close the program ([#400](https://github.com/code-yeongyu/sanepi-mono/pull/400) by [@mitsuhiko](https://github.com/mitsuhiko))
3039
+ - Ctrl+C now works like Escape in selector components, so mashing Ctrl+C will eventually close the program ([#400](https://github.com/code-yeongyu/senpi-mono/pull/400) by [@mitsuhiko](https://github.com/mitsuhiko))
2998
3040
 
2999
3041
  ## [0.31.1] - 2026-01-02
3000
3042
 
3001
3043
  ### Fixed
3002
3044
 
3003
- - Model selector no longer allows negative index when pressing arrow keys before models finish loading ([#398](https://github.com/code-yeongyu/sanepi-mono/pull/398) by [@mitsuhiko](https://github.com/mitsuhiko))
3004
- - Type guard functions (`isBashToolResult`, etc.) now exported at runtime, not just in type declarations ([#397](https://github.com/code-yeongyu/sanepi-mono/issues/397))
3045
+ - Model selector no longer allows negative index when pressing arrow keys before models finish loading ([#398](https://github.com/code-yeongyu/senpi-mono/pull/398) by [@mitsuhiko](https://github.com/mitsuhiko))
3046
+ - Type guard functions (`isBashToolResult`, etc.) now exported at runtime, not just in type declarations ([#397](https://github.com/code-yeongyu/senpi-mono/issues/397))
3005
3047
 
3006
3048
  ## [0.31.0] - 2026-01-02
3007
3049
 
@@ -3239,15 +3281,15 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3239
3281
 
3240
3282
  ### Added
3241
3283
 
3242
- - `ctx.ui.setStatus(key, text)` for hooks to display persistent status text in the footer ([#385](https://github.com/code-yeongyu/sanepi-mono/pull/385) by [@prateekmedia](https://github.com/prateekmedia))
3284
+ - `ctx.ui.setStatus(key, text)` for hooks to display persistent status text in the footer ([#385](https://github.com/code-yeongyu/senpi-mono/pull/385) by [@prateekmedia](https://github.com/prateekmedia))
3243
3285
  - `ctx.ui.theme` getter for styling status text and other output with theme colors
3244
- - `/share` command to upload session as a secret GitHub gist and get a shareable URL via pi.dev ([#380](https://github.com/code-yeongyu/sanepi-mono/issues/380))
3245
- - HTML export now includes a tree visualization sidebar for navigating session branches ([#375](https://github.com/code-yeongyu/sanepi-mono/issues/375))
3286
+ - `/share` command to upload session as a secret GitHub gist and get a shareable URL via pi.dev ([#380](https://github.com/code-yeongyu/senpi-mono/issues/380))
3287
+ - HTML export now includes a tree visualization sidebar for navigating session branches ([#375](https://github.com/code-yeongyu/senpi-mono/issues/375))
3246
3288
  - HTML export supports keyboard shortcuts: Ctrl+T to toggle thinking blocks, Ctrl+O to toggle tool outputs
3247
- - HTML export supports theme-configurable background colors via optional `export` section in theme JSON ([#387](https://github.com/code-yeongyu/sanepi-mono/pull/387) by [@mitsuhiko](https://github.com/mitsuhiko))
3289
+ - HTML export supports theme-configurable background colors via optional `export` section in theme JSON ([#387](https://github.com/code-yeongyu/senpi-mono/pull/387) by [@mitsuhiko](https://github.com/mitsuhiko))
3248
3290
  - HTML export syntax highlighting now uses theme colors and matches TUI rendering
3249
3291
  - **Snake game example hook**: Demonstrates `ui.custom()`, `registerCommand()`, and session persistence. See [examples/hooks/snake.ts](examples/hooks/snake.ts).
3250
- - **`thinkingText` theme token**: Configurable color for thinking block text. ([#366](https://github.com/code-yeongyu/sanepi-mono/pull/366) by [@paulbettner](https://github.com/paulbettner))
3292
+ - **`thinkingText` theme token**: Configurable color for thinking block text. ([#366](https://github.com/code-yeongyu/senpi-mono/pull/366) by [@paulbettner](https://github.com/paulbettner))
3251
3293
 
3252
3294
  ### Changed
3253
3295
 
@@ -3258,21 +3300,21 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3258
3300
  ### Fixed
3259
3301
 
3260
3302
  - HTML export now properly sanitizes user messages containing HTML tags like `<style>` that could break DOM rendering
3261
- - Crash when displaying bash output containing Unicode format characters like U+0600-U+0604 ([#372](https://github.com/code-yeongyu/sanepi-mono/pull/372) by [@HACKE-RC](https://github.com/HACKE-RC))
3262
- - **Footer shows full session stats**: Token usage and cost now include all messages, not just those after compaction. ([#322](https://github.com/code-yeongyu/sanepi-mono/issues/322))
3263
- - **Status messages spam chat log**: Rapidly changing settings (e.g., thinking level via Shift+Tab) would add multiple status lines. Sequential status updates now coalesce into a single line. ([#365](https://github.com/code-yeongyu/sanepi-mono/pull/365) by [@paulbettner](https://github.com/paulbettner))
3303
+ - Crash when displaying bash output containing Unicode format characters like U+0600-U+0604 ([#372](https://github.com/code-yeongyu/senpi-mono/pull/372) by [@HACKE-RC](https://github.com/HACKE-RC))
3304
+ - **Footer shows full session stats**: Token usage and cost now include all messages, not just those after compaction. ([#322](https://github.com/code-yeongyu/senpi-mono/issues/322))
3305
+ - **Status messages spam chat log**: Rapidly changing settings (e.g., thinking level via Shift+Tab) would add multiple status lines. Sequential status updates now coalesce into a single line. ([#365](https://github.com/code-yeongyu/senpi-mono/pull/365) by [@paulbettner](https://github.com/paulbettner))
3264
3306
  - **Toggling thinking blocks during streaming shows nothing**: Pressing Ctrl+T while streaming would hide the current message until streaming completed.
3265
- - **Resuming session resets thinking level to off**: Initial model and thinking level were not saved to session file, causing `--resume`/`--continue` to default to `off`. ([#342](https://github.com/code-yeongyu/sanepi-mono/issues/342) by [@aliou](https://github.com/aliou))
3266
- - **Hook `tool_result` event ignores errors from custom tools**: The `tool_result` hook event was never emitted when tools threw errors, and always had `isError: false` for successful executions. Now emits the event with correct `isError` value in both success and error cases. ([#374](https://github.com/code-yeongyu/sanepi-mono/issues/374) by [@nicobailon](https://github.com/nicobailon))
3267
- - **Edit tool fails on Windows due to CRLF line endings**: Files with CRLF line endings now match correctly when LLMs send LF-only text. Line endings are normalized before matching and restored to original style on write. ([#355](https://github.com/code-yeongyu/sanepi-mono/issues/355) by [@Pratham-Dubey](https://github.com/Pratham-Dubey))
3268
- - **Edit tool fails on files with UTF-8 BOM**: Files with UTF-8 BOM marker could cause "text not found" errors since the LLM doesn't include the invisible BOM character. BOM is now stripped before matching and restored on write. ([#394](https://github.com/code-yeongyu/sanepi-mono/pull/394) by [@prathamdby](https://github.com/prathamdby))
3269
- - **Use bash instead of sh on Unix**: Fixed shell commands using `/bin/sh` instead of `/bin/bash` on Unix systems. ([#328](https://github.com/code-yeongyu/sanepi-mono/pull/328) by [@dnouri](https://github.com/dnouri))
3270
- - **OAuth login URL clickable**: Made OAuth login URLs clickable in terminal. ([#349](https://github.com/code-yeongyu/sanepi-mono/pull/349) by [@Cursivez](https://github.com/Cursivez))
3271
- - **Improved error messages**: Better error messages when `apiKey` or `model` are missing. ([#346](https://github.com/code-yeongyu/sanepi-mono/pull/346) by [@ronyrus](https://github.com/ronyrus))
3307
+ - **Resuming session resets thinking level to off**: Initial model and thinking level were not saved to session file, causing `--resume`/`--continue` to default to `off`. ([#342](https://github.com/code-yeongyu/senpi-mono/issues/342) by [@aliou](https://github.com/aliou))
3308
+ - **Hook `tool_result` event ignores errors from custom tools**: The `tool_result` hook event was never emitted when tools threw errors, and always had `isError: false` for successful executions. Now emits the event with correct `isError` value in both success and error cases. ([#374](https://github.com/code-yeongyu/senpi-mono/issues/374) by [@nicobailon](https://github.com/nicobailon))
3309
+ - **Edit tool fails on Windows due to CRLF line endings**: Files with CRLF line endings now match correctly when LLMs send LF-only text. Line endings are normalized before matching and restored to original style on write. ([#355](https://github.com/code-yeongyu/senpi-mono/issues/355) by [@Pratham-Dubey](https://github.com/Pratham-Dubey))
3310
+ - **Edit tool fails on files with UTF-8 BOM**: Files with UTF-8 BOM marker could cause "text not found" errors since the LLM doesn't include the invisible BOM character. BOM is now stripped before matching and restored on write. ([#394](https://github.com/code-yeongyu/senpi-mono/pull/394) by [@prathamdby](https://github.com/prathamdby))
3311
+ - **Use bash instead of sh on Unix**: Fixed shell commands using `/bin/sh` instead of `/bin/bash` on Unix systems. ([#328](https://github.com/code-yeongyu/senpi-mono/pull/328) by [@dnouri](https://github.com/dnouri))
3312
+ - **OAuth login URL clickable**: Made OAuth login URLs clickable in terminal. ([#349](https://github.com/code-yeongyu/senpi-mono/pull/349) by [@Cursivez](https://github.com/Cursivez))
3313
+ - **Improved error messages**: Better error messages when `apiKey` or `model` are missing. ([#346](https://github.com/code-yeongyu/senpi-mono/pull/346) by [@ronyrus](https://github.com/ronyrus))
3272
3314
  - **Session file validation**: `findMostRecentSession()` now validates session headers before returning, preventing non-session JSONL files from being loaded
3273
3315
  - **Compaction error handling**: `generateSummary()` and `generateTurnPrefixSummary()` now throw on LLM errors instead of returning empty strings
3274
3316
  - **Compaction with branched sessions**: Fixed compaction incorrectly including entries from abandoned branches, causing token overflow errors. Compaction now uses `sessionManager.getPath()` to work only on the current branch path, eliminating 80+ lines of duplicate entry collection logic between `prepareCompaction()` and `compact()`
3275
- - **enabledModels glob patterns**: `--models` and `enabledModels` now support glob patterns like `github-copilot/*` or `*sonnet*`. Previously, patterns were only matched literally or via substring search. ([#337](https://github.com/code-yeongyu/sanepi-mono/issues/337))
3317
+ - **enabledModels glob patterns**: `--models` and `enabledModels` now support glob patterns like `github-copilot/*` or `*sonnet*`. Previously, patterns were only matched literally or via substring search. ([#337](https://github.com/code-yeongyu/senpi-mono/issues/337))
3276
3318
 
3277
3319
  ## [0.30.2] - 2025-12-26
3278
3320
 
@@ -3284,54 +3326,54 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3284
3326
 
3285
3327
  ### Fixed
3286
3328
 
3287
- - **Sessions saved to wrong directory**: In v0.30.0, sessions were being saved to `~/.senpi/agent/` instead of `~/.senpi/agent/sessions/<encoded-cwd>/`, breaking `--resume` and `/resume`. Misplaced sessions are automatically migrated on startup. ([#320](https://github.com/code-yeongyu/sanepi-mono/issues/320) by [@aliou](https://github.com/aliou))
3288
- - **Custom system prompts missing context**: When using a custom system prompt string, project context files (AGENTS.md), skills, date/time, and working directory were not appended. ([#321](https://github.com/code-yeongyu/sanepi-mono/issues/321))
3329
+ - **Sessions saved to wrong directory**: In v0.30.0, sessions were being saved to `~/.senpi/agent/` instead of `~/.senpi/agent/sessions/<encoded-cwd>/`, breaking `--resume` and `/resume`. Misplaced sessions are automatically migrated on startup. ([#320](https://github.com/code-yeongyu/senpi-mono/issues/320) by [@aliou](https://github.com/aliou))
3330
+ - **Custom system prompts missing context**: When using a custom system prompt string, project context files (AGENTS.md), skills, date/time, and working directory were not appended. ([#321](https://github.com/code-yeongyu/senpi-mono/issues/321))
3289
3331
 
3290
3332
  ## [0.30.0] - 2025-12-25
3291
3333
 
3292
3334
  ### Breaking Changes
3293
3335
 
3294
- - **SessionManager API**: The second parameter of `create()`, `continueRecent()`, and `list()` changed from `agentDir` to `sessionDir`. When provided, it specifies the session directory directly (no cwd encoding). When omitted, uses default (`~/.senpi/agent/sessions/<encoded-cwd>/`). `open()` no longer takes `agentDir`. ([#313](https://github.com/code-yeongyu/sanepi-mono/pull/313))
3336
+ - **SessionManager API**: The second parameter of `create()`, `continueRecent()`, and `list()` changed from `agentDir` to `sessionDir`. When provided, it specifies the session directory directly (no cwd encoding). When omitted, uses default (`~/.senpi/agent/sessions/<encoded-cwd>/`). `open()` no longer takes `agentDir`. ([#313](https://github.com/code-yeongyu/senpi-mono/pull/313))
3295
3337
 
3296
3338
  ### Added
3297
3339
 
3298
- - **`--session-dir` flag**: Use a custom directory for sessions instead of the default `~/.senpi/agent/sessions/<encoded-cwd>/`. Works with `-c` (continue) and `-r` (resume) flags. ([#313](https://github.com/code-yeongyu/sanepi-mono/pull/313) by [@scutifer](https://github.com/scutifer))
3299
- - **Reverse model cycling and model selector**: Shift+Ctrl+P cycles models backward, Ctrl+L opens model selector (retaining text in editor). ([#315](https://github.com/code-yeongyu/sanepi-mono/pull/315) by [@mitsuhiko](https://github.com/mitsuhiko))
3340
+ - **`--session-dir` flag**: Use a custom directory for sessions instead of the default `~/.senpi/agent/sessions/<encoded-cwd>/`. Works with `-c` (continue) and `-r` (resume) flags. ([#313](https://github.com/code-yeongyu/senpi-mono/pull/313) by [@scutifer](https://github.com/scutifer))
3341
+ - **Reverse model cycling and model selector**: Shift+Ctrl+P cycles models backward, Ctrl+L opens model selector (retaining text in editor). ([#315](https://github.com/code-yeongyu/senpi-mono/pull/315) by [@mitsuhiko](https://github.com/mitsuhiko))
3300
3342
 
3301
3343
  ## [0.29.1] - 2025-12-25
3302
3344
 
3303
3345
  ### Added
3304
3346
 
3305
- - **Automatic custom system prompt loading**: Pi now auto-loads `SYSTEM.md` files to replace the default system prompt. Project-local `.senpi/SYSTEM.md` takes precedence over global `~/.senpi/agent/SYSTEM.md`. CLI `--system-prompt` flag overrides both. ([#309](https://github.com/code-yeongyu/sanepi-mono/issues/309))
3306
- - **Unified `/settings` command**: New settings menu consolidating thinking level, theme, queue mode, auto-compact, show images, hide thinking, and collapse changelog. Replaces individual `/thinking`, `/queue`, `/theme`, `/autocompact`, and `/show-images` commands. ([#310](https://github.com/code-yeongyu/sanepi-mono/issues/310))
3347
+ - **Automatic custom system prompt loading**: Pi now auto-loads `SYSTEM.md` files to replace the default system prompt. Project-local `.senpi/SYSTEM.md` takes precedence over global `~/.senpi/agent/SYSTEM.md`. CLI `--system-prompt` flag overrides both. ([#309](https://github.com/code-yeongyu/senpi-mono/issues/309))
3348
+ - **Unified `/settings` command**: New settings menu consolidating thinking level, theme, queue mode, auto-compact, show images, hide thinking, and collapse changelog. Replaces individual `/thinking`, `/queue`, `/theme`, `/autocompact`, and `/show-images` commands. ([#310](https://github.com/code-yeongyu/senpi-mono/issues/310))
3307
3349
 
3308
3350
  ### Fixed
3309
3351
 
3310
- - **Custom tools/hooks with typebox subpath imports**: Fixed jiti alias for `@sinclair/typebox` to point to package root instead of entry file, allowing imports like `@sinclair/typebox/compiler` to resolve correctly. ([#311](https://github.com/code-yeongyu/sanepi-mono/issues/311) by [@kim0](https://github.com/kim0))
3352
+ - **Custom tools/hooks with typebox subpath imports**: Fixed jiti alias for `@sinclair/typebox` to point to package root instead of entry file, allowing imports like `@sinclair/typebox/compiler` to resolve correctly. ([#311](https://github.com/code-yeongyu/senpi-mono/issues/311) by [@kim0](https://github.com/kim0))
3311
3353
 
3312
3354
  ## [0.29.0] - 2025-12-25
3313
3355
 
3314
3356
  ### Breaking Changes
3315
3357
 
3316
- - **Renamed `/clear` to `/new`**: The command to start a fresh session is now `/new`. Hook event reasons `before_clear`/`clear` are now `before_new`/`new`. Merry Christmas [@mitsuhiko](https://github.com/mitsuhiko)! ([#305](https://github.com/code-yeongyu/sanepi-mono/pull/305))
3358
+ - **Renamed `/clear` to `/new`**: The command to start a fresh session is now `/new`. Hook event reasons `before_clear`/`clear` are now `before_new`/`new`. Merry Christmas [@mitsuhiko](https://github.com/mitsuhiko)! ([#305](https://github.com/code-yeongyu/senpi-mono/pull/305))
3317
3359
 
3318
3360
  ### Added
3319
3361
 
3320
- - **Auto-space before pasted file paths**: When pasting a file path (starting with `/`, `~`, or `.`) after a word character, a space is automatically prepended. ([#307](https://github.com/code-yeongyu/sanepi-mono/pull/307) by [@mitsuhiko](https://github.com/mitsuhiko))
3321
- - **Word navigation in input fields**: Added Ctrl+Left/Right and Alt+Left/Right for word-by-word cursor movement. ([#306](https://github.com/code-yeongyu/sanepi-mono/pull/306) by [@kim0](https://github.com/kim0))
3322
- - **Full Unicode input**: Input fields now accept Unicode characters beyond ASCII. ([#306](https://github.com/code-yeongyu/sanepi-mono/pull/306) by [@kim0](https://github.com/kim0))
3362
+ - **Auto-space before pasted file paths**: When pasting a file path (starting with `/`, `~`, or `.`) after a word character, a space is automatically prepended. ([#307](https://github.com/code-yeongyu/senpi-mono/pull/307) by [@mitsuhiko](https://github.com/mitsuhiko))
3363
+ - **Word navigation in input fields**: Added Ctrl+Left/Right and Alt+Left/Right for word-by-word cursor movement. ([#306](https://github.com/code-yeongyu/senpi-mono/pull/306) by [@kim0](https://github.com/kim0))
3364
+ - **Full Unicode input**: Input fields now accept Unicode characters beyond ASCII. ([#306](https://github.com/code-yeongyu/senpi-mono/pull/306) by [@kim0](https://github.com/kim0))
3323
3365
 
3324
3366
  ### Fixed
3325
3367
 
3326
- - **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/code-yeongyu/sanepi-mono/pull/306) by [@kim0](https://github.com/kim0))
3368
+ - **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/code-yeongyu/senpi-mono/pull/306) by [@kim0](https://github.com/kim0))
3327
3369
 
3328
3370
  ## [0.28.0] - 2025-12-25
3329
3371
 
3330
3372
  ### Changed
3331
3373
 
3332
- - **Credential storage refactored**: API keys and OAuth tokens are now stored in `~/.senpi/agent/auth.json` instead of `oauth.json` and `settings.json`. Existing credentials are automatically migrated on first run. ([#296](https://github.com/code-yeongyu/sanepi-mono/issues/296))
3374
+ - **Credential storage refactored**: API keys and OAuth tokens are now stored in `~/.senpi/agent/auth.json` instead of `oauth.json` and `settings.json`. Existing credentials are automatically migrated on first run. ([#296](https://github.com/code-yeongyu/senpi-mono/issues/296))
3333
3375
 
3334
- - **SDK API changes** ([#296](https://github.com/code-yeongyu/sanepi-mono/issues/296)):
3376
+ - **SDK API changes** ([#296](https://github.com/code-yeongyu/senpi-mono/issues/296)):
3335
3377
 
3336
3378
  - Added `AuthStorage` class for credential management (API keys and OAuth tokens)
3337
3379
  - Added `ModelRegistry` class for model discovery and API key resolution
@@ -3342,17 +3384,17 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3342
3384
  - Use `getModel()` from `@earendil-works/pi-ai` for built-in models, `modelRegistry.find()` for custom models + built-in models
3343
3385
  - See updated [SDK documentation](docs/sdk.md) and [README](README.md)
3344
3386
 
3345
- - **Settings changes**: Removed `apiKeys` from `settings.json`. Use `auth.json` instead. ([#296](https://github.com/code-yeongyu/sanepi-mono/issues/296))
3387
+ - **Settings changes**: Removed `apiKeys` from `settings.json`. Use `auth.json` instead. ([#296](https://github.com/code-yeongyu/senpi-mono/issues/296))
3346
3388
 
3347
3389
  ### Fixed
3348
3390
 
3349
- - **Duplicate skill warnings for symlinks**: Skills loaded via symlinks pointing to the same file are now silently deduplicated instead of showing name collision warnings. ([#304](https://github.com/code-yeongyu/sanepi-mono/pull/304) by [@mitsuhiko](https://github.com/mitsuhiko))
3391
+ - **Duplicate skill warnings for symlinks**: Skills loaded via symlinks pointing to the same file are now silently deduplicated instead of showing name collision warnings. ([#304](https://github.com/code-yeongyu/senpi-mono/pull/304) by [@mitsuhiko](https://github.com/mitsuhiko))
3350
3392
 
3351
3393
  ## [0.27.9] - 2025-12-24
3352
3394
 
3353
3395
  ### Fixed
3354
3396
 
3355
- - **Model selector and --list-models with settings.json API keys**: Models with API keys configured in settings.json (but not in environment variables) now properly appear in the /model selector and `--list-models` output. ([#295](https://github.com/code-yeongyu/sanepi-mono/issues/295))
3397
+ - **Model selector and --list-models with settings.json API keys**: Models with API keys configured in settings.json (but not in environment variables) now properly appear in the /model selector and `--list-models` output. ([#295](https://github.com/code-yeongyu/senpi-mono/issues/295))
3356
3398
 
3357
3399
  ## [0.27.8] - 2025-12-24
3358
3400
 
@@ -3364,7 +3406,7 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3364
3406
 
3365
3407
  ### Fixed
3366
3408
 
3367
- - **Thinking tag leakage**: Fixed Claude mimicking literal `</thinking>` tags in responses. Unsigned thinking blocks (from aborted streams) are now converted to plain text without `<thinking>` tags. The TUI still displays them as thinking blocks. ([#302](https://github.com/code-yeongyu/sanepi-mono/pull/302) by [@nicobailon](https://github.com/nicobailon))
3409
+ - **Thinking tag leakage**: Fixed Claude mimicking literal `</thinking>` tags in responses. Unsigned thinking blocks (from aborted streams) are now converted to plain text without `<thinking>` tags. The TUI still displays them as thinking blocks. ([#302](https://github.com/code-yeongyu/senpi-mono/pull/302) by [@nicobailon](https://github.com/nicobailon))
3368
3410
 
3369
3411
  ## [0.27.6] - 2025-12-24
3370
3412
 
@@ -3391,7 +3433,7 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3391
3433
 
3392
3434
  ### Fixed
3393
3435
 
3394
- - **Ghostty inline images in tmux**: Fixed terminal detection for Ghostty when running inside tmux by checking `GHOSTTY_RESOURCES_DIR` env var. ([#299](https://github.com/code-yeongyu/sanepi-mono/pull/299) by [@nicobailon](https://github.com/nicobailon))
3436
+ - **Ghostty inline images in tmux**: Fixed terminal detection for Ghostty when running inside tmux by checking `GHOSTTY_RESOURCES_DIR` env var. ([#299](https://github.com/code-yeongyu/senpi-mono/pull/299) by [@nicobailon](https://github.com/nicobailon))
3395
3437
 
3396
3438
  ## [0.27.4] - 2025-12-24
3397
3439
 
@@ -3403,18 +3445,18 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3403
3445
 
3404
3446
  ### Added
3405
3447
 
3406
- - **API keys in settings.json**: Store API keys in `~/.senpi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/code-yeongyu/sanepi-mono/issues/295))
3448
+ - **API keys in settings.json**: Store API keys in `~/.senpi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/code-yeongyu/senpi-mono/issues/295))
3407
3449
 
3408
3450
  ### Fixed
3409
3451
 
3410
- - **Allow startup without API keys**: Interactive mode no longer throws when no API keys are configured. Users can now start the agent and use `/login` to authenticate. ([#288](https://github.com/code-yeongyu/sanepi-mono/issues/288))
3411
- - **`--system-prompt` file path support**: The `--system-prompt` argument now correctly resolves file paths (like `--append-system-prompt` already did). ([#287](https://github.com/code-yeongyu/sanepi-mono/pull/287) by [@scutifer](https://github.com/scutifer))
3452
+ - **Allow startup without API keys**: Interactive mode no longer throws when no API keys are configured. Users can now start the agent and use `/login` to authenticate. ([#288](https://github.com/code-yeongyu/senpi-mono/issues/288))
3453
+ - **`--system-prompt` file path support**: The `--system-prompt` argument now correctly resolves file paths (like `--append-system-prompt` already did). ([#287](https://github.com/code-yeongyu/senpi-mono/pull/287) by [@scutifer](https://github.com/scutifer))
3412
3454
 
3413
3455
  ## [0.27.2] - 2025-12-23
3414
3456
 
3415
3457
  ### Added
3416
3458
 
3417
- - **Skip conversation restore on branch**: Hooks can return `{ skipConversationRestore: true }` from `before_branch` to create the branched session file without restoring conversation messages. Useful for checkpoint hooks that restore files separately. ([#286](https://github.com/code-yeongyu/sanepi-mono/pull/286) by [@nicobarray](https://github.com/nicobarray))
3459
+ - **Skip conversation restore on branch**: Hooks can return `{ skipConversationRestore: true }` from `before_branch` to create the branched session file without restoring conversation messages. Useful for checkpoint hooks that restore files separately. ([#286](https://github.com/code-yeongyu/senpi-mono/pull/286) by [@nicobarray](https://github.com/nicobarray))
3418
3460
 
3419
3461
  ## [0.27.1] - 2025-12-22
3420
3462
 
@@ -3430,31 +3472,31 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3430
3472
 
3431
3473
  ### Breaking
3432
3474
 
3433
- - **Session hooks API redesign**: Merged `branch` event into `session` event. `BranchEvent`, `BranchEventResult` types and `pi.on("branch", ...)` removed. Use `pi.on("session", ...)` with `reason: "before_branch" | "branch"` instead. `AgentSession.branch()` returns `{ cancelled }` instead of `{ skipped }`. `AgentSession.reset()` and `switchSession()` now return `boolean` (false if cancelled by hook). RPC commands `reset`, `switch_session`, and `branch` now include `cancelled` in response data. ([#278](https://github.com/code-yeongyu/sanepi-mono/issues/278))
3475
+ - **Session hooks API redesign**: Merged `branch` event into `session` event. `BranchEvent`, `BranchEventResult` types and `pi.on("branch", ...)` removed. Use `pi.on("session", ...)` with `reason: "before_branch" | "branch"` instead. `AgentSession.branch()` returns `{ cancelled }` instead of `{ skipped }`. `AgentSession.reset()` and `switchSession()` now return `boolean` (false if cancelled by hook). RPC commands `reset`, `switch_session`, and `branch` now include `cancelled` in response data. ([#278](https://github.com/code-yeongyu/senpi-mono/issues/278))
3434
3476
 
3435
3477
  ### Added
3436
3478
 
3437
- - **Session lifecycle hooks**: Added `before_*` variants (`before_switch`, `before_clear`, `before_branch`) that fire before actions and can be cancelled with `{ cancel: true }`. Added `shutdown` reason for graceful exit handling. ([#278](https://github.com/code-yeongyu/sanepi-mono/issues/278))
3479
+ - **Session lifecycle hooks**: Added `before_*` variants (`before_switch`, `before_clear`, `before_branch`) that fire before actions and can be cancelled with `{ cancel: true }`. Added `shutdown` reason for graceful exit handling. ([#278](https://github.com/code-yeongyu/senpi-mono/issues/278))
3438
3480
 
3439
3481
  ### Fixed
3440
3482
 
3441
- - **File tab completion display**: File paths no longer get cut off early. Folders now show trailing `/` and removed redundant "directory"/"file" labels to maximize horizontal space. ([#280](https://github.com/code-yeongyu/sanepi-mono/issues/280))
3483
+ - **File tab completion display**: File paths no longer get cut off early. Folders now show trailing `/` and removed redundant "directory"/"file" labels to maximize horizontal space. ([#280](https://github.com/code-yeongyu/senpi-mono/issues/280))
3442
3484
 
3443
- - **Bash tool visual line truncation**: Fixed bash tool output in collapsed mode to use visual line counting (accounting for line wrapping) instead of logical line counting. Now consistent with bash-execution.ts behavior. Extracted shared `truncateToVisualLines` utility. ([#275](https://github.com/code-yeongyu/sanepi-mono/issues/275))
3485
+ - **Bash tool visual line truncation**: Fixed bash tool output in collapsed mode to use visual line counting (accounting for line wrapping) instead of logical line counting. Now consistent with bash-execution.ts behavior. Extracted shared `truncateToVisualLines` utility. ([#275](https://github.com/code-yeongyu/senpi-mono/issues/275))
3444
3486
 
3445
3487
  ## [0.26.1] - 2025-12-22
3446
3488
 
3447
3489
  ### Fixed
3448
3490
 
3449
- - **SDK tools respect cwd**: Core tools (bash, read, edit, write, grep, find, ls) now properly use the `cwd` option from `createAgentSession()`. Added tool factory functions (`createBashTool`, `createReadTool`, etc.) for SDK users who specify custom `cwd` with explicit tools. ([#279](https://github.com/code-yeongyu/sanepi-mono/issues/279))
3491
+ - **SDK tools respect cwd**: Core tools (bash, read, edit, write, grep, find, ls) now properly use the `cwd` option from `createAgentSession()`. Added tool factory functions (`createBashTool`, `createReadTool`, etc.) for SDK users who specify custom `cwd` with explicit tools. ([#279](https://github.com/code-yeongyu/senpi-mono/issues/279))
3450
3492
 
3451
3493
  ## [0.26.0] - 2025-12-22
3452
3494
 
3453
3495
  ### Added
3454
3496
 
3455
- - **SDK for programmatic usage**: New `createAgentSession()` factory with full control over model, tools, hooks, skills, session persistence, and settings. Philosophy: "omit to discover, provide to override". Includes 12 examples and comprehensive documentation. ([#272](https://github.com/code-yeongyu/sanepi-mono/issues/272))
3497
+ - **SDK for programmatic usage**: New `createAgentSession()` factory with full control over model, tools, hooks, skills, session persistence, and settings. Philosophy: "omit to discover, provide to override". Includes 12 examples and comprehensive documentation. ([#272](https://github.com/code-yeongyu/senpi-mono/issues/272))
3456
3498
 
3457
- - **Project-specific settings**: Settings now load from both `~/.senpi/agent/settings.json` (global) and `<cwd>/.senpi/settings.json` (project). Project settings override global with deep merge for nested objects. Project settings are read-only (for version control). ([#276](https://github.com/code-yeongyu/sanepi-mono/pull/276))
3499
+ - **Project-specific settings**: Settings now load from both `~/.senpi/agent/settings.json` (global) and `<cwd>/.senpi/settings.json` (project). Project settings override global with deep merge for nested objects. Project settings are read-only (for version control). ([#276](https://github.com/code-yeongyu/senpi-mono/pull/276))
3458
3500
 
3459
3501
  - **SettingsManager static factories**: `SettingsManager.create(cwd?, agentDir?)` for file-based settings, `SettingsManager.inMemory(settings?)` for testing. Added `applyOverrides()` for programmatic overrides.
3460
3502
 
@@ -3464,21 +3506,21 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3464
3506
 
3465
3507
  ### Fixed
3466
3508
 
3467
- - **Syntax highlighting stderr spam**: Fixed cli-highlight logging errors to stderr when markdown contains malformed code fences (e.g., missing newlines around closing backticks). Now validates language identifiers before highlighting and falls back silently to plain text. ([#274](https://github.com/code-yeongyu/sanepi-mono/issues/274))
3509
+ - **Syntax highlighting stderr spam**: Fixed cli-highlight logging errors to stderr when markdown contains malformed code fences (e.g., missing newlines around closing backticks). Now validates language identifiers before highlighting and falls back silently to plain text. ([#274](https://github.com/code-yeongyu/senpi-mono/issues/274))
3468
3510
 
3469
3511
  ## [0.25.3] - 2025-12-21
3470
3512
 
3471
3513
  ### Added
3472
3514
 
3473
- - **Gemini 3 preview models**: Added `gemini-3-pro-preview` and `gemini-3-flash-preview` to the google-gemini-cli provider. ([#264](https://github.com/code-yeongyu/sanepi-mono/pull/264) by [@LukeFost](https://github.com/LukeFost))
3515
+ - **Gemini 3 preview models**: Added `gemini-3-pro-preview` and `gemini-3-flash-preview` to the google-gemini-cli provider. ([#264](https://github.com/code-yeongyu/senpi-mono/pull/264) by [@LukeFost](https://github.com/LukeFost))
3474
3516
 
3475
- - **External editor support**: Press `Ctrl+G` to edit your message in an external editor. Uses `$VISUAL` or `$EDITOR` environment variable. On successful save, the message is replaced; on cancel, the original is kept. ([#266](https://github.com/code-yeongyu/sanepi-mono/pull/266) by [@aliou](https://github.com/aliou))
3517
+ - **External editor support**: Press `Ctrl+G` to edit your message in an external editor. Uses `$VISUAL` or `$EDITOR` environment variable. On successful save, the message is replaced; on cancel, the original is kept. ([#266](https://github.com/code-yeongyu/senpi-mono/pull/266) by [@aliou](https://github.com/aliou))
3476
3518
 
3477
- - **Process suspension**: Press `Ctrl+Z` to suspend pi and return to the shell. Resume with `fg` as usual. ([#267](https://github.com/code-yeongyu/sanepi-mono/pull/267) by [@aliou](https://github.com/aliou))
3519
+ - **Process suspension**: Press `Ctrl+Z` to suspend pi and return to the shell. Resume with `fg` as usual. ([#267](https://github.com/code-yeongyu/senpi-mono/pull/267) by [@aliou](https://github.com/aliou))
3478
3520
 
3479
- - **Configurable skills directories**: Added granular control over skill sources with `enableCodexUser`, `enableClaudeUser`, `enableClaudeProject`, `enablePiUser`, `enablePiProject` toggles, plus `customDirectories` and `ignoredSkills` settings. ([#269](https://github.com/code-yeongyu/sanepi-mono/pull/269) by [@nicobailon](https://github.com/nicobailon))
3521
+ - **Configurable skills directories**: Added granular control over skill sources with `enableCodexUser`, `enableClaudeUser`, `enableClaudeProject`, `enablePiUser`, `enablePiProject` toggles, plus `customDirectories` and `ignoredSkills` settings. ([#269](https://github.com/code-yeongyu/senpi-mono/pull/269) by [@nicobailon](https://github.com/nicobailon))
3480
3522
 
3481
- - **Skills CLI filtering**: Added `--skills <patterns>` flag for filtering skills with glob patterns. Also added `includeSkills` setting and glob pattern support for `ignoredSkills`. ([#268](https://github.com/code-yeongyu/sanepi-mono/issues/268))
3523
+ - **Skills CLI filtering**: Added `--skills <patterns>` flag for filtering skills with glob patterns. Also added `includeSkills` setting and glob pattern support for `ignoredSkills`. ([#268](https://github.com/code-yeongyu/senpi-mono/issues/268))
3482
3524
 
3483
3525
  ## [0.25.2] - 2025-12-21
3484
3526
 
@@ -3498,7 +3540,7 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3498
3540
 
3499
3541
  ### Added
3500
3542
 
3501
- - **Interruptible tool execution**: Queuing a message while tools are executing now interrupts the current tool batch. Remaining tools are skipped with an error result, and your queued message is processed immediately. Useful for redirecting the agent mid-task. ([#259](https://github.com/code-yeongyu/sanepi-mono/pull/259) by [@steipete](https://github.com/steipete))
3543
+ - **Interruptible tool execution**: Queuing a message while tools are executing now interrupts the current tool batch. Remaining tools are skipped with an error result, and your queued message is processed immediately. Useful for redirecting the agent mid-task. ([#259](https://github.com/code-yeongyu/senpi-mono/pull/259) by [@steipete](https://github.com/steipete))
3502
3544
 
3503
3545
  - **Google Gemini CLI OAuth provider**: Access Gemini 2.0/2.5 models for free via Google Cloud Code Assist. Login with `/login` and select "Google Gemini CLI". Uses your Google account with rate limits.
3504
3546
 
@@ -3506,13 +3548,13 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3506
3548
 
3507
3549
  ### Changed
3508
3550
 
3509
- - **Model selector respects --models scope**: The `/model` command now only shows models specified via `--models` flag when that flag is used, instead of showing all available models. This prevents accidentally selecting models from unintended providers. ([#255](https://github.com/code-yeongyu/sanepi-mono/issues/255))
3551
+ - **Model selector respects --models scope**: The `/model` command now only shows models specified via `--models` flag when that flag is used, instead of showing all available models. This prevents accidentally selecting models from unintended providers. ([#255](https://github.com/code-yeongyu/senpi-mono/issues/255))
3510
3552
 
3511
3553
  ### Fixed
3512
3554
 
3513
- - **Connection errors not retried**: Added "connection error" to the list of retryable errors so Anthropic connection drops trigger auto-retry instead of silently failing. ([#252](https://github.com/code-yeongyu/sanepi-mono/issues/252))
3555
+ - **Connection errors not retried**: Added "connection error" to the list of retryable errors so Anthropic connection drops trigger auto-retry instead of silently failing. ([#252](https://github.com/code-yeongyu/senpi-mono/issues/252))
3514
3556
 
3515
- - **Thinking level not clamped on model switch**: Fixed TUI showing xhigh thinking level after switching to a model that doesn't support it. Thinking level is now automatically clamped to model capabilities. ([#253](https://github.com/code-yeongyu/sanepi-mono/issues/253))
3557
+ - **Thinking level not clamped on model switch**: Fixed TUI showing xhigh thinking level after switching to a model that doesn't support it. Thinking level is now automatically clamped to model capabilities. ([#253](https://github.com/code-yeongyu/senpi-mono/issues/253))
3516
3558
 
3517
3559
  - **Cross-model thinking handoff**: Fixed error when switching between models with different thinking signature formats (e.g., GPT-OSS to Claude thinking models via Antigravity). Thinking blocks without signatures are now converted to text with `<thinking>` delimiters.
3518
3560
 
@@ -3526,7 +3568,7 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3526
3568
 
3527
3569
  ### Fixed
3528
3570
 
3529
- - **Arrow keys and Enter in selector components**: Fixed arrow keys and Enter not working in model selector, session selector, OAuth selector, and other selector components when Caps Lock or Num Lock is enabled. ([#243](https://github.com/code-yeongyu/sanepi-mono/issues/243))
3571
+ - **Arrow keys and Enter in selector components**: Fixed arrow keys and Enter not working in model selector, session selector, OAuth selector, and other selector components when Caps Lock or Num Lock is enabled. ([#243](https://github.com/code-yeongyu/senpi-mono/issues/243))
3530
3572
 
3531
3573
  ## [0.24.3] - 2025-12-19
3532
3574
 
@@ -3538,45 +3580,45 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3538
3580
 
3539
3581
  ### Fixed
3540
3582
 
3541
- - **More Kitty keyboard protocol fixes**: Fixed Backspace, Enter, Home, End, and Delete keys not working with Caps Lock enabled. The initial fix in 0.24.1 missed several key handlers that were still using raw byte detection. Now all key handlers use the helper functions that properly mask out lock key bits. ([#243](https://github.com/code-yeongyu/sanepi-mono/issues/243))
3583
+ - **More Kitty keyboard protocol fixes**: Fixed Backspace, Enter, Home, End, and Delete keys not working with Caps Lock enabled. The initial fix in 0.24.1 missed several key handlers that were still using raw byte detection. Now all key handlers use the helper functions that properly mask out lock key bits. ([#243](https://github.com/code-yeongyu/senpi-mono/issues/243))
3542
3584
 
3543
3585
  ## [0.24.1] - 2025-12-19
3544
3586
 
3545
3587
  ### Added
3546
3588
 
3547
- - **OAuth and model config exports**: Scripts using `AgentSession` directly can now import `getAvailableModels`, `getApiKeyForModel`, `findModel`, `login`, `logout`, and `getOAuthProviders` from `@code-yeongyu/senpi` to reuse OAuth token storage and model resolution. ([#245](https://github.com/code-yeongyu/sanepi-mono/issues/245))
3589
+ - **OAuth and model config exports**: Scripts using `AgentSession` directly can now import `getAvailableModels`, `getApiKeyForModel`, `findModel`, `login`, `logout`, and `getOAuthProviders` from `@code-yeongyu/senpi` to reuse OAuth token storage and model resolution. ([#245](https://github.com/code-yeongyu/senpi-mono/issues/245))
3548
3590
 
3549
- - **xhigh thinking level for gpt-5.2 models**: The thinking level selector and shift+tab cycling now show xhigh option for gpt-5.2 and gpt-5.2-codex models (in addition to gpt-5.1-codex-max). ([#236](https://github.com/code-yeongyu/sanepi-mono/pull/236) by [@theBucky](https://github.com/theBucky))
3591
+ - **xhigh thinking level for gpt-5.2 models**: The thinking level selector and shift+tab cycling now show xhigh option for gpt-5.2 and gpt-5.2-codex models (in addition to gpt-5.1-codex-max). ([#236](https://github.com/code-yeongyu/senpi-mono/pull/236) by [@theBucky](https://github.com/theBucky))
3550
3592
 
3551
3593
  ### Fixed
3552
3594
 
3553
- - **Hooks wrap custom tools**: Custom tools are now executed through the hook wrapper, so `tool_call`/`tool_result` hooks can observe, block, and modify custom tool executions (consistent with hook type docs). ([#248](https://github.com/code-yeongyu/sanepi-mono/pull/248) by [@nicobailon](https://github.com/nicobailon))
3595
+ - **Hooks wrap custom tools**: Custom tools are now executed through the hook wrapper, so `tool_call`/`tool_result` hooks can observe, block, and modify custom tool executions (consistent with hook type docs). ([#248](https://github.com/code-yeongyu/senpi-mono/pull/248) by [@nicobailon](https://github.com/nicobailon))
3554
3596
 
3555
- - **Hook onUpdate callback forwarding**: The `onUpdate` callback is now correctly forwarded through the hook wrapper, fixing custom tool progress updates. ([#238](https://github.com/code-yeongyu/sanepi-mono/pull/238) by [@nicobailon](https://github.com/nicobailon))
3597
+ - **Hook onUpdate callback forwarding**: The `onUpdate` callback is now correctly forwarded through the hook wrapper, fixing custom tool progress updates. ([#238](https://github.com/code-yeongyu/senpi-mono/pull/238) by [@nicobailon](https://github.com/nicobailon))
3556
3598
 
3557
- - **Terminal cleanup on Ctrl+C in session selector**: Fixed terminal not being properly restored when pressing Ctrl+C in the session selector. ([#247](https://github.com/code-yeongyu/sanepi-mono/pull/247) by [@aliou](https://github.com/aliou))
3599
+ - **Terminal cleanup on Ctrl+C in session selector**: Fixed terminal not being properly restored when pressing Ctrl+C in the session selector. ([#247](https://github.com/code-yeongyu/senpi-mono/pull/247) by [@aliou](https://github.com/aliou))
3558
3600
 
3559
- - **OpenRouter models with colons in IDs**: Fixed parsing of OpenRouter model IDs that contain colons (e.g., `openrouter:meta-llama/llama-4-scout:free`). ([#242](https://github.com/code-yeongyu/sanepi-mono/pull/242) by [@aliou](https://github.com/aliou))
3601
+ - **OpenRouter models with colons in IDs**: Fixed parsing of OpenRouter model IDs that contain colons (e.g., `openrouter:meta-llama/llama-4-scout:free`). ([#242](https://github.com/code-yeongyu/senpi-mono/pull/242) by [@aliou](https://github.com/aliou))
3560
3602
 
3561
- - **Global AGENTS.md loaded twice**: Fixed global AGENTS.md being loaded twice when present in both `~/.senpi/agent/` and the current directory. ([#239](https://github.com/code-yeongyu/sanepi-mono/pull/239) by [@aliou](https://github.com/aliou))
3603
+ - **Global AGENTS.md loaded twice**: Fixed global AGENTS.md being loaded twice when present in both `~/.senpi/agent/` and the current directory. ([#239](https://github.com/code-yeongyu/senpi-mono/pull/239) by [@aliou](https://github.com/aliou))
3562
3604
 
3563
- - **Kitty keyboard protocol on Linux**: Fixed keyboard input not working in Ghostty on Linux when Num Lock is enabled. The Kitty protocol includes Caps Lock and Num Lock state in modifier values, which broke key detection. Now correctly masks out lock key bits when matching keyboard shortcuts. ([#243](https://github.com/code-yeongyu/sanepi-mono/issues/243))
3605
+ - **Kitty keyboard protocol on Linux**: Fixed keyboard input not working in Ghostty on Linux when Num Lock is enabled. The Kitty protocol includes Caps Lock and Num Lock state in modifier values, which broke key detection. Now correctly masks out lock key bits when matching keyboard shortcuts. ([#243](https://github.com/code-yeongyu/senpi-mono/issues/243))
3564
3606
 
3565
- - **Emoji deletion and cursor movement**: Backspace, Delete, and arrow keys now correctly handle multi-codepoint characters like emojis. Previously, deleting an emoji would leave partial bytes, corrupting the editor state. ([#240](https://github.com/code-yeongyu/sanepi-mono/issues/240))
3607
+ - **Emoji deletion and cursor movement**: Backspace, Delete, and arrow keys now correctly handle multi-codepoint characters like emojis. Previously, deleting an emoji would leave partial bytes, corrupting the editor state. ([#240](https://github.com/code-yeongyu/senpi-mono/issues/240))
3566
3608
 
3567
3609
  ## [0.24.0] - 2025-12-19
3568
3610
 
3569
3611
  ### Added
3570
3612
 
3571
- - **Subagent orchestration example**: Added comprehensive custom tool example for spawning and orchestrating sub-agents with isolated context windows. Includes scout/planner/reviewer/worker agents and workflow commands for multi-agent pipelines. ([#215](https://github.com/code-yeongyu/sanepi-mono/pull/215) by [@nicobailon](https://github.com/nicobailon))
3613
+ - **Subagent orchestration example**: Added comprehensive custom tool example for spawning and orchestrating sub-agents with isolated context windows. Includes scout/planner/reviewer/worker agents and workflow commands for multi-agent pipelines. ([#215](https://github.com/code-yeongyu/senpi-mono/pull/215) by [@nicobailon](https://github.com/nicobailon))
3572
3614
 
3573
3615
  - **`getMarkdownTheme()` export**: Custom tools can now import `getMarkdownTheme()` from `@code-yeongyu/senpi` to use the same markdown styling as the main UI.
3574
3616
 
3575
3617
  - **`pi.exec()` signal and timeout support**: Custom tools and hooks can now pass `{ signal, timeout }` options to `pi.exec()` for cancellation and timeout handling. The result includes a `killed` flag when the process was terminated.
3576
3618
 
3577
- - **Kitty keyboard protocol support**: Shift+Enter, Alt+Enter, Shift+Tab, Ctrl+D, and all Ctrl+key combinations now work in Ghostty, Kitty, WezTerm, and other modern terminals. ([#225](https://github.com/code-yeongyu/sanepi-mono/pull/225) by [@kim0](https://github.com/kim0))
3619
+ - **Kitty keyboard protocol support**: Shift+Enter, Alt+Enter, Shift+Tab, Ctrl+D, and all Ctrl+key combinations now work in Ghostty, Kitty, WezTerm, and other modern terminals. ([#225](https://github.com/code-yeongyu/senpi-mono/pull/225) by [@kim0](https://github.com/kim0))
3578
3620
 
3579
- - **Dynamic API key refresh**: OAuth tokens (GitHub Copilot, Anthropic OAuth) are now refreshed before each LLM call, preventing failures in long-running agent loops where tokens expire mid-session. ([#223](https://github.com/code-yeongyu/sanepi-mono/pull/223) by [@kim0](https://github.com/kim0))
3621
+ - **Dynamic API key refresh**: OAuth tokens (GitHub Copilot, Anthropic OAuth) are now refreshed before each LLM call, preventing failures in long-running agent loops where tokens expire mid-session. ([#223](https://github.com/code-yeongyu/senpi-mono/pull/223) by [@kim0](https://github.com/kim0))
3580
3622
 
3581
3623
  - **`/hotkeys` command**: Shows all keyboard shortcuts in a formatted table.
3582
3624
 
@@ -3586,19 +3628,19 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3586
3628
 
3587
3629
  - **Subagent example improvements**: Parallel mode now streams updates from all tasks. Chain mode shows all completed steps during streaming. Expanded view uses proper markdown rendering with syntax highlighting. Usage footer shows turn count.
3588
3630
 
3589
- - **Skills standard compliance**: Skills now adhere to the [Agent Skills standard](https://agentskills.io/specification). Validates name (must match parent directory, lowercase, max 64 chars), description (required, max 1024 chars), and frontmatter fields. Warns on violations but remains lenient. Prompt format changed to XML structure. Removed `{baseDir}` placeholder in favor of relative paths. ([#231](https://github.com/code-yeongyu/sanepi-mono/issues/231))
3631
+ - **Skills standard compliance**: Skills now adhere to the [Agent Skills standard](https://agentskills.io/specification). Validates name (must match parent directory, lowercase, max 64 chars), description (required, max 1024 chars), and frontmatter fields. Warns on violations but remains lenient. Prompt format changed to XML structure. Removed `{baseDir}` placeholder in favor of relative paths. ([#231](https://github.com/code-yeongyu/senpi-mono/issues/231))
3590
3632
 
3591
3633
  ### Fixed
3592
3634
 
3593
3635
  - **JSON mode stdout flush**: Fixed race condition where `pi --mode json` could exit before all output was written to stdout, causing consumers to miss final events.
3594
3636
 
3595
- - **Symlinked tools, hooks, and slash commands**: Discovery now correctly follows symlinks when scanning for custom tools, hooks, and slash commands. ([#219](https://github.com/code-yeongyu/sanepi-mono/pull/219), [#232](https://github.com/code-yeongyu/sanepi-mono/pull/232) by [@aliou](https://github.com/aliou))
3637
+ - **Symlinked tools, hooks, and slash commands**: Discovery now correctly follows symlinks when scanning for custom tools, hooks, and slash commands. ([#219](https://github.com/code-yeongyu/senpi-mono/pull/219), [#232](https://github.com/code-yeongyu/senpi-mono/pull/232) by [@aliou](https://github.com/aliou))
3596
3638
 
3597
3639
  ### Breaking Changes
3598
3640
 
3599
3641
  - **Custom tools now require `index.ts` entry point**: Auto-discovered custom tools must be in a subdirectory with an `index.ts` file. The old pattern `~/.senpi/agent/tools/mytool.ts` must become `~/.senpi/agent/tools/mytool/index.ts`. This allows multi-file tools to import helper modules. Explicit paths via `--tool` or `settings.json` still work with any `.ts` file.
3600
3642
 
3601
- - **Hook `tool_result` event restructured**: The `ToolResultEvent` now exposes full tool result data instead of just text. ([#233](https://github.com/code-yeongyu/sanepi-mono/pull/233))
3643
+ - **Hook `tool_result` event restructured**: The `ToolResultEvent` now exposes full tool result data instead of just text. ([#233](https://github.com/code-yeongyu/senpi-mono/pull/233))
3602
3644
  - Removed: `result: string` field
3603
3645
  - Added: `content: (TextContent | ImageContent)[]` - full content array
3604
3646
  - Added: `details: unknown` - tool-specific details (typed per tool via discriminated union on `toolName`)
@@ -3611,15 +3653,15 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3611
3653
 
3612
3654
  ### Added
3613
3655
 
3614
- - **Syntax highlighting**: Added syntax highlighting for markdown code blocks, read tool output, and write tool content. Uses cli-highlight with theme-aware color mapping and VS Code-style syntax colors. ([#214](https://github.com/code-yeongyu/sanepi-mono/pull/214) by [@svkozak](https://github.com/svkozak))
3656
+ - **Syntax highlighting**: Added syntax highlighting for markdown code blocks, read tool output, and write tool content. Uses cli-highlight with theme-aware color mapping and VS Code-style syntax colors. ([#214](https://github.com/code-yeongyu/senpi-mono/pull/214) by [@svkozak](https://github.com/svkozak))
3615
3657
 
3616
3658
  - **Intra-line diff highlighting**: Edit tool now shows word-level changes with inverse highlighting when a single line is modified. Multi-line changes show all removed lines first, then all added lines.
3617
3659
 
3618
3660
  ### Fixed
3619
3661
 
3620
- - **Gemini tool result format**: Fixed tool result format for Gemini 3 Flash Preview which strictly requires `{ output: value }` for success and `{ error: value }` for errors. Previous format using `{ result, isError }` was rejected by newer Gemini models. ([#213](https://github.com/code-yeongyu/sanepi-mono/issues/213), [#220](https://github.com/code-yeongyu/sanepi-mono/pull/220))
3662
+ - **Gemini tool result format**: Fixed tool result format for Gemini 3 Flash Preview which strictly requires `{ output: value }` for success and `{ error: value }` for errors. Previous format using `{ result, isError }` was rejected by newer Gemini models. ([#213](https://github.com/code-yeongyu/senpi-mono/issues/213), [#220](https://github.com/code-yeongyu/senpi-mono/pull/220))
3621
3663
 
3622
- - **Google baseUrl configuration**: Google provider now respects `baseUrl` configuration for custom endpoints or API proxies. ([#216](https://github.com/code-yeongyu/sanepi-mono/issues/216), [#221](https://github.com/code-yeongyu/sanepi-mono/pull/221) by [@theBucky](https://github.com/theBucky))
3664
+ - **Google baseUrl configuration**: Google provider now respects `baseUrl` configuration for custom endpoints or API proxies. ([#216](https://github.com/code-yeongyu/senpi-mono/issues/216), [#221](https://github.com/code-yeongyu/senpi-mono/pull/221) by [@theBucky](https://github.com/theBucky))
3623
3665
 
3624
3666
  - **Google provider FinishReason**: Added handling for new `IMAGE_RECITATION` and `IMAGE_OTHER` finish reasons. Upgraded @google/genai to 1.34.0.
3625
3667
 
@@ -3652,11 +3694,11 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3652
3694
 
3653
3695
  ### Fixed
3654
3696
 
3655
- - Fixed Claude models via GitHub Copilot re-answering all previous prompts in multi-turn conversations. The issue was that assistant message content was sent as an array instead of a string, which Copilot's Claude adapter misinterpreted. Also added missing `Openai-Intent: conversation-edits` header and fixed `X-Initiator` logic to check for any assistant/tool message in history. ([#209](https://github.com/code-yeongyu/sanepi-mono/issues/209))
3697
+ - Fixed Claude models via GitHub Copilot re-answering all previous prompts in multi-turn conversations. The issue was that assistant message content was sent as an array instead of a string, which Copilot's Claude adapter misinterpreted. Also added missing `Openai-Intent: conversation-edits` header and fixed `X-Initiator` logic to check for any assistant/tool message in history. ([#209](https://github.com/code-yeongyu/senpi-mono/issues/209))
3656
3698
 
3657
3699
  - Detect image MIME type via file magic (read tool and `@file` attachments), not filename extension.
3658
3700
 
3659
- - Fixed markdown tables overflowing terminal width. Tables now wrap cell contents to fit available width instead of breaking borders mid-row. ([#206](https://github.com/code-yeongyu/sanepi-mono/pull/206) by [@kim0](https://github.com/kim0))
3701
+ - Fixed markdown tables overflowing terminal width. Tables now wrap cell contents to fit available width instead of breaking borders mid-row. ([#206](https://github.com/code-yeongyu/senpi-mono/pull/206) by [@kim0](https://github.com/kim0))
3660
3702
 
3661
3703
  ## [0.23.1] - 2025-12-17
3662
3704
 
@@ -3670,7 +3712,7 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3670
3712
 
3671
3713
  ### Added
3672
3714
 
3673
- - **Custom tools**: Extend pi with custom tools written in TypeScript. Tools can provide custom TUI rendering, interact with users via `pi.ui` (select, confirm, input, notify), and maintain state across sessions via `onSession` callback. See [docs/custom-tools.md](docs/custom-tools.md) and [examples/custom-tools/](examples/custom-tools/). ([#190](https://github.com/code-yeongyu/sanepi-mono/issues/190))
3715
+ - **Custom tools**: Extend pi with custom tools written in TypeScript. Tools can provide custom TUI rendering, interact with users via `pi.ui` (select, confirm, input, notify), and maintain state across sessions via `onSession` callback. See [docs/custom-tools.md](docs/custom-tools.md) and [examples/custom-tools/](examples/custom-tools/). ([#190](https://github.com/code-yeongyu/senpi-mono/issues/190))
3674
3716
 
3675
3717
  - **Hook and tool examples**: Added `examples/hooks/` and `examples/custom-tools/` with working examples. Examples are now bundled in npm and binary releases.
3676
3718
 
@@ -3688,7 +3730,7 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3688
3730
 
3689
3731
  ### Added
3690
3732
 
3691
- - `--list-models [search]` CLI flag to list available models with optional fuzzy search. Shows provider, model ID, context window, max output, thinking support, and image support. Only lists models with configured API keys. ([#203](https://github.com/code-yeongyu/sanepi-mono/issues/203))
3733
+ - `--list-models [search]` CLI flag to list available models with optional fuzzy search. Shows provider, model ID, context window, max output, thinking support, and image support. Only lists models with configured API keys. ([#203](https://github.com/code-yeongyu/senpi-mono/issues/203))
3692
3734
 
3693
3735
  ### Fixed
3694
3736
 
@@ -3698,19 +3740,19 @@ Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md)
3698
3740
 
3699
3741
  ### Added
3700
3742
 
3701
- - **Streaming bash output**: Bash tool now streams output in real-time during execution. The TUI displays live progress with the last 5 lines visible (expandable with ctrl+o). ([#44](https://github.com/code-yeongyu/sanepi-mono/issues/44))
3743
+ - **Streaming bash output**: Bash tool now streams output in real-time during execution. The TUI displays live progress with the last 5 lines visible (expandable with ctrl+o). ([#44](https://github.com/code-yeongyu/senpi-mono/issues/44))
3702
3744
 
3703
3745
  ### Changed
3704
3746
 
3705
3747
  - **Tool output display**: When collapsed, tool output now shows the last N lines instead of the first N lines, making streaming output more useful.
3706
3748
 
3707
- - Updated `@earendil-works/pi-ai` with X-Initiator header support for GitHub Copilot, ensuring agent calls are not deducted from quota. ([#200](https://github.com/code-yeongyu/sanepi-mono/pull/200) by [@kim0](https://github.com/kim0))
3749
+ - Updated `@earendil-works/pi-ai` with X-Initiator header support for GitHub Copilot, ensuring agent calls are not deducted from quota. ([#200](https://github.com/code-yeongyu/senpi-mono/pull/200) by [@kim0](https://github.com/kim0))
3708
3750
 
3709
3751
  ### Fixed
3710
3752
 
3711
- - Fixed editor text being cleared during compaction. Text typed while compaction is running is now preserved. ([#179](https://github.com/code-yeongyu/sanepi-mono/issues/179))
3753
+ - Fixed editor text being cleared during compaction. Text typed while compaction is running is now preserved. ([#179](https://github.com/code-yeongyu/senpi-mono/issues/179))
3712
3754
  - Improved RGB to 256-color mapping for terminals without truecolor support. Now correctly uses grayscale ramp for neutral colors and preserves semantic tints (green for success, red for error, blue for pending) instead of mapping everything to wrong cube colors.
3713
- - `/think off` now actually disables thinking for all providers. Previously, providers like Gemini with "dynamic thinking" enabled by default would still use thinking even when turned off. ([#180](https://github.com/code-yeongyu/sanepi-mono/pull/180) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3755
+ - `/think off` now actually disables thinking for all providers. Previously, providers like Gemini with "dynamic thinking" enabled by default would still use thinking even when turned off. ([#180](https://github.com/code-yeongyu/senpi-mono/pull/180) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3714
3756
 
3715
3757
  ## [0.22.2] - 2025-12-15
3716
3758
 
@@ -3730,7 +3772,7 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3730
3772
 
3731
3773
  ### Added
3732
3774
 
3733
- - **GitHub Copilot support**: Use GitHub Copilot models via OAuth login (`/login` -> "GitHub Copilot"). Supports both github.com and GitHub Enterprise. Models are sourced from models.dev and include Claude, GPT, Gemini, Grok, and more. All models are automatically enabled after login. ([#191](https://github.com/code-yeongyu/sanepi-mono/pull/191) by [@cau1k](https://github.com/cau1k))
3775
+ - **GitHub Copilot support**: Use GitHub Copilot models via OAuth login (`/login` -> "GitHub Copilot"). Supports both github.com and GitHub Enterprise. Models are sourced from models.dev and include Claude, GPT, Gemini, Grok, and more. All models are automatically enabled after login. ([#191](https://github.com/code-yeongyu/senpi-mono/pull/191) by [@cau1k](https://github.com/cau1k))
3734
3776
 
3735
3777
  ### Fixed
3736
3778
 
@@ -3740,15 +3782,15 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3740
3782
 
3741
3783
  ### Added
3742
3784
 
3743
- - **Inline image rendering**: Terminals supporting Kitty graphics protocol (Kitty, Ghostty, WezTerm) or iTerm2 inline images now render images inline in tool output. Aspect ratio is preserved by querying terminal cell dimensions on startup. Toggle with `/show-images` command or `terminal.showImages` setting. Falls back to text placeholder on unsupported terminals or when disabled. ([#177](https://github.com/code-yeongyu/sanepi-mono/pull/177) by [@nicobailon](https://github.com/nicobailon))
3785
+ - **Inline image rendering**: Terminals supporting Kitty graphics protocol (Kitty, Ghostty, WezTerm) or iTerm2 inline images now render images inline in tool output. Aspect ratio is preserved by querying terminal cell dimensions on startup. Toggle with `/show-images` command or `terminal.showImages` setting. Falls back to text placeholder on unsupported terminals or when disabled. ([#177](https://github.com/code-yeongyu/senpi-mono/pull/177) by [@nicobailon](https://github.com/nicobailon))
3744
3786
 
3745
- - **Gemini 3 Pro thinking levels**: Thinking level selector now works with Gemini 3 Pro models. Minimal/low map to Google's LOW, medium/high map to Google's HIGH. ([#176](https://github.com/code-yeongyu/sanepi-mono/pull/176) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3787
+ - **Gemini 3 Pro thinking levels**: Thinking level selector now works with Gemini 3 Pro models. Minimal/low map to Google's LOW, medium/high map to Google's HIGH. ([#176](https://github.com/code-yeongyu/senpi-mono/pull/176) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3746
3788
 
3747
3789
  ### Fixed
3748
3790
 
3749
- - Fixed read tool failing on macOS screenshot filenames due to Unicode Narrow No-Break Space (U+202F) in timestamp. Added fallback to try macOS variant paths and consolidated duplicate expandPath functions into shared path-utils.ts. ([#181](https://github.com/code-yeongyu/sanepi-mono/pull/181) by [@nicobailon](https://github.com/nicobailon))
3791
+ - Fixed read tool failing on macOS screenshot filenames due to Unicode Narrow No-Break Space (U+202F) in timestamp. Added fallback to try macOS variant paths and consolidated duplicate expandPath functions into shared path-utils.ts. ([#181](https://github.com/code-yeongyu/senpi-mono/pull/181) by [@nicobailon](https://github.com/nicobailon))
3750
3792
 
3751
- - Fixed double blank lines rendering after markdown code blocks ([#173](https://github.com/code-yeongyu/sanepi-mono/pull/173) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3793
+ - Fixed double blank lines rendering after markdown code blocks ([#173](https://github.com/code-yeongyu/senpi-mono/pull/173) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3752
3794
 
3753
3795
  ## [0.20.1] - 2025-12-13
3754
3796
 
@@ -3776,25 +3818,25 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3776
3818
 
3777
3819
  ### Added
3778
3820
 
3779
- - **Skills system**: Auto-discover and load instruction files on-demand. Supports Claude Code (`~/.claude/skills/*/SKILL.md`), Codex CLI (`~/.codex/skills/`), and Pi-native formats (`~/.senpi/agent/skills/`, `.senpi/skills/`). Skills are listed in system prompt with descriptions, agent loads them via read tool when needed. Supports `{baseDir}` placeholder. Disable with `--no-skills` or `skills.enabled: false` in settings. ([#169](https://github.com/code-yeongyu/sanepi-mono/issues/169))
3821
+ - **Skills system**: Auto-discover and load instruction files on-demand. Supports Claude Code (`~/.claude/skills/*/SKILL.md`), Codex CLI (`~/.codex/skills/`), and Pi-native formats (`~/.senpi/agent/skills/`, `.senpi/skills/`). Skills are listed in system prompt with descriptions, agent loads them via read tool when needed. Supports `{baseDir}` placeholder. Disable with `--no-skills` or `skills.enabled: false` in settings. ([#169](https://github.com/code-yeongyu/senpi-mono/issues/169))
3780
3822
 
3781
- - **Version flag**: Added `--version` / `-v` flag to display the current version and exit. ([#170](https://github.com/code-yeongyu/sanepi-mono/pull/170))
3823
+ - **Version flag**: Added `--version` / `-v` flag to display the current version and exit. ([#170](https://github.com/code-yeongyu/senpi-mono/pull/170))
3782
3824
 
3783
3825
  ## [0.18.2] - 2025-12-11
3784
3826
 
3785
3827
  ### Added
3786
3828
 
3787
- - **Auto-retry on transient errors**: Automatically retries requests when providers return overloaded, rate limit, or server errors (429, 500, 502, 503, 504). Uses exponential backoff (2s, 4s, 8s). Shows retry status in TUI with option to cancel via Escape. Configurable in `settings.json` via `retry.enabled`, `retry.maxRetries`, `retry.baseDelayMs`. RPC mode emits `auto_retry_start` and `auto_retry_end` events. ([#157](https://github.com/code-yeongyu/sanepi-mono/issues/157))
3829
+ - **Auto-retry on transient errors**: Automatically retries requests when providers return overloaded, rate limit, or server errors (429, 500, 502, 503, 504). Uses exponential backoff (2s, 4s, 8s). Shows retry status in TUI with option to cancel via Escape. Configurable in `settings.json` via `retry.enabled`, `retry.maxRetries`, `retry.baseDelayMs`. RPC mode emits `auto_retry_start` and `auto_retry_end` events. ([#157](https://github.com/code-yeongyu/senpi-mono/issues/157))
3788
3830
 
3789
- - **HTML export line numbers**: Read tool calls in HTML exports now display line number ranges (e.g., `file.txt:10-20`) when offset/limit parameters are used, matching the TUI display format. Line numbers appear in yellow color for better visibility. ([#166](https://github.com/code-yeongyu/sanepi-mono/issues/166))
3831
+ - **HTML export line numbers**: Read tool calls in HTML exports now display line number ranges (e.g., `file.txt:10-20`) when offset/limit parameters are used, matching the TUI display format. Line numbers appear in yellow color for better visibility. ([#166](https://github.com/code-yeongyu/senpi-mono/issues/166))
3790
3832
 
3791
3833
  ### Fixed
3792
3834
 
3793
- - **Branch selector now works with single message**: Previously the branch selector would not open when there was only one user message. Now it correctly allows branching from any message, including the first one. This is needed for checkpoint hooks to restore state from before the first message. ([#163](https://github.com/code-yeongyu/sanepi-mono/issues/163))
3835
+ - **Branch selector now works with single message**: Previously the branch selector would not open when there was only one user message. Now it correctly allows branching from any message, including the first one. This is needed for checkpoint hooks to restore state from before the first message. ([#163](https://github.com/code-yeongyu/senpi-mono/issues/163))
3794
3836
 
3795
3837
  - **In-memory branching for `--no-session` mode**: Branching now works correctly in `--no-session` mode without creating any session files. The conversation is truncated in memory.
3796
3838
 
3797
- - **Git branch indicator now works in subdirectories**: The footer's git branch detection now walks up the directory hierarchy to find the git root, so it works when running pi from a subdirectory of a repository. ([#156](https://github.com/code-yeongyu/sanepi-mono/issues/156))
3839
+ - **Git branch indicator now works in subdirectories**: The footer's git branch detection now walks up the directory hierarchy to find the git root, so it works when running pi from a subdirectory of a repository. ([#156](https://github.com/code-yeongyu/senpi-mono/issues/156))
3798
3840
 
3799
3841
  ## [0.18.1] - 2025-12-10
3800
3842
 
@@ -3804,13 +3846,13 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3804
3846
 
3805
3847
  ### Fixed
3806
3848
 
3807
- - Fixed print mode (`-p`) not exiting after output when custom themes are present (theme watcher now properly stops in print mode) ([#161](https://github.com/code-yeongyu/sanepi-mono/issues/161))
3849
+ - Fixed print mode (`-p`) not exiting after output when custom themes are present (theme watcher now properly stops in print mode) ([#161](https://github.com/code-yeongyu/senpi-mono/issues/161))
3808
3850
 
3809
3851
  ## [0.18.0] - 2025-12-10
3810
3852
 
3811
3853
  ### Added
3812
3854
 
3813
- - **Hooks system**: TypeScript modules that extend agent behavior by subscribing to lifecycle events. Hooks can intercept tool calls, prompt for confirmation, modify results, and inject messages from external sources. Auto-discovered from `~/.senpi/agent/hooks/*.ts` and `.senpi/hooks/*.ts`. Thanks to [@nicobailon](https://github.com/nicobailon) for the collaboration on the design and implementation. ([#145](https://github.com/code-yeongyu/sanepi-mono/issues/145), supersedes [#158](https://github.com/code-yeongyu/sanepi-mono/pull/158))
3855
+ - **Hooks system**: TypeScript modules that extend agent behavior by subscribing to lifecycle events. Hooks can intercept tool calls, prompt for confirmation, modify results, and inject messages from external sources. Auto-discovered from `~/.senpi/agent/hooks/*.ts` and `.senpi/hooks/*.ts`. Thanks to [@nicobailon](https://github.com/nicobailon) for the collaboration on the design and implementation. ([#145](https://github.com/code-yeongyu/senpi-mono/issues/145), supersedes [#158](https://github.com/code-yeongyu/senpi-mono/pull/158))
3814
3856
 
3815
3857
  - **`pi.send()` API**: Hooks can inject messages into the agent session from external sources (file watchers, webhooks, CI systems). If streaming, messages are queued; otherwise a new agent loop starts immediately.
3816
3858
 
@@ -3848,7 +3890,7 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3848
3890
 
3849
3891
  ### Breaking Changes
3850
3892
 
3851
- - **New RPC protocol**: The RPC mode (`--mode rpc`) has been completely redesigned with a new JSON protocol. The old protocol is no longer supported. See [`docs/rpc.md`](docs/rpc.md) for the new protocol documentation and [`test/rpc-example.ts`](test/rpc-example.ts) for a working example. Includes `RpcClient` TypeScript class for easy integration. ([#91](https://github.com/code-yeongyu/sanepi-mono/issues/91))
3893
+ - **New RPC protocol**: The RPC mode (`--mode rpc`) has been completely redesigned with a new JSON protocol. The old protocol is no longer supported. See [`docs/rpc.md`](docs/rpc.md) for the new protocol documentation and [`test/rpc-example.ts`](test/rpc-example.ts) for a working example. Includes `RpcClient` TypeScript class for easy integration. ([#91](https://github.com/code-yeongyu/senpi-mono/issues/91))
3852
3894
 
3853
3895
  ### Changed
3854
3896
 
@@ -3858,7 +3900,7 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3858
3900
 
3859
3901
  ### Changed
3860
3902
 
3861
- - **Major code refactoring**: Restructured codebase for better maintainability and separation of concerns. Moved files into organized directories (`core/`, `modes/`, `utils/`, `cli/`). Extracted `AgentSession` class as central session management abstraction. Split `main.ts` and `tui-renderer.ts` into focused modules. See `DEVELOPMENT.md` for the new code map. ([#153](https://github.com/code-yeongyu/sanepi-mono/issues/153))
3903
+ - **Major code refactoring**: Restructured codebase for better maintainability and separation of concerns. Moved files into organized directories (`core/`, `modes/`, `utils/`, `cli/`). Extracted `AgentSession` class as central session management abstraction. Split `main.ts` and `tui-renderer.ts` into focused modules. See `DEVELOPMENT.md` for the new code map. ([#153](https://github.com/code-yeongyu/senpi-mono/issues/153))
3862
3904
 
3863
3905
  ## [0.14.2] - 2025-12-08
3864
3906
 
@@ -3884,19 +3926,19 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3884
3926
 
3885
3927
  ### Added
3886
3928
 
3887
- - **OpenAI compatibility overrides in models.json**: Custom models using `openai-completions` API can now specify a `compat` object to override provider quirks (`supportsStore`, `supportsDeveloperRole`, `supportsReasoningEffort`, `maxTokensField`). Useful for LiteLLM, custom proxies, and other non-standard endpoints. ([#133](https://github.com/code-yeongyu/sanepi-mono/issues/133), thanks @fink-andreas for the initial idea and PR)
3929
+ - **OpenAI compatibility overrides in models.json**: Custom models using `openai-completions` API can now specify a `compat` object to override provider quirks (`supportsStore`, `supportsDeveloperRole`, `supportsReasoningEffort`, `maxTokensField`). Useful for LiteLLM, custom proxies, and other non-standard endpoints. ([#133](https://github.com/code-yeongyu/senpi-mono/issues/133), thanks @fink-andreas for the initial idea and PR)
3888
3930
 
3889
- - **xhigh thinking level**: Added `xhigh` thinking level for OpenAI codex-max models. Cycle through thinking levels with Shift+Tab; `xhigh` appears only when using a codex-max model. ([#143](https://github.com/code-yeongyu/sanepi-mono/issues/143))
3931
+ - **xhigh thinking level**: Added `xhigh` thinking level for OpenAI codex-max models. Cycle through thinking levels with Shift+Tab; `xhigh` appears only when using a codex-max model. ([#143](https://github.com/code-yeongyu/senpi-mono/issues/143))
3890
3932
 
3891
- - **Collapse changelog setting**: Add `"collapseChangelog": true` to `~/.senpi/agent/settings.json` to show a condensed "Updated to vX.Y.Z" message instead of the full changelog after updates. Use `/changelog` to view the full changelog. ([#148](https://github.com/code-yeongyu/sanepi-mono/issues/148))
3933
+ - **Collapse changelog setting**: Add `"collapseChangelog": true` to `~/.senpi/agent/settings.json` to show a condensed "Updated to vX.Y.Z" message instead of the full changelog after updates. Use `/changelog` to view the full changelog. ([#148](https://github.com/code-yeongyu/senpi-mono/issues/148))
3892
3934
 
3893
- - **Bash mode**: Execute shell commands directly from the editor by prefixing with `!` (e.g., `!ls -la`). Output streams in real-time, is added to the LLM context, and persists in session history. Supports multiline commands, cancellation (Escape), truncation for large outputs, and preview/expand toggle (Ctrl+O). Also available in RPC mode via `{"type":"bash","command":"..."}`. ([#112](https://github.com/code-yeongyu/sanepi-mono/pull/112), original implementation by [@markusylisiurunen](https://github.com/markusylisiurunen))
3935
+ - **Bash mode**: Execute shell commands directly from the editor by prefixing with `!` (e.g., `!ls -la`). Output streams in real-time, is added to the LLM context, and persists in session history. Supports multiline commands, cancellation (Escape), truncation for large outputs, and preview/expand toggle (Ctrl+O). Also available in RPC mode via `{"type":"bash","command":"..."}`. ([#112](https://github.com/code-yeongyu/senpi-mono/pull/112), original implementation by [@markusylisiurunen](https://github.com/markusylisiurunen))
3894
3936
 
3895
3937
  ## [0.13.2] - 2025-12-07
3896
3938
 
3897
3939
  ### Changed
3898
3940
 
3899
- - **Tool output truncation**: All tools now enforce consistent truncation limits with actionable notices for the LLM. ([#134](https://github.com/code-yeongyu/sanepi-mono/issues/134))
3941
+ - **Tool output truncation**: All tools now enforce consistent truncation limits with actionable notices for the LLM. ([#134](https://github.com/code-yeongyu/senpi-mono/issues/134))
3900
3942
  - **Limits**: 2000 lines OR 50KB (whichever hits first), never partial lines
3901
3943
  - **read**: Shows `[Showing lines X-Y of Z. Use offset=N to continue]`. If first line exceeds 50KB, suggests bash command
3902
3944
  - **bash**: Tail truncation with temp file. Shows `[Showing lines X-Y of Z. Full output: /tmp/...]`
@@ -3940,20 +3982,20 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3940
3982
 
3941
3983
  ### Fixed
3942
3984
 
3943
- - **Multi-key sequences in inputs**: Inputs like model search now handle multi-key sequences identically to the main prompt editor. ([#122](https://github.com/code-yeongyu/sanepi-mono/pull/122) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3944
- - **Line wrapping escape codes**: Fixed underline style bleeding into padding when wrapping long URLs. ANSI codes now attach to the correct content, and line-end resets only turn off underline (preserving background colors). ([#109](https://github.com/code-yeongyu/sanepi-mono/issues/109))
3985
+ - **Multi-key sequences in inputs**: Inputs like model search now handle multi-key sequences identically to the main prompt editor. ([#122](https://github.com/code-yeongyu/senpi-mono/pull/122) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3986
+ - **Line wrapping escape codes**: Fixed underline style bleeding into padding when wrapping long URLs. ANSI codes now attach to the correct content, and line-end resets only turn off underline (preserving background colors). ([#109](https://github.com/code-yeongyu/senpi-mono/issues/109))
3945
3987
 
3946
3988
  ### Added
3947
3989
 
3948
- - **Fuzzy search models and sessions**: Implemented a simple fuzzy search for models and sessions (e.g., `codexmax` now finds `gpt-5.1-codex-max`). ([#122](https://github.com/code-yeongyu/sanepi-mono/pull/122) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3949
- - **Prompt History Navigation**: Browse previously submitted prompts using Up/Down arrow keys when the editor is empty. Press Up to cycle through older prompts, Down to return to newer ones or clear the editor. Similar to shell history and Claude Code's prompt history feature. History is session-scoped and stores up to 100 entries. ([#121](https://github.com/code-yeongyu/sanepi-mono/pull/121) by [@nicobailon](https://github.com/nicobailon))
3950
- - **`/resume` Command**: Switch to a different session mid-conversation. Opens an interactive selector showing all available sessions. Equivalent to the `--resume` CLI flag but can be used without restarting the agent. ([#117](https://github.com/code-yeongyu/sanepi-mono/pull/117) by [@hewliyang](https://github.com/hewliyang))
3990
+ - **Fuzzy search models and sessions**: Implemented a simple fuzzy search for models and sessions (e.g., `codexmax` now finds `gpt-5.1-codex-max`). ([#122](https://github.com/code-yeongyu/senpi-mono/pull/122) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3991
+ - **Prompt History Navigation**: Browse previously submitted prompts using Up/Down arrow keys when the editor is empty. Press Up to cycle through older prompts, Down to return to newer ones or clear the editor. Similar to shell history and Claude Code's prompt history feature. History is session-scoped and stores up to 100 entries. ([#121](https://github.com/code-yeongyu/senpi-mono/pull/121) by [@nicobailon](https://github.com/nicobailon))
3992
+ - **`/resume` Command**: Switch to a different session mid-conversation. Opens an interactive selector showing all available sessions. Equivalent to the `--resume` CLI flag but can be used without restarting the agent. ([#117](https://github.com/code-yeongyu/senpi-mono/pull/117) by [@hewliyang](https://github.com/hewliyang))
3951
3993
 
3952
3994
  ## [0.12.11] - 2025-12-05
3953
3995
 
3954
3996
  ### Changed
3955
3997
 
3956
- - **Compaction UI**: Simplified collapsed compaction indicator to show warning-colored text with token count instead of styled banner. Removed redundant success message after compaction. ([#108](https://github.com/code-yeongyu/sanepi-mono/issues/108))
3998
+ - **Compaction UI**: Simplified collapsed compaction indicator to show warning-colored text with token count instead of styled banner. Removed redundant success message after compaction. ([#108](https://github.com/code-yeongyu/senpi-mono/issues/108))
3957
3999
 
3958
4000
  ### Fixed
3959
4001
 
@@ -3964,9 +4006,9 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3964
4006
 
3965
4007
  ### Added
3966
4008
 
3967
- - **`authHeader` option in models.json**: Custom providers can set `"authHeader": true` to automatically add `Authorization: Bearer <apiKey>` header. Useful for providers that require explicit auth headers. ([#81](https://github.com/code-yeongyu/sanepi-mono/issues/81))
3968
- - **`--append-system-prompt` Flag**: Append additional text or file contents to the system prompt. Supports both inline text and file paths. Complements `--system-prompt` for layering custom instructions without replacing the base system prompt. ([#114](https://github.com/code-yeongyu/sanepi-mono/pull/114) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3969
- - **Thinking Block Toggle**: Added `Ctrl+T` shortcut to toggle visibility of LLM thinking blocks. When toggled off, shows a static "Thinking..." label instead of full content. Useful for reducing visual clutter during long conversations. ([#113](https://github.com/code-yeongyu/sanepi-mono/pull/113) by [@markusylisiurunen](https://github.com/markusylisiurunen))
4009
+ - **`authHeader` option in models.json**: Custom providers can set `"authHeader": true` to automatically add `Authorization: Bearer <apiKey>` header. Useful for providers that require explicit auth headers. ([#81](https://github.com/code-yeongyu/senpi-mono/issues/81))
4010
+ - **`--append-system-prompt` Flag**: Append additional text or file contents to the system prompt. Supports both inline text and file paths. Complements `--system-prompt` for layering custom instructions without replacing the base system prompt. ([#114](https://github.com/code-yeongyu/senpi-mono/pull/114) by [@markusylisiurunen](https://github.com/markusylisiurunen))
4011
+ - **Thinking Block Toggle**: Added `Ctrl+T` shortcut to toggle visibility of LLM thinking blocks. When toggled off, shows a static "Thinking..." label instead of full content. Useful for reducing visual clutter during long conversations. ([#113](https://github.com/code-yeongyu/senpi-mono/pull/113) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3970
4012
 
3971
4013
  ## [0.12.10] - 2025-12-04
3972
4014
 
@@ -3978,7 +4020,7 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3978
4020
 
3979
4021
  ### Added
3980
4022
 
3981
- - **`/copy` Command**: Copy the last agent message to clipboard. Works cross-platform (macOS, Windows, Linux). Useful for extracting text from rendered Markdown output. ([#105](https://github.com/code-yeongyu/sanepi-mono/pull/105) by [@markusylisiurunen](https://github.com/markusylisiurunen))
4023
+ - **`/copy` Command**: Copy the last agent message to clipboard. Works cross-platform (macOS, Windows, Linux). Useful for extracting text from rendered Markdown output. ([#105](https://github.com/code-yeongyu/senpi-mono/pull/105) by [@markusylisiurunen](https://github.com/markusylisiurunen))
3982
4024
 
3983
4025
  ## [0.12.8] - 2025-12-04
3984
4026
 
@@ -3988,7 +4030,7 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
3988
4030
 
3989
4031
  ### Added
3990
4032
 
3991
- - **Context Compaction**: Long sessions can now be compacted to reduce context usage while preserving recent conversation history. ([#92](https://github.com/code-yeongyu/sanepi-mono/issues/92), [docs](https://github.com/code-yeongyu/sanepi-mono/blob/main/packages/coding-agent/README.md#context-compaction))
4033
+ - **Context Compaction**: Long sessions can now be compacted to reduce context usage while preserving recent conversation history. ([#92](https://github.com/code-yeongyu/senpi-mono/issues/92), [docs](https://github.com/code-yeongyu/senpi-mono/blob/main/packages/coding-agent/README.md#context-compaction))
3992
4034
  - `/compact [instructions]`: Manually compact context with optional custom instructions for the summary
3993
4035
  - `/autocompact`: Toggle automatic compaction when context exceeds threshold
3994
4036
  - Compaction summarizes older messages while keeping recent messages (default 20k tokens) verbatim
@@ -4002,11 +4044,11 @@ _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
4002
4044
 
4003
4045
  ### Added
4004
4046
 
4005
- - **Forking/Rebranding Support**: All branding (app name, config directory, environment variable names) is now configurable via `piConfig` in `package.json`. Forks can change `piConfig.name` and `piConfig.configDir` to rebrand the CLI without code changes. Affects CLI banner, help text, config paths, and error messages. ([#95](https://github.com/code-yeongyu/sanepi-mono/pull/95))
4047
+ - **Forking/Rebranding Support**: All branding (app name, config directory, environment variable names) is now configurable via `piConfig` in `package.json`. Forks can change `piConfig.name` and `piConfig.configDir` to rebrand the CLI without code changes. Affects CLI banner, help text, config paths, and error messages. ([#95](https://github.com/code-yeongyu/senpi-mono/pull/95))
4006
4048
 
4007
4049
  ### Fixed
4008
4050
 
4009
- - **Bun Binary Detection**: Fixed Bun compiled binary failing to start after Bun updated its virtual filesystem path format from `%7EBUN` to `$bunfs`. ([#95](https://github.com/code-yeongyu/sanepi-mono/pull/95))
4051
+ - **Bun Binary Detection**: Fixed Bun compiled binary failing to start after Bun updated its virtual filesystem path format from `%7EBUN` to `$bunfs`. ([#95](https://github.com/code-yeongyu/senpi-mono/pull/95))
4010
4052
 
4011
4053
  ## [0.12.4] - 2025-12-02
4012
4054