@ai-agent-forge/agent-forge 0.86.4 → 0.86.5

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 (220) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/dist/bundle/.build-manifest.json +470 -404
  3. package/dist/bundle/chunks/anthropic-messages-ALDZBUKI.js +6 -0
  4. package/dist/bundle/chunks/anthropic.js +2 -2
  5. package/dist/bundle/chunks/{azure-openai-responses-WQCZWFAH.js → azure-openai-responses-A2WJWZFB.js} +1 -1
  6. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  7. package/dist/bundle/chunks/chunk-A7GUOX2H.js +141 -0
  8. package/dist/bundle/chunks/{chunk-WGLBM2BP.js → chunk-CIX3FSBK.js} +1 -1
  9. package/dist/bundle/chunks/{chunk-ZV3W36HK.js → chunk-EALJ5DDX.js} +99 -92
  10. package/dist/bundle/chunks/chunk-OO6DJ3CL.js +31 -0
  11. package/dist/bundle/chunks/{chunk-PE3XUHPT.js → chunk-SQFG22WN.js} +1 -1
  12. package/dist/bundle/chunks/{chunk-V46XUTK3.js → chunk-Y7HXTASS.js} +1 -1
  13. package/dist/bundle/chunks/{chunk-3WE3W52L.js → chunk-YJCQVXW5.js} +1 -1
  14. package/dist/bundle/chunks/github-copilot.js +1 -1
  15. package/dist/bundle/chunks/{google-generative-ai-LQ375GYC.js → google-generative-ai-NIB4WONV.js} +1 -1
  16. package/dist/bundle/chunks/{google-vertex-HXSRAKEZ.js → google-vertex-DCPYUEUO.js} +1 -1
  17. package/dist/bundle/chunks/{mistral-conversations-CSNMFR4J.js → mistral-conversations-OC6LA5XL.js} +1 -1
  18. package/dist/bundle/chunks/{openai-codex-responses-YDJSZOIH.js → openai-codex-responses-IO2X4Y7L.js} +1 -1
  19. package/dist/bundle/chunks/openai-codex.js +2 -2
  20. package/dist/bundle/chunks/{openai-completions-UPRWTQPT.js → openai-completions-XYQQHETU.js} +1 -1
  21. package/dist/bundle/chunks/{openai-responses-O63W6HQ3.js → openai-responses-DLIRN3CI.js} +1 -1
  22. package/dist/bundle/chunks/{openrouter-images-G3GT5BVT.js → openrouter-images-G4GQRUSG.js} +1 -1
  23. package/dist/bundle/chunks/openrouter.js +2 -2
  24. package/dist/bundle/chunks/{pi-messages-SLF355GF.js → pi-messages-E6RRYBO7.js} +1 -1
  25. package/dist/bundle/chunks/radius.js +2 -2
  26. package/dist/bundle/chunks/{virtual-modules-O72ICTMQ.js → virtual-modules-3IZ4MYSQ.js} +1 -1
  27. package/dist/bundle/cli.js +1 -1
  28. package/dist/bundle/index.js +1 -1
  29. package/dist/bundle/rpc-entry.js +1 -1
  30. package/dist/capabilities/builtin.d.ts +4 -2
  31. package/dist/capabilities/builtin.d.ts.map +1 -1
  32. package/dist/capabilities/builtin.js +5 -1
  33. package/dist/capabilities/builtin.js.map +1 -1
  34. package/dist/cli/plugin-command.d.ts.map +1 -1
  35. package/dist/cli/plugin-command.js +51 -5
  36. package/dist/cli/plugin-command.js.map +1 -1
  37. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  38. package/dist/core/agent-session-compaction.js +13 -5
  39. package/dist/core/agent-session-compaction.js.map +1 -1
  40. package/dist/core/agent-session-internal.d.ts +2 -4
  41. package/dist/core/agent-session-internal.d.ts.map +1 -1
  42. package/dist/core/agent-session-internal.js.map +1 -1
  43. package/dist/core/agent-session-paths.d.ts +2 -0
  44. package/dist/core/agent-session-paths.d.ts.map +1 -1
  45. package/dist/core/agent-session-paths.js +2 -1
  46. package/dist/core/agent-session-paths.js.map +1 -1
  47. package/dist/core/agent-session-projection.d.ts +10 -4
  48. package/dist/core/agent-session-projection.d.ts.map +1 -1
  49. package/dist/core/agent-session-projection.js +17 -4
  50. package/dist/core/agent-session-projection.js.map +1 -1
  51. package/dist/core/agent-session.d.ts +19 -5
  52. package/dist/core/agent-session.d.ts.map +1 -1
  53. package/dist/core/agent-session.js +30 -4
  54. package/dist/core/agent-session.js.map +1 -1
  55. package/dist/core/extensions/bootstrap-lifecycle.d.ts +1 -1
  56. package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
  57. package/dist/core/extensions/bootstrap-lifecycle.js +5 -2
  58. package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
  59. package/dist/core/extensions/capability-runtime-store.d.ts.map +1 -1
  60. package/dist/core/extensions/capability-runtime-store.js +1 -0
  61. package/dist/core/extensions/capability-runtime-store.js.map +1 -1
  62. package/dist/core/extensions/capability-runtime-types.d.ts +16 -1
  63. package/dist/core/extensions/capability-runtime-types.d.ts.map +1 -1
  64. package/dist/core/extensions/capability-runtime-types.js.map +1 -1
  65. package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
  66. package/dist/core/extensions/capability-runtime.js +38 -2
  67. package/dist/core/extensions/capability-runtime.js.map +1 -1
  68. package/dist/core/extensions/index.d.ts +1 -1
  69. package/dist/core/extensions/index.d.ts.map +1 -1
  70. package/dist/core/extensions/index.js.map +1 -1
  71. package/dist/core/extensions/lifecycle-catalog.d.ts +46 -0
  72. package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
  73. package/dist/core/extensions/lifecycle-catalog.js +101 -0
  74. package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
  75. package/dist/core/extensions/provider-failover.d.ts +106 -0
  76. package/dist/core/extensions/provider-failover.d.ts.map +1 -0
  77. package/dist/core/extensions/provider-failover.js +692 -0
  78. package/dist/core/extensions/provider-failover.js.map +1 -0
  79. package/dist/core/facade/coding-agent-facade.d.ts +13 -6
  80. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  81. package/dist/core/facade/coding-agent-facade.js +3 -1
  82. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  83. package/dist/core/keybindings.d.ts +6 -6
  84. package/dist/core/keybindings.d.ts.map +1 -1
  85. package/dist/core/keybindings.js +23 -6
  86. package/dist/core/keybindings.js.map +1 -1
  87. package/dist/core/model-config.d.ts +102 -0
  88. package/dist/core/model-config.d.ts.map +1 -1
  89. package/dist/core/model-config.js +46 -14
  90. package/dist/core/model-config.js.map +1 -1
  91. package/dist/core/model-resolver.d.ts.map +1 -1
  92. package/dist/core/model-resolver.js +1 -1
  93. package/dist/core/model-resolver.js.map +1 -1
  94. package/dist/core/model-runtime.d.ts +15 -0
  95. package/dist/core/model-runtime.d.ts.map +1 -1
  96. package/dist/core/model-runtime.js +30 -18
  97. package/dist/core/model-runtime.js.map +1 -1
  98. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  99. package/dist/core/remote-catalog-provider.js +4 -9
  100. package/dist/core/remote-catalog-provider.js.map +1 -1
  101. package/dist/core/sdk.d.ts.map +1 -1
  102. package/dist/core/sdk.js +107 -24
  103. package/dist/core/sdk.js.map +1 -1
  104. package/dist/core/session-manager.d.ts +2 -0
  105. package/dist/core/session-manager.d.ts.map +1 -1
  106. package/dist/core/session-manager.js +10 -5
  107. package/dist/core/session-manager.js.map +1 -1
  108. package/dist/core/settings-manager.d.ts +71 -5
  109. package/dist/core/settings-manager.d.ts.map +1 -1
  110. package/dist/core/settings-manager.js +138 -9
  111. package/dist/core/settings-manager.js.map +1 -1
  112. package/dist/core/slash-commands.d.ts.map +1 -1
  113. package/dist/core/slash-commands.js +17 -2
  114. package/dist/core/slash-commands.js.map +1 -1
  115. package/dist/core/tools/render-utils.d.ts +6 -0
  116. package/dist/core/tools/render-utils.d.ts.map +1 -1
  117. package/dist/core/tools/render-utils.js +26 -0
  118. package/dist/core/tools/render-utils.js.map +1 -1
  119. package/dist/core/tools/tool-definition.d.ts +21 -2
  120. package/dist/core/tools/tool-definition.d.ts.map +1 -1
  121. package/dist/core/tools/tool-definition.js.map +1 -1
  122. package/dist/main.d.ts.map +1 -1
  123. package/dist/main.js +3 -6
  124. package/dist/main.js.map +1 -1
  125. package/dist/modes/interactive/components/agents-view.d.ts +57 -0
  126. package/dist/modes/interactive/components/agents-view.d.ts.map +1 -0
  127. package/dist/modes/interactive/components/agents-view.js +260 -0
  128. package/dist/modes/interactive/components/agents-view.js.map +1 -0
  129. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  130. package/dist/modes/interactive/components/custom-editor.js +2 -2
  131. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  132. package/dist/modes/interactive/components/footer.d.ts +7 -0
  133. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  134. package/dist/modes/interactive/components/footer.js +51 -6
  135. package/dist/modes/interactive/components/footer.js.map +1 -1
  136. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -1
  137. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  138. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  139. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  140. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  141. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  142. package/dist/modes/interactive/components/settings-selector.js +12 -2
  143. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  144. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  145. package/dist/modes/interactive/components/thinking-selector.js +1 -1
  146. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  147. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  148. package/dist/modes/interactive/components/tool-execution.js +89 -10
  149. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  150. package/dist/modes/interactive/components/user-message-selector.d.ts +3 -0
  151. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  152. package/dist/modes/interactive/components/user-message-selector.js +9 -3
  153. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  154. package/dist/modes/interactive/components/workflow-view.d.ts +119 -0
  155. package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -0
  156. package/dist/modes/interactive/components/workflow-view.js +638 -0
  157. package/dist/modes/interactive/components/workflow-view.js.map +1 -0
  158. package/dist/modes/interactive/interactive-commands.d.ts +22 -0
  159. package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
  160. package/dist/modes/interactive/interactive-commands.js +56 -0
  161. package/dist/modes/interactive/interactive-commands.js.map +1 -1
  162. package/dist/modes/interactive/interactive-mode.d.ts +51 -1
  163. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  164. package/dist/modes/interactive/interactive-mode.js +218 -37
  165. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  166. package/dist/modes/interactive/interactive-selectors.d.ts +2 -4
  167. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  168. package/dist/modes/interactive/interactive-selectors.js +10 -1
  169. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  170. package/dist/modes/print-mode.d.ts.map +1 -1
  171. package/dist/modes/print-mode.js +5 -0
  172. package/dist/modes/print-mode.js.map +1 -1
  173. package/dist/modes/rpc/rpc-client.d.ts +3 -1
  174. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  175. package/dist/modes/rpc/rpc-client.js +4 -2
  176. package/dist/modes/rpc/rpc-client.js.map +1 -1
  177. package/dist/modes/rpc/rpc-types.d.ts +1 -0
  178. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  179. package/dist/modes/rpc/rpc-types.js.map +1 -1
  180. package/dist/plugins/ecosystem/bootstrap-factory-manifest.d.ts.map +1 -1
  181. package/dist/plugins/ecosystem/bootstrap-factory-manifest.js +7 -0
  182. package/dist/plugins/ecosystem/bootstrap-factory-manifest.js.map +1 -1
  183. package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
  184. package/dist/plugins/ecosystem/cli.js +1 -1
  185. package/dist/plugins/ecosystem/cli.js.map +1 -1
  186. package/dist/plugins/ecosystem/install-store-paths.d.ts +15 -0
  187. package/dist/plugins/ecosystem/install-store-paths.d.ts.map +1 -0
  188. package/dist/plugins/ecosystem/install-store-paths.js +58 -0
  189. package/dist/plugins/ecosystem/install-store-paths.js.map +1 -0
  190. package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
  191. package/dist/plugins/ecosystem/node-disk-registry-source.js +3 -8
  192. package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
  193. package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
  194. package/dist/plugins/ecosystem/node-package-install-host.js +9 -1
  195. package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
  196. package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
  197. package/dist/plugins/ecosystem/node-package-install-persistence.js +3 -8
  198. package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
  199. package/dist/profile/plugin-profiles.d.ts +2 -0
  200. package/dist/profile/plugin-profiles.d.ts.map +1 -1
  201. package/dist/profile/plugin-profiles.js +4 -0
  202. package/dist/profile/plugin-profiles.js.map +1 -1
  203. package/dist/profiles/builtin-suites.d.ts +19 -2
  204. package/dist/profiles/builtin-suites.d.ts.map +1 -1
  205. package/dist/profiles/builtin-suites.js +20 -2
  206. package/dist/profiles/builtin-suites.js.map +1 -1
  207. package/dist/profiles/suite-loader.d.ts.map +1 -1
  208. package/dist/profiles/suite-loader.js +4 -1
  209. package/dist/profiles/suite-loader.js.map +1 -1
  210. package/dist/utils/clipboard.d.ts.map +1 -1
  211. package/dist/utils/clipboard.js +10 -10
  212. package/dist/utils/clipboard.js.map +1 -1
  213. package/docs/keybindings.md +8 -8
  214. package/docs/models.md +1 -1
  215. package/docs/rpc.md +3 -1
  216. package/docs/settings.md +2 -1
  217. package/package.json +4 -4
  218. package/dist/bundle/chunks/anthropic-messages-EVFQ6MLR.js +0 -6
  219. package/dist/bundle/chunks/chunk-F6SBZUJG.js +0 -141
  220. package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog
2
2
 
3
+ ## [Unreleased]
4
+
5
+ ## [0.86.5] - 2026-10-02
6
+ ### Added
7
+
8
+ - Interrupt grading for background subagents (设计 子代理运行时 §4.2, user ruling 2026-10-02; industry alignment: codex Esc stops only the current thread's turn, Claude Code stops background agents through a separate confirmed entry): `AgentSession.abort()` gains `{ cancelAgentTasks?: boolean }` (default `true`, original cascade contract unchanged for SDK/dispose paths) — `false` stops the current turn (model stream/tool loop/bash) without touching the background-agent cancel fence. **The TUI Esc always passes `false`**: Esc now has exactly one meaning (stop the current turn) and never terminates background subagents — previously one accidental Esc irreversibly cancelled every running subagent (fence epoch refresh made it unrecoverable). When background subagents are still running after an interrupt, a status line points at the way out. New `/stop-agents` command (single entry, no keybinding) is the only explicit termination face, reporting how many tasks it terminated; `getActiveAgentTaskCount()` (session/facade) exposes the runtime's live-task projection, and `abortAgentTasks()` is the command's execution face. Two implementation traps the new tests caught: the fence epoch must refresh only when the cascade actually fired (otherwise live tasks' fence listeners detach from the controller, and a later explicit termination misses them), and terminal-but-not-yet-disposed tasks stay in the live set (the count filters by status).
9
+ - The workflow orchestration plugin ships in the factory bootstrap manifest (ninth package) and both builtin suites declare `builtin.workflow` (goal/plan/todo parity, D-077): fresh installs acquire the plugin on first startup, existing workspaces adopt the suite declaration via the `--suite-reset` upgrade proposal (`FACTORY_CONTENTS_VERSION` 5→6), and the plugin form is unchanged — independent package, independently disableable and replaceable. Until the multi-package npm publish line lands (D-075), the fresh-install bootstrap entry resolves as a per-plugin failed diagnostic (fail-open, startup unaffected), matching the image-generation entry's current state.
10
+ - `/queue [text]`, `/dequeue`, and `/editor` builtin commands (single-entry-point iron law): `/queue` queues a follow-up message for after the current run — with an explicit argument it queues that text without touching the editor draft, without one it mirrors the old keybinding verbatim (queues the editor content); `/dequeue` restores queued messages back to the editor; `/editor` opens the current input in an external editor. Their shipped keybinding defaults (`ctrl+q`/`alt+enter`, `alt+q`/`alt+up`) were cleared (bindings stay configurable, `/hotkeys` rows appear only when configured). `ctrl+g` (external editor) and `ctrl+x` (copy) keep their defaults scoped to the components that have no command channel — dialog inputs (external editor) and the `/tree` view (in-place copy); the main editor no longer consumes either key (iron-law review 2026-10-02: registering them globally had re-created a second entry for `/editor` and `/copy`), so those two commands are the main editor's single entries.
11
+ - Read-only text commands for the task plugins: `/goal` (goal records with status and evidence), `/plan` (plans with status and goal reference), and `/todo` (todos with status, plan reference, and evidence) render each plugin's live state from its latest session entry — the same L1 text face as `/workflow`, available in interactive completions and print mode alike (`-p "/todo"`); empty states return a one-line creation hint. The footer's `goal/todo` line now also shows todo progress alone when no goal exists (previously a todo set without a goal was invisible).
12
+ - Capability-slot config faces for independent image-generation providers (设计 `供应商能力槽位与主备切换设计.md` §3): `settings.json` gains a `capabilities.imageGeneration` slot (`{ provider, model? }`, deep-merged across layers, invalid shapes warn once and fail closed) and a `failover` node typed and readable raw (`SettingsManager.getFailoverSettings()`; behavior lands in Phase 2); `models.json` model definitions/overrides accept `output?: ("text"|"image")[]` (omitted = `["text"]`); `ModelConfig.getImageModelCatalog()` projects the per-provider image-model snapshot for the host's assembly-time `configOverride` injection into the image-generation plugin.
13
+ - Provider primary/backup failover (设计 `供应商能力槽位与主备切换设计.md` §4, Phase 2): the embedded first-party `agent-forge.provider-failover` plugin registers a stream-function wrapper through the new public `registerStreamFnWrapper` face on the sdk default stream assembly. Judgment uses only local stream-terminal facts (`done`/`error`/`aborted`) plus the prelude-event commit boundary: a primary `error` with no released content reroutes immediately (replay reuses the same context with `apiKey`/`headers`/`env` stripped and only the backup `Model` swapped), `aborted` neither counts nor reroutes, and an exhausted chain reports the last actual failure verbatim with a whole-chain `diagnostics` summary. Per-primary breakers (threshold 2, cooldown 60s doubling to a 15min cap, HALF_OPEN real-request probes) live in a module-level singleton shared by every session and subagent in the process. Explicit `failover.chains` win over `backupProviders` same-id matching, duplicate chain primaries refuse load with a warning, and an empty candidate list sends straight to the primary with failures counted as before. Every reroute is observable through `provider.failover.switched@1` / `provider.failover.recovered@1` / `provider.failover.probe.failed@1`. Sessions whose caller supplies an explicit `options.streamFn` bypass the default assembly entirely and never fail over (known boundary, §6 risk 9).
14
+ - Install-time preflight for provider failover (设计 `供应商能力槽位与主备切换设计.md` §4.6): when the plugin is installed, explicit-chain backups are statically checked — model resolvable through the catalog and provider has a credential entry (a `hasConfiguredAuth`-shaped snapshot read: no network, no OAuth refresh) — and failing entries are dropped from the candidates with a warning, as is a whole chain whose primary does not resolve. A backup `contextWindow` below the primary's and `compat`/`thinkingLevelMap`/`maxTokens` derivation differences only warn (entries kept). `backupProviders` entries are checked for provider existence and credentials while model matching stays runtime. Preflight warnings are deduped to at most once per process and never block the primary or the surviving entries.
15
+ - Interactive footer shows a workflow summary line (`wf: <title> 3/7 ▶n ⏸ ⚠ ✗`) parsed from `workflow.state` session entries: completion count over stages, parallel-active count, awaiting-review/diagnostics/failed markers; absent entirely when no workflow exists (contract: docs/design/工作流编排插件设计.md §9 L0).
16
+ - Interactive footer shows a provider-failover line while a breaker is open (设计 `供应商能力槽位与主备切换设计.md` §4.7, Phase 3): the provider-failover plugin appends `provider.failover.state` snapshots through the public `api.session.appendEntry` face at state transitions (open with target/probe time, probe-failed reopen, recovered, plus an install-time closed snapshot that overrides stale entries in resumed sessions), and the footer renders the last snapshot as `failover: 主 <primary> 不可用 • 经 <backup> • 下次试探 <Ns>` in warning color (at zero: `等待试探`; closed/absent: hidden). A 1s ticker in interactive-mode re-renders while open and clears itself when the state closes. Snapshots are per-session log entries, so other sessions' footers do not reflect the process-wide breaker state (documented fidelity limit).
17
+ - Workflow overview overlay (`/workflow view` — the command is the single entry point): L2 panorama (stage DAG tree with waiting conditions, attempts/evidence counts, scope-conflict markers, diagnostics) and L3 transition log (last 30, newest first), parsed from session entries; stage actions (approve/reject/skip/cancel) prefill the editor with the action text for the agent to execute on submit — rendering and execution stay separated. Non-view `/workflow` subcommands keep their text path. `builtin.workflow` short id now maps to the workflow plugin for suite capability declarations. The `app.workflow.view` keybinding (`alt+w`) shipped earlier in this unreleased cycle was removed per the single-entry-point rule (commands over memorized keybindings; keybindings only for top-frequency actions — recorded in AGENTS.md) — the same binding also collided with the editor's `cursorWordRight`.
18
+ - Read-only subagent session browser: the builtin `/agents` command (single entry point, no keybinding) opens an overlay listing this session's subagent transcripts — parent-scoped summaries read from the `sessions/_agents/` store (newest first; role / short id / modified / bytes rows) with a bounded detail timeline per session (message entries as `[role] text`, other entries as `[<type>] <json>`, ~160-char line cap). Entries load lazily on entering detail; a failed load renders in the detail header instead of throwing. No write affordances: steer/cancel/resume stay with the conversation's subagent tools.
19
+
20
+ ### Changed
21
+
22
+ - The slash-command dispatch layer no longer wipes editor content a handler just wrote (independent review P0): the post-run clear only fires while the editor still holds the submitted command text, so `/dequeue`'s restored queue and `/editor`'s externally edited content survive (both previously lost their content to the unconditional clear). A bare `/queue` now prints usage instead of silently doing nothing — the editor buffer is already cleared by submit before the command runs, so the "uses the editor content" clause was unfulfillable and was dropped from the description. The queued-messages hint falls back to `/dequeue` when the keybinding has no default, and `/hotkeys` hides the `suspend` row on platforms where it has no default key.
23
+ - Single-entry-point iron law (user ruling, 2026-10-01, recorded in AGENTS.md "TUI Feature Trigger Entry Points"): any feature with two trigger entries loses one, commands over memorized keybindings. The shipped defaults `ctrl+l` (open model selector — the `/model` command's feature, same selector), `ctrl+p`/`alt+p` (cycle models — also `/model`), and `shift+tab` (cycle thinking level — the `/thinking` command's feature) were cleared; all bindings remain user-configurable, `/hotkeys` and startup hints show their rows only when configured, and the earlier-unreleased `app.workflow.view` (`alt+w`) entry was dropped entirely (it also collided with the editor's `cursorWordRight`).
24
+ - `/fork` picker context and failure handling (codex backtrack borrowing, 2026-10-02): each fork candidate now carries `replySummary` — the first line of the reply that followed that prompt — rendered as `Message N of M ↳ <reply first line>` so the picker reads as "which turn am I returning to" instead of a bare text list (the `get_fork_messages` RPC response gains the same optional field); a failed fork now restores the chosen prompt into the editor instead of dropping it; and the `/fork` completion description now says what it does ("Return to any earlier prompt and continue from there; the original path stays as a branch"). Codex's double-Esc entry was deliberately not borrowed — `/fork` is the single entry per the iron law, and the branch-tree semantics (non-destructive, any user entry) already beat codex's destructive `thread/revert`.
25
+ - The generic (no-renderer) tool-result fallback now collapses pretty-printed JSON to one compact preview line plus the `(ctrl+o to expand)` hint instead of showing the multi-line block verbatim whenever it fit under the 10-preview-line threshold — a short capability-tool ticket (e.g. a `subagent_run` background return) previously sprawled ~7-9 raw JSON lines across the chat. Expansion, non-JSON text, and unparseable JSON-like text render exactly as before; error results (`isError`) keep their full pretty form (error visibility beats compactness, error background unchanged); the 10-visual-line preview threshold itself is unchanged. Plugin tool definitions that provide their own `renderResult` are unaffected.
26
+
27
+ ### Fixed
28
+
29
+ - Uninstall no longer bricks the install store under mixed Windows path spellings. `plugin remove` deletes the installation directory before committing the index update, and that commit re-validates every record; the just-deleted directory's record failed normalization, fell back to the raw short/long-name comparison, and was rejected — leaving a ghost index entry (record present, directory gone) that made every later store operation (`install`/`remove`) fail with `invalid_state`. `withinInstallStoreRoot` now normalizes through the deepest existing ancestor (missing tails are re-appended), so a mid-uninstall or otherwise stale ghost record still validates lexically while escapes outside the root stay rejected (2026-10-01 dogfood finding via `plugin remove` on a mixed-spelling store).
30
+ - Uninstalling a ghost installation self-heals: an installation record whose directory is already gone (an uninstall interrupted between the `rm` and the index commit) previously failed the retry on ENOENT — `force: false` is deliberate, so the missing directory is now treated as the desired end state and the uninstall proceeds to the index commit instead of leaving the record bricking later store operations (2026-10-01 dogfood follow-up; covered by `node-package-install-host.test.ts` ghost case).
31
+ - Installed plugin stores written under Windows 8.3 short names (`ADMINI~1`) now validate against roots spelled with long names (and vice versa): the install-store root containment check in both `node-package-install-persistence` and `node-disk-registry-source` normalizes both sides through `realpathSync.native` (pairwise, with a raw-spelling fallback when either path does not resolve) via the shared `install-store-paths.ts` module. Previously a store installed from a shell passing the short `%TEMP%` spelling (bash) failed wholesale with `invalid_state`/`manifest_unavailable` when launched with the long spelling (PowerShell), silently unloading every installed capability plugin — and with them all plugin commands and tools (2026-10-01 dogfood finding: `/workflow` missing from completions).
32
+ - Print mode (`-p`) no longer nudges the model after a capability command handled the prompt: a command-intercepted turn appends no messages, and the empty-reply auto-continuation misread that as a swallowed reply and sent a follow-up model request for command-only prompts like `-p "/workflow"`. Parity with the interactive guard is preserved for genuinely swallowed replies (user message present, no assistant output still nudges once).
33
+ - `plugin selection set <profile> <pluginId>` now rejects non-builtin plugin profile ids with a structured error listing the valid ids (exit 1, store untouched). Previously any string — e.g. suite ids like `assistant` — was persisted but could never be read back (the selection store is deliberately not consulted for ordinary runs), leaving a dead entry and a false sense of activation (2026-10-01 dogfood finding).
34
+ - The post-install note now points at the real activation path: add the installed pluginId to the `capabilities` list in `<agentDir>/suites/<suite>/suite.json` and restart. The old hint recommended `plugin selection set`, which does not activate tools for suites.
35
+ - The suite profile-lock drift diagnostic now appends a recovery path: delete `<agentDir>/suites/<suiteId>/.profile-lock.json` and restart (the lock rebuilds from the resolved manifest).
36
+ - `SessionManager.listAll()` (the `/resume` "All" scope) no longer mixes subagent sessions into the user session list: the default-tree enumeration skips the `_agents` directory (D-060 §3 keeps subagent transcripts out of the user's session list; the directory name is now the exported `AGENT_SESSIONS_DIR_NAME` constant), while explicit flat `sessionDir` listings are unchanged.
37
+ - `/workflow view` renders a fixed height (exactly maxRows content rows plus an always-present indicator row) across panorama/log modes and content sizes — the same grid-footprint contract as `/agents`, so switching modes or row counts no longer moves the chat/editor layout boundary between frames (each boundary shift now costs the renderer's geometry-guard full redraw; see @agent-forge/tui). The agents-view comment claiming the differential renderer "skips empty lines" was corrected: the residue mechanism was layout-boundary movement between incremental frames, addressed in the renderer.
38
+
3
39
  ## [0.86.4] - 2026-10-01
4
40
  ### Added
5
41
 
@@ -7,6 +43,7 @@
7
43
 
8
44
  ### Changed
9
45
 
46
+ - Repo `npm run build` / `build:offline` now rebuild every `plugins/*` dist via `scripts/build-plugins.mjs` (single-plugin failures are reported and fail the batch), and `npm run check` gains `check:plugin-dist-fresh` which fails when any plugin's src is newer than its dist — closing the blind spot where stale plugin dists shipped old code while src-level tests stayed green (surfaced by a real-API image-generation test hitting `config_missing` from a pre-slot-era dist).
10
47
  - `planMicrocompact` now takes an explicit `MicrocompactPlanOptions` type (`enabled` gates the relief mechanism only) instead of reusing `CompactionSettings`, whose `enabled` is the compaction master switch - a different gate.
11
48
  - `compaction.microcompactEnabled` now defaults to `false` (was `true`); the cheap relief mechanism stays available as opt-in experimental. A controlled 30K-window seat pair (8-round CRM project, grok gateway) showed the relief was net-negative: cache hit 30.6% vs 44.6% disabled, uncached input +37%, full-compaction count unchanged (23 vs 22), and the disabled group recalled strictly more detail (6/6 vs 5/6 on the no-files memory quiz). The threshold-decision request field `microcompactEnabled` also defaults to `false` when omitted.
12
49
  ## [0.86.3] - 2026-10-01
@@ -33,6 +70,21 @@
33
70
  - Invalid `--mode` values are rejected with the list of valid modes instead of being silently ignored (upstream pi `e40126f57`).
34
71
  - The `opencode-go` and `together` default models now resolve to `kimi-k3` / `moonshotai/Kimi-K3` after Kimi K2.6 retired from the catalog, instead of pointing at a nonexistent model (upstream pi `e1787702d`).
35
72
  - The interactive footer caches its session-stats scan (usage totals, cache-hit rate, goal/todo/workflow status) keyed by session/leaf/model, and the bash renderer caches rendered lines including the expand hint, so streaming frames stop rescanning entries and re-truncating previews every frame (upstream pi `b485fa312`).
73
+ - `SessionManager.getSessionName()` reads `fileEntries` directly and the new `getEntryCount()` answers entry counts from the id index, removing per-frame full-array copies from footer reads (upstream pi `b485fa312`).
74
+ - `compaction.modelOverrides` sets per-model token budgets (`reserveTokens`/`keepRecentTokens`) keyed by `provider/modelId`; the auto, manual, and threshold-decide compaction paths all resolve overrides against the active model (upstream pi `46bde88a1`).
75
+ - Fallback-rendered tools (MCP pool plugins, third-party tools without `renderCall`) show their call arguments in the header and limit collapsed result previews to wrapped visual lines, so long single-line output no longer floods the screen (upstream pi `5257d0d5f`, `0582d9c11`).
76
+ - Providers registered with stored credentials count as configured before the async availability refresh lands, so initial model selection no longer falls back or warns on startup (upstream pi `fddc968b9`).
77
+ - Remote catalog merges resolve in linear time via a Map instead of a per-model `findIndex` scan (upstream pi `c34f2d6ad`).
78
+ - Manual compaction settles cancellations by the compaction controller's signal state (matching the auto path) instead of matching on the AbortError shape, so unrelated abort-shaped failures still report as failures (upstream pi `de2de549b` completion).
79
+ - The WSL clipboard channel runs `wslpath`/`powershell.exe` asynchronously instead of blocking the event loop for up to ~6s (upstream pi `6dff740fa` alignment).
80
+ - `RpcClient.prompt()` accepts the `streamingBehavior` third parameter and forwards it (upstream pi `e473b5cd8` completion).
81
+ ### Added
82
+
83
+ - New setting `fullscreenWheelScrollLines` ("auto" or 1-100) drives the fullscreen wheel-scroll accelerator, settable in `/settings` and applied live (upstream pi `f1927c2d5`).
84
+ ### Added
85
+
86
+ - `defaultTools` accepts `+name`/`-name` entries that add or remove tools on top of the inherited selection (plain names still replace); project-layer `+/-` entries apply on top of user settings (upstream pi `30a1d1849`).
87
+ - Custom `models.json` entries can override `allowedFallbackModels` through the `AnthropicMessagesCompat` schema (upstream pi `b03a367a4`).
36
88
 
37
89
  - Small context windows no longer spin the compaction loop: `keepRecentTokens` is now clamped per model window (`effectiveKeepRecentTokens`: half the summarizable window `contextWindow - reserveTokens`, floor 1024, result floor 1; unknown and large windows keep the configured value — 200K stays 20000, a 30K window resolves 20000 → 6808), applied uniformly to threshold decisions, manual and automatic preparations, and the overflow trim stage-0 target. Seat-measured on a 30K gateway window: the default 20000 budget protected the entire history, so threshold hits answered `compact: true` with a zero-length summarizable prefix until the real ceiling overflowed. Deterministic coverage in `test/suite/agent-session-compaction.test.ts`.
38
90
  - A recoverable length stop (truncated response) whose compact-and-retry recovery failed now enters the overflow trim ladder instead of dead-ending: turn-boundary projection trims free input room for the truncated output, and the failure prefix is split by cause (the existing `Context overflow persists...` wording is unchanged; truncated responses report `Truncated response persists after compaction and N trim attempts. `). Deterministic coverage in `test/suite/agent-session-compaction.test.ts`.