indusagi-coding-agent 0.1.5 → 0.1.7

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 (90) hide show
  1. package/CHANGELOG.md +1 -2149
  2. package/dist/core/agent-session.js +98 -117
  3. package/dist/core/agent-session.js.map +1 -1
  4. package/dist/core/auth-storage.js +2 -4
  5. package/dist/core/auth-storage.js.map +1 -1
  6. package/dist/core/extensions/runner.js +13 -19
  7. package/dist/core/extensions/runner.js.map +1 -1
  8. package/dist/core/footer-data-provider.js +5 -5
  9. package/dist/core/footer-data-provider.js.map +1 -1
  10. package/dist/core/keybindings.js +0 -2
  11. package/dist/core/keybindings.js.map +1 -1
  12. package/dist/core/model-registry.js +4 -6
  13. package/dist/core/model-registry.js.map +1 -1
  14. package/dist/core/package-manager.js +0 -5
  15. package/dist/core/package-manager.js.map +1 -1
  16. package/dist/core/resource-loader.js +0 -34
  17. package/dist/core/resource-loader.js.map +1 -1
  18. package/dist/core/session-manager.js +6 -10
  19. package/dist/core/session-manager.js.map +1 -1
  20. package/dist/core/settings-manager.js +0 -6
  21. package/dist/core/settings-manager.js.map +1 -1
  22. package/dist/modes/interactive/components/armin.js +6 -10
  23. package/dist/modes/interactive/components/armin.js.map +1 -1
  24. package/dist/modes/interactive/components/assistant-message.js +0 -4
  25. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  26. package/dist/modes/interactive/components/bash-execution.js +4 -10
  27. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  28. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  29. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  30. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  31. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  32. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  33. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  34. package/dist/modes/interactive/components/config-selector.js +6 -15
  35. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  36. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  37. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  38. package/dist/modes/interactive/components/custom-editor.js +1 -8
  39. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  40. package/dist/modes/interactive/components/custom-message.js +1 -6
  41. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  42. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  43. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  44. package/dist/modes/interactive/components/extension-editor.js +0 -5
  45. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  46. package/dist/modes/interactive/components/extension-input.js +2 -8
  47. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  48. package/dist/modes/interactive/components/extension-selector.js +1 -8
  49. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  50. package/dist/modes/interactive/components/footer.js +1 -3
  51. package/dist/modes/interactive/components/footer.js.map +1 -1
  52. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  53. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  54. package/dist/modes/interactive/components/login-dialog.js +6 -11
  55. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  56. package/dist/modes/interactive/components/model-selector.js +8 -20
  57. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  58. package/dist/modes/interactive/components/oauth-selector.d.ts +32 -4
  59. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  60. package/dist/modes/interactive/components/oauth-selector.js +174 -32
  61. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  62. package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
  63. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  64. package/dist/modes/interactive/components/session-selector.js +31 -52
  65. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  66. package/dist/modes/interactive/components/settings-selector.js +0 -2
  67. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  68. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  69. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  70. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  71. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  72. package/dist/modes/interactive/components/theme-selector.js +0 -2
  73. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  74. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  75. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  76. package/dist/modes/interactive/components/tool-execution.js +6 -18
  77. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  78. package/dist/modes/interactive/components/tree-selector.js +13 -27
  79. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  80. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  81. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  82. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  83. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  84. package/dist/modes/interactive/interactive-mode.js +123 -92
  85. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  86. package/dist/modes/interactive/theme/theme.js +0 -5
  87. package/dist/modes/interactive/theme/theme.js.map +1 -1
  88. package/dist/modes/rpc/rpc-client.js +6 -7
  89. package/dist/modes/rpc/rpc-client.js.map +1 -1
  90. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
- ## [0.50.0] - 2026-01-26
5
+ ## [0.1.6] - 2026-02-12
6
6
 
7
7
  ### New Features
8
8
 
@@ -99,2151 +99,3 @@ There are multiple SDK breaking changes since v0.49.3. For the quickest migratio
99
99
  - Fixed session corruption when loading empty or invalid session files via `--session` flag ([#932](https://github.com/badlogic/indusagi-mono/issues/932) by [@armanddp](https://github.com/armanddp))
100
100
  - Fixed extension shortcuts not firing when extension also uses `setEditorComponent()` ([#947](https://github.com/badlogic/indusagi-mono/pull/947) by [@Perlence](https://github.com/Perlence))
101
101
  - Session "modified" time now uses last message timestamp instead of file mtime, so renaming doesn't reorder the recent list ([#863](https://github.com/badlogic/indusagi-mono/pull/863) by [@svkozak](https://github.com/svkozak))
102
-
103
- ## [0.49.3] - 2026-01-22
104
-
105
- ### Added
106
-
107
- - `markdown.codeBlockIndent` setting to customize code block indentation in rendered output ([#855](https://github.com/badlogic/indusagi-mono/pull/855) by [@terrorobe](https://github.com/terrorobe))
108
- - Added `inline-bash.ts` example extension for expanding `!{command}` patterns in prompts ([#881](https://github.com/badlogic/indusagi-mono/pull/881) by [@scutifer](https://github.com/scutifer))
109
- - Added `antigravity-image-gen.ts` example extension for AI image generation via Google Antigravity ([#893](https://github.com/badlogic/indusagi-mono/pull/893) by [@benvargas](https://github.com/benvargas))
110
- - Added `INDUSAGI_SHARE_VIEWER_URL` environment variable for custom share viewer URLs ([#889](https://github.com/badlogic/indusagi-mono/pull/889) by [@andresaraujo](https://github.com/andresaraujo))
111
- - Added Alt+Delete as hotkey for delete word forwards ([#878](https://github.com/badlogic/indusagi-mono/pull/878) by [@Perlence](https://github.com/Perlence))
112
-
113
- ### Changed
114
-
115
- - Tree selector: changed label filter shortcut from `l` to `Shift+L` so users can search for entries containing "l" ([#861](https://github.com/badlogic/indusagi-mono/pull/861) by [@mitsuhiko](https://github.com/mitsuhiko))
116
- - Fuzzy matching now scores consecutive matches higher for better search relevance ([#860](https://github.com/badlogic/indusagi-mono/pull/860) by [@mitsuhiko](https://github.com/mitsuhiko))
117
-
118
- ### Fixed
119
-
120
- - Fixed error messages showing hardcoded `~/.indusagi/agent/` paths instead of respecting `INDUSAGI_CODING_AGENT_DIR` ([#887](https://github.com/badlogic/indusagi-mono/pull/887) by [@aliou](https://github.com/aliou))
121
- - Fixed `write` tool not displaying errors in the UI when execution fails ([#856](https://github.com/badlogic/indusagi-mono/issues/856))
122
- - Fixed HTML export using default theme instead of user's active theme ([#870](https://github.com/badlogic/indusagi-mono/pull/870) by [@scutifer](https://github.com/scutifer))
123
- - Show session name in the footer and terminal / tab title ([#876](https://github.com/badlogic/indusagi-mono/pull/876) by [@scutifer](https://github.com/scutifer))
124
- - Fixed 256color fallback in Terminal.app to prevent color rendering issues ([#869](https://github.com/badlogic/indusagi-mono/pull/869) by [@Perlence](https://github.com/Perlence))
125
- - Fixed viewport tracking and cursor positioning for overlays and content shrink scenarios
126
- - Fixed autocomplete to allow searches with `/` characters (e.g., `folder1/folder2`) ([#882](https://github.com/badlogic/indusagi-mono/pull/882) by [@richardgill](https://github.com/richardgill))
127
- - Fixed autolinked emails displaying redundant `(mailto:...)` suffix ([#888](https://github.com/badlogic/indusagi-mono/pull/888) by [@terrorobe](https://github.com/terrorobe))
128
- - Fixed `@` file autocomplete adding space after directories, breaking continued autocomplete into subdirectories
129
-
130
- ## [0.49.2] - 2026-01-19
131
-
132
- ### Added
133
-
134
- - Added widget placement option for extension widgets via `widgetPlacement` in `indusagi.addWidget()` ([#850](https://github.com/badlogic/indusagi-mono/pull/850) by [@marckrenn](https://github.com/marckrenn))
135
- - 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/badlogic/indusagi-mono/issues/848))
136
- - Add "quiet startup" setting to `/settings` ([#847](https://github.com/badlogic/indusagi-mono/pull/847) by [@unexge](https://github.com/unexge))
137
-
138
- ### Changed
139
-
140
- - HTML export now includes JSONL download button, jump-to-last-message on click, and fixed missing labels ([#853](https://github.com/badlogic/indusagi-mono/pull/853) by [@mitsuhiko](https://github.com/mitsuhiko))
141
- - Improved error message for OAuth authentication failures (expired credentials, offline) instead of generic 'No API key found' ([#849](https://github.com/badlogic/indusagi-mono/pull/849) by [@zedrdave](https://github.com/zedrdave))
142
-
143
- ### Fixed
144
- - Fixed `/model` selector scope toggle so you can switch between all and scoped models when scoped models are saved ([#844](https://github.com/badlogic/indusagi-mono/issues/844))
145
- - Fixed OpenAI Responses 400 error "reasoning without following item" when replaying aborted turns ([#838](https://github.com/badlogic/indusagi-mono/pull/838))
146
- - Fixed indusagi exiting with code 0 when cancelling resume session selection
147
-
148
- ### Removed
149
-
150
- - Removed `strictResponsesPairing` compat option from models.json schema (no longer needed)
151
-
152
- ## [0.49.1] - 2026-01-18
153
-
154
- ### Added
155
-
156
- - Added `strictResponsesPairing` compat option for custom OpenAI Responses models on Azure ([#768](https://github.com/badlogic/indusagi-mono/pull/768) by [@prateekmedia](https://github.com/prateekmedia))
157
- - Session selector (`/resume`) now supports path display toggle (`Ctrl+P`) and session deletion (`Ctrl+D`) with inline confirmation ([#816](https://github.com/badlogic/indusagi-mono/pull/816) by [@w-winter](https://github.com/w-winter))
158
- - Added undo support in interactive mode with Ctrl+- hotkey. ([#831](https://github.com/badlogic/indusagi-mono/pull/831) by [@Perlence](https://github.com/Perlence))
159
-
160
- ### Changed
161
-
162
- - Share URLs now use hash fragments (`#`) instead of query strings (`?`) to prevent session IDs from being sent to buildwithindusagi.ai ([#829](https://github.com/badlogic/indusagi-mono/pull/829) by [@terrorobe](https://github.com/terrorobe))
163
- - 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/badlogic/indusagi-mono/pull/762) by [@cv](https://github.com/cv))
164
-
165
- ### Fixed
166
-
167
- - 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/badlogic/indusagi-mono/issues/827))
168
- - Fixed extension shortcut conflicts to respect user keybindings when built-in actions are remapped. ([#826](https://github.com/badlogic/indusagi-mono/pull/826) by [@richardgill](https://github.com/richardgill))
169
- - Fixed photon WASM loading in standalone compiled binaries.
170
- - Fixed tool call ID normalization for cross-provider handoffs (e.g., Codex to Antigravity Claude) ([#821](https://github.com/badlogic/indusagi-mono/issues/821))
171
-
172
- ## [0.49.0] - 2026-01-17
173
-
174
- ### Added
175
-
176
- - `indusagi.setLabel(entryId, label)` in ExtensionAPI for setting per-entry labels from extensions ([#806](https://github.com/badlogic/indusagi-mono/issues/806))
177
- - Export `keyHint`, `appKeyHint`, `editorKey`, `appKey`, `rawKeyHint` for extensions to format keybinding hints consistently ([#802](https://github.com/badlogic/indusagi-mono/pull/802) by [@dannote](https://github.com/dannote))
178
- - Exported `VERSION` from the package index and updated the custom-header example. ([#798](https://github.com/badlogic/indusagi-mono/pull/798) by [@tallshort](https://github.com/tallshort))
179
- - Added `showHardwareCursor` setting to control cursor visibility while still positioning it for IME support. ([#800](https://github.com/badlogic/indusagi-mono/pull/800) by [@ghoulr](https://github.com/ghoulr))
180
- - 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/badlogic/indusagi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
181
- - Added `ctx.compact()` and `ctx.getContextUsage()` to extension contexts for programmatic compaction and context usage checks.
182
- - Added documentation for delete word forward and kill ring keybindings in interactive mode. ([#810](https://github.com/badlogic/indusagi-mono/pull/810) by [@Perlence](https://github.com/Perlence))
183
-
184
- ### Changed
185
-
186
- - Updated the default system prompt wording to clarify the indusagi harness and documentation scope.
187
- - Simplified Codex system prompt handling to use the default system prompt directly for Codex instructions.
188
-
189
- ### Fixed
190
-
191
- - Fixed photon module failing to load in ESM context with "require is not defined" error ([#795](https://github.com/badlogic/indusagi-mono/pull/795) by [@dannote](https://github.com/dannote))
192
- - Fixed compaction UI not showing when extensions trigger compaction.
193
- - 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/badlogic/indusagi-mono/issues/812))
194
- - Fixed Bedrock Claude max_tokens handling to always exceed thinking budget tokens, preventing compaction failures. ([#797](https://github.com/badlogic/indusagi-mono/pull/797) by [@pjtf93](https://github.com/pjtf93))
195
- - Fixed Claude Code tool name normalization to match the Claude Code tool list case-insensitively and remove invalid mappings.
196
-
197
- ### Removed
198
-
199
- - Removed `indusagi-internal://` path resolution from the read tool.
200
-
201
- ## [0.48.0] - 2026-01-16
202
-
203
- ### Added
204
-
205
- - Added `quietStartup` setting to silence startup output (version header, loaded context info, model scope line). Changelog notifications are still shown. ([#777](https://github.com/badlogic/indusagi-mono/pull/777) by [@ribelo](https://github.com/ribelo))
206
- - Added `editorPaddingX` setting for horizontal padding in input editor (0-3, default: 0)
207
- - 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/badlogic/indusagi-mono/pull/790) by [@richardgill](https://github.com/richardgill))
208
- - Added bash-style argument slicing for prompt templates ([#770](https://github.com/badlogic/indusagi-mono/pull/770) by [@airtonix](https://github.com/airtonix))
209
- - Extension commands can provide argument auto-completions via `getArgumentCompletions` in `indusagi.registerCommand()` ([#775](https://github.com/badlogic/indusagi-mono/pull/775) by [@ribelo](https://github.com/ribelo))
210
- - Bash tool now displays the timeout value in the UI when a timeout is set ([#780](https://github.com/badlogic/indusagi-mono/pull/780) by [@dannote](https://github.com/dannote))
211
- - Export `getShellConfig` for extensions to detect user's shell environment ([#766](https://github.com/badlogic/indusagi-mono/pull/766) by [@dannote](https://github.com/dannote))
212
- - Added `thinkingText` and `selectedBg` to theme schema ([#763](https://github.com/badlogic/indusagi-mono/pull/763) by [@scutifer](https://github.com/scutifer))
213
- - `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/badlogic/indusagi-mono/pull/787) by [@mitsuhiko](https://github.com/mitsuhiko))
214
-
215
- ### Fixed
216
-
217
- - Fixed crash during auto-compaction when summarization fails (e.g., quota exceeded). Now displays error message instead of crashing ([#792](https://github.com/badlogic/indusagi-mono/issues/792))
218
- - Fixed `--session <UUID>` to search globally across projects if not found locally, with option to fork sessions from other projects ([#785](https://github.com/badlogic/indusagi-mono/pull/785) by [@ribelo](https://github.com/ribelo))
219
- - Fixed standalone binary WASM loading on Linux ([#784](https://github.com/badlogic/indusagi-mono/issues/784))
220
- - Fixed string numbers in tool arguments not being coerced to numbers during validation ([#786](https://github.com/badlogic/indusagi-mono/pull/786) by [@dannote](https://github.com/dannote))
221
- - Fixed `--no-extensions` flag not preventing extension discovery ([#776](https://github.com/badlogic/indusagi-mono/issues/776))
222
- - Fixed extension messages rendering twice on startup when `indusagi.sendMessage({ display: true })` is called during `session_start` ([#765](https://github.com/badlogic/indusagi-mono/pull/765) by [@dannote](https://github.com/dannote))
223
- - Fixed `INDUSAGI_CODING_AGENT_DIR` env var not expanding tilde (`~`) to home directory ([#778](https://github.com/badlogic/indusagi-mono/pull/778) by [@aliou](https://github.com/aliou))
224
- - Fixed session picker hint text overflow ([#764](https://github.com/badlogic/indusagi-mono/issues/764))
225
- - Fixed Kitty keyboard protocol shifted symbol keys (e.g., `@`, `?`) not working in editor ([#779](https://github.com/badlogic/indusagi-mono/pull/779) by [@iamd3vil](https://github.com/iamd3vil))
226
- - Fixed Bedrock tool call IDs causing API errors from invalid characters ([#781](https://github.com/badlogic/indusagi-mono/pull/781) by [@pjtf93](https://github.com/pjtf93))
227
-
228
- ### Changed
229
-
230
- - Hardware cursor is now disabled by default for better terminal compatibility. Set `INDUSAGI_HARDWARE_CURSOR=1` to enable (replaces `INDUSAGI_NO_HARDWARE_CURSOR=1` which disabled it).
231
-
232
- ## [0.47.0] - 2026-01-16
233
-
234
- ### Breaking Changes
235
-
236
- - 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/badlogic/indusagi-mono/issues/732))
237
-
238
- ### Added
239
-
240
- - **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_AINDUSAGI_KEY` and use `--provider openai-codex` or select a Codex model. ([#737](https://github.com/badlogic/indusagi-mono/pull/737))
241
- - `indusagi-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 indusagi.
242
- - 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/badlogic/indusagi-mono/pull/761) by [@nicobailon](https://github.com/nicobailon))
243
- - Extension example: `input-transform.ts` demonstrating input interception patterns (quick mode, instant commands, source routing) ([#761](https://github.com/badlogic/indusagi-mono/pull/761) by [@nicobailon](https://github.com/nicobailon))
244
- - 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/badlogic/indusagi-mono/pull/702) by [@aliou](https://github.com/aliou))
245
- - 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/badlogic/indusagi-mono/pull/747) by [@kaofelix](https://github.com/kaofelix))
246
-
247
- ### Changed
248
-
249
- - Skill commands (`/skill:name`) are now expanded in AgentSession instead of interactive mode. This enables skill commands in RPC and print modes, and allows the `input` event to intercept `/skill:name` before expansion.
250
-
251
- ### Fixed
252
-
253
- - 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/badlogic/indusagi-mono/issues/732))
254
- - Piped stdin now works correctly: `echo foo | indusagi` is equivalent to `indusagi -p foo`. When stdin is piped, print mode is automatically enabled since interactive mode requires a TTY ([#708](https://github.com/badlogic/indusagi-mono/issues/708))
255
- - 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/badlogic/indusagi-mono/pull/739) by [@w-winter](https://github.com/w-winter))
256
- - Added `upstream connect`, `connection refused`, and `reset before headers` patterns to auto-retry error detection ([#733](https://github.com/badlogic/indusagi-mono/issues/733))
257
- - Multi-line YAML frontmatter in skills and prompt templates now parses correctly. Centralized frontmatter parsing using the `yaml` library. ([#728](https://github.com/badlogic/indusagi-mono/pull/728) by [@richardgill](https://github.com/richardgill))
258
- - `ctx.shutdown()` now waits for pending UI renders to complete before exiting, ensuring notifications and final output are visible ([#756](https://github.com/badlogic/indusagi-mono/issues/756))
259
- - OpenAI Codex provider now retries on transient errors (429, 5xx, connection failures) with exponential backoff ([#733](https://github.com/badlogic/indusagi-mono/issues/733))
260
-
261
- ## [0.46.0] - 2026-01-15
262
-
263
- ### Fixed
264
-
265
- - 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/badlogic/indusagi-mono/pull/736) by [@ogulcancelik](https://github.com/ogulcancelik))
266
- - Show `bun install` instead of `npm install` in update notification when running under Bun ([#714](https://github.com/badlogic/indusagi-mono/pull/714) by [@dannote](https://github.com/dannote))
267
- - `/skill` prompts now include the skill path ([#711](https://github.com/badlogic/indusagi-mono/pull/711) by [@jblwilliams](https://github.com/jblwilliams))
268
- - Use configurable `expandTools` keybinding instead of hardcoded Ctrl+O ([#717](https://github.com/badlogic/indusagi-mono/pull/717) by [@dannote](https://github.com/dannote))
269
- - Compaction turn prefix summaries now merge correctly ([#738](https://github.com/badlogic/indusagi-mono/pull/738) by [@vsabavat](https://github.com/vsabavat))
270
- - Avoid unsigned Gemini 3 tool calls ([#741](https://github.com/badlogic/indusagi-mono/pull/741) by [@roshanasingh4](https://github.com/roshanasingh4))
271
- - Fixed signature support for non-Anthropic models in Amazon Bedrock provider ([#727](https://github.com/badlogic/indusagi-mono/pull/727) by [@unexge](https://github.com/unexge))
272
- - 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/badlogic/indusagi-mono/pull/718) by [@dannote](https://github.com/dannote))
273
-
274
- ### Added
275
-
276
- - 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/badlogic/indusagi-mono/pull/713) by [@dannote](https://github.com/dannote))
277
- - Support `APPEND_SYSTEM.md` to append instructions to the system prompt ([#716](https://github.com/badlogic/indusagi-mono/pull/716) by [@tallshort](https://github.com/tallshort))
278
- - 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/badlogic/indusagi-mono/pull/731) by [@ogulcancelik](https://github.com/ogulcancelik))
279
- - Export `getAgentDir` for extensions ([#749](https://github.com/badlogic/indusagi-mono/pull/749) by [@dannote](https://github.com/dannote))
280
- - Show loaded prompt templates on startup ([#743](https://github.com/badlogic/indusagi-mono/pull/743) by [@tallshort](https://github.com/tallshort))
281
- - MiniMax China (`minimax-cn`) provider support ([#725](https://github.com/badlogic/indusagi-mono/pull/725) by [@tallshort](https://github.com/tallshort))
282
- - `gpt-5.2-codex` models for GitHub Copilot and OpenCode Zen providers ([#734](https://github.com/badlogic/indusagi-mono/pull/734) by [@aadishv](https://github.com/aadishv))
283
-
284
- ### Changed
285
-
286
- - Replaced `wasm-vips` with `@silvia-odwyer/photon-node` for image processing ([#710](https://github.com/badlogic/indusagi-mono/pull/710) by [@can1357](https://github.com/can1357))
287
- - Extension example: `plan-mode/` shortcut changed from Shift+P to Ctrl+Alt+P to avoid conflict with typing capital P ([#746](https://github.com/badlogic/indusagi-mono/pull/746) by [@ferologics](https://github.com/ferologics))
288
- - UI keybinding hints now respect configured keybindings across components ([#724](https://github.com/badlogic/indusagi-mono/pull/724) by [@dannote](https://github.com/dannote))
289
- - CLI process title is now set to `indusagi` for easier process identification ([#742](https://github.com/badlogic/indusagi-mono/pull/742) by [@richardgill](https://github.com/richardgill))
290
-
291
- ## [0.45.7] - 2026-01-13
292
-
293
- ### Added
294
-
295
- - Exported `highlightCode` and `getLanguageFromPath` for extensions ([#703](https://github.com/badlogic/indusagi-mono/pull/703) by [@dannote](https://github.com/dannote))
296
-
297
- ## [0.45.6] - 2026-01-13
298
-
299
- ### Added
300
-
301
- - `ctx.ui.custom()` now accepts `overlayOptions` for overlay positioning and sizing (anchor, margins, offsets, percentages, absolute positioning) ([#667](https://github.com/badlogic/indusagi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
302
- - `ctx.ui.custom()` now accepts `onHandle` callback to receive the `OverlayHandle` for controlling overlay visibility ([#667](https://github.com/badlogic/indusagi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
303
- - Extension example: `overlay-qa-tests.ts` with 10 commands for testing overlay positioning, animation, and toggle scenarios ([#667](https://github.com/badlogic/indusagi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
304
- - Extension example: `doom-overlay/` - DOOM game running as an overlay at 35 FPS (auto-downloads WAD on first run) ([#667](https://github.com/badlogic/indusagi-mono/pull/667) by [@nicobailon](https://github.com/nicobailon))
305
-
306
- ## [0.45.5] - 2026-01-13
307
-
308
- ### Fixed
309
-
310
- - Skip changelog display on fresh install (only show on upgrades)
311
-
312
- ## [0.45.4] - 2026-01-13
313
-
314
- ### Changed
315
-
316
- - Light theme colors adjusted for WCAG AA compliance (4.5:1 contrast ratio against white backgrounds)
317
- - 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/badlogic/indusagi-mono/issues/696))
318
-
319
- ### Added
320
-
321
- - Extension example: `summarize.ts` for summarizing conversations using custom UI and an external model ([#684](https://github.com/badlogic/indusagi-mono/pull/684) by [@scutifer](https://github.com/scutifer))
322
- - Extension example: `question.ts` enhanced with custom UI for asking user questions ([#693](https://github.com/badlogic/indusagi-mono/pull/693) by [@ferologics](https://github.com/ferologics))
323
- - Extension example: `plan-mode/` enhanced with explicit step tracking and progress widget ([#694](https://github.com/badlogic/indusagi-mono/pull/694) by [@ferologics](https://github.com/ferologics))
324
- - Extension example: `questionnaire.ts` for multi-question input with tab bar navigation ([#695](https://github.com/badlogic/indusagi-mono/pull/695) by [@ferologics](https://github.com/ferologics))
325
- - Experimental Vercel AI Gateway provider support: set `AI_GATEWAY_AINDUSAGI_KEY` and use `--provider vercel-ai-gateway`. Token usage is currently reported incorrectly by Anthropic Messages compatible endpoint. ([#689](https://github.com/badlogic/indusagi-mono/pull/689) by [@timolins](https://github.com/timolins))
326
-
327
- ### Fixed
328
-
329
- - Fix API key resolution after model switches by using provider argument ([#691](https://github.com/badlogic/indusagi-mono/pull/691) by [@joshp123](https://github.com/joshp123))
330
- - Fixed z.ai thinking/reasoning: thinking toggle now correctly enables/disables thinking for z.ai models ([#688](https://github.com/badlogic/indusagi-mono/issues/688))
331
- - 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/badlogic/indusagi-mono/issues/681))
332
- - 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/badlogic/indusagi-mono/issues/681))
333
-
334
- ## [0.45.3] - 2026-01-13
335
-
336
- ## [0.45.2] - 2026-01-13
337
-
338
- ### Fixed
339
-
340
- - Extensions now load correctly in compiled Bun binary using `@mariozechner/jiti` fork with `virtualModules` support. Bundled packages (`@sinclair/typebox`, `indusagi-tui`, `indusagi-ai`, `indusagi-coding-agent`) are accessible to extensions without filesystem node_modules.
341
-
342
- ## [0.45.1] - 2026-01-13
343
-
344
- ### Changed
345
-
346
- - `/share` now outputs `buildwithindusagi.ai` session preview URLs instead of `shittycodingagent.ai`
347
-
348
- ## [0.45.0] - 2026-01-13
349
-
350
- ### Added
351
-
352
- - MiniMax provider support: set `MINIMAX_AINDUSAGI_KEY` and use `minimax/MiniMax-M2.1` ([#656](https://github.com/badlogic/indusagi-mono/pull/656) by [@dannote](https://github.com/dannote))
353
- - `/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/badlogic/indusagi-mono/pull/676) by [@thomasmhr](https://github.com/thomasmhr))
354
- - Amazon Bedrock provider support (experimental, tested with Anthropic Claude models only) ([#494](https://github.com/badlogic/indusagi-mono/pull/494) by [@unexge](https://github.com/unexge))
355
- - Extension example: `sandbox/` for OS-level bash sandboxing using `@anthropic-ai/sandbox-runtime` with per-project config ([#673](https://github.com/badlogic/indusagi-mono/pull/673) by [@dannote](https://github.com/dannote))
356
- - Print mode JSON output now emits the session header as the first line.
357
-
358
- ## [0.44.0] - 2026-01-12
359
-
360
- ### Breaking Changes
361
-
362
- - `indusagi.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/badlogic/indusagi-mono/pull/648) by [@carsonfarmer](https://github.com/carsonfarmer))
363
-
364
- ### Added
365
-
366
- - 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 `indusagi.setSessionName()` and `indusagi.getSessionName()`. ([#650](https://github.com/badlogic/indusagi-mono/pull/650) by [@scutifer](https://github.com/scutifer))
367
- - Extension example: `notify.ts` for desktop notifications via OSC 777 escape sequence ([#658](https://github.com/badlogic/indusagi-mono/pull/658) by [@ferologics](https://github.com/ferologics))
368
- - Inline hint for queued messages showing the `Alt+Up` restore shortcut ([#657](https://github.com/badlogic/indusagi-mono/pull/657) by [@tmustier](https://github.com/tmustier))
369
- - Page-up/down navigation in `/resume` session selector to jump by 5 items ([#662](https://github.com/badlogic/indusagi-mono/pull/662) by [@aliou](https://github.com/aliou))
370
- - Fuzzy search in `/settings` menu: type to filter settings by label ([#643](https://github.com/badlogic/indusagi-mono/pull/643) by [@ninlds](https://github.com/ninlds))
371
-
372
- ### Fixed
373
-
374
- - Session selector now stays open when current folder has no sessions, allowing Tab to switch to "all" scope ([#661](https://github.com/badlogic/indusagi-mono/pull/661) by [@aliou](https://github.com/aliou))
375
- - Extensions using theme utilities like `getSettingsListTheme()` now work in dev mode with tsx
376
-
377
- ## [0.43.0] - 2026-01-11
378
-
379
- ### Breaking Changes
380
-
381
- - 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/badlogic/indusagi-mono/pull/642) by [@mitsuhiko](https://github.com/mitsuhiko))
382
- - Renamed `/branch` command to `/fork` ([#641](https://github.com/badlogic/indusagi-mono/issues/641))
383
- - RPC: `branch` → `fork`, `get_branch_messages` → `get_fork_messages`
384
- - SDK: `branch()` → `fork()`, `getBranchMessages()` → `getForkMessages()`
385
- - AgentSession: `branch()` → `fork()`, `getUserMessagesForBranching()` → `getUserMessagesForForking()`
386
- - Extension events: `session_before_branch` → `session_before_fork`, `session_branch` → `session_fork`
387
- - Settings: `doubleEscapeAction: "branch" | "tree"` → `"fork" | "tree"`
388
- - `SessionManager.list()` and `SessionManager.listAll()` are now async, returning `Promise<SessionInfo[]>`. Callers must await them. ([#620](https://github.com/badlogic/indusagi-mono/pull/620) by [@tmustier](https://github.com/tmustier))
389
-
390
- ### Added
391
- - `/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/badlogic/indusagi-mono/pull/620) by [@tmustier](https://github.com/tmustier))
392
- - `SessionManager.list()` and `SessionManager.listAll()` accept optional `onProgress` callback for progress updates
393
- - `SessionInfo.cwd` field containing the session's working directory (empty string for old sessions)
394
- - `SessionListProgress` type export for progress callbacks
395
- - `/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/badlogic/indusagi-mono/pull/626) by [@CarlosGtrz](https://github.com/CarlosGtrz))
396
- - `model_select` extension hook fires when model changes via `/model`, model cycling, or session restore with `source` field and `previousModel` ([#628](https://github.com/badlogic/indusagi-mono/pull/628) by [@marckrenn](https://github.com/marckrenn))
397
- - `ctx.ui.setWorkingMessage()` extension API to customize the "Working..." message during streaming ([#625](https://github.com/badlogic/indusagi-mono/pull/625) by [@nicobailon](https://github.com/nicobailon))
398
- - 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/badlogic/indusagi-mono/pull/630) by [@Dwsy](https://github.com/Dwsy))
399
- - Slash command autocomplete now uses fuzzy matching (type `/skbra` to match `/skill:brave-search`)
400
- - `/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/badlogic/indusagi-mono/pull/642) by [@mitsuhiko](https://github.com/mitsuhiko))
401
-
402
- ### Fixed
403
-
404
- - Missing spacer between assistant message and text editor ([#655](https://github.com/badlogic/indusagi-mono/issues/655))
405
- - Session picker respects custom keybindings when using `--resume` ([#633](https://github.com/badlogic/indusagi-mono/pull/633) by [@aos](https://github.com/aos))
406
- - 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/badlogic/indusagi-mono/pull/634) by [@ogulcancelik](https://github.com/ogulcancelik))
407
- - 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.
408
- - Extension loading errors are now displayed to the user instead of being silently ignored ([#639](https://github.com/badlogic/indusagi-mono/pull/639) by [@aliou](https://github.com/aliou))
409
-
410
- ## [0.42.5] - 2026-01-11
411
-
412
- ### Fixed
413
-
414
- - Reduced flicker by only re-rendering changed lines ([#617](https://github.com/badlogic/indusagi-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.
415
- - Cursor position tracking when content shrinks with unchanged remaining lines
416
- - TUI renders with wrong dimensions after suspend/resume if terminal was resized while suspended ([#599](https://github.com/badlogic/indusagi-mono/issues/599))
417
- - Pasted content containing Kitty key release patterns (e.g., `:3F` in MAC addresses) was incorrectly filtered out ([#623](https://github.com/badlogic/indusagi-mono/pull/623) by [@ogulcancelik](https://github.com/ogulcancelik))
418
-
419
- ## [0.42.4] - 2026-01-10
420
-
421
- ### Fixed
422
-
423
- - Bash output expanded hint now says "(ctrl+o to collapse)" ([#610](https://github.com/badlogic/indusagi-mono/pull/610) by [@tallshort](https://github.com/tallshort))
424
- - Fixed UTF-8 text corruption in remote bash execution (SSH, containers) by using streaming TextDecoder ([#608](https://github.com/badlogic/indusagi-mono/issues/608))
425
-
426
- ## [0.42.3] - 2026-01-10
427
-
428
- ### Changed
429
-
430
- - OpenAI Codex: updated to use bundled system prompt from upstream
431
-
432
- ## [0.42.2] - 2026-01-10
433
-
434
- ### Added
435
-
436
- - `/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/badlogic/indusagi-mono/pull/587) by [@zedrdave](https://github.com/zedrdave))
437
- - `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/badlogic/indusagi-mono/pull/600) by [@nicobailon](https://github.com/nicobailon))
438
- - `Alt+Up` hotkey to restore queued steering/follow-up messages back into the editor without aborting the current run ([#604](https://github.com/badlogic/indusagi-mono/pull/604) by [@tmustier](https://github.com/tmustier))
439
-
440
- ### Fixed
441
-
442
- - Fixed LM Studio compatibility for OpenAI Responses tool strict mapping in the ai provider ([#598](https://github.com/badlogic/indusagi-mono/pull/598) by [@gnattu](https://github.com/gnattu))
443
-
444
- ## [0.42.1] - 2026-01-09
445
-
446
- ### Fixed
447
-
448
- - Symlinked directories in `prompts/` folders are now followed when loading prompt templates ([#601](https://github.com/badlogic/indusagi-mono/pull/601) by [@aliou](https://github.com/aliou))
449
-
450
- ## [0.42.0] - 2026-01-09
451
-
452
- ### Added
453
-
454
- - Added OpenCode Zen provider support. Set `OPENCODE_AINDUSAGI_KEY` env var and use `opencode/<model-id>` (e.g., `opencode/claude-opus-4-5`).
455
-
456
- ## [0.41.0] - 2026-01-09
457
-
458
- ### Added
459
-
460
- - Anthropic OAuth support is back! Use `/login` to authenticate with your Claude Pro/Max subscription.
461
-
462
- ## [0.40.1] - 2026-01-09
463
-
464
- ### Removed
465
-
466
- - Anthropic OAuth support (`/login`). Use API keys instead.
467
-
468
- ## [0.40.0] - 2026-01-08
469
-
470
- ### Added
471
-
472
- - Documentation on component invalidation and theme changes in `docs/tui.md`
473
-
474
- ### Fixed
475
-
476
- - Components now properly rebuild their content on theme change (tool executions, assistant messages, bash executions, custom messages, branch/compaction summaries)
477
-
478
- ## [0.39.1] - 2026-01-08
479
-
480
- ### Fixed
481
-
482
- - `setTheme()` now triggers a full rerender so previously rendered components update with the new theme colors
483
- - `mac-system-theme.ts` example now polls every 2 seconds and uses `osascript` for real-time macOS appearance detection
484
-
485
- ## [0.39.0] - 2026-01-08
486
-
487
- ### Breaking Changes
488
-
489
- - `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/badlogic/indusagi-mono/issues/575))
490
- - `discoverSkills()` now returns `{ skills: Skill[], warnings: SkillWarning[] }` instead of `Skill[]`. This allows callers to handle skill loading warnings. ([#577](https://github.com/badlogic/indusagi-mono/pull/577) by [@cv](https://github.com/cv))
491
-
492
- ### Added
493
-
494
- - `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/badlogic/indusagi-mono/pull/576))
495
- - `--no-tools` flag to disable all built-in tools, allowing extension-only tool setups ([#557](https://github.com/badlogic/indusagi-mono/pull/557) by [@cv](https://github.com/cv))
496
- - Pluggable operations for built-in tools enabling remote execution via SSH or other transports ([#564](https://github.com/badlogic/indusagi-mono/issues/564)). Interfaces: `ReadOperations`, `WriteOperations`, `EditOperations`, `BashOperations`, `LsOperations`, `GrepOperations`, `FindOperations`
497
- - `user_bash` event for intercepting user `!`/`!!` commands, allowing extensions to redirect to remote systems ([#528](https://github.com/badlogic/indusagi-mono/issues/528))
498
- - `setActiveTools()` in ExtensionAPI for dynamic tool management
499
- - Built-in renderers used automatically for tool overrides without custom `renderCall`/`renderResult`
500
- - `ssh.ts` example: remote tool execution via `--ssh user@host:/path`
501
- - `interactive-shell.ts` example: run interactive commands (vim, git rebase, htop) with full terminal access via `!i` prefix or auto-detection
502
- - Wayland clipboard support for `/copy` command using wl-copy with xclip/xsel fallback ([#570](https://github.com/badlogic/indusagi-mono/pull/570) by [@OgulcanCelik](https://github.com/OgulcanCelik))
503
- - **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/badlogic/indusagi-mono/pull/558) by [@nicobailon](https://github.com/nicobailon))
504
- - `AgentSession.skills` and `AgentSession.skillWarnings` properties to access loaded skills without rediscovery ([#577](https://github.com/badlogic/indusagi-mono/pull/577) by [@cv](https://github.com/cv))
505
-
506
- ### Fixed
507
-
508
- - 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/badlogic/indusagi-mono/issues/543))
509
- - Update notification for bun binary installs now shows release download URL instead of npm command ([#567](https://github.com/badlogic/indusagi-mono/pull/567) by [@ferologics](https://github.com/ferologics))
510
- - ESC key now works during "Working..." state after auto-retry ([#568](https://github.com/badlogic/indusagi-mono/pull/568) by [@tmustier](https://github.com/tmustier))
511
- - Abort messages now show correct retry attempt count (e.g., "Aborted after 2 retry attempts") ([#568](https://github.com/badlogic/indusagi-mono/pull/568) by [@tmustier](https://github.com/tmustier))
512
- - Fixed Antigravity provider returning 429 errors despite available quota ([#571](https://github.com/badlogic/indusagi-mono/pull/571) by [@ben-vargas](https://github.com/ben-vargas))
513
- - 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/badlogic/indusagi-mono/issues/561))
514
- - `--no-skills` flag now correctly prevents skills from loading in interactive mode ([#577](https://github.com/badlogic/indusagi-mono/pull/577) by [@cv](https://github.com/cv))
515
-
516
- ## [0.38.0] - 2026-01-08
517
-
518
- ### Breaking Changes
519
-
520
- - `ctx.ui.custom()` factory signature changed from `(tui, theme, done)` to `(tui, theme, keybindings, done)` for keybinding access in custom components
521
- - `LoadedExtension` type renamed to `Extension`
522
- - `LoadExtensionsResult.setUIContext()` removed, replaced with `runtime: ExtensionRuntime`
523
- - `ExtensionRunner` constructor now requires `runtime: ExtensionRuntime` as second parameter
524
- - `ExtensionRunner.initialize()` signature changed from options object to positional params `(actions, contextActions, commandContextActions?, uiContext?)`
525
- - `ExtensionRunner.getHasUI()` renamed to `hasUI()`
526
- - 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/badlogic/indusagi-mono/pull/536) by [@ghoulr](https://github.com/ghoulr))
527
-
528
- ### Added
529
-
530
- - `--no-extensions` flag to disable extension discovery while still allowing explicit `-e` paths ([#524](https://github.com/badlogic/indusagi-mono/pull/524) by [@cv](https://github.com/cv))
531
- - SDK: `InteractiveMode`, `runPrintMode()`, `runRpcMode()` exported for building custom run modes. See `docs/sdk.md`.
532
- - `INDUSAGI_SKIP_VERSION_CHECK` environment variable to disable new version notifications at startup ([#549](https://github.com/badlogic/indusagi-mono/pull/549) by [@aos](https://github.com/aos))
533
- - `thinkingBudgets` setting to customize token budgets per thinking level for token-based providers ([#529](https://github.com/badlogic/indusagi-mono/pull/529) by [@melihmucuk](https://github.com/melihmucuk))
534
- - 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/badlogic/indusagi-mono/pull/522) by [@nicobailon](https://github.com/nicobailon))
535
- - Extensions can now provide custom editor components via `ctx.ui.setEditorComponent()`. See `examples/extensions/modal-editor.ts` and `docs/tui.md` Pattern 7.
536
- - Extension factories can now be async, enabling dynamic imports and lazy-loaded dependencies ([#513](https://github.com/badlogic/indusagi-mono/pull/513) by [@austinm911](https://github.com/austinm911))
537
- - `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/badlogic/indusagi-mono/pull/542) by [@kaofelix](https://github.com/kaofelix))
538
-
539
- ### Fixed
540
-
541
- - Default thinking level from settings now applies correctly when `enabledModels` is configured ([#540](https://github.com/badlogic/indusagi-mono/pull/540) by [@ferologics](https://github.com/ferologics))
542
- - External edits to `settings.json` while indusagi is running are now preserved when indusagi saves settings ([#527](https://github.com/badlogic/indusagi-mono/pull/527) by [@ferologics](https://github.com/ferologics))
543
- - Overflow-based compaction now skips if error came from a different model or was already handled by a previous compaction ([#535](https://github.com/badlogic/indusagi-mono/pull/535) by [@mitsuhiko](https://github.com/mitsuhiko))
544
- - OpenAI Codex context window reduced from 400k to 272k tokens to match Codex CLI defaults and prevent 400 errors ([#536](https://github.com/badlogic/indusagi-mono/pull/536) by [@ghoulr](https://github.com/ghoulr))
545
- - Context overflow detection now recognizes `context_length_exceeded` errors.
546
- - Key presses no longer dropped when input is batched over SSH ([#538](https://github.com/badlogic/indusagi-mono/issues/538))
547
- - Clipboard image support now works on Alpine Linux and other musl-based distros ([#533](https://github.com/badlogic/indusagi-mono/issues/533))
548
-
549
- ## [0.37.8] - 2026-01-07
550
-
551
- ## [0.37.7] - 2026-01-07
552
-
553
- ## [0.37.6] - 2026-01-06
554
-
555
- ### Added
556
-
557
- - 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/badlogic/indusagi-mono/issues/474))
558
- - HTML export now shows bridge prompts in model change messages for Codex sessions ([#510](https://github.com/badlogic/indusagi-mono/pull/510) by [@mitsuhiko](https://github.com/mitsuhiko))
559
-
560
- ## [0.37.5] - 2026-01-06
561
-
562
- ### Added
563
-
564
- - ExtensionAPI: `setModel()`, `getThinkingLevel()`, `setThinkingLevel()` methods for extensions to change model and thinking level at runtime ([#509](https://github.com/badlogic/indusagi-mono/issues/509))
565
- - Exported truncation utilities for custom tools: `truncateHead`, `truncateTail`, `truncateLine`, `formatSize`, `DEFAULT_MAX_BYTES`, `DEFAULT_MAX_LINES`, `TruncationOptions`, `TruncationResult`
566
- - New example `truncated-tool.ts` demonstrating proper output truncation with custom rendering for extensions
567
- - New example `preset.ts` demonstrating preset configurations with model/thinking/tools switching ([#347](https://github.com/badlogic/indusagi-mono/issues/347))
568
- - Documentation for output truncation best practices in `docs/extensions.md`
569
- - 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`
570
- - `docs/tui.md`: Common Patterns section with copy-paste code for SelectList, BorderedLoader, SettingsList, setStatus, setWidget, setFooter
571
- - `docs/tui.md`: Key Rules section documenting critical patterns for extension UI development
572
- - `docs/extensions.md`: Exhaustive example links for all ExtensionAPI methods and events
573
- - System prompt now references `docs/tui.md` for TUI component development
574
-
575
- ## [0.37.4] - 2026-01-06
576
-
577
- ### Added
578
-
579
- - Session picker (`indusagi -r`) and `--session` flag now support searching/resuming by session ID (UUID prefix) ([#495](https://github.com/badlogic/indusagi-mono/issues/495) by [@arunsathiya](https://github.com/arunsathiya))
580
- - Extensions can now replace the startup header with `ctx.ui.setHeader()`, see `examples/extensions/custom-header.ts` ([#500](https://github.com/badlogic/indusagi-mono/pull/500) by [@tudoroancea](https://github.com/tudoroancea))
581
-
582
- ### Changed
583
-
584
- - Startup help text: fixed misleading "ctrl+k to delete line" to "ctrl+k to delete to end"
585
- - Startup help text and `/hotkeys`: added `!!` shortcut for running bash without adding output to context
586
-
587
- ### Fixed
588
-
589
- - Queued steering/follow-up messages no longer wipe unsent editor input ([#503](https://github.com/badlogic/indusagi-mono/pull/503) by [@tmustier](https://github.com/tmustier))
590
- - OAuth token refresh failure no longer crashes app at startup, allowing user to `/login` to re-authenticate ([#498](https://github.com/badlogic/indusagi-mono/issues/498))
591
-
592
- ## [0.37.3] - 2026-01-06
593
-
594
- ### Added
595
-
596
- - Extensions can now replace the footer with `ctx.ui.setFooter()`, see `examples/extensions/custom-footer.ts` ([#481](https://github.com/badlogic/indusagi-mono/issues/481))
597
- - Session ID is now forwarded to LLM providers for session-based caching (used by OpenAI Codex for prompt caching).
598
- - Added `blockImages` setting to prevent images from being sent to LLM providers ([#492](https://github.com/badlogic/indusagi-mono/pull/492) by [@jsinge97](https://github.com/jsinge97))
599
- - Extensions can now send user messages via `indusagi.sendUserMessage()` ([#483](https://github.com/badlogic/indusagi-mono/issues/483))
600
-
601
- ### Fixed
602
-
603
- - Add `minimatch` as a direct dependency for explicit imports.
604
- - Status bar now shows correct git branch when running in a git worktree ([#490](https://github.com/badlogic/indusagi-mono/pull/490) by [@kcosr](https://github.com/kcosr))
605
- - Interactive mode: Ctrl+V clipboard image paste now works on Wayland sessions by using `wl-paste` with `xclip` fallback ([#488](https://github.com/badlogic/indusagi-mono/pull/488) by [@ghoulr](https://github.com/ghoulr))
606
-
607
- ## [0.37.2] - 2026-01-05
608
-
609
- ### Fixed
610
-
611
- - Extension directories in `settings.json` now respect `package.json` manifests, matching global extension behavior ([#480](https://github.com/badlogic/indusagi-mono/pull/480) by [@prateekmedia](https://github.com/prateekmedia))
612
- - Share viewer: deep links now scroll to the target message when opened via `/share`
613
- - Bash tool now handles spawn errors gracefully instead of crashing the agent (missing cwd, invalid shell path) ([#479](https://github.com/badlogic/indusagi-mono/pull/479) by [@robinwander](https://github.com/robinwander))
614
-
615
- ## [0.37.1] - 2026-01-05
616
-
617
- ### Fixed
618
-
619
- - Share viewer: copy-link buttons now generate correct URLs when session is viewed via `/share` (iframe context)
620
-
621
- ## [0.37.0] - 2026-01-05
622
-
623
- ### Added
624
-
625
- - Share viewer: copy-link button on messages to share URLs that navigate directly to a specific message ([#477](https://github.com/badlogic/indusagi-mono/pull/477) by [@lockmeister](https://github.com/lockmeister))
626
- - Extension example: add `claude-rules` to load `.claude/rules/` entries into the system prompt ([#461](https://github.com/badlogic/indusagi-mono/pull/461) by [@vaayne](https://github.com/vaayne))
627
- - Headless OAuth login: all providers now show paste input for manual URL/code entry, works over SSH without DISPLAY ([#428](https://github.com/badlogic/indusagi-mono/pull/428) by [@ben-vargas](https://github.com/ben-vargas), [#468](https://github.com/badlogic/indusagi-mono/pull/468) by [@crcatala](https://github.com/crcatala))
628
-
629
- ### Changed
630
-
631
- - OAuth login UI now uses dedicated dialog component with consistent borders
632
- - Assume truecolor support for all terminals except `dumb`, empty, or `linux` (fixes colors over SSH)
633
- - 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/badlogic/indusagi-mono/pull/472) by [@ben-vargas](https://github.com/ben-vargas))
634
-
635
- ### Fixed
636
-
637
- - 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/badlogic/indusagi-mono/pull/476) by [@tmustier](https://github.com/tmustier))
638
- - Managed binaries (`fd`, `rg`) now stored in `~/.indusagi/agent/bin/` instead of `tools/`, eliminating false deprecation warnings ([#470](https://github.com/badlogic/indusagi-mono/pull/470) by [@mcinteerj](https://github.com/mcinteerj))
639
- - Extensions defined in `settings.json` were not loaded ([#463](https://github.com/badlogic/indusagi-mono/pull/463) by [@melihmucuk](https://github.com/melihmucuk))
640
- - OAuth refresh no longer logs users out when multiple indusagi instances are running ([#466](https://github.com/badlogic/indusagi-mono/pull/466) by [@Cursivez](https://github.com/Cursivez))
641
- - Migration warnings now ignore `fd.exe` and `rg.exe` in `tools/` on Windows ([#458](https://github.com/badlogic/indusagi-mono/pull/458) by [@carlosgtrz](https://github.com/carlosgtrz))
642
- - CI: add `examples/extensions/with-deps` to workspaces to fix typecheck ([#467](https://github.com/badlogic/indusagi-mono/pull/467) by [@aliou](https://github.com/aliou))
643
- - SDK: passing `extensions: []` now disables extension discovery as documented ([#465](https://github.com/badlogic/indusagi-mono/pull/465) by [@aliou](https://github.com/aliou))
644
-
645
- ## [0.36.0] - 2026-01-05
646
-
647
- ### Added
648
-
649
- - Experimental: OpenAI Codex OAuth provider support: access Codex models via ChatGPT Plus/Pro subscription using `/login openai-codex` ([#451](https://github.com/badlogic/indusagi-mono/pull/451) by [@kim0](https://github.com/kim0))
650
-
651
- ## [0.35.0] - 2026-01-05
652
-
653
- This release unifies hooks and custom tools into a single "extensions" system and renames "slash commands" to "prompt templates". ([#454](https://github.com/badlogic/indusagi-mono/issues/454))
654
-
655
- **Before migrating, read:**
656
-
657
- - [docs/extensions.md](docs/extensions.md) - Full API reference
658
- - [README.md](README.md) - Extensions section with examples
659
- - [examples/extensions/](examples/extensions/) - Working examples
660
-
661
- ### Extensions Migration
662
-
663
- Hooks and custom tools are now unified as **extensions**. Both were TypeScript modules exporting a factory function that receives an API object. Now there's one concept, one discovery location, one CLI flag, one settings.json entry.
664
-
665
- **Automatic migration:**
666
-
667
- - `commands/` directories are automatically renamed to `prompts/` on startup (both `~/.indusagi/agent/commands/` and `.indusagi/commands/`)
668
-
669
- **Manual migration required:**
670
-
671
- 1. Move files from `hooks/` and `tools/` directories to `extensions/` (deprecation warnings shown on startup)
672
- 2. Update imports and type names in your extension code
673
- 3. Update `settings.json` if you have explicit hook and custom tool paths configured
674
-
675
- **Directory changes:**
676
-
677
- ```
678
- # Before
679
- ~/.indusagi/agent/hooks/*.ts → ~/.indusagi/agent/extensions/*.ts
680
- ~/.indusagi/agent/tools/*.ts → ~/.indusagi/agent/extensions/*.ts
681
- .indusagi/hooks/*.ts → .indusagi/extensions/*.ts
682
- .indusagi/tools/*.ts → .indusagi/extensions/*.ts
683
- ```
684
-
685
- **Extension discovery rules** (in `extensions/` directories):
686
-
687
- 1. **Direct files:** `extensions/*.ts` or `*.js` → loaded directly
688
- 2. **Subdirectory with index:** `extensions/myext/index.ts` → loaded as single extension
689
- 3. **Subdirectory with package.json:** `extensions/myext/package.json` with `"indusagi"` field → loads declared paths
690
-
691
- ```json
692
- // extensions/my-package/package.json
693
- {
694
- "name": "my-extension-package",
695
- "dependencies": { "zod": "^3.0.0" },
696
- "indusagi": {
697
- "extensions": ["./src/main.ts", "./src/tools.ts"]
698
- }
699
- }
700
- ```
701
-
702
- No recursion beyond one level. Complex packages must use the `package.json` manifest. Dependencies are resolved via jiti, and extensions can be published to and installed from npm.
703
-
704
- **Type renames:**
705
-
706
- - `HookAPI` → `ExtensionAPI`
707
- - `HookContext` → `ExtensionContext`
708
- - `HookCommandContext` → `ExtensionCommandContext`
709
- - `HookUIContext` → `ExtensionUIContext`
710
- - `CustomToolAPI` → `ExtensionAPI` (merged)
711
- - `CustomToolContext` → `ExtensionContext` (merged)
712
- - `CustomToolUIContext` → `ExtensionUIContext`
713
- - `CustomTool` → `ToolDefinition`
714
- - `CustomToolFactory` → `ExtensionFactory`
715
- - `HookMessage` → `CustomMessage`
716
-
717
- **Import changes:**
718
-
719
- ```typescript
720
- // Before (hook)
721
- import type { HookAPI, HookContext } from "indusagi-coding-agent";
722
- export default function (indusagi: HookAPI) { ... }
723
-
724
- // Before (custom tool)
725
- import type { CustomToolFactory } from "indusagi-coding-agent";
726
- const factory: CustomToolFactory = (indusagi) => ({ name: "my_tool", ... });
727
- export default factory;
728
-
729
- // After (both are now extensions)
730
- import type { ExtensionAPI } from "indusagi-coding-agent";
731
- export default function (indusagi: ExtensionAPI) {
732
- indusagi.on("tool_call", async (event, ctx) => { ... });
733
- indusagi.registerTool({ name: "my_tool", ... });
734
- }
735
- ```
736
-
737
- **Custom tools now have full context access.** Tools registered via `indusagi.registerTool()` now receive the same `ctx` object that event handlers receive. Previously, custom tools had limited context. Now all extension code shares the same capabilities:
738
-
739
- - `indusagi.registerTool()` - Register tools the LLM can call
740
- - `indusagi.registerCommand()` - Register commands like `/mycommand`
741
- - `indusagi.registerShortcut()` - Register keyboard shortcuts (shown in `/hotkeys`)
742
- - `indusagi.registerFlag()` - Register CLI flags (shown in `--help`)
743
- - `indusagi.registerMessageRenderer()` - Custom TUI rendering for message types
744
- - `indusagi.on()` - Subscribe to lifecycle events (tool_call, session_start, etc.)
745
- - `indusagi.sendMessage()` - Inject messages into the conversation
746
- - `indusagi.appendEntry()` - Persist custom data in session (survives restart/branch)
747
- - `indusagi.exec()` - Run shell commands
748
- - `indusagi.getActiveTools()` / `indusagi.setActiveTools()` - Dynamic tool enable/disable
749
- - `indusagi.getAllTools()` - List all available tools
750
- - `indusagi.events` - Event bus for cross-extension communication
751
- - `ctx.ui.confirm()` / `select()` / `input()` - User prompts
752
- - `ctx.ui.notify()` - Toast notifications
753
- - `ctx.ui.setStatus()` - Persistent status in footer (multiple extensions can set their own)
754
- - `ctx.ui.setWidget()` - Widget display above editor
755
- - `ctx.ui.setTitle()` - Set terminal window title
756
- - `ctx.ui.custom()` - Full TUI component with keyboard handling
757
- - `ctx.ui.editor()` - Multi-line text editor with external editor support
758
- - `ctx.sessionManager` - Read session entries, get branch history
759
-
760
- **Settings changes:**
761
-
762
- ```json
763
- // Before
764
- {
765
- "hooks": ["./my-hook.ts"],
766
- "customTools": ["./my-tool.ts"]
767
- }
768
-
769
- // After
770
- {
771
- "extensions": ["./my-extension.ts"]
772
- }
773
- ```
774
-
775
- **CLI changes:**
776
-
777
- ```bash
778
- # Before
779
- indusagi --hook ./safety.ts --tool ./todo.ts
780
-
781
- # After
782
- indusagi --extension ./safety.ts -e ./todo.ts
783
- ```
784
-
785
- ### Prompt Templates Migration
786
-
787
- "Slash commands" (markdown files defining reusable prompts invoked via `/name`) are renamed to "prompt templates" to avoid confusion with extension-registered commands.
788
-
789
- **Automatic migration:** The `commands/` directory is automatically renamed to `prompts/` on startup (if `prompts/` doesn't exist). Works for both regular directories and symlinks.
790
-
791
- **Directory changes:**
792
-
793
- ```
794
- ~/.indusagi/agent/commands/*.md → ~/.indusagi/agent/prompts/*.md
795
- .indusagi/commands/*.md → .indusagi/prompts/*.md
796
- ```
797
-
798
- **SDK type renames:**
799
-
800
- - `FileSlashCommand` → `PromptTemplate`
801
- - `LoadSlashCommandsOptions` → `LoadPromptTemplatesOptions`
802
-
803
- **SDK function renames:**
804
-
805
- - `discoverSlashCommands()` → `discoverPromptTemplates()`
806
- - `loadSlashCommands()` → `loadPromptTemplates()`
807
- - `expandSlashCommand()` → `expandPromptTemplate()`
808
- - `getCommandsDir()` → `getPromptsDir()`
809
-
810
- **SDK option renames:**
811
-
812
- - `CreateAgentSessionOptions.slashCommands` → `.promptTemplates`
813
- - `AgentSession.fileCommands` → `.promptTemplates`
814
- - `PromptOptions.expandSlashCommands` → `.expandPromptTemplates`
815
-
816
- ### SDK Migration
817
-
818
- **Discovery functions:**
819
-
820
- - `discoverAndLoadHooks()` → `discoverAndLoadExtensions()`
821
- - `discoverAndLoadCustomTools()` → merged into `discoverAndLoadExtensions()`
822
- - `loadHooks()` → `loadExtensions()`
823
- - `loadCustomTools()` → merged into `loadExtensions()`
824
-
825
- **Runner and wrapper:**
826
-
827
- - `HookRunner` → `ExtensionRunner`
828
- - `wrapToolsWithHooks()` → `wrapToolsWithExtensions()`
829
- - `wrapToolWithHooks()` → `wrapToolWithExtensions()`
830
-
831
- **CreateAgentSessionOptions:**
832
-
833
- - `.hooks` → removed (use `.additionalExtensionPaths` for paths)
834
- - `.additionalHookPaths` → `.additionalExtensionPaths`
835
- - `.preloadedHooks` → `.preloadedExtensions`
836
- - `.customTools` type changed: `Array<{ path?; tool: CustomTool }>` → `ToolDefinition[]`
837
- - `.additionalCustomToolPaths` → merged into `.additionalExtensionPaths`
838
- - `.slashCommands` → `.promptTemplates`
839
-
840
- **AgentSession:**
841
-
842
- - `.hookRunner` → `.extensionRunner`
843
- - `.fileCommands` → `.promptTemplates`
844
- - `.sendHookMessage()` → `.sendCustomMessage()`
845
-
846
- ### Session Migration
847
-
848
- **Automatic.** Session version bumped from 2 to 3. Existing sessions are migrated on first load:
849
-
850
- - Message role `"hookMessage"` → `"custom"`
851
-
852
- ### Breaking Changes
853
-
854
- - **Settings:** `hooks` and `customTools` arrays replaced with single `extensions` array
855
- - **CLI:** `--hook` and `--tool` flags replaced with `--extension` / `-e`
856
- - **Directories:** `hooks/`, `tools/` → `extensions/`; `commands/` → `prompts/`
857
- - **Types:** See type renames above
858
- - **SDK:** See SDK migration above
859
-
860
- ### Changed
861
-
862
- - Extensions can have their own `package.json` with dependencies (resolved via jiti)
863
- - Documentation: `docs/hooks.md` and `docs/custom-tools.md` merged into `docs/extensions.md`
864
- - Examples: `examples/hooks/` and `examples/custom-tools/` merged into `examples/extensions/`
865
- - README: Extensions section expanded with custom tools, commands, events, state persistence, shortcuts, flags, and UI examples
866
- - SDK: `customTools` option now accepts `ToolDefinition[]` directly (simplified from `Array<{ path?, tool }>`)
867
- - SDK: `extensions` option accepts `ExtensionFactory[]` for inline extensions
868
- - SDK: `additionalExtensionPaths` replaces both `additionalHookPaths` and `additionalCustomToolPaths`
869
-
870
- ## [0.34.2] - 2026-01-04
871
-
872
- ## [0.34.1] - 2026-01-04
873
-
874
- ### Added
875
-
876
- - Hook API: `ctx.ui.setTitle(title)` allows hooks to set the terminal window/tab title ([#446](https://github.com/badlogic/indusagi-mono/pull/446) by [@aliou](https://github.com/aliou))
877
-
878
- ### Changed
879
-
880
- - Expanded keybinding documentation to list all 32 supported symbol keys with notes on ctrl+symbol behavior ([#450](https://github.com/badlogic/indusagi-mono/pull/450) by [@kaofelix](https://github.com/kaofelix))
881
-
882
- ## [0.34.0] - 2026-01-04
883
-
884
- ### Added
885
-
886
- - Hook API: `indusagi.getActiveTools()` and `indusagi.setActiveTools(toolNames)` for dynamically enabling/disabling tools from hooks
887
- - Hook API: `indusagi.getAllTools()` to enumerate all configured tools (built-in via --tools or default, plus custom tools)
888
- - Hook API: `indusagi.registerFlag(name, options)` and `indusagi.getFlag(name)` for hooks to register custom CLI flags (parsed automatically)
889
- - Hook API: `indusagi.registerShortcut(shortcut, options)` for hooks to register custom keyboard shortcuts using `KeyId` (e.g., `Key.shift("p")`). Conflicts with built-in shortcuts are skipped, conflicts between hooks logged as warnings.
890
- - Hook API: `ctx.ui.setWidget(key, content)` for status displays above the editor. Accepts either a string array or a component factory function.
891
- - Hook API: `theme.strikethrough(text)` for strikethrough text styling
892
- - Hook API: `before_agent_start` handlers can now return `systemPromptAppend` to dynamically append text to the system prompt for that turn. Multiple hooks' appends are concatenated.
893
- - Hook API: `before_agent_start` handlers can now return multiple messages (all are injected, not just the first)
894
- - `/hotkeys` command now shows hook-registered shortcuts in a separate "Hooks" section
895
- - New example hook: `plan-mode.ts` - Claude Code-style read-only exploration mode:
896
- - Toggle via `/plan` command, `Shift+P` shortcut, or `--plan` CLI flag
897
- - Read-only tools: `read`, `bash`, `grep`, `find`, `ls` (no `edit`/`write`)
898
- - Bash commands restricted to non-destructive operations (blocks `rm`, `mv`, `git commit`, `npm install`, etc.)
899
- - Interactive prompt after each response: execute plan, stay in plan mode, or refine
900
- - Todo list widget showing progress with checkboxes and strikethrough for completed items
901
- - Each todo has a unique ID; agent marks items done by outputting `[DONE:id]`
902
- - Progress updates via `agent_end` hook (parses completed items from final message)
903
- - `/todos` command to view current plan progress
904
- - Shows `⏸ plan` indicator in footer when in plan mode, `📋 2/5` when executing
905
- - State persists across sessions (including todo progress)
906
- - New example hook: `tools.ts` - Interactive `/tools` command to enable/disable tools with session persistence
907
- - New example hook: `pirate.ts` - Demonstrates `systemPromptAppend` to make the agent speak like a pirate
908
- - Tool registry now contains all built-in tools (read, bash, edit, write, grep, find, ls) even when `--tools` limits the initially active set. Hooks can enable any tool from the registry via `indusagi.setActiveTools()`.
909
- - System prompt now automatically rebuilds when tools change via `setActiveTools()`, updating tool descriptions and guidelines to match the new tool set
910
- - Hook errors now display full stack traces for easier debugging
911
- - Event bus (`indusagi.events`) for tool/hook communication: shared pub/sub between custom tools and hooks
912
- - Custom tools now have `indusagi.sendMessage()` to send messages directly to the agent session without needing the event bus
913
- - `sendMessage()` supports `deliverAs: "nextTurn"` to queue messages for the next user prompt
914
-
915
- ### Changed
916
-
917
- - Removed image placeholders after copy & paste, replaced with inserting image file paths directly. ([#442](https://github.com/badlogic/indusagi-mono/pull/442) by [@mitsuhiko](https://github.com/mitsuhiko))
918
-
919
- ### Fixed
920
-
921
- - Fixed potential text decoding issues in bash executor by using streaming TextDecoder instead of Buffer.toString()
922
- - External editor (Ctrl-G) now shows full pasted content instead of `[paste #N ...]` placeholders ([#444](https://github.com/badlogic/indusagi-mono/pull/444) by [@aliou](https://github.com/aliou))
923
-
924
- ## [0.33.0] - 2026-01-04
925
-
926
- ### Breaking Changes
927
-
928
- - **Key detection functions removed from `indusagi-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/badlogic/indusagi-mono/pull/405))
929
-
930
- ### Added
931
-
932
- - 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/badlogic/indusagi-mono/issues/419))
933
- - Configurable keybindings via `~/.indusagi/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/badlogic/indusagi-mono/pull/405) by [@hjanuschka](https://github.com/hjanuschka))
934
- - `/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/badlogic/indusagi-mono/pull/426) by [@ben-vargas](https://github.com/ben-vargas))
935
-
936
- ### Fixed
937
-
938
- - Subagent example README referenced incorrect filename `subagent.ts` instead of `index.ts` ([#427](https://github.com/badlogic/indusagi-mono/pull/427) by [@Whamp](https://github.com/Whamp))
939
-
940
- ## [0.32.3] - 2026-01-03
941
-
942
- ### Fixed
943
-
944
- - `--list-models` no longer shows Google Vertex AI models without explicit authentication configured
945
- - 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.
946
- - Version check URL typo preventing update notifications from working ([#423](https://github.com/badlogic/indusagi-mono/pull/423) by [@skuridin](https://github.com/skuridin))
947
- - Large images exceeding Anthropic's 5MB limit now retry with progressive quality/size reduction ([#424](https://github.com/badlogic/indusagi-mono/pull/424) by [@mitsuhiko](https://github.com/mitsuhiko))
948
-
949
- ## [0.32.2] - 2026-01-03
950
-
951
- ### Added
952
-
953
- - `$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/badlogic/indusagi-mono/pull/418) by [@skuridin](https://github.com/skuridin))
954
-
955
- ### Changed
956
-
957
- - **Slash commands and hook commands now work during streaming**: Previously, using a slash command or hook command while the agent was streaming would crash with "Agent is already processing". Now:
958
- - Hook commands execute immediately (they manage their own LLM interaction via `indusagi.sendMessage()`)
959
- - File-based slash commands are expanded and queued via steer/followUp
960
- - `steer()` and `followUp()` now expand file-based slash commands and error on hook commands (hook commands cannot be queued)
961
- - `prompt()` accepts new `streamingBehavior` option (`"steer"` or `"followUp"`) to specify queueing behavior during streaming
962
- - RPC `prompt` command now accepts optional `streamingBehavior` field
963
- ([#420](https://github.com/badlogic/indusagi-mono/issues/420))
964
-
965
- ### Fixed
966
-
967
- - 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/badlogic/indusagi-mono/pull/418) by [@skuridin](https://github.com/skuridin))
968
-
969
- ## [0.32.1] - 2026-01-03
970
-
971
- ### Added
972
-
973
- - 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/badlogic/indusagi-mono/issues/414))
974
-
975
- ### Fixed
976
-
977
- - Edit tool diff not displaying in TUI due to race condition between async preview computation and tool execution
978
-
979
- ## [0.32.0] - 2026-01-03
980
-
981
- ### Breaking Changes
982
-
983
- - **Queue API replaced with steer/followUp**: The `queueMessage()` method has been split into two methods with different delivery semantics ([#403](https://github.com/badlogic/indusagi-mono/issues/403)):
984
- - `steer(text)`: Interrupts the agent mid-run (Enter while streaming). Delivered after current tool execution.
985
- - `followUp(text)`: Waits until the agent finishes (Alt+Enter while streaming). Delivered only when agent stops.
986
- - **Settings renamed**: `queueMode` setting renamed to `steeringMode`. Added new `followUpMode` setting. Old settings.json files are migrated automatically.
987
- - **AgentSession methods renamed**:
988
- - `queueMessage()` → `steer()` and `followUp()`
989
- - `queueMode` getter → `steeringMode` and `followUpMode` getters
990
- - `setQueueMode()` → `setSteeringMode()` and `setFollowUpMode()`
991
- - `queuedMessageCount` → `pendingMessageCount`
992
- - `getQueuedMessages()` → `getSteeringMessages()` and `getFollowUpMessages()`
993
- - `clearQueue()` now returns `{ steering: string[], followUp: string[] }`
994
- - `hasQueuedMessages()` → `hasPendingMessages()`
995
- - **Hook API signature changed**: `indusagi.sendMessage()` second parameter changed from `triggerTurn?: boolean` to `options?: { triggerTurn?, deliverAs? }`. Use `deliverAs: "followUp"` for follow-up delivery. Affects both hooks and internal `sendHookMessage()` method.
996
- - **RPC API changes**:
997
- - `queue_message` command → `steer` and `follow_up` commands
998
- - `set_queue_mode` command → `set_steering_mode` and `set_follow_up_mode` commands
999
- - `RpcSessionState.queueMode` → `steeringMode` and `followUpMode`
1000
- - **Settings UI**: "Queue mode" setting split into "Steering mode" and "Follow-up mode"
1001
-
1002
- ### Added
1003
-
1004
- - 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/badlogic/indusagi-mono/issues/404))
1005
- - Vertex AI provider (`google-vertex`): access Gemini models via Google Cloud Vertex AI using Application Default Credentials ([#300](https://github.com/badlogic/indusagi-mono/pull/300) by [@default-anton](https://github.com/default-anton))
1006
- - 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/badlogic/indusagi-mono/pull/406) by [@yevhen](https://github.com/yevhen))
1007
- - 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/badlogic/indusagi-mono/pull/402) by [@mitsuhiko](https://github.com/mitsuhiko))
1008
- - Alt+Enter keybind to queue follow-up messages while agent is streaming
1009
- - `Theme` and `ThemeColor` types now exported for hooks using `ctx.ui.custom()`
1010
- - Terminal window title now displays "indusagi - dirname" to identify which project session you're in ([#407](https://github.com/badlogic/indusagi-mono/pull/407) by [@kaofelix](https://github.com/kaofelix))
1011
-
1012
- ### Changed
1013
-
1014
- - Editor component now uses word wrapping instead of character-level wrapping for better readability ([#382](https://github.com/badlogic/indusagi-mono/pull/382) by [@nickseelert](https://github.com/nickseelert))
1015
-
1016
- ### Fixed
1017
-
1018
- - `/model` selector now opens instantly instead of waiting for OAuth token refresh. Token refresh is deferred until a model is actually used.
1019
- - 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/badlogic/indusagi-mono/pull/411) by [@nathyong](https://github.com/nathyong))
1020
- - `AgentSession.prompt()` now throws if called while the agent is already streaming, preventing race conditions. Use `steer()` or `followUp()` to queue messages during streaming.
1021
- - Ctrl+C now works like Escape in selector components, so mashing Ctrl+C will eventually close the program ([#400](https://github.com/badlogic/indusagi-mono/pull/400) by [@mitsuhiko](https://github.com/mitsuhiko))
1022
-
1023
- ## [0.31.1] - 2026-01-02
1024
-
1025
- ### Fixed
1026
-
1027
- - Model selector no longer allows negative index when pressing arrow keys before models finish loading ([#398](https://github.com/badlogic/indusagi-mono/pull/398) by [@mitsuhiko](https://github.com/mitsuhiko))
1028
- - Type guard functions (`isBashToolResult`, etc.) now exported at runtime, not just in type declarations ([#397](https://github.com/badlogic/indusagi-mono/issues/397))
1029
-
1030
- ## [0.31.0] - 2026-01-02
1031
-
1032
- This release introduces session trees for in-place branching, major API changes to hooks and custom tools, and structured compaction with file tracking.
1033
-
1034
- ### Session Tree
1035
-
1036
- Sessions now use a tree structure with `id`/`parentId` fields. This enables in-place branching: navigate to any previous point with `/tree`, continue from there, and switch between branches while preserving all history in a single file.
1037
-
1038
- **Existing sessions are automatically migrated** (v1 → v2) on first load. No manual action required.
1039
-
1040
- New entry types: `BranchSummaryEntry` (context from abandoned branches), `CustomEntry` (hook state), `CustomMessageEntry` (hook-injected messages), `LabelEntry` (bookmarks).
1041
-
1042
- See [docs/session.md](docs/session.md) for the file format and `SessionManager` API.
1043
-
1044
- ### Hooks Migration
1045
-
1046
- The hooks API has been restructured with more granular events and better session access.
1047
-
1048
- **Type renames:**
1049
-
1050
- - `HookEventContext` → `HookContext`
1051
- - `HookCommandContext` is now a new interface extending `HookContext` with session control methods
1052
-
1053
- **Event changes:**
1054
-
1055
- - The monolithic `session` event is now split into granular events: `session_start`, `session_before_switch`, `session_switch`, `session_before_branch`, `session_branch`, `session_before_compact`, `session_compact`, `session_shutdown`
1056
- - `session_before_switch` and `session_switch` events now include `reason: "new" | "resume"` to distinguish between `/new` and `/resume`
1057
- - New `session_before_tree` and `session_tree` events for `/tree` navigation (hook can provide custom branch summary)
1058
- - New `before_agent_start` event: inject messages before the agent loop starts
1059
- - New `context` event: modify messages non-destructively before each LLM call
1060
- - Session entries are no longer passed in events. Use `ctx.sessionManager.getEntries()` or `ctx.sessionManager.getBranch()` instead
1061
-
1062
- **API changes:**
1063
-
1064
- - `indusagi.send(text, attachments?)` → `indusagi.sendMessage(message, triggerTurn?)` (creates `CustomMessageEntry`)
1065
- - New `indusagi.appendEntry(customType, data?)` for hook state persistence (not in LLM context)
1066
- - New `indusagi.registerCommand(name, options)` for custom slash commands (handler receives `HookCommandContext`)
1067
- - New `indusagi.registerMessageRenderer(customType, renderer)` for custom TUI rendering
1068
- - New `ctx.isIdle()`, `ctx.abort()`, `ctx.hasQueuedMessages()` for agent state (available in all events)
1069
- - New `ctx.ui.editor(title, prefill?)` for multi-line text editing with Ctrl+G external editor support
1070
- - New `ctx.ui.custom(component)` for full TUI component rendering with keyboard focus
1071
- - New `ctx.ui.setStatus(key, text)` for persistent status text in footer (multiple hooks can set their own)
1072
- - New `ctx.ui.theme` getter for styling text with theme colors
1073
- - `ctx.exec()` moved to `indusagi.exec()`
1074
- - `ctx.sessionFile` → `ctx.sessionManager.getSessionFile()`
1075
- - New `ctx.modelRegistry` and `ctx.model` for API key resolution
1076
-
1077
- **HookCommandContext (slash commands only):**
1078
-
1079
- - `ctx.waitForIdle()` - wait for agent to finish streaming
1080
- - `ctx.newSession(options?)` - create new sessions with optional setup callback
1081
- - `ctx.fork(entryId) - fork from a specific entry, creating a new session file
1082
- - `ctx.navigateTree(targetId, options?)` - navigate the session tree
1083
-
1084
- These methods are only on `HookCommandContext` (not `HookContext`) because they can deadlock if called from event handlers that run inside the agent loop.
1085
-
1086
- **Removed:**
1087
-
1088
- - `hookTimeout` setting (hooks no longer have timeouts; use Ctrl+C to abort)
1089
- - `resolveApiKey` parameter (use `ctx.modelRegistry.getApiKey(model)`)
1090
-
1091
- See [docs/hooks.md](docs/hooks.md) and [examples/hooks/](examples/hooks/) for the current API.
1092
-
1093
- ### Custom Tools Migration
1094
-
1095
- The custom tools API has been restructured to mirror the hooks pattern with a context object.
1096
-
1097
- **Type renames:**
1098
-
1099
- - `CustomAgentTool` → `CustomTool`
1100
- - `ToolAPI` → `CustomToolAPI`
1101
- - `ToolContext` → `CustomToolContext`
1102
- - `ToolSessionEvent` → `CustomToolSessionEvent`
1103
-
1104
- **Execute signature changed:**
1105
-
1106
- ```typescript
1107
- // Before (v0.30.2)
1108
- execute(toolCallId, params, signal, onUpdate)
1109
-
1110
- // After
1111
- execute(toolCallId, params, onUpdate, ctx, signal?)
1112
- ```
1113
-
1114
- The new `ctx: CustomToolContext` provides `sessionManager`, `modelRegistry`, `model`, and agent state methods:
1115
-
1116
- - `ctx.isIdle()` - check if agent is streaming
1117
- - `ctx.hasQueuedMessages()` - check if user has queued messages (skip interactive prompts)
1118
- - `ctx.abort()` - abort current operation (fire-and-forget)
1119
-
1120
- **Session event changes:**
1121
-
1122
- - `CustomToolSessionEvent` now only has `reason` and `previousSessionFile`
1123
- - Session entries are no longer in the event. Use `ctx.sessionManager.getBranch()` or `ctx.sessionManager.getEntries()` to reconstruct state
1124
- - Reasons: `"start" | "switch" | "branch" | "tree" | "shutdown"` (no separate `"new"` reason; `/new` triggers `"switch"`)
1125
- - `dispose()` method removed. Use `onSession` with `reason: "shutdown"` for cleanup
1126
-
1127
- See [docs/custom-tools.md](docs/custom-tools.md) and [examples/custom-tools/](examples/custom-tools/) for the current API.
1128
-
1129
- ### SDK Migration
1130
-
1131
- **Type changes:**
1132
-
1133
- - `CustomAgentTool` → `CustomTool`
1134
- - `AppMessage` → `AgentMessage`
1135
- - `sessionFile` returns `string | undefined` (was `string | null`)
1136
- - `model` returns `Model | undefined` (was `Model | null`)
1137
- - `Attachment` type removed. Use `ImageContent` from `indusagi-ai` instead. Add images directly to message content arrays.
1138
-
1139
- **AgentSession API:**
1140
-
1141
- - `branch(entryIndex: number)` → `branch(entryId: string)`
1142
- - `getUserMessagesForBranching()` returns `{ entryId, text }` instead of `{ entryIndex, text }`
1143
- - `reset()` → `newSession(options?)` where options has optional `parentSession` for lineage tracking
1144
- - `newSession()` and `switchSession()` now return `Promise<boolean>` (false if cancelled by hook)
1145
- - New `navigateTree(targetId, options?)` for in-place tree navigation
1146
-
1147
- **Hook integration:**
1148
-
1149
- - New `sendHookMessage(message, triggerTurn?)` for hook message injection
1150
-
1151
- **SessionManager API:**
1152
-
1153
- - Method renames: `saveXXX()` → `appendXXX()` (e.g., `appendMessage`, `appendCompaction`)
1154
- - `branchInPlace()` → `branch()`
1155
- - `reset()` → `newSession(options?)` with optional `parentSession` for lineage tracking
1156
- - `createBranchedSessionFromEntries(entries, index)` → `createBranchedSession(leafId)`
1157
- - `SessionHeader.branchedFrom` → `SessionHeader.parentSession`
1158
- - `saveCompaction(entry)` → `appendCompaction(summary, firstKeptEntryId, tokensBefore, details?)`
1159
- - `getEntries()` now excludes the session header (use `getHeader()` separately)
1160
- - `getSessionFile()` returns `string | undefined` (undefined for in-memory sessions)
1161
- - New tree methods: `getTree()`, `getBranch()`, `getLeafId()`, `getLeafEntry()`, `getEntry()`, `getChildren()`, `getLabel()`
1162
- - New append methods: `appendCustomEntry()`, `appendCustomMessageEntry()`, `appendLabelChange()`
1163
- - New branch methods: `branch(entryId)`, `branchWithSummary()`
1164
-
1165
- **ModelRegistry (new):**
1166
-
1167
- `ModelRegistry` is a new class that manages model discovery and API key resolution. It combines built-in models with custom models from `models.json` and resolves API keys via `AuthStorage`.
1168
-
1169
- ```typescript
1170
- import {
1171
- discoverAuthStorage,
1172
- discoverModels,
1173
- } from "indusagi-coding-agent";
1174
-
1175
- const authStorage = discoverAuthStorage(); // ~/.indusagi/agent/auth.json
1176
- const modelRegistry = discoverModels(authStorage); // + ~/.indusagi/agent/models.json
1177
-
1178
- // Get all models (built-in + custom)
1179
- const allModels = modelRegistry.getAll();
1180
-
1181
- // Get only models with valid API keys
1182
- const available = await modelRegistry.getAvailable();
1183
-
1184
- // Find specific model
1185
- const model = modelRegistry.find("anthropic", "claude-sonnet-4-20250514");
1186
-
1187
- // Get API key for a model
1188
- const apiKey = await modelRegistry.getApiKey(model);
1189
- ```
1190
-
1191
- This replaces the old `resolveApiKey` callback pattern. Hooks and custom tools access it via `ctx.modelRegistry`.
1192
-
1193
- **Renamed exports:**
1194
-
1195
- - `messageTransformer` → `convertToLlm`
1196
- - `SessionContext` alias `LoadedSession` removed
1197
-
1198
- See [docs/sdk.md](docs/sdk.md) and [examples/sdk/](examples/sdk/) for the current API.
1199
-
1200
- ### RPC Migration
1201
-
1202
- **Session commands:**
1203
-
1204
- - `reset` command → `new_session` command with optional `parentSession` field
1205
-
1206
- **Branching commands:**
1207
-
1208
- - `branch` command: `entryIndex` → `entryId`
1209
- - `get_branch_messages` response: `entryIndex` → `entryId`
1210
-
1211
- **Type changes:**
1212
-
1213
- - Messages are now `AgentMessage` (was `AppMessage`)
1214
- - `prompt` command: `attachments` field replaced with `images` field using `ImageContent` format
1215
-
1216
- **Compaction events:**
1217
-
1218
- - `auto_compaction_start` now includes `reason` field (`"threshold"` or `"overflow"`)
1219
- - `auto_compaction_end` now includes `willRetry` field
1220
- - `compact` response includes full `CompactionResult` (`summary`, `firstKeptEntryId`, `tokensBefore`, `details`)
1221
-
1222
- See [docs/rpc.md](docs/rpc.md) for the current protocol.
1223
-
1224
- ### Structured Compaction
1225
-
1226
- Compaction and branch summarization now use a structured output format:
1227
-
1228
- - Clear sections: Goal, Progress, Key Information, File Operations
1229
- - File tracking: `readFiles` and `modifiedFiles` arrays in `details`, accumulated across compactions
1230
- - Conversations are serialized to text before summarization to prevent the model from "continuing" them
1231
-
1232
- The `before_compact` and `before_tree` hook events allow custom compaction implementations. See [docs/compaction.md](docs/compaction.md).
1233
-
1234
- ### Interactive Mode
1235
-
1236
- **`/tree` command:**
1237
-
1238
- - Navigate the full session tree in-place
1239
- - Search by typing, page with ←/→
1240
- - Filter modes (Ctrl+O): default → no-tools → user-only → labeled-only → all
1241
- - Press `l` to label entries as bookmarks
1242
- - Selecting a branch switches context and optionally injects a summary of the abandoned branch
1243
-
1244
- **Entry labels:**
1245
-
1246
- - Bookmark any entry via `/tree` → select → `l`
1247
- - Labels appear in tree view and persist as `LabelEntry`
1248
-
1249
- **Theme changes (breaking for custom themes):**
1250
-
1251
- Custom themes must add these new color tokens or they will fail to load:
1252
-
1253
- - `selectedBg`: background for selected/highlighted items in tree selector and other components
1254
- - `customMessageBg`: background for hook-injected messages (`CustomMessageEntry`)
1255
- - `customMessageText`: text color for hook messages
1256
- - `customMessageLabel`: label color for hook messages (the `[customType]` prefix)
1257
-
1258
- Total color count increased from 46 to 50. See [docs/themes.md](docs/themes.md) for the full color list and copy values from the built-in dark/light themes.
1259
-
1260
- **Settings:**
1261
-
1262
- - `enabledModels`: allowlist models in `settings.json` (same format as `--models` CLI)
1263
-
1264
- ### Added
1265
-
1266
- - `ctx.ui.setStatus(key, text)` for hooks to display persistent status text in the footer ([#385](https://github.com/badlogic/indusagi-mono/pull/385) by [@prateekmedia](https://github.com/prateekmedia))
1267
- - `ctx.ui.theme` getter for styling status text and other output with theme colors
1268
- - `/share` command to upload session as a secret GitHub gist and get a shareable URL via shittycodingagent.ai ([#380](https://github.com/badlogic/indusagi-mono/issues/380))
1269
- - HTML export now includes a tree visualization sidebar for navigating session branches ([#375](https://github.com/badlogic/indusagi-mono/issues/375))
1270
- - HTML export supports keyboard shortcuts: Ctrl+T to toggle thinking blocks, Ctrl+O to toggle tool outputs
1271
- - HTML export supports theme-configurable background colors via optional `export` section in theme JSON ([#387](https://github.com/badlogic/indusagi-mono/pull/387) by [@mitsuhiko](https://github.com/mitsuhiko))
1272
- - HTML export syntax highlighting now uses theme colors and matches TUI rendering
1273
- - **Snake game example hook**: Demonstrates `ui.custom()`, `registerCommand()`, and session persistence. See [examples/hooks/snake.ts](examples/hooks/snake.ts).
1274
- - **`thinkingText` theme token**: Configurable color for thinking block text. ([#366](https://github.com/badlogic/indusagi-mono/pull/366) by [@paulbettner](https://github.com/paulbettner))
1275
-
1276
- ### Changed
1277
-
1278
- - **Entry IDs**: Session entries now use short 8-character hex IDs instead of full UUIDs
1279
- - **API key priority**: `ANTHROPIC_OAUTH_TOKEN` now takes precedence over `ANTHROPIC_AINDUSAGI_KEY`
1280
- - HTML export template split into separate files (template.html, template.css, template.js) for easier maintenance
1281
-
1282
- ### Fixed
1283
-
1284
- - HTML export now properly sanitizes user messages containing HTML tags like `<style>` that could break DOM rendering
1285
- - Crash when displaying bash output containing Unicode format characters like U+0600-U+0604 ([#372](https://github.com/badlogic/indusagi-mono/pull/372) by [@HACKE-RC](https://github.com/HACKE-RC))
1286
- - **Footer shows full session stats**: Token usage and cost now include all messages, not just those after compaction. ([#322](https://github.com/badlogic/indusagi-mono/issues/322))
1287
- - **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/badlogic/indusagi-mono/pull/365) by [@paulbettner](https://github.com/paulbettner))
1288
- - **Toggling thinking blocks during streaming shows nothing**: Pressing Ctrl+T while streaming would hide the current message until streaming completed.
1289
- - **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/badlogic/indusagi-mono/issues/342) by [@aliou](https://github.com/aliou))
1290
- - **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/badlogic/indusagi-mono/issues/374) by [@nicobailon](https://github.com/nicobailon))
1291
- - **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/badlogic/indusagi-mono/issues/355) by [@Pratham-Dubey](https://github.com/Pratham-Dubey))
1292
- - **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/badlogic/indusagi-mono/pull/394) by [@prathamdby](https://github.com/prathamdby))
1293
- - **Use bash instead of sh on Unix**: Fixed shell commands using `/bin/sh` instead of `/bin/bash` on Unix systems. ([#328](https://github.com/badlogic/indusagi-mono/pull/328) by [@dnouri](https://github.com/dnouri))
1294
- - **OAuth login URL clickable**: Made OAuth login URLs clickable in terminal. ([#349](https://github.com/badlogic/indusagi-mono/pull/349) by [@Cursivez](https://github.com/Cursivez))
1295
- - **Improved error messages**: Better error messages when `apiKey` or `model` are missing. ([#346](https://github.com/badlogic/indusagi-mono/pull/346) by [@ronyrus](https://github.com/ronyrus))
1296
- - **Session file validation**: `findMostRecentSession()` now validates session headers before returning, preventing non-session JSONL files from being loaded
1297
- - **Compaction error handling**: `generateSummary()` and `generateTurnPrefixSummary()` now throw on LLM errors instead of returning empty strings
1298
- - **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()`
1299
- - **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/badlogic/indusagi-mono/issues/337))
1300
-
1301
- ## [0.30.2] - 2025-12-26
1302
-
1303
- ### Changed
1304
-
1305
- - **Consolidated migrations**: Moved auth migration from `AuthStorage.migrateLegacy()` to new `migrations.ts` module.
1306
-
1307
- ## [0.30.1] - 2025-12-26
1308
-
1309
- ### Fixed
1310
-
1311
- - **Sessions saved to wrong directory**: In v0.30.0, sessions were being saved to `~/.indusagi/agent/` instead of `~/.indusagi/agent/sessions/<encoded-cwd>/`, breaking `--resume` and `/resume`. Misplaced sessions are automatically migrated on startup. ([#320](https://github.com/badlogic/indusagi-mono/issues/320) by [@aliou](https://github.com/aliou))
1312
- - **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/badlogic/indusagi-mono/issues/321))
1313
-
1314
- ## [0.30.0] - 2025-12-25
1315
-
1316
- ### Breaking Changes
1317
-
1318
- - **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 (`~/.indusagi/agent/sessions/<encoded-cwd>/`). `open()` no longer takes `agentDir`. ([#313](https://github.com/badlogic/indusagi-mono/pull/313))
1319
-
1320
- ### Added
1321
-
1322
- - **`--session-dir` flag**: Use a custom directory for sessions instead of the default `~/.indusagi/agent/sessions/<encoded-cwd>/`. Works with `-c` (continue) and `-r` (resume) flags. ([#313](https://github.com/badlogic/indusagi-mono/pull/313) by [@scutifer](https://github.com/scutifer))
1323
- - **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/badlogic/indusagi-mono/pull/315) by [@mitsuhiko](https://github.com/mitsuhiko))
1324
-
1325
- ## [0.29.1] - 2025-12-25
1326
-
1327
- ### Added
1328
-
1329
- - **Automatic custom system prompt loading**: indusagi now auto-loads `SYSTEM.md` files to replace the default system prompt. Project-local `.indusagi/SYSTEM.md` takes precedence over global `~/.indusagi/agent/SYSTEM.md`. CLI `--system-prompt` flag overrides both. ([#309](https://github.com/badlogic/indusagi-mono/issues/309))
1330
- - **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/badlogic/indusagi-mono/issues/310))
1331
-
1332
- ### Fixed
1333
-
1334
- - **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/badlogic/indusagi-mono/issues/311) by [@kim0](https://github.com/kim0))
1335
-
1336
- ## [0.29.0] - 2025-12-25
1337
-
1338
- ### Breaking Changes
1339
-
1340
- - **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/badlogic/indusagi-mono/pull/305))
1341
-
1342
- ### Added
1343
-
1344
- - **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/badlogic/indusagi-mono/pull/307) by [@mitsuhiko](https://github.com/mitsuhiko))
1345
- - **Word navigation in input fields**: Added Ctrl+Left/Right and Alt+Left/Right for word-by-word cursor movement. ([#306](https://github.com/badlogic/indusagi-mono/pull/306) by [@kim0](https://github.com/kim0))
1346
- - **Full Unicode input**: Input fields now accept Unicode characters beyond ASCII. ([#306](https://github.com/badlogic/indusagi-mono/pull/306) by [@kim0](https://github.com/kim0))
1347
-
1348
- ### Fixed
1349
-
1350
- - **Readline-style Ctrl+W**: Now skips trailing whitespace before deleting the preceding word, matching standard readline behavior. ([#306](https://github.com/badlogic/indusagi-mono/pull/306) by [@kim0](https://github.com/kim0))
1351
-
1352
- ## [0.28.0] - 2025-12-25
1353
-
1354
- ### Changed
1355
-
1356
- - **Credential storage refactored**: API keys and OAuth tokens are now stored in `~/.indusagi/agent/auth.json` instead of `oauth.json` and `settings.json`. Existing credentials are automatically migrated on first run. ([#296](https://github.com/badlogic/indusagi-mono/issues/296))
1357
-
1358
- - **SDK API changes** ([#296](https://github.com/badlogic/indusagi-mono/issues/296)):
1359
-
1360
- - Added `AuthStorage` class for credential management (API keys and OAuth tokens)
1361
- - Added `ModelRegistry` class for model discovery and API key resolution
1362
- - Added `discoverAuthStorage()` and `discoverModels()` discovery functions
1363
- - `createAgentSession()` now accepts `authStorage` and `modelRegistry` options
1364
- - Removed `configureOAuthStorage()`, `defaultGetApiKey()`, `findModel()`, `discoverAvailableModels()`
1365
- - Removed `getApiKey` callback option (use `AuthStorage.setRuntimeApiKey()` for runtime overrides)
1366
- - Use `getModel()` from `indusagi-ai` for built-in models, `modelRegistry.find()` for custom models + built-in models
1367
- - See updated [SDK documentation](docs/sdk.md) and [README](README.md)
1368
-
1369
- - **Settings changes**: Removed `apiKeys` from `settings.json`. Use `auth.json` instead. ([#296](https://github.com/badlogic/indusagi-mono/issues/296))
1370
-
1371
- ### Fixed
1372
-
1373
- - **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/badlogic/indusagi-mono/pull/304) by [@mitsuhiko](https://github.com/mitsuhiko))
1374
-
1375
- ## [0.27.9] - 2025-12-24
1376
-
1377
- ### Fixed
1378
-
1379
- - **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/badlogic/indusagi-mono/issues/295))
1380
-
1381
- ## [0.27.8] - 2025-12-24
1382
-
1383
- ### Fixed
1384
-
1385
- - **API key priority**: OAuth tokens now take priority over settings.json API keys. Previously, an API key in settings.json would trump OAuth, causing users logged in with a plan (unlimited tokens) to be billed via PAYG instead.
1386
-
1387
- ## [0.27.7] - 2025-12-24
1388
-
1389
- ### Fixed
1390
-
1391
- - **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/badlogic/indusagi-mono/pull/302) by [@nicobailon](https://github.com/nicobailon))
1392
-
1393
- ## [0.27.6] - 2025-12-24
1394
-
1395
- ### Added
1396
-
1397
- - **Compaction hook improvements**: The `before_compact` session event now includes:
1398
-
1399
- - `previousSummary`: Summary from the last compaction (if any), so hooks can preserve accumulated context
1400
- - `messagesToKeep`: Messages that will be kept after the summary (recent turns), in addition to `messagesToSummarize`
1401
- - `resolveApiKey`: Function to resolve API keys for any model (checks settings, OAuth, env vars)
1402
- - Removed `apiKey` string in favor of `resolveApiKey` for more flexibility
1403
-
1404
- - **SessionManager API cleanup**:
1405
- - Renamed `loadSessionFromEntries()` to `buildSessionContext()` (builds LLM context from entries, handling compaction)
1406
- - Renamed `loadEntries()` to `getEntries()` (returns defensive copy of all session entries)
1407
- - Added `buildSessionContext()` method to SessionManager
1408
-
1409
- ## [0.27.5] - 2025-12-24
1410
-
1411
- ### Added
1412
-
1413
- - **HTML export syntax highlighting**: Code blocks in markdown and tool outputs (read, write) now have syntax highlighting using highlight.js with theme-aware colors matching the TUI.
1414
- - **HTML export improvements**: Render markdown server-side using marked (tables, headings, code blocks, etc.), honor user's chosen theme (light/dark), add image rendering for user messages, and style code blocks with TUI-like language markers. ([@scutifer](https://github.com/scutifer))
1415
-
1416
- ### Fixed
1417
-
1418
- - **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/badlogic/indusagi-mono/pull/299) by [@nicobailon](https://github.com/nicobailon))
1419
-
1420
- ## [0.27.4] - 2025-12-24
1421
-
1422
- ### Fixed
1423
-
1424
- - **Symlinked skill directories**: Skills in symlinked directories (e.g., `~/.indusagi/agent/skills/my-skills -> /path/to/skills`) are now correctly discovered and loaded.
1425
-
1426
- ## [0.27.3] - 2025-12-24
1427
-
1428
- ### Added
1429
-
1430
- - **API keys in settings.json**: Store API keys in `~/.indusagi/agent/settings.json` under the `apiKeys` field (e.g., `{ "apiKeys": { "anthropic": "sk-..." } }`). Settings keys take priority over environment variables. ([#295](https://github.com/badlogic/indusagi-mono/issues/295))
1431
-
1432
- ### Fixed
1433
-
1434
- - **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/badlogic/indusagi-mono/issues/288))
1435
- - **`--system-prompt` file path support**: The `--system-prompt` argument now correctly resolves file paths (like `--append-system-prompt` already did). ([#287](https://github.com/badlogic/indusagi-mono/pull/287) by [@scutifer](https://github.com/scutifer))
1436
-
1437
- ## [0.27.2] - 2025-12-23
1438
-
1439
- ### Added
1440
-
1441
- - **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/badlogic/indusagi-mono/pull/286) by [@nicobarray](https://github.com/nicobarray))
1442
-
1443
- ## [0.27.1] - 2025-12-22
1444
-
1445
- ### Fixed
1446
-
1447
- - **Skill discovery performance**: Skip `node_modules` directories when recursively scanning for skills. Fixes ~60ms startup delay when skill directories contain npm dependencies.
1448
-
1449
- ### Added
1450
-
1451
- - **Startup timing instrumentation**: Set `INDUSAGI_TIMING=1` to see startup performance breakdown (interactive mode only).
1452
-
1453
- ## [0.27.0] - 2025-12-22
1454
-
1455
- ### Breaking
1456
-
1457
- - **Session hooks API redesign**: Merged `branch` event into `session` event. `BranchEvent`, `BranchEventResult` types and `indusagi.on("branch", ...)` removed. Use `indusagi.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/badlogic/indusagi-mono/issues/278))
1458
-
1459
- ### Added
1460
-
1461
- - **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/badlogic/indusagi-mono/issues/278))
1462
-
1463
- ### Fixed
1464
-
1465
- - **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/badlogic/indusagi-mono/issues/280))
1466
-
1467
- - **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/badlogic/indusagi-mono/issues/275))
1468
-
1469
- ## [0.26.1] - 2025-12-22
1470
-
1471
- ### Fixed
1472
-
1473
- - **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/badlogic/indusagi-mono/issues/279))
1474
-
1475
- ## [0.26.0] - 2025-12-22
1476
-
1477
- ### Added
1478
-
1479
- - **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/badlogic/indusagi-mono/issues/272))
1480
-
1481
- - **Project-specific settings**: Settings now load from both `~/.indusagi/agent/settings.json` (global) and `<cwd>/.indusagi/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/badlogic/indusagi-mono/pull/276))
1482
-
1483
- - **SettingsManager static factories**: `SettingsManager.create(cwd?, agentDir?)` for file-based settings, `SettingsManager.inMemory(settings?)` for testing. Added `applyOverrides()` for programmatic overrides.
1484
-
1485
- - **SessionManager static factories**: `SessionManager.create()`, `SessionManager.open()`, `SessionManager.continueRecent()`, `SessionManager.inMemory()`, `SessionManager.list()` for flexible session management.
1486
-
1487
- ## [0.25.4] - 2025-12-22
1488
-
1489
- ### Fixed
1490
-
1491
- - **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/badlogic/indusagi-mono/issues/274))
1492
-
1493
- ## [0.25.3] - 2025-12-21
1494
-
1495
- ### Added
1496
-
1497
- - **Gemini 3 preview models**: Added `gemini-3-pro-preview` and `gemini-3-flash-preview` to the google-gemini-cli provider. ([#264](https://github.com/badlogic/indusagi-mono/pull/264) by [@LukeFost](https://github.com/LukeFost))
1498
-
1499
- - **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/badlogic/indusagi-mono/pull/266) by [@aliou](https://github.com/aliou))
1500
-
1501
- - **Process suspension**: Press `Ctrl+Z` to suspend indusagi and return to the shell. Resume with `fg` as usual. ([#267](https://github.com/badlogic/indusagi-mono/pull/267) by [@aliou](https://github.com/aliou))
1502
-
1503
- - **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/badlogic/indusagi-mono/pull/269) by [@nicobailon](https://github.com/nicobailon))
1504
-
1505
- - **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/badlogic/indusagi-mono/issues/268))
1506
-
1507
- ## [0.25.2] - 2025-12-21
1508
-
1509
- ### Fixed
1510
-
1511
- - **Image shifting in tool output**: Fixed an issue where images in tool output would shift down (due to accumulating spacers) each time the tool output was expanded or collapsed via Ctrl+O.
1512
-
1513
- ## [0.25.1] - 2025-12-21
1514
-
1515
- ### Fixed
1516
-
1517
- - **Gemini image reading broken**: Fixed the `read` tool returning images causing flaky/broken responses with Gemini models. Images in tool results are now properly formatted per the Gemini API spec.
1518
-
1519
- - **Tab completion for absolute paths**: Fixed tab completion producing `//tmp` instead of `/tmp/`. Also fixed symlinks to directories (like `/tmp`) not getting a trailing slash, which prevented continuing to tab through subdirectories.
1520
-
1521
- ## [0.25.0] - 2025-12-20
1522
-
1523
- ### Added
1524
-
1525
- - **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/badlogic/indusagi-mono/pull/259) by [@steipete](https://github.com/steipete))
1526
-
1527
- - **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.
1528
-
1529
- - **Google Antigravity OAuth provider**: Access Gemini 3, Claude (sonnet/opus thinking models), and GPT-OSS models for free via Google's Antigravity sandbox. Login with `/login` and select "Antigravity". Uses your Google account with rate limits.
1530
-
1531
- ### Changed
1532
-
1533
- - **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/badlogic/indusagi-mono/issues/255))
1534
-
1535
- ### Fixed
1536
-
1537
- - **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/badlogic/indusagi-mono/issues/252))
1538
-
1539
- - **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/badlogic/indusagi-mono/issues/253))
1540
-
1541
- - **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.
1542
-
1543
- ## [0.24.5] - 2025-12-20
1544
-
1545
- ### Fixed
1546
-
1547
- - **Input buffering in iTerm2**: Fixed Ctrl+C, Ctrl+D, and other keys requiring multiple presses in iTerm2. The cell size query response parser was incorrectly holding back keyboard input.
1548
-
1549
- ## [0.24.4] - 2025-12-20
1550
-
1551
- ### Fixed
1552
-
1553
- - **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/badlogic/indusagi-mono/issues/243))
1554
-
1555
- ## [0.24.3] - 2025-12-19
1556
-
1557
- ### Fixed
1558
-
1559
- - **Footer overflow on narrow terminals**: Fixed footer path display exceeding terminal width when resizing to very narrow widths, causing rendering crashes. /arminsayshi
1560
-
1561
- ## [0.24.2] - 2025-12-20
1562
-
1563
- ### Fixed
1564
-
1565
- - **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/badlogic/indusagi-mono/issues/243))
1566
-
1567
- ## [0.24.1] - 2025-12-19
1568
-
1569
- ### Added
1570
-
1571
- - **OAuth and model config exports**: Scripts using `AgentSession` directly can now import `getAvailableModels`, `getApiKeyForModel`, `findModel`, `login`, `logout`, and `getOAuthProviders` from `indusagi-coding-agent` to reuse OAuth token storage and model resolution. ([#245](https://github.com/badlogic/indusagi-mono/issues/245))
1572
-
1573
- - **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/badlogic/indusagi-mono/pull/236) by [@theBucky](https://github.com/theBucky))
1574
-
1575
- ### Fixed
1576
-
1577
- - **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/badlogic/indusagi-mono/pull/248) by [@nicobailon](https://github.com/nicobailon))
1578
-
1579
- - **Hook onUpdate callback forwarding**: The `onUpdate` callback is now correctly forwarded through the hook wrapper, fixing custom tool progress updates. ([#238](https://github.com/badlogic/indusagi-mono/pull/238) by [@nicobailon](https://github.com/nicobailon))
1580
-
1581
- - **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/badlogic/indusagi-mono/pull/247) by [@aliou](https://github.com/aliou))
1582
-
1583
- - **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/badlogic/indusagi-mono/pull/242) by [@aliou](https://github.com/aliou))
1584
-
1585
- - **Global AGENTS.md loaded twice**: Fixed global AGENTS.md being loaded twice when present in both `~/.indusagi/agent/` and the current directory. ([#239](https://github.com/badlogic/indusagi-mono/pull/239) by [@aliou](https://github.com/aliou))
1586
-
1587
- - **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/badlogic/indusagi-mono/issues/243))
1588
-
1589
- - **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/badlogic/indusagi-mono/issues/240))
1590
-
1591
- ## [0.24.0] - 2025-12-19
1592
-
1593
- ### Added
1594
-
1595
- - **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/badlogic/indusagi-mono/pull/215) by [@nicobailon](https://github.com/nicobailon))
1596
-
1597
- - **`getMarkdownTheme()` export**: Custom tools can now import `getMarkdownTheme()` from `indusagi-coding-agent` to use the same markdown styling as the main UI.
1598
-
1599
- - **`indusagi.exec()` signal and timeout support**: Custom tools and hooks can now pass `{ signal, timeout }` options to `indusagi.exec()` for cancellation and timeout handling. The result includes a `killed` flag when the process was terminated.
1600
-
1601
- - **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/badlogic/indusagi-mono/pull/225) by [@kim0](https://github.com/kim0))
1602
-
1603
- - **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/badlogic/indusagi-mono/pull/223) by [@kim0](https://github.com/kim0))
1604
-
1605
- - **`/hotkeys` command**: Shows all keyboard shortcuts in a formatted table.
1606
-
1607
- - **Markdown table borders**: Tables now render with proper top and bottom borders.
1608
-
1609
- ### Changed
1610
-
1611
- - **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.
1612
-
1613
- - **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/badlogic/indusagi-mono/issues/231))
1614
-
1615
- ### Fixed
1616
-
1617
- - **JSON mode stdout flush**: Fixed race condition where `indusagi --mode json` could exit before all output was written to stdout, causing consumers to miss final events.
1618
-
1619
- - **Symlinked tools, hooks, and slash commands**: Discovery now correctly follows symlinks when scanning for custom tools, hooks, and slash commands. ([#219](https://github.com/badlogic/indusagi-mono/pull/219), [#232](https://github.com/badlogic/indusagi-mono/pull/232) by [@aliou](https://github.com/aliou))
1620
-
1621
- ### Breaking Changes
1622
-
1623
- - **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 `~/.indusagi/agent/tools/mytool.ts` must become `~/.indusagi/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.
1624
-
1625
- - **Hook `tool_result` event restructured**: The `ToolResultEvent` now exposes full tool result data instead of just text. ([#233](https://github.com/badlogic/indusagi-mono/pull/233))
1626
- - Removed: `result: string` field
1627
- - Added: `content: (TextContent | ImageContent)[]` - full content array
1628
- - Added: `details: unknown` - tool-specific details (typed per tool via discriminated union on `toolName`)
1629
- - `ToolResultEventResult.result` renamed to `ToolResultEventResult.text` (removed), use `content` instead
1630
- - Hook handlers returning `{ result: "..." }` must change to `{ content: [{ type: "text", text: "..." }] }`
1631
- - Built-in tool details types exported: `BashToolDetails`, `ReadToolDetails`, `GrepToolDetails`, `FindToolDetails`, `LsToolDetails`, `TruncationResult`
1632
- - Type guards exported for narrowing: `isBashToolResult`, `isReadToolResult`, `isEditToolResult`, `isWriteToolResult`, `isGrepToolResult`, `isFindToolResult`, `isLsToolResult`
1633
-
1634
- ## [0.23.4] - 2025-12-18
1635
-
1636
- ### Added
1637
-
1638
- - **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/badlogic/indusagi-mono/pull/214) by [@svkozak](https://github.com/svkozak))
1639
-
1640
- - **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.
1641
-
1642
- ### Fixed
1643
-
1644
- - **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/badlogic/indusagi-mono/issues/213), [#220](https://github.com/badlogic/indusagi-mono/pull/220))
1645
-
1646
- - **Google baseUrl configuration**: Google provider now respects `baseUrl` configuration for custom endpoints or API proxies. ([#216](https://github.com/badlogic/indusagi-mono/issues/216), [#221](https://github.com/badlogic/indusagi-mono/pull/221) by [@theBucky](https://github.com/theBucky))
1647
-
1648
- - **Google provider FinishReason**: Added handling for new `IMAGE_RECITATION` and `IMAGE_OTHER` finish reasons. Upgraded @google/genai to 1.34.0.
1649
-
1650
- ## [0.23.3] - 2025-12-17
1651
-
1652
- ### Fixed
1653
-
1654
- - Check for compaction before submitting user prompt, not just after agent turn ends. This catches cases where user aborts mid-response and context is already near the limit.
1655
-
1656
- ### Changed
1657
-
1658
- - Improved system prompt documentation section with clearer pointers to specific doc files for custom models, themes, skills, hooks, custom tools, and RPC.
1659
-
1660
- - Cleaned up documentation:
1661
-
1662
- - `theme.md`: Added missing color tokens (`thinkingXhigh`, `bashMode`)
1663
- - `skills.md`: Rewrote with better framing and examples
1664
- - `hooks.md`: Fixed timeout/error handling docs, added import aliases section
1665
- - `custom-tools.md`: Added intro with use cases and comparison table
1666
- - `rpc.md`: Added missing `hook_error` event documentation
1667
- - `README.md`: Complete settings table, condensed philosophy section, standardized OAuth docs
1668
-
1669
- - Hooks loader now supports same import aliases as custom tools (`@sinclair/typebox`, `indusagi-ai`, `indusagi-tui`, `indusagi-coding-agent`).
1670
-
1671
- ### Breaking Changes
1672
-
1673
- - **Hooks**: `turn_end` event's `toolResults` type changed from `AppMessage[]` to `ToolResultMessage[]`. If you have hooks that handle `turn_end` events and explicitly type the results, update your type annotations.
1674
-
1675
- ## [0.23.2] - 2025-12-17
1676
-
1677
- ### Fixed
1678
-
1679
- - 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/badlogic/indusagi-mono/issues/209))
1680
-
1681
- - Detect image MIME type via file magic (read tool and `@file` attachments), not filename extension.
1682
-
1683
- - 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/badlogic/indusagi-mono/pull/206) by [@kim0](https://github.com/kim0))
1684
-
1685
- ## [0.23.1] - 2025-12-17
1686
-
1687
- ### Fixed
1688
-
1689
- - Fixed TUI performance regression caused by Box component lacking render caching. Built-in tools now use Text directly (like v0.22.5), and Box has proper caching for custom tool rendering.
1690
-
1691
- - Fixed custom tools failing to load from `~/.indusagi/agent/tools/` when indusagi is installed globally. Module imports (`@sinclair/typebox`, `indusagi-tui`, `indusagi-ai`) are now resolved via aliases.
1692
-
1693
- ## [0.23.0] - 2025-12-17
1694
-
1695
- ### Added
1696
-
1697
- - **Custom tools**: Extend indusagi with custom tools written in TypeScript. Tools can provide custom TUI rendering, interact with users via `indusagi.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/badlogic/indusagi-mono/issues/190))
1698
-
1699
- - **Hook and tool examples**: Added `examples/hooks/` and `examples/custom-tools/` with working examples. Examples are now bundled in npm and binary releases.
1700
-
1701
- ### Breaking Changes
1702
-
1703
- - **Hooks**: Replaced `session_start` and `session_switch` events with unified `session` event. Use `event.reason` (`"start" | "switch" | "clear"`) to distinguish. Event now includes `entries` array for state reconstruction.
1704
-
1705
- ## [0.22.5] - 2025-12-17
1706
-
1707
- ### Fixed
1708
-
1709
- - Fixed `--session` flag not saving sessions in print mode (`-p`). The session manager was never receiving events because no subscriber was attached.
1710
-
1711
- ## [0.22.4] - 2025-12-17
1712
-
1713
- ### Added
1714
-
1715
- - `--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/badlogic/indusagi-mono/issues/203))
1716
-
1717
- ### Fixed
1718
-
1719
- - Fixed tool execution showing green (success) background while still running. Now correctly shows gray (pending) background until the tool completes.
1720
-
1721
- ## [0.22.3] - 2025-12-16
1722
-
1723
- ### Added
1724
-
1725
- - **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/badlogic/indusagi-mono/issues/44))
1726
-
1727
- ### Changed
1728
-
1729
- - **Tool output display**: When collapsed, tool output now shows the last N lines instead of the first N lines, making streaming output more useful.
1730
-
1731
- - Updated `indusagi-ai` with X-Initiator header support for GitHub Copilot, ensuring agent calls are not deducted from quota. ([#200](https://github.com/badlogic/indusagi-mono/pull/200) by [@kim0](https://github.com/kim0))
1732
-
1733
- ### Fixed
1734
-
1735
- - Fixed editor text being cleared during compaction. Text typed while compaction is running is now preserved. ([#179](https://github.com/badlogic/indusagi-mono/issues/179))
1736
- - 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.
1737
- - `/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/badlogic/indusagi-mono/pull/180) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1738
-
1739
- ## [0.22.2] - 2025-12-15
1740
-
1741
- ### Changed
1742
-
1743
- - Updated `indusagi-ai` with interleaved thinking enabled by default for Anthropic Claude 4 models.
1744
-
1745
- ## [0.22.1] - 2025-12-15
1746
-
1747
- _Dedicated to Peter's shoulder ([@steipete](https://twitter.com/steipete))_
1748
-
1749
- ### Changed
1750
-
1751
- - Updated `indusagi-ai` with interleaved thinking support for Anthropic models.
1752
-
1753
- ## [0.22.0] - 2025-12-15
1754
-
1755
- ### Added
1756
-
1757
- - **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/badlogic/indusagi-mono/pull/191) by [@cau1k](https://github.com/cau1k))
1758
-
1759
- ### Fixed
1760
-
1761
- - Model selector fuzzy search now matches against provider name (not just model ID) and supports space-separated tokens where all tokens must match
1762
-
1763
- ## [0.21.0] - 2025-12-14
1764
-
1765
- ### Added
1766
-
1767
- - **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/badlogic/indusagi-mono/pull/177) by [@nicobailon](https://github.com/nicobailon))
1768
-
1769
- - **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/badlogic/indusagi-mono/pull/176) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1770
-
1771
- ### Fixed
1772
-
1773
- - 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/badlogic/indusagi-mono/pull/181) by [@nicobailon](https://github.com/nicobailon))
1774
-
1775
- - Fixed double blank lines rendering after markdown code blocks ([#173](https://github.com/badlogic/indusagi-mono/pull/173) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1776
-
1777
- ## [0.20.1] - 2025-12-13
1778
-
1779
- ### Added
1780
-
1781
- - **Exported skills API**: `loadSkillsFromDir`, `formatSkillsForPrompt`, and related types are now exported for use by other packages (e.g., mom).
1782
-
1783
- ## [0.20.0] - 2025-12-13
1784
-
1785
- ### Breaking Changes
1786
-
1787
- - **indusagi skills now use `SKILL.md` convention**: indusagi skills must now be named `SKILL.md` inside a directory, matching Codex CLI format. Previously any `*.md` file was treated as a skill. Migrate by renaming `~/.indusagi/agent/skills/foo.md` to `~/.indusagi/agent/skills/foo/SKILL.md`.
1788
-
1789
- ### Added
1790
-
1791
- - Display loaded skills on startup in interactive mode
1792
-
1793
- ## [0.19.1] - 2025-12-12
1794
-
1795
- ### Fixed
1796
-
1797
- - Documentation: Added skills system documentation to README (setup, usage, CLI flags, settings)
1798
-
1799
- ## [0.19.0] - 2025-12-12
1800
-
1801
- ### Added
1802
-
1803
- - **Skills system**: Auto-discover and load instruction files on-demand. Supports Claude Code (`~/.claude/skills/*/SKILL.md`), Codex CLI (`~/.codex/skills/`), and indusagi-native formats (`~/.indusagi/agent/skills/`, `.indusagi/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/badlogic/indusagi-mono/issues/169))
1804
-
1805
- - **Version flag**: Added `--version` / `-v` flag to display the current version and exit. ([#170](https://github.com/badlogic/indusagi-mono/pull/170))
1806
-
1807
- ## [0.18.2] - 2025-12-11
1808
-
1809
- ### Added
1810
-
1811
- - **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/badlogic/indusagi-mono/issues/157))
1812
-
1813
- - **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/badlogic/indusagi-mono/issues/166))
1814
-
1815
- ### Fixed
1816
-
1817
- - **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/badlogic/indusagi-mono/issues/163))
1818
-
1819
- - **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.
1820
-
1821
- - **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 indusagi from a subdirectory of a repository. ([#156](https://github.com/badlogic/indusagi-mono/issues/156))
1822
-
1823
- ## [0.18.1] - 2025-12-10
1824
-
1825
- ### Added
1826
-
1827
- - **Mistral provider**: Added support for Mistral AI models. Set `MISTRAL_AINDUSAGI_KEY` environment variable to use.
1828
-
1829
- ### Fixed
1830
-
1831
- - 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/badlogic/indusagi-mono/issues/161))
1832
-
1833
- ## [0.18.0] - 2025-12-10
1834
-
1835
- ### Added
1836
-
1837
- - **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 `~/.indusagi/agent/hooks/*.ts` and `.indusagi/hooks/*.ts`. Thanks to [@nicobailon](https://github.com/nicobailon) for the collaboration on the design and implementation. ([#145](https://github.com/badlogic/indusagi-mono/issues/145), supersedes [#158](https://github.com/badlogic/indusagi-mono/pull/158))
1838
-
1839
- - **`indusagi.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.
1840
-
1841
- - **`--hook <path>` CLI flag**: Load hook files directly for testing without modifying settings.
1842
-
1843
- - **Hook events**: `session_start`, `session_switch`, `agent_start`, `agent_end`, `turn_start`, `turn_end`, `tool_call` (can block), `tool_result` (can modify), `branch`.
1844
-
1845
- - **Hook UI primitives**: `ctx.ui.select()`, `ctx.ui.confirm()`, `ctx.ui.input()`, `ctx.ui.notify()` for interactive prompts from hooks.
1846
-
1847
- - **Hooks documentation**: Full API reference at `docs/hooks.md`, shipped with npm package.
1848
-
1849
- ## [0.17.0] - 2025-12-09
1850
-
1851
- ### Changed
1852
-
1853
- - **Simplified compaction flow**: Removed proactive compaction (aborting mid-turn when threshold approached). Compaction now triggers in two cases only: (1) overflow error from LLM, which compacts and auto-retries, or (2) threshold crossed after a successful turn, which compacts without retry.
1854
-
1855
- - **Compaction retry uses `Agent.continue()`**: Auto-retry after overflow now uses the new `continue()` API instead of re-sending the user message, preserving exact context state.
1856
-
1857
- - **Merged turn prefix summary**: When a turn is split during compaction, the turn prefix summary is now merged into the main history summary instead of being stored separately.
1858
-
1859
- ### Added
1860
-
1861
- - **`isCompacting` property on AgentSession**: Check if auto-compaction is currently running.
1862
-
1863
- - **Session compaction indicator**: When resuming a compacted session, displays "Session compacted N times" status message.
1864
-
1865
- ### Fixed
1866
-
1867
- - **Block input during compaction**: User input is now blocked while auto-compaction is running to prevent race conditions.
1868
-
1869
- - **Skip error messages in usage calculation**: Context size estimation now skips both aborted and error messages, as neither have valid usage data.
1870
-
1871
- ## [0.16.0] - 2025-12-09
1872
-
1873
- ### Breaking Changes
1874
-
1875
- - **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/badlogic/indusagi-mono/issues/91))
1876
-
1877
- ### Changed
1878
-
1879
- - **README restructured**: Reorganized documentation from 30+ flat sections into 10 logical groups. Converted verbose subsections to scannable tables. Consolidated philosophy sections. Reduced size by ~60% while preserving all information.
1880
-
1881
- ## [0.15.0] - 2025-12-09
1882
-
1883
- ### Changed
1884
-
1885
- - **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/badlogic/indusagi-mono/issues/153))
1886
-
1887
- ## [0.14.2] - 2025-12-08
1888
-
1889
- ### Added
1890
-
1891
- - `/debug` command now includes agent messages as JSONL in the output
1892
-
1893
- ### Fixed
1894
-
1895
- - Fix crash when bash command outputs binary data (e.g., `curl` downloading a video file)
1896
-
1897
- ## [0.14.1] - 2025-12-08
1898
-
1899
- ### Fixed
1900
-
1901
- - Fix build errors with tsgo 7.0.0-dev.20251208.1 by properly importing `ReasoningEffort` type
1902
-
1903
- ## [0.14.0] - 2025-12-08
1904
-
1905
- ### Breaking Changes
1906
-
1907
- - **Custom themes require new color tokens**: Themes must now include `thinkingXhigh` and `bashMode` color tokens. The theme loader provides helpful error messages listing missing tokens. See built-in themes (dark.json, light.json) for reference values.
1908
-
1909
- ### Added
1910
-
1911
- - **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/badlogic/indusagi-mono/issues/133), thanks @fink-andreas for the initial idea and PR)
1912
-
1913
- - **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/badlogic/indusagi-mono/issues/143))
1914
-
1915
- - **Collapse changelog setting**: Add `"collapseChangelog": true` to `~/.indusagi/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/badlogic/indusagi-mono/issues/148))
1916
-
1917
- - **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/badlogic/indusagi-mono/pull/112), original implementation by [@markusylisiurunen](https://github.com/markusylisiurunen))
1918
-
1919
- ## [0.13.2] - 2025-12-07
1920
-
1921
- ### Changed
1922
-
1923
- - **Tool output truncation**: All tools now enforce consistent truncation limits with actionable notices for the LLM. ([#134](https://github.com/badlogic/indusagi-mono/issues/134))
1924
- - **Limits**: 2000 lines OR 50KB (whichever hits first), never partial lines
1925
- - **read**: Shows `[Showing lines X-Y of Z. Use offset=N to continue]`. If first line exceeds 50KB, suggests bash command
1926
- - **bash**: Tail truncation with temp file. Shows `[Showing lines X-Y of Z. Full output: /tmp/...]`
1927
- - **grep**: Pre-truncates match lines to 500 chars. Shows match limit and line truncation notices
1928
- - **find/ls**: Shows result/entry limit notices
1929
- - TUI displays truncation warnings in yellow at bottom of tool output (visible even when collapsed)
1930
-
1931
- ## [0.13.1] - 2025-12-06
1932
-
1933
- ### Added
1934
-
1935
- - **Flexible Windows shell configuration**: The bash tool now supports multiple shell sources beyond Git Bash. Resolution order: (1) custom `shellPath` in settings.json, (2) Git Bash in standard locations, (3) any bash.exe on PATH. This enables Cygwin, MSYS2, and other bash environments. Configure with `~/.indusagi/agent/settings.json`: `{"shellPath": "C:\\cygwin64\\bin\\bash.exe"}`.
1936
-
1937
- ### Fixed
1938
-
1939
- - **Windows binary detection**: Fixed Bun compiled binary detection on Windows by checking for URL-encoded `%7EBUN` in addition to `$bunfs` and `~BUN` in `import.meta.url`. This ensures the binary correctly locates supporting files (package.json, themes, etc.) next to the executable.
1940
-
1941
- ## [0.12.15] - 2025-12-06
1942
-
1943
- ### Fixed
1944
-
1945
- - **Editor crash with emojis/CJK characters**: Fixed crash when pasting or typing text containing wide characters (emojis like ✅, CJK characters) that caused line width to exceed terminal width. The editor now uses grapheme-aware text wrapping with proper visible width calculation.
1946
-
1947
- ## [0.12.14] - 2025-12-06
1948
-
1949
- ### Added
1950
-
1951
- - **Double-Escape Branch Shortcut**: Press Escape twice with an empty editor to quickly open the `/branch` selector for conversation branching.
1952
-
1953
- ## [0.12.13] - 2025-12-05
1954
-
1955
- ### Changed
1956
-
1957
- - **Faster startup**: Version check now runs in parallel with TUI initialization instead of blocking startup for up to 1 second. Update notifications appear in chat when the check completes.
1958
-
1959
- ## [0.12.12] - 2025-12-05
1960
-
1961
- ### Changed
1962
-
1963
- - **Footer display**: Token counts now use M suffix for millions (e.g., `10.2M` instead of `10184k`). Context display shortened from `61.3% of 200k` to `61.3%/200k`.
1964
-
1965
- ### Fixed
1966
-
1967
- - **Multi-key sequences in inputs**: Inputs like model search now handle multi-key sequences identically to the main prompt editor. ([#122](https://github.com/badlogic/indusagi-mono/pull/122) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1968
- - **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/badlogic/indusagi-mono/issues/109))
1969
-
1970
- ### Added
1971
-
1972
- - **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/badlogic/indusagi-mono/pull/122) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1973
- - **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/badlogic/indusagi-mono/pull/121) by [@nicobailon](https://github.com/nicobailon))
1974
- - **`/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/badlogic/indusagi-mono/pull/117) by [@hewliyang](https://github.com/hewliyang))
1975
-
1976
- ## [0.12.11] - 2025-12-05
1977
-
1978
- ### Changed
1979
-
1980
- - **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/badlogic/indusagi-mono/issues/108))
1981
-
1982
- ### Fixed
1983
-
1984
- - **Print mode error handling**: `-p` flag now outputs error messages and exits with code 1 when requests fail, instead of silently producing no output.
1985
- - **Branch selector crash**: Fixed TUI crash when user messages contained Unicode characters (like `✔` or `›`) that caused line width to exceed terminal width. Now uses proper `truncateToWidth` instead of `substring`.
1986
- - **Bash output escape sequences**: Fixed incomplete stripping of terminal escape sequences in bash tool output. `stripAnsi` misses some sequences like standalone String Terminator (`ESC \`), which could cause rendering issues when displaying captured TUI output.
1987
- - **Footer overflow crash**: Fixed TUI crash when terminal width is too narrow for the footer stats line. The footer now truncates gracefully instead of overflowing.
1988
-
1989
- ### Added
1990
-
1991
- - **`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/badlogic/indusagi-mono/issues/81))
1992
- - **`--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/badlogic/indusagi-mono/pull/114) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1993
- - **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/badlogic/indusagi-mono/pull/113) by [@markusylisiurunen](https://github.com/markusylisiurunen))
1994
-
1995
- ## [0.12.10] - 2025-12-04
1996
-
1997
- ### Added
1998
-
1999
- - Added `gpt-5.1-codex-max` model support
2000
-
2001
- ## [0.12.9] - 2025-12-04
2002
-
2003
- ### Added
2004
-
2005
- - **`/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/badlogic/indusagi-mono/pull/105) by [@markusylisiurunen](https://github.com/markusylisiurunen))
2006
-
2007
- ## [0.12.8] - 2025-12-04
2008
-
2009
- - Fix: Use CTRL+O consistently for compaction expand shortcut (not CMD+O on Mac)
2010
-
2011
- ## [0.12.7] - 2025-12-04
2012
-
2013
- ### Added
2014
-
2015
- - **Context Compaction**: Long sessions can now be compacted to reduce context usage while preserving recent conversation history. ([#92](https://github.com/badlogic/indusagi-mono/issues/92), [docs](https://github.com/badlogic/indusagi-mono/blob/main/packages/coding-agent/README.md#context-compaction))
2016
- - `/compact [instructions]`: Manually compact context with optional custom instructions for the summary
2017
- - `/autocompact`: Toggle automatic compaction when context exceeds threshold
2018
- - Compaction summarizes older messages while keeping recent messages (default 20k tokens) verbatim
2019
- - Auto-compaction triggers when context reaches `contextWindow - reserveTokens` (default 16k reserve)
2020
- - Compacted sessions show a collapsible summary in the TUI (toggle with `o` key)
2021
- - HTML exports include compaction summaries as collapsible sections
2022
- - RPC mode supports `{"type":"compact"}` command and auto-compaction (emits compaction events)
2023
- - **Branch Source Tracking**: Branched sessions now store `branchedFrom` in the session header, containing the path to the original session file. Useful for tracing session lineage.
2024
-
2025
- ## [0.12.5] - 2025-12-03
2026
-
2027
- ### Added
2028
-
2029
- - **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/badlogic/indusagi-mono/pull/95))
2030
-
2031
- ### Fixed
2032
-
2033
- - **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/badlogic/indusagi-mono/pull/95))
2034
-
2035
- ## [0.12.4] - 2025-12-02
2036
-
2037
- ### Added
2038
-
2039
- - **RPC Termination Safeguard**: When running as an RPC worker (stdin pipe detected), the CLI now exits immediately if the parent process terminates unexpectedly. Prevents orphaned RPC workers from persisting indefinitely and consuming system resources.
2040
-
2041
- ## [0.12.3] - 2025-12-02
2042
-
2043
- ### Fixed
2044
-
2045
- - **Rate limit handling**: Anthropic rate limit errors now trigger automatic retry with exponential backoff (base 10s, max 5 retries). Previously these errors would abort the request immediately.
2046
- - **Usage tracking during retries**: Retried requests now correctly accumulate token usage from all attempts, not just the final successful one. Fixes artificially low token counts when requests were retried.
2047
-
2048
- ## [0.12.2] - 2025-12-02
2049
-
2050
- ### Changed
2051
-
2052
- - Removed support for gpt-4.5-preview and o3 models (not yet available)
2053
-
2054
- ## [0.12.1] - 2025-12-02
2055
-
2056
- ### Added
2057
-
2058
- - **Models**: Added support for OpenAI's new models:
2059
- - `gpt-4.1` (128K context)
2060
- - `gpt-4.1-mini` (128K context)
2061
- - `gpt-4.1-nano` (128K context)
2062
- - `o3` (200K context, reasoning model)
2063
- - `o4-mini` (200K context, reasoning model)
2064
-
2065
- ## [0.12.0] - 2025-12-02
2066
-
2067
- ### Added
2068
-
2069
- - **`-p, --print` Flag**: Run in non-interactive batch mode. Processes input message or piped stdin without TUI, prints agent response directly to stdout. Ideal for scripting, piping, and CI/CD integration. Exits after first response.
2070
- - **`-P, --print-streaming` Flag**: Like `-p`, but streams response tokens as they arrive. Use `--print-streaming --no-markdown` for raw unformatted output.
2071
- - **`--print-turn` Flag**: Continue processing tool calls and agent turns until the agent naturally finishes or requires user input. Combine with `-p` for complete multi-turn conversations.
2072
- - **`--no-markdown` Flag**: Output raw text without Markdown formatting. Useful when piping output to tools that expect plain text.
2073
- - **Streaming Print Mode**: Added internal `printStreaming` option for streaming output in non-TUI mode.
2074
- - **RPC Mode `print` Command**: Send `{"type":"print","content":"text"}` to get formatted print output via `print_output` events.
2075
- - **Auto-Save in Print Mode**: Print mode conversations are automatically saved to the session directory, allowing later resumption with `--continue`.
2076
- - **Thinking level options**: Added `--thinking-off`, `--thinking-minimal`, `--thinking-low`, `--thinking-medium`, `--thinking-high` flags for directly specifying thinking level without the selector UI.
2077
-
2078
- ### Changed
2079
-
2080
- - **Simplified RPC Protocol**: Replaced the `prompt` wrapper command with direct message objects. Send `{"role":"user","content":"text"}` instead of `{"type":"prompt","message":"text"}`. Better aligns with message format throughout the codebase.
2081
- - **RPC Message Handling**: Agent now processes raw message objects directly, with `timestamp` auto-populated if missing.
2082
-
2083
- ## [0.11.9] - 2025-12-02
2084
-
2085
- ### Changed
2086
-
2087
- - Change Ctrl+I to Ctrl+P for model cycling shortcut to avoid collision with Tab key in some terminals
2088
-
2089
- ## [0.11.8] - 2025-12-01
2090
-
2091
- ### Fixed
2092
-
2093
- - Absolute glob patterns (e.g., `/Users/foo/**/*.ts`) are now handled correctly. Previously the leading `/` was being stripped, causing the pattern to be interpreted relative to the current directory.
2094
-
2095
- ## [0.11.7] - 2025-12-01
2096
-
2097
- ### Fixed
2098
-
2099
- - Fix read path traversal vulnerability. Paths are now validated to prevent reading outside the working directory or its parents. The `read` tool can read from `cwd`, its ancestors (for config files), and all descendants. Symlinks are resolved before validation.
2100
-
2101
- ## [0.11.6] - 2025-12-01
2102
-
2103
- ### Fixed
2104
-
2105
- - Fix `--system-prompt <path>` allowing the path argument to be captured by the message collection, causing "file not found" errors.
2106
-
2107
- ## [0.11.5] - 2025-11-30
2108
-
2109
- ### Fixed
2110
-
2111
- - Fixed fatal error "Cannot set properties of undefined (setting '0')" when editing empty files in the `edit` tool.
2112
- - Simplified `edit` tool output: Shows only "Edited file.txt" for successful edits instead of verbose search/replace details.
2113
- - Fixed fatal error in footer rendering when token counts contain NaN values due to missing usage data.
2114
-
2115
- ## [0.11.4] - 2025-11-30
2116
-
2117
- ### Fixed
2118
-
2119
- - Fixed chat rendering crash when messages contain preformatted/styled text (e.g., thinking traces with gray italic styling). The markdown renderer now preserves existing ANSI escape codes when they appear before inline elements.
2120
-
2121
- ## [0.11.3] - 2025-11-29
2122
-
2123
- ### Fixed
2124
-
2125
- - Fix file drop functionality for absolute paths
2126
-
2127
- ## [0.11.2] - 2025-11-29
2128
-
2129
- ### Fixed
2130
-
2131
- - Fixed TUI crash when pasting content containing tab characters. Tabs are now converted to 4 spaces before insertion.
2132
- - Fixed terminal corruption after exit when shell integration sequences (OSC 133) appeared in bash output. These sequences are now stripped along with other ANSI codes.
2133
-
2134
- ## [0.11.1] - 2025-11-29
2135
-
2136
- ### Added
2137
-
2138
- - Added `fd` integration for file path autocompletion. Now uses `fd` for faster fuzzy file search
2139
-
2140
- ### Fixed
2141
-
2142
- - Fixed keyboard shortcuts Ctrl+A, Ctrl+E, Ctrl+K, Ctrl+U, Ctrl+W, and word navigation (Option+Arrow) not working in VS Code integrated terminal and some other terminal emulators
2143
-
2144
- ## [0.11.0] - 2025-11-29
2145
-
2146
- ### Added
2147
-
2148
- - **File-based Slash Commands**: Create custom reusable prompts as `.txt` files in `~/.indusagi/slash-commands/`. Files become `/filename` commands with first-line descriptions. Supports `{{selection}}` placeholder for referencing selected/attached content.
2149
- - **`/branch` Command**: Create conversation branches from any previous user message. Opens a selector to pick a message, then creates a new session file starting from that point. Original message text is placed in the editor for modification.
2150
- - **Unified Content References**: Both `@path` in messages and `--file path` CLI arguments now use the same attachment system with consistent MIME type detection.
2151
- - **Drag & Drop Files**: Drop files onto the terminal to attach them to your message. Supports multiple files and both text and image content.
2152
-
2153
- ### Changed
2154
-
2155
- - **Model Selector with Search**: The `/model` command now opens a searchable list. Type to filter models by name, use arrows to navigate, Enter to select.
2156
- - **Improved File Autocomplete**: File path completion after `@` now supports fuzzy matching and shows file/directory indicators.
2157
- - **Session Selector with Search**: The `--resume` and `--session` flags now open a searchable session list with fuzzy filtering.
2158
- - **Attachment Display**: Files added via `@path` are now shown as "Attached: filename" in the user message, separate from the prompt text.
2159
- - **Tab Completion**: Tab key now triggers file path autocompletion anywhere in the editor, not just after `@` symbol.
2160
-
2161
- ### Fixed
2162
-
2163
- - Fixed autocomplete z-order issue where dropdown could appear behind chat messages
2164
- - Fixed cursor position when navigating through wrapped lines in the editor
2165
- - Fixed attachment handling for continued sessions to preserve file references
2166
-
2167
- ## [0.10.6] - 2025-11-28
2168
-
2169
- ### Changed
2170
-
2171
- - Show base64-truncated indicator for large images in tool output
2172
-
2173
- ### Fixed
2174
-
2175
- - Fixed image dimensions not being read correctly from PNG/JPEG/GIF files
2176
- - Fixed PDF images being incorrectly base64-truncated in display
2177
- - Allow reading files from ancestor directories (needed for monorepo configs)
2178
-
2179
- ## [0.10.5] - 2025-11-28
2180
-
2181
- ### Added
2182
-
2183
- - Full multimodal support: attach images (PNG, JPEG, GIF, WebP) and PDFs to prompts using `@path` syntax or `--file` flag
2184
-
2185
- ### Fixed
2186
-
2187
- - `@`-references now handle special characters in file names (spaces, quotes, unicode)
2188
- - Fixed cursor positioning issues with multi-byte unicode characters in editor
2189
-
2190
- ## [0.10.4] - 2025-11-28
2191
-
2192
- ### Fixed
2193
-
2194
- - Removed padding on first user message in TUI to improve visual consistency.
2195
-
2196
- ## [0.10.3] - 2025-11-28
2197
-
2198
- ### Added
2199
-
2200
- - Added RPC mode (`--rpc`) for programmatic integration. Accepts JSON commands on stdin, emits JSON events on stdout. See [RPC mode documentation](https://github.com/nicobailon/indusagi-mono/blob/main/packages/coding-agent/README.md#rpc-mode) for protocol details.
2201
-
2202
- ### Changed
2203
-
2204
- - Refactored internal architecture to support multiple frontends (TUI, RPC) with shared agent logic.
2205
-
2206
- ## [0.10.2] - 2025-11-26
2207
-
2208
- ### Added
2209
-
2210
- - Added thinking level persistence. Default level stored in `~/.indusagi/settings.json`, restored on startup. Per-session overrides saved in session files.
2211
- - Added model cycling shortcut: `Ctrl+I` cycles through available models (or scoped models with `-m` flag).
2212
- - Added automatic retry with exponential backoff for transient API errors (network issues, 500s, overload).
2213
- - Cumulative token usage now shown in footer (total tokens used across all messages in session).
2214
- - Added `--system-prompt` flag to override default system prompt with custom text or file contents.
2215
- - Footer now shows estimated total cost in USD based on model pricing.
2216
-
2217
- ### Changed
2218
-
2219
- - Replaced `--models` flag with `-m/--model` supporting multiple values. Specify models as `provider/model@thinking` (e.g., `anthropic/claude-sonnet-4-20250514@high`). Multiple `-m` flags scope available models for the session.
2220
- - Thinking level border now persists visually after selector closes.
2221
- - Improved tool result display with collapsible output (default collapsed, expand with `Ctrl+O`).
2222
-
2223
- ## [0.10.1] - 2025-11-25
2224
-
2225
- ### Added
2226
-
2227
- - Add custom model configuration via `~/.indusagi/models.json`
2228
-
2229
- ## [0.10.0] - 2025-11-25
2230
-
2231
- Initial public release.
2232
-
2233
- ### Added
2234
-
2235
- - Interactive TUI with streaming responses
2236
- - Conversation session management with `--continue`, `--resume`, and `--session` flags
2237
- - Multi-line input support (Shift+Enter or Option+Enter for new lines)
2238
- - Tool execution: `read`, `write`, `edit`, `bash`, `glob`, `grep`, `think`
2239
- - Thinking mode support for Claude with visual indicator and `/thinking` selector
2240
- - File path autocompletion with `@` prefix
2241
- - Slash command autocompletion
2242
- - `/export` command for HTML session export
2243
- - `/model` command for runtime model switching
2244
- - `/session` command for session statistics
2245
- - Model provider support: Anthropic (Claude), OpenAI, Google (Gemini)
2246
- - Git branch display in footer
2247
- - Message queueing during streaming responses
2248
- - OAuth integration for Gmail and Google Calendar access
2249
- - HTML export with syntax highlighting and collapsible sections