@bastani/atomic 0.9.4-alpha.8 → 0.9.4

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 (166) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  5. package/dist/builtin/intercom/package.json +1 -1
  6. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  7. package/dist/builtin/mcp/package.json +1 -1
  8. package/dist/builtin/subagents/CHANGELOG.md +34 -0
  9. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  10. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  11. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  12. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  13. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  14. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  15. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  16. package/dist/builtin/subagents/agents/debugger.md +1 -1
  17. package/dist/builtin/subagents/agents/worker.md +2 -2
  18. package/dist/builtin/subagents/package.json +1 -1
  19. package/dist/builtin/subagents/src/slash/slash-commands.ts +2 -2
  20. package/dist/builtin/subagents/src/tui/render-result-compact.ts +3 -2
  21. package/dist/builtin/subagents/src/tui/render-result.ts +3 -3
  22. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +4 -3
  23. package/dist/builtin/subagents/src/tui/render-widget.ts +10 -4
  24. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  25. package/dist/builtin/web-access/package.json +1 -1
  26. package/dist/builtin/workflows/CHANGELOG.md +30 -0
  27. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +24 -29
  28. package/dist/builtin/workflows/builtin/goal-runner.ts +13 -37
  29. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +6 -9
  30. package/dist/builtin/workflows/builtin/ralph-models.ts +58 -115
  31. package/dist/builtin/workflows/package.json +1 -1
  32. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +4 -0
  33. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +4 -0
  34. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +12 -1
  35. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +2 -0
  36. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +6 -0
  37. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +4 -0
  38. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +4 -0
  39. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +8 -9
  40. package/dist/bun/cli.d.ts.map +1 -1
  41. package/dist/bun/cli.js +3 -2
  42. package/dist/bun/cli.js.map +1 -1
  43. package/dist/cli.d.ts.map +1 -1
  44. package/dist/cli.js +15 -5
  45. package/dist/cli.js.map +1 -1
  46. package/dist/config.d.ts +10 -3
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +18 -1
  49. package/dist/config.js.map +1 -1
  50. package/dist/core/agent-session-events.d.ts.map +1 -1
  51. package/dist/core/agent-session-events.js +16 -8
  52. package/dist/core/agent-session-events.js.map +1 -1
  53. package/dist/core/agent-session-export.d.ts.map +1 -1
  54. package/dist/core/agent-session-export.js +4 -2
  55. package/dist/core/agent-session-export.js.map +1 -1
  56. package/dist/core/agent-session-extension-bindings.d.ts +3 -1
  57. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  58. package/dist/core/agent-session-extension-bindings.js +7 -4
  59. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  60. package/dist/core/agent-session-methods.d.ts +8 -2
  61. package/dist/core/agent-session-methods.d.ts.map +1 -1
  62. package/dist/core/agent-session-methods.js.map +1 -1
  63. package/dist/core/agent-session-retry.d.ts +2 -0
  64. package/dist/core/agent-session-retry.d.ts.map +1 -1
  65. package/dist/core/agent-session-retry.js +66 -7
  66. package/dist/core/agent-session-retry.js.map +1 -1
  67. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  68. package/dist/core/agent-session-tool-registry.js +4 -0
  69. package/dist/core/agent-session-tool-registry.js.map +1 -1
  70. package/dist/core/agent-session.d.ts +4 -1
  71. package/dist/core/agent-session.d.ts.map +1 -1
  72. package/dist/core/agent-session.js +4 -0
  73. package/dist/core/agent-session.js.map +1 -1
  74. package/dist/core/async/format.d.ts +3 -0
  75. package/dist/core/async/format.d.ts.map +1 -0
  76. package/dist/core/async/format.js +50 -0
  77. package/dist/core/async/format.js.map +1 -0
  78. package/dist/core/async/job-manager.d.ts +39 -0
  79. package/dist/core/async/job-manager.d.ts.map +1 -0
  80. package/dist/core/async/job-manager.js +254 -0
  81. package/dist/core/async/job-manager.js.map +1 -0
  82. package/dist/core/async/session-manager.d.ts +18 -0
  83. package/dist/core/async/session-manager.d.ts.map +1 -0
  84. package/dist/core/async/session-manager.js +61 -0
  85. package/dist/core/async/session-manager.js.map +1 -0
  86. package/dist/core/async/types.d.ts +23 -0
  87. package/dist/core/async/types.d.ts.map +1 -0
  88. package/dist/core/async/types.js +2 -0
  89. package/dist/core/async/types.js.map +1 -0
  90. package/dist/core/copilot-model-static-fallbacks.d.ts +43 -0
  91. package/dist/core/copilot-model-static-fallbacks.d.ts.map +1 -0
  92. package/dist/core/copilot-model-static-fallbacks.js +50 -0
  93. package/dist/core/copilot-model-static-fallbacks.js.map +1 -0
  94. package/dist/core/extensions/loader-virtual-modules.d.ts +11 -0
  95. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  96. package/dist/core/extensions/loader-virtual-modules.js +79 -11
  97. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  98. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  99. package/dist/core/model-registry-builtins.js +9 -1
  100. package/dist/core/model-registry-builtins.js.map +1 -1
  101. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  102. package/dist/core/resource-loader-reload.js +4 -2
  103. package/dist/core/resource-loader-reload.js.map +1 -1
  104. package/dist/core/resource-loader-types.d.ts +6 -0
  105. package/dist/core/resource-loader-types.d.ts.map +1 -1
  106. package/dist/core/resource-loader-types.js.map +1 -1
  107. package/dist/core/tools/bash-async-execution.d.ts +25 -0
  108. package/dist/core/tools/bash-async-execution.d.ts.map +1 -0
  109. package/dist/core/tools/bash-async-execution.js +71 -0
  110. package/dist/core/tools/bash-async-execution.js.map +1 -0
  111. package/dist/core/tools/bash-async-jobs.d.ts +10 -0
  112. package/dist/core/tools/bash-async-jobs.d.ts.map +1 -1
  113. package/dist/core/tools/bash-async-jobs.js +18 -2
  114. package/dist/core/tools/bash-async-jobs.js.map +1 -1
  115. package/dist/core/tools/bash-async-output.d.ts +3 -1
  116. package/dist/core/tools/bash-async-output.d.ts.map +1 -1
  117. package/dist/core/tools/bash-async-output.js +4 -1
  118. package/dist/core/tools/bash-async-output.js.map +1 -1
  119. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  120. package/dist/core/tools/bash-pty-native.js +2 -2
  121. package/dist/core/tools/bash-pty-native.js.map +1 -1
  122. package/dist/core/tools/bash.d.ts +10 -4
  123. package/dist/core/tools/bash.d.ts.map +1 -1
  124. package/dist/core/tools/bash.js +20 -38
  125. package/dist/core/tools/bash.js.map +1 -1
  126. package/dist/core/tools/search-native.d.ts.map +1 -1
  127. package/dist/core/tools/search-native.js +2 -2
  128. package/dist/core/tools/search-native.js.map +1 -1
  129. package/dist/main.d.ts.map +1 -1
  130. package/dist/main.js +56 -32
  131. package/dist/main.js.map +1 -1
  132. package/dist/modes/interactive/interactive-deferred-startup.d.ts +2 -0
  133. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -0
  134. package/dist/modes/interactive/interactive-deferred-startup.js +59 -0
  135. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -0
  136. package/dist/modes/interactive/interactive-mode-base.d.ts +2 -0
  137. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  138. package/dist/modes/interactive/interactive-mode-base.js +4 -0
  139. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  140. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  141. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  142. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  143. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  144. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -0
  145. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  146. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  147. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  148. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  149. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  150. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  151. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  152. package/dist/modes/interactive/interactive-mode.js +1 -0
  153. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  154. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  155. package/dist/modes/interactive/interactive-session-runtime.js +4 -2
  156. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  157. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  158. package/dist/modes/interactive/interactive-startup.js +11 -1
  159. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  160. package/dist/utils/module-require.d.ts +11 -0
  161. package/dist/utils/module-require.d.ts.map +1 -0
  162. package/dist/utils/module-require.js +16 -0
  163. package/dist/utils/module-require.js.map +1 -0
  164. package/docs/tools.md +4 -2
  165. package/npm-shrinkwrap.json +23 -23
  166. package/package.json +5 -3
package/CHANGELOG.md CHANGED
@@ -2,6 +2,61 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.4] - 2026-07-03
6
+
7
+ ### Added
8
+
9
+ - Added dynamic GitHub Copilot model population from the live CAPI `/models` catalog — picker-enabled chat ids are synthesized from catalog metadata while built-in `pi-ai` definitions still win — plus catalog-driven thinking-level gating so synthesized and bundled Copilot models only offer the reasoning levels CAPI's `capabilities.supports.reasoning_effort` arrays advertise.
10
+ - Added `get_entries`/`get_tree` RPC commands with `RpcClient.getEntries`/`getTree` helpers, a package `./rpc-entry` export for launching Atomic directly in RPC mode, a `session_info_changed` extension event, an `externalEditor` settings.json override for Ctrl+G, an `outputPad` setting controlling message padding, BMP image detection with PNG normalization, and separate extension-load timing namespaces (inherited from upstream Pi 0.80.3).
11
+ - Added subagent watchdog escape hatches: setting `ATOMIC_SUBAGENT_ATTEMPT_IDLE_TIMEOUT_MS` or `ATOMIC_SUBAGENT_ATTEMPT_TIMEOUT_MS` to `0` (or negative) disables the corresponding per-attempt timeout, while the `ATOMIC_SUBAGENT_ATTEMPT_KILL_GRACE_MS` SIGTERM→SIGKILL grace period always stays bounded ([#1581](https://github.com/bastani-inc/atomic/pull/1581)).
12
+
13
+ ### Changed
14
+
15
+ - Sped up startup substantially: compiled binaries now use Bun bytecode compilation (`--bytecode --format=cjs`, TUI first paint ~450ms → ~200ms), builtin extensions transpile through a persistent on-disk jiti cache at `~/.atomic/agent/cache/jiti/<version>` (~2.8x faster warm TUI starts), the interactive TUI shell paints immediately while extensions load in the background, `--version`/`-v` is a fast path (~380ms → ~25ms), and the HTML session export module loads lazily on first use.
16
+ - Synced `@earendil-works/pi-agent-core`, `pi-ai`, and `pi-tui` runtime dependencies from `^0.80.2` to `^0.80.3` across `@bastani/atomic` and all bundled first-party extensions, and changed the default OpenAI model to `gpt-5.5` (the Atomic-specific `github-copilot` default remains `gpt-5.4`).
17
+ - Restored upstream Pi's provider retry default by leaving `retry.provider.maxRetries` unset/zero unless users configure it explicitly, so Atomic's agent-level retry observes provider transport failures directly instead of the SDK retrying them first.
18
+
19
+ ### Fixed
20
+
21
+ - Fixed async `bash({ async: true })` jobs finishing silently: completed or failed session-managed background jobs now enqueue an `async-job-result` follow-up message into the originating session with duplicate suppression, retention-bounded delivery bookkeeping, full-output-path persistence for truncated previews, and lifecycle tracking that survives owner-session disposal; also fixed a leak where a failed async-manager registration left a never-executed job permanently reported as `running`.
22
+ - Fixed every builtin extension (workflows, subagents, mcp, web-access, intercom, cursor) failing to load with `Package subpath './package.json' is not defined by "exports"` on npm/bun package installs (0.9.4-alpha.9 regression): the loader now locates package roots by scanning the `node_modules` resolution chain instead of exports-encapsulated `require.resolve`, guarded by installed-layout CI smoke tests under Node on Linux and Windows.
23
+ - Fixed intercepted provider safety refusals dead-ending agent turns: canned zero-usage refusals are detected and auto-retried, structured safety-trigger errors (Anthropic `refusal` stops, OpenAI-style `finish_reason: content_filter`) are now retryable for all providers, and a static CAPI-derived limit snapshot (2026-07-02) keeps bundled GitHub Copilot models within real server-enforced context/output limits — including branded long-context tiers with hard input caps — whenever the live catalog is unavailable ([#1608](https://github.com/bastani-inc/atomic/issues/1608)).
24
+ - Fixed GitHub Copilot metadata handling: models use the live `max_output_tokens` from the catalog ([#1582](https://github.com/bastani-inc/atomic/issues/1582)), active sessions adopt live catalog metadata without a restart, and `COPILOT_GITHUB_TOKEN` env auth routes through an endpoint resolver honoring explicit base URL overrides, GitHub Enterprise server URLs, and the public Copilot routing hub, avoiding `421 Misdirected Request` failures ([#1569](https://github.com/bastani-inc/atomic/issues/1569)).
25
+ - Fixed workflow and subagent model fallback chains so request/context incompatibility failures (HTTP 400/413/422, unsupported tool/parameter, context-window overflow, `invalid_request`/`bad_request`/`too_large`) advance to the next candidate and ultimately fall back to the current user-selected model; bounded foreground and background subagent attempts with an idle watchdog and wall-clock cap where in-flight tool executions count as activity; skipped known unauthenticated providers before spawning; aligned the subagents and workflows model-failure classifiers with a cross-package conformance suite; and made the background runner spawn one default-model attempt when no candidates were ever configured ([#1580](https://github.com/bastani-inc/atomic/issues/1580), [#1581](https://github.com/bastani-inc/atomic/pull/1581)).
26
+ - Fixed the `read` tool to parse colon-delimited `file:START:END` (and grep-style `file:LINE:COL`) path selectors as line ranges instead of producing a bogus `ENOENT` ([#1585](https://github.com/bastani-inc/atomic/issues/1585)).
27
+ - Fixed post-compaction queued work to resume through the full agent continuation lifecycle with surfaced continuation failures ([#1570](https://github.com/bastani-inc/atomic/issues/1570)), removed the fixed 10-second connect-phase timeout from the global proxy-aware HTTP dispatcher so slow provider CONNECT establishment behind policy proxies no longer fails spuriously, and made headless JSON print mode exit nonzero when the final assistant turn ends with `stopReason: "error"` or `"aborted"`.
28
+ - Fixed release packaging determinism: declared `lru-cache` as a direct runtime dependency, added publish-time `npm-shrinkwrap.json` generation matching upstream Pi, and made shrinkwrap preparation hermetic by deriving `@bastani/atomic-natives` and generated platform optional package entries from local stamped metadata with deterministic registry tarball URLs.
29
+ - Fixed issues inherited from upstream Pi 0.80.3, including mid-run extension `setActiveTools` changes applying before the next provider request, `before_agent_start` system prompt overrides surviving mid-run tool changes, clean red errors (not stack traces) for invalid session files without overwriting them, `outputPad`-aware transcript rendering, visible backslashes in Markdown escape sequences, a visible incomplete-response error on output-length stops, `--no-session --session-id` for deterministic provider cache affinity, disk BMP attachment support, and a crash when undici emits an internal client error mid-stream.
30
+
31
+ ## [0.9.4-alpha.11] - 2026-07-03
32
+
33
+ ### Fixed
34
+
35
+ - Fixed async `bash({ async: true })` jobs finishing silently: completed or failed session-managed background bash jobs now enqueue an `async-job-result` follow-up message into the originating chat session automatically, while explicit completed-job polling, explicit cancellation, and parent aborts acknowledge the job and suppress duplicate or unwanted idle turns. Suppression is checked again at the streaming boundary so a completed job polled while its automatic follow-up is staged does not later deliver a duplicate. Async delivery bookkeeping is now bounded by the existing background-job retention defaults, suppressions stay tied to retained jobs so disposed-session running jobs cannot later fall back into the owner session, 12KB–50KB follow-up outputs persist their full output path before inline preview truncation, just-under-threshold raw outputs remain fully inline instead of being preview-truncated without a `fullOutputPath`, shared-manager lifecycle tracking prevents owner-session disposal from dropping later-session jobs while cleaning stale handlers from disposed fork/subagent sessions, and non-blocking delivery attempts keep one live streaming session from delaying unrelated async job completions.
36
+ - Fixed a background bash job leak where a failed async-manager registration (disposed manager/session or a capacity race mid-flight) left a never-executed job permanently reported as `running` to `__atomic_bash_job` polls; the managed job entry is now discarded when registration fails and the tool call error is surfaced unchanged.
37
+
38
+ ## [0.9.4-alpha.10] - 2026-07-03
39
+
40
+ ### Fixed
41
+
42
+ - Fixed every builtin extension (workflows, subagents, mcp, web-access, intercom, cursor) failing to load with `Package subpath './package.json' is not defined by "exports"` for npm/bun package installs of Atomic (regression in 0.9.4-alpha.9): the extension loader's installed-package alias fallback resolved host packages via `require.resolve("<pkg>/package.json")`, which Node's strict exports-map encapsulation rejects for packages like `@earendil-works/pi-ai` that do not export `./package.json` (the compiled binary and Bun-run dev paths were unaffected, which is why it slipped through). The loader now locates package roots by scanning the `node_modules` resolution chain directly, bypassing exports maps entirely while staying `import.meta.resolve()`-free to keep bytecode compilation intact. CI now guards this path with an installed-layout smoke test that runs the built package under the Node runtime on both Linux and Windows.
43
+
44
+ ## [0.9.4-alpha.9] - 2026-07-02
45
+
46
+ ### Changed
47
+
48
+ - Sped up TUI startup for the compiled Bun binary (and Windows) by ~2.8x on warm starts: builtin extensions transpiled at runtime through jiti now use a persistent on-disk cache at `~/.atomic/agent/cache/jiti/<version>` instead of re-transpiling ~280 TypeScript files on every launch (extension loading drops from ~4.1s to ~1.4s on Linux). Cache entries self-invalidate via jiti's source-content hashing, and stale version directories are pruned in the background.
49
+ - Made `--version`/`-v` a fast path that prints the version before loading the full CLI module graph, dropping `atomic --version` from ~380ms to ~25ms. The CLI entrypoint now loads the main module graph dynamically so metadata fast paths skip it entirely.
50
+ - Decoupled the TUI first paint from extension loading: in interactive mode the shell (header, editor, footer) now renders immediately with a "Loading extensions, skills, prompts, themes..." indicator while extension code loads in the background, dropping perceived compiled-binary startup from ~2s (warm) / ~5s (cold) to ~0.5s regardless of extension count. Deferred loading only engages when nothing before first paint needs extensions (no pending trust prompt, `-e` paths, extension flags, or CLI/settings model selection); resources, startup notices, and any saved-model restore that depends on extension-registered providers are applied once the background load completes.
51
+ - Deferred loading of the HTML session export module (including its large generated template) until `--export` or `/export` is actually used.
52
+ - Compiled binaries are now built with Bun bytecode compilation (`--bytecode --format=cjs`), skipping JavaScript parsing at launch: TUI first paint drops from ~450ms to ~200ms and `--version` from ~285ms to ~85ms. To support the CJS bundle (where `import.meta.url` no longer points into Bun's virtual filesystem), binary detection also checks `process.argv[1]`, native-module `require`s are anchored to the executable path, and the extension loader's dev-mode alias fallback resolves packages via their `package.json` export instead of `import.meta.resolve()`.
53
+
54
+ ### Fixed
55
+
56
+ - Fixed intercepted provider safety refusals dead-ending agent turns: a canned "I'm sorry, but I cannot assist with that request." completion arriving with zero token usage and a spurious `stopReason` of `length` (or `stop`) — observed on `github-copilot` GPT models under very large contexts — was accepted as the final answer, silently ending the turn (and, inside workflows, poisoning worker receipts). Such canned refusals are now detected (single short refusal text, no tool calls or thinking, zero billed output) and auto-retried like other transient failures, bounded by `maxRetries`; genuine model-authored refusals that bill output tokens are never retried ([#1608](https://github.com/bastani-inc/atomic/issues/1608)).
57
+ - Fixed the root cause of GitHub Copilot sessions overrunning server-enforced limits when the live CAPI `/models` catalog is unavailable (cold start without cache, catalog fetch failure, or network-restricted environments): several bundled `pi-ai` Copilot model definitions disagree with what CAPI actually enforces — the `gpt-5.x` family claims a 400k context window vs CAPI's 272k default tier, `claude-opus-4.6`/`claude-sonnet-4.6` claim the branded 1M window as their base tier vs CAPI's 200k, and `claude-opus-4.6`/`4.7` ship a 32k output cap vs CAPI's real 64k. Because auto-compaction thresholds are driven by `model.contextWindow`, an overstated window meant sessions never compacted, sailed past the real server cap, and were intercepted by CAPI with the canned refusals above; understated output caps truncated long responses at half the real limit. Atomic now applies a static CAPI-derived limit snapshot (snapshotted 2026-07-02) for every bundled Copilot model present in the CAPI catalog whenever the active catalog has no entry for it, carrying the full tier structure — default-tier context window, `max_output_tokens`, and the branded long-context tier with its hard input cap where CAPI advertises one (e.g. 272k/1.05M with a 922k input cap for `gpt-5.5`, 200k/1M with a 936k input cap for `claude-opus-4.8`) — so persisted long-context selections stay valid offline; the live catalog (or its disk cache) always wins when available ([#1608](https://github.com/bastani-inc/atomic/issues/1608)).
58
+ - Changed structured safety-trigger errors to be auto-retried for all providers, not just GitHub Copilot Gemini: pi-ai maps Anthropic `refusal` stops to a canned "The model refused to complete the request" error and OpenAI-style APIs surface `finish_reason: content_filter`; both are now classified as retryable (bounded by `maxRetries`) so spurious safety triggers re-request the model call instead of dead-ending the task ([#1608](https://github.com/bastani-inc/atomic/issues/1608)).
59
+
5
60
  ## [0.9.4-alpha.7] - 2026-07-02
6
61
 
7
62
  ### Added
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.4] - 2026-07-03
6
+
7
+ ### Changed
8
+
9
+ - Published the stable Atomic 0.9.4 release for the Cursor provider package with its upstream pi-ai dependency aligned to `^0.80.3`; no functional Cursor provider source changes were made after 0.9.3.
10
+
5
11
  ## [0.9.4-alpha.6] - 2026-07-01
6
12
 
7
13
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/cursor",
3
- "version": "0.9.4-alpha.8",
3
+ "version": "0.9.4",
4
4
  "private": true,
5
5
  "description": "Experimental first-party Atomic extension for Cursor OAuth, model discovery, and streaming provider registration.",
6
6
  "contributors": [
@@ -40,7 +40,7 @@
40
40
  }
41
41
  },
42
42
  "dependencies": {
43
- "@bastani/atomic-natives": "0.9.4-alpha.8",
43
+ "@bastani/atomic-natives": "0.9.4",
44
44
  "@bufbuild/protobuf": "^2.12.1",
45
45
  "@earendil-works/pi-ai": "^0.80.3"
46
46
  }
@@ -4,6 +4,12 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.4] - 2026-07-03
8
+
9
+ ### Changed
10
+
11
+ - Published the stable Atomic 0.9.4 release for the intercom extension with its upstream pi TUI peer dependency aligned to `^0.80.3`; no intercom extension source changes were needed after 0.9.3.
12
+
7
13
  ## [0.9.4-alpha.6] - 2026-07-01
8
14
 
9
15
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.9.4-alpha.8",
3
+ "version": "0.9.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions. Fork of: https://github.com/nicobailon/pi-intercom",
6
6
  "contributors": [
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.9.4] - 2026-07-03
11
+
12
+ ### Changed
13
+
14
+ - Published the stable Atomic 0.9.4 release for the MCP extension with its upstream pi AI/TUI peer dependencies aligned to `^0.80.3`; no MCP extension source changes were needed after 0.9.3.
15
+
10
16
  ## [0.9.4-alpha.6] - 2026-07-01
11
17
 
12
18
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.9.4-alpha.8",
3
+ "version": "0.9.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent. Fork of: https://github.com/nicobailon/pi-mcp-adapter",
6
6
  "contributors": [
@@ -2,6 +2,40 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.9.4] - 2026-07-03
6
+
7
+ ### Added
8
+
9
+ - Added a watchdog escape hatch: setting `ATOMIC_SUBAGENT_ATTEMPT_IDLE_TIMEOUT_MS` or `ATOMIC_SUBAGENT_ATTEMPT_TIMEOUT_MS` to `0` (or a negative value) disables the corresponding per-attempt timeout entirely; the `ATOMIC_SUBAGENT_ATTEMPT_KILL_GRACE_MS` SIGTERM→SIGKILL grace period intentionally cannot be disabled so escalation always stays bounded ([#1581](https://github.com/bastani-inc/atomic/pull/1581)).
10
+
11
+ ### Changed
12
+
13
+ - Curated builtin agent model defaults against Atomic's agentic-coding benchmark (pass@1 / avg cost per task, 2026-07-02) under a role-based placement principle: all primaries are now `openai-codex/gpt-5.5` at the measured value point for each tier (`debugger` at `:xhigh`; `worker`, `code-simplifier`, and the analyzer/researcher agents at `:medium`; locator and pattern-finder agents at `:low`), fallback chains degrade through same-model provider mirrors first, then remaining families by descending benchmark value, with OpenRouter mirrors as the availability tail; strictly dominated models (`claude-sonnet-5`, `claude-sonnet-4.6`, `gemini-3.1-pro`, `gemini-3.5-flash`) and unbenchmarked entries (`gpt-5.4-mini`, `claude-haiku-4.5`) were removed so every chain entry corresponds to a benchmark datapoint.
14
+ - Normalized all GLM-5.2 entries to the model's two real reasoning tiers: native `zai`/`zai-coding-cn` entries now say `:high` explicitly (replacing misleading `:medium`/`:low` labels that silently ran at the "high" tier), the `debugger` chain keeps `:xhigh`, and the `openrouter/z-ai/glm-5.2` mirror is now always `:xhigh`.
15
+ - Aligned the subagents extension peer dependencies with upstream pi `^0.80.3` runtime packages.
16
+
17
+ ### Fixed
18
+
19
+ - Fixed subagent live-detail hints to render the configured `app.tools.expand` keybinding instead of hardcoding Ctrl+O ([#1607](https://github.com/bastani-inc/atomic/issues/1607)), and fixed the running subagent widget to preserve its expanded/open state across workflow stage-node exit re-renders instead of transiently collapsing ([#1619](https://github.com/bastani-inc/atomic/issues/1619)).
20
+ - Fixed subagent model fallback so request/context incompatibility failures (HTTP 400/413/422, unsupported tool/parameter, context-window overflow, `invalid_request`/`bad_request`/`too_large` errors) advance the chain to the next candidate, falling back to the current user-selected model when no configured candidate can serve the request; refusals, content-filter/safety blocks, cancellations, and task failures still stop the chain ([#1580](https://github.com/bastani-inc/atomic/issues/1580)).
21
+ - Fixed foreground and background subagent model attempts that produced no child activity from hanging indefinitely: each candidate attempt now has a conservative idle watchdog (where in-flight tool executions count as activity) and an absolute wall-clock cap, records a retryable timeout failure, and advances to the next fallback candidate; known providers without configured auth are skipped before spawning ([#1580](https://github.com/bastani-inc/atomic/issues/1580), [#1581](https://github.com/bastani-inc/atomic/pull/1581)).
22
+ - Aligned the subagents model-failure classifier's direct-message precedence with the workflows classifier and added a cross-package conformance test suite so the two classifier copies cannot silently drift ([#1581](https://github.com/bastani-inc/atomic/pull/1581)).
23
+ - Fixed the background subagent runner to spawn one default-model attempt when no model candidates were ever configured, mirroring the foreground path instead of silently exiting 1 with no error; an explicitly empty candidate list produced by pre-spawn auth filtering is still surfaced as an error ([#1581](https://github.com/bastani-inc/atomic/pull/1581)).
24
+
25
+ ## [0.9.4-alpha.11] - 2026-07-03
26
+
27
+ ### Fixed
28
+
29
+ - Fixed subagent live-detail hints to render the configured `app.tools.expand` keybinding instead of hardcoding Ctrl+O, so remapped users see the same binding honored by attached workflow stage viewers ([#1607](https://github.com/bastani-inc/atomic/issues/1607)).
30
+ - Fixed the running subagent widget so it preserves the last known expanded/open state across workflow stage-node exit re-renders instead of transiently collapsing when the live widget context is stale until the next subagent status update ([#1619](https://github.com/bastani-inc/atomic/issues/1619)).
31
+
32
+ ## [0.9.4-alpha.9] - 2026-07-02
33
+
34
+ ### Changed
35
+
36
+ - Curated builtin agent model defaults against Atomic's agentic-coding benchmark (pass@1 / avg cost per task, 2026-07-02) under a role-based placement principle: only reviewer-style roles warrant best-in-class models; every builtin agent is a performance-per-dollar role and now leads with the measured value point for its tier. All primaries are now `openai-codex/gpt-5.5`: `debugger` at `:xhigh` (67% / $7.23, with `anthropic/claude-fable-5:xhigh` — the 70% / $13.41 accuracy ceiling — as first cross-family fallback); `worker`, `code-simplifier`, `codebase-online-researcher`, `codebase-analyzer`, and `codebase-research-analyzer` at `:medium` (54% / $2.75, strictly better than their previous GLM-5.2 primaries measured at 36% / $2.84, which move into the fallback chain); and `codebase-locator`, `codebase-research-locator`, and `codebase-pattern-finder` at `:low` ($1.20 / task, 28 steps, 9.4k output tokens — the measured cheap-tier value point), backed only by measured fallbacks (`claude-opus-4.8:low` at 41% / $2.29, then `glm-5.2:high`). All fallback chains degrade in a consistent order: same-model provider mirrors first (to preserve capability when a provider fails), then remaining families by descending benchmark value (`claude-fable-5:low` at 60% / $3.76 ahead of `claude-opus-4.8:medium` at 49% / $3.44, then GLM), with OpenRouter mirrors as the availability tail in the same order; `claude-opus-4.8` fallbacks ride at their `:high`/`:medium`/`:low` value points instead of `:xhigh`. Dropped strictly dominated models from all chains: `claude-sonnet-5`, `claude-sonnet-4.6`, and `gemini-3.1-pro` everywhere, and `gemini-3.5-flash` everywhere. Unbenchmarked models (`gpt-5.4-mini`, `claude-haiku-4.5`) and unmeasured levels (`gemini-3.5-flash:low`) are removed entirely — every chain entry in every builtin agent now corresponds to a benchmark datapoint.
37
+ - Normalized all GLM-5.2 entries to the model's two real reasoning tiers: GLM-5.2's thinking-level map collapses `minimal`/`low`/`medium`/`high` to its "high" effort and `xhigh` to "max", so the previous `zai/glm-5.2:medium` and `:low` labels (the `codebase-online-researcher` and analyzer primaries and various fallbacks) silently ran at the "high" tier under a misleading label. Native `zai`/`zai-coding-cn` entries now say `:high` explicitly, the `debugger` chain keeps `:xhigh` (→ "max"), and the `openrouter/z-ai/glm-5.2` mirror — which only maps `:xhigh` — is now always `:xhigh` instead of unsupported `:medium`/`:low`.
38
+
5
39
  ## [0.9.4-alpha.7] - 2026-07-02
6
40
 
7
41
  ### Fixed
@@ -8,8 +8,8 @@ description: |
8
8
  - Production-quality refinement of a working draft ("ugly but working CSV parser").
9
9
  - Code that has gotten messy after several iterations.
10
10
  tools: read, edit, write, search, find, ls, bash, todo
11
- model: zai/glm-5.2:medium
12
- fallbackModels: zai-coding-cn/glm-5.2:medium, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, github-copilot/claude-sonnet-5 (1m):medium, anthropic/claude-sonnet-5:medium, github-copilot/claude-sonnet-4.6 (1m):medium, anthropic/claude-sonnet-4-6:medium, github-copilot/gemini-3.5-flash (1m):medium, google/gemini-3.5-flash:medium, google-vertex/gemini-3.5-flash:medium, github-copilot/gemini-3.1-pro-preview (1m):medium, google/gemini-3.1-pro-preview:medium, google-vertex/gemini-3.1-pro-preview:medium, openrouter/z-ai/glm-5.2:medium, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-opus-4-8:medium, openrouter/anthropic/claude-sonnet-5:medium, openrouter/anthropic/claude-sonnet-4-6:medium, openrouter/google/gemini-3.5-flash:medium, openrouter/google/gemini-3.1-pro-preview:medium
11
+ model: openai-codex/gpt-5.5:medium
12
+ fallbackModels: github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/z-ai/glm-5.2:xhigh
13
13
  skills: tdd, playwright-cli, tmux
14
14
  ---
15
15
 
@@ -2,8 +2,8 @@
2
2
  name: codebase-analyzer
3
3
  description: Analyzes codebase implementation details. Call the codebase-analyzer agent when you need to find detailed information about specific components.
4
4
  tools: read, search, find, ls, todo
5
- model: zai/glm-5.2:low
6
- fallbackModels: zai-coding-cn/glm-5.2:low, openai-codex/gpt-5.5:low, github-copilot/gpt-5.5:low, openai/gpt-5.5:low, github-copilot/claude-opus-4.8 (1m):low, anthropic/claude-opus-4-8:low, github-copilot/claude-sonnet-5 (1m):low, anthropic/claude-sonnet-5:low, github-copilot/claude-sonnet-4.6 (1m):low, anthropic/claude-sonnet-4-6:low, github-copilot/gemini-3.5-flash (1m):low, google/gemini-3.5-flash:low, google-vertex/gemini-3.5-flash:low, github-copilot/gemini-3.1-pro-preview (1m):low, google/gemini-3.1-pro-preview:low, google-vertex/gemini-3.1-pro-preview:low, openrouter/z-ai/glm-5.2:low, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/anthropic/claude-sonnet-5:low, openrouter/anthropic/claude-sonnet-4-6:low, openrouter/google/gemini-3.5-flash:low, openrouter/google/gemini-3.1-pro-preview:low
5
+ model: openai-codex/gpt-5.5:medium
6
+ fallbackModels: github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/z-ai/glm-5.2:xhigh
7
7
  skills: tdd, playwright-cli, tmux
8
8
  ---
9
9
 
@@ -2,8 +2,8 @@
2
2
  name: codebase-locator
3
3
  description: Locates files, directories, and components relevant to a feature or task. Basically a "super search/find/ls tool."
4
4
  tools: read, search, find, ls
5
- model: openai/gpt-5.4-mini:low
6
- fallbackModels: openai-codex/gpt-5.4-mini:low, github-copilot/gpt-5.4-mini:low, anthropic/claude-haiku-4-5:low, github-copilot/claude-haiku-4.5:low, github-copilot/gemini-3.5-flash (1m):low, google/gemini-3.5-flash:low, google-vertex/gemini-3.5-flash:low, openrouter/openai/gpt-5.4-mini:low, openrouter/anthropic/claude-haiku-4-5:low, openrouter/google/gemini-3.5-flash:low
5
+ model: openai-codex/gpt-5.5:low
6
+ fallbackModels: github-copilot/gpt-5.5:low, openai/gpt-5.5:low, github-copilot/claude-opus-4.8 (1m):low, anthropic/claude-opus-4-8:low, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/z-ai/glm-5.2:xhigh
7
7
  ---
8
8
 
9
9
  You are a specialist at finding WHERE code lives in a codebase. Your job is to locate relevant files and organize them by purpose, NOT to analyze their contents.
@@ -2,8 +2,8 @@
2
2
  name: codebase-online-researcher
3
3
  description: Online research for up-to-date documentation and library-source knowledge. Use when you need authoritative external information — official docs, ecosystem context, version-specific behavior, GitHub permalinks into open-source libraries, or video tutorials.
4
4
  tools: read, search, find, ls, bash, web_search, fetch_content, get_search_content, todo
5
- model: zai/glm-5.2:medium
6
- fallbackModels: zai-coding-cn/glm-5.2:medium, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, github-copilot/claude-sonnet-5 (1m):medium, anthropic/claude-sonnet-5:medium, github-copilot/claude-sonnet-4.6 (1m):medium, anthropic/claude-sonnet-4-6:medium, github-copilot/gemini-3.5-flash (1m):medium, google/gemini-3.5-flash:medium, google-vertex/gemini-3.5-flash:medium, github-copilot/gemini-3.1-pro-preview (1m):medium, google/gemini-3.1-pro-preview:medium, google-vertex/gemini-3.1-pro-preview:medium, openrouter/z-ai/glm-5.2:medium, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-opus-4-8:medium, openrouter/anthropic/claude-sonnet-5:medium, openrouter/anthropic/claude-sonnet-4-6:medium, openrouter/google/gemini-3.5-flash:medium, openrouter/google/gemini-3.1-pro-preview:medium
5
+ model: openai-codex/gpt-5.5:medium
6
+ fallbackModels: github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/z-ai/glm-5.2:xhigh
7
7
  skills: playwright-cli
8
8
  ---
9
9
 
@@ -2,8 +2,8 @@
2
2
  name: codebase-pattern-finder
3
3
  description: Find similar implementations, usage examples, or existing patterns in the codebase that can be modeled after.
4
4
  tools: read, search, find, ls
5
- model: openai/gpt-5.4-mini:low
6
- fallbackModels: openai-codex/gpt-5.4-mini:low, github-copilot/gpt-5.4-mini:low, anthropic/claude-haiku-4-5:low, github-copilot/claude-haiku-4.5:low, github-copilot/gemini-3.5-flash (1m):low, google/gemini-3.5-flash:low, google-vertex/gemini-3.5-flash:low, openrouter/openai/gpt-5.4-mini:low, openrouter/anthropic/claude-haiku-4-5:low, openrouter/google/gemini-3.5-flash:low
5
+ model: openai-codex/gpt-5.5:low
6
+ fallbackModels: github-copilot/gpt-5.5:low, openai/gpt-5.5:low, github-copilot/claude-opus-4.8 (1m):low, anthropic/claude-opus-4-8:low, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/z-ai/glm-5.2:xhigh
7
7
  ---
8
8
 
9
9
  You are a specialist at finding code patterns and examples in the codebase. Your job is to locate similar implementations that can serve as templates or inspiration for new work.
@@ -2,8 +2,8 @@
2
2
  name: codebase-research-analyzer
3
3
  description: Analyzes local research documents to extract high-value insights, decisions, and technical details while filtering out noise. Use this when you want to deep dive on a research topic or understand the rationale behind decisions.
4
4
  tools: read, search, find, ls, todo
5
- model: zai/glm-5.2:low
6
- fallbackModels: zai-coding-cn/glm-5.2:low, openai-codex/gpt-5.5:low, github-copilot/gpt-5.5:low, openai/gpt-5.5:low, github-copilot/claude-opus-4.8 (1m):low, anthropic/claude-opus-4-8:low, github-copilot/claude-sonnet-5 (1m):low, anthropic/claude-sonnet-5:low, github-copilot/claude-sonnet-4.6 (1m):low, anthropic/claude-sonnet-4-6:low, github-copilot/gemini-3.5-flash (1m):low, google/gemini-3.5-flash:low, google-vertex/gemini-3.5-flash:low, github-copilot/gemini-3.1-pro-preview (1m):low, google/gemini-3.1-pro-preview:low, google-vertex/gemini-3.1-pro-preview:low, openrouter/z-ai/glm-5.2:low, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/anthropic/claude-sonnet-5:low, openrouter/anthropic/claude-sonnet-4-6:low, openrouter/google/gemini-3.5-flash:low, openrouter/google/gemini-3.1-pro-preview:low
5
+ model: openai-codex/gpt-5.5:medium
6
+ fallbackModels: github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/z-ai/glm-5.2:xhigh
7
7
  ---
8
8
 
9
9
  You are a specialist at extracting HIGH-VALUE insights from research documents. Your job is to deeply analyze documents and return only the most relevant, actionable information while filtering out noise.
@@ -2,8 +2,8 @@
2
2
  name: codebase-research-locator
3
3
  description: Discovers local research documents that are relevant to the current research task.
4
4
  tools: read, search, find, ls
5
- model: openai/gpt-5.4-mini:low
6
- fallbackModels: openai-codex/gpt-5.4-mini:low, github-copilot/gpt-5.4-mini:low, anthropic/claude-haiku-4-5:low, github-copilot/claude-haiku-4.5:low, github-copilot/gemini-3.5-flash (1m):low, google/gemini-3.5-flash:low, google-vertex/gemini-3.5-flash:low, openrouter/openai/gpt-5.4-mini:low, openrouter/anthropic/claude-haiku-4-5:low, openrouter/google/gemini-3.5-flash:low
5
+ model: openai-codex/gpt-5.5:low
6
+ fallbackModels: github-copilot/gpt-5.5:low, openai/gpt-5.5:low, github-copilot/claude-opus-4.8 (1m):low, anthropic/claude-opus-4-8:low, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/z-ai/glm-5.2:xhigh
7
7
  ---
8
8
 
9
9
  You are a specialist at finding documents in the `research/` directory. Your job is to locate relevant research documents and categorize them, NOT to analyze their contents in depth.
@@ -3,7 +3,7 @@ name: debugger
3
3
  description: Debug errors, test failures, and unexpected behavior. Use PROACTIVELY when encountering issues, analyzing stack traces, or investigating system problems.
4
4
  tools: read, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo
5
5
  model: openai-codex/gpt-5.5:xhigh
6
- fallbackModels: github-copilot/gpt-5.5:xhigh, openai/gpt-5.5:xhigh, github-copilot/claude-opus-4.8 (1m):xhigh, anthropic/claude-opus-4-8:xhigh, zai/glm-5.2:xhigh, zai-coding-cn/glm-5.2:xhigh, github-copilot/claude-sonnet-5 (1m):high, anthropic/claude-sonnet-5:high, github-copilot/claude-sonnet-4.6 (1m):high, anthropic/claude-sonnet-4-6:high, github-copilot/gemini-3.5-flash (1m):high, google/gemini-3.5-flash:high, google-vertex/gemini-3.5-flash:high, github-copilot/gemini-3.1-pro-preview (1m):high, google/gemini-3.1-pro-preview:high, google-vertex/gemini-3.1-pro-preview:high, openrouter/z-ai/glm-5.2:xhigh, openrouter/openai/gpt-5.5:xhigh, openrouter/anthropic/claude-opus-4-8:xhigh, openrouter/anthropic/claude-sonnet-5:high, openrouter/anthropic/claude-sonnet-4-6:high, openrouter/google/gemini-3.5-flash:high, openrouter/google/gemini-3.1-pro-preview:high
6
+ fallbackModels: github-copilot/gpt-5.5:xhigh, openai/gpt-5.5:xhigh, anthropic/claude-fable-5:xhigh, github-copilot/claude-opus-4.8 (1m):high, anthropic/claude-opus-4-8:high, zai/glm-5.2:xhigh, zai-coding-cn/glm-5.2:xhigh, openrouter/openai/gpt-5.5:xhigh, openrouter/anthropic/claude-fable-5:xhigh, openrouter/anthropic/claude-opus-4-8:high, openrouter/z-ai/glm-5.2:xhigh
7
7
  skills: tdd, playwright-cli, tmux
8
8
  ---
9
9
 
@@ -5,8 +5,8 @@ systemPromptMode: replace
5
5
  inheritProjectContext: true
6
6
  inheritSkills: false
7
7
  tools: read, edit, write, search, find, ls, bash, web_search, fetch_content, get_search_content, intercom, contact_supervisor, todo
8
- model: zai/glm-5.2:medium
9
- fallbackModels: zai-coding-cn/glm-5.2:medium, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, github-copilot/claude-sonnet-5 (1m):medium, anthropic/claude-sonnet-5:medium, github-copilot/claude-sonnet-4.6 (1m):medium, anthropic/claude-sonnet-4-6:medium, github-copilot/gemini-3.5-flash (1m):medium, google/gemini-3.5-flash:medium, google-vertex/gemini-3.5-flash:medium, github-copilot/gemini-3.1-pro-preview (1m):medium, google/gemini-3.1-pro-preview:medium, google-vertex/gemini-3.1-pro-preview:medium, openrouter/z-ai/glm-5.2:medium, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-opus-4-8:medium, openrouter/anthropic/claude-sonnet-5:medium, openrouter/anthropic/claude-sonnet-4-6:medium, openrouter/google/gemini-3.5-flash:medium, openrouter/google/gemini-3.1-pro-preview:medium
8
+ model: openai-codex/gpt-5.5:medium
9
+ fallbackModels: github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-opus-4.8 (1m):medium, anthropic/claude-opus-4-8:medium, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/z-ai/glm-5.2:xhigh
10
10
  skills: tdd, playwright-cli, tmux
11
11
  defaultContext: fork
12
12
  defaultProgress: true
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.9.4-alpha.8",
3
+ "version": "0.9.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with chains, parallel execution, and TUI clarification. Fork of: https://github.com/nicobailon/pi-subagents",
6
6
  "contributors": [
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import * as fs from "node:fs";
3
3
  import * as path from "node:path";
4
- import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
4
+ import { keyHint, type ExtensionAPI, type ExtensionContext } from "@bastani/atomic";
5
5
  import { Key, matchesKey } from "@earendil-works/pi-tui";
6
6
  import { discoverAgents, discoverAgentsAll, type ChainConfig } from "../agents/agents.ts";
7
7
  import type { SubagentParamsLike } from "../runs/foreground/subagent-executor.ts";
@@ -164,7 +164,7 @@ async function requestSlashRun(
164
164
  if (!ctx.hasUI) return;
165
165
  const tool = update.currentTool ? ` ${update.currentTool}` : "";
166
166
  const count = update.toolCount ?? 0;
167
- ctx.ui.setStatus("subagent-slash", `${count} tools${tool} | ctrl+o live detail`);
167
+ ctx.ui.setStatus("subagent-slash", `${count} tools${tool} | ${keyHint("app.tools.expand", "live detail")}`);
168
168
  };
169
169
 
170
170
  const onTerminalInput = ctx.hasUI
@@ -1,3 +1,4 @@
1
+ import { keyHint } from "@bastani/atomic";
1
2
  import { Container, Text, type Component } from "@earendil-works/pi-tui";
2
3
  import type { AgentProgress, AsyncJobStep, Details } from "../shared/types.ts";
3
4
  import { shortenPath } from "../shared/formatters.ts";
@@ -45,7 +46,7 @@ export function renderSingleCompact(d: Details, r: Details["results"][number], t
45
46
  c.addChild(new Text(truncLine(theme.fg("dim", ` ⎿ ${activity}`), width), 0, 0));
46
47
  const liveStatus = buildLiveStatusLine(r.progress, progressSnapshotNow);
47
48
  if (liveStatus && liveStatus !== activity) c.addChild(new Text(truncLine(theme.fg("dim", ` ${liveStatus}`), width), 0, 0));
48
- c.addChild(new Text(truncLine(theme.fg("accent", " Press ctrl+o for live detail"), width), 0, 0));
49
+ c.addChild(new Text(truncLine(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`), width), 0, 0));
49
50
  if (r.artifactPaths) c.addChild(new Text(truncLine(theme.fg("dim", ` output: ${shortenPath(r.artifactPaths.outputPath)}`), width), 0, 0));
50
51
  return c;
51
52
  }
@@ -141,7 +142,7 @@ export function renderMultiCompact(d: Details, theme: Theme, now?: number, pulse
141
142
  if (rRunning && rProg && "status" in rProg) {
142
143
  const activity = compactCurrentActivity(rProg, now);
143
144
  c.addChild(new Text(truncLine(theme.fg("dim", ` ⎿ ${activity}`), width), 0, 0));
144
- c.addChild(new Text(truncLine(theme.fg("accent", " Press ctrl+o for live detail"), width), 0, 0));
145
+ c.addChild(new Text(truncLine(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`), width), 0, 0));
145
146
  } else if (!rPending && (r.exitCode !== 0 || r.interrupted || r.detached || hasEmptyTextOutputWithoutOutputTarget(r.task, output))) {
146
147
  c.addChild(new Text(truncLine(theme.fg(r.exitCode !== 0 ? "error" : "dim", ` ⎿ ${resultStatusLine(r, output)}`), width), 0, 0));
147
148
  }
@@ -1,5 +1,5 @@
1
1
  import type { AgentToolResult } from "@earendil-works/pi-agent-core";
2
- import { getMarkdownTheme } from "@bastani/atomic";
2
+ import { getMarkdownTheme, keyHint } from "@bastani/atomic";
3
3
  import { Container, Markdown, Spacer, Text, type Component } from "@earendil-works/pi-tui";
4
4
  import type { AgentProgress, AsyncJobStep, Details } from "../shared/types.ts";
5
5
  import { formatDuration, formatTokens, formatUsage, shortenPath } from "../shared/formatters.ts";
@@ -116,7 +116,7 @@ export function renderSubagentResult(
116
116
  if (liveStatusLine) {
117
117
  c.addChild(new Text(fit(theme.fg("accent", liveStatusLine)), 0, 0));
118
118
  }
119
- c.addChild(new Text(fit(theme.fg("accent", "Press ctrl+o for live detail")), 0, 0));
119
+ c.addChild(new Text(fit(theme.fg("accent", `Press ${keyHint("app.tools.expand", "for live detail")}`)), 0, 0));
120
120
  if (r.artifactPaths) {
121
121
  c.addChild(new Text(fit(theme.fg("dim", `Artifacts: ${shortenPath(r.artifactPaths.outputPath)}`)), 0, 0));
122
122
  }
@@ -350,7 +350,7 @@ export function renderSubagentResult(
350
350
  if (liveStatusLine) {
351
351
  c.addChild(new Text(fit(theme.fg("accent", ` ${liveStatusLine}`)), 0, 0));
352
352
  }
353
- c.addChild(new Text(fit(theme.fg("accent", " Press ctrl+o for live detail")), 0, 0));
353
+ c.addChild(new Text(fit(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`)), 0, 0));
354
354
  if (r.artifactPaths) {
355
355
  c.addChild(new Text(fit(theme.fg("dim", ` artifacts: ${shortenPath(r.artifactPaths.outputPath)}`)), 0, 0));
356
356
  }
@@ -1,3 +1,4 @@
1
+ import { keyHint } from "@bastani/atomic";
1
2
  import type { AsyncJobState } from "../shared/types.ts";
2
3
  import { shortenPath } from "../shared/formatters.ts";
3
4
  import { aggregateStepStatus, formatParallelOutcome } from "../shared/status-format.ts";
@@ -80,7 +81,7 @@ export function foregroundStyleWidgetStepLines(
80
81
  lines.push(` ${nestedLine}`);
81
82
  }
82
83
  if (step.status === "running") {
83
- if (!expanded) lines.push(` ${theme.fg("accent", "Press ctrl+o for live detail")}`);
84
+ if (!expanded) lines.push(` ${theme.fg("accent", `Press ${keyHint("app.tools.expand", "for live detail")}`)}`);
84
85
  const output = widgetOutputPath(job, step);
85
86
  if (output) lines.push(` ${theme.fg("dim", `output: ${shortenPath(output)}`)}`);
86
87
  if (expanded) {
@@ -147,7 +148,7 @@ export function compactSingleWidgetLines(job: AsyncJobState, theme: Theme, width
147
148
  lines.push(` ${widgetStepGlyph(step.status, theme, widgetStepRunningSeed(step, index), now)} ${itemTitle} ${index + 1}/${total}: ${themeBold(theme, step.agent)} ${theme.fg("dim", "·")} ${status}${modelDisplay}${activitySuffix}${stepStats ? ` ${theme.fg("dim", "·")} ${stepStats}` : ""}`);
148
149
  for (const nestedLine of formatNestedWidgetLines(step.children, theme, width, false, job.updatedAt, undefined, now)) lines.push(` ${nestedLine}`);
149
150
  }
150
- if (job.steps.some((step) => step.status === "running")) lines.push(theme.fg("accent", " Press ctrl+o for live detail"));
151
+ if (job.steps.some((step) => step.status === "running")) lines.push(theme.fg("accent", ` Press ${keyHint("app.tools.expand", "for live detail")}`));
151
152
  return lines.map((line) => truncLine(line, width));
152
153
  }
153
154
 
@@ -161,6 +162,6 @@ export function fitWidgetLineBudget(lines: string[], theme: Theme, width: number
161
162
  const hiddenCount = lines.length - visibleLines;
162
163
  const hint = expanded
163
164
  ? `… ${hiddenCount} live-detail lines hidden`
164
- : `… ${hiddenCount} lines hidden · ctrl+o expands`;
165
+ : `… ${hiddenCount} lines hidden · ${keyHint("app.tools.expand", "expands")}`;
165
166
  return [...lines.slice(0, visibleLines), truncLine(theme.fg("dim", hint), width)];
166
167
  }
@@ -63,6 +63,7 @@ interface RenderRequestingContext {
63
63
  let latestWidgetCtx: ExtensionContext | undefined;
64
64
  let latestWidgetJobs: AsyncJobState[] = [];
65
65
  let latestWidgetFrameNow = 0;
66
+ let latestWidgetExpanded = false;
66
67
  let widgetTimer: ReturnType<typeof setInterval> | undefined;
67
68
  let mountedWidgetCtx: ExtensionContext | undefined;
68
69
  let mountedWidgetOwnerKey: string | undefined;
@@ -78,16 +79,21 @@ function getLatestWidgetFrameNow(): number {
78
79
 
79
80
  function getLatestWidgetExpanded(): boolean {
80
81
  // LiveWidgetComponent re-renders outside a specific renderWidget() call, so
81
- // read expansion from the latest live singleton context. If that context was
82
- // cleared or went stale, collapse safely instead of consulting a stale caller.
83
- if (!latestWidgetCtx?.hasUI) return false;
84
- return latestWidgetCtx.ui.getToolsExpanded?.() ?? false;
82
+ // remember the last expansion state observed from a live host UI. Workflow
83
+ // stage-node detach can briefly repaint the mounted singleton with a stale or
84
+ // no-UI context before the next subagent status update refreshes it; falling
85
+ // back to the cached value avoids a transient collapse while jobs keep running.
86
+ if (!latestWidgetCtx?.hasUI) return latestWidgetExpanded;
87
+ const expanded = latestWidgetCtx.ui.getToolsExpanded?.();
88
+ if (typeof expanded === "boolean") latestWidgetExpanded = expanded;
89
+ return latestWidgetExpanded;
85
90
  }
86
91
 
87
92
  function clearLatestWidgetState(): void {
88
93
  latestWidgetCtx = undefined;
89
94
  latestWidgetJobs = [];
90
95
  latestWidgetFrameNow = 0;
96
+ latestWidgetExpanded = false;
91
97
  mountedWidgetCtx = undefined;
92
98
  mountedWidgetOwnerKey = undefined;
93
99
  widgetMounted = false;
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.9.4] - 2026-07-03
8
+
9
+ ### Changed
10
+
11
+ - Published the stable Atomic 0.9.4 release for the web-access extension with its upstream pi TUI peer dependency aligned to `^0.80.3`; no web-access extension source changes were needed after 0.9.3.
12
+
7
13
  ## [0.9.4-alpha.6] - 2026-07-01
8
14
 
9
15
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.9.4-alpha.8",
3
+ "version": "0.9.4",
4
4
  "private": true,
5
5
  "description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction. Fork of: https://github.com/nicobailon/pi-web-access",
6
6
  "contributors": [
@@ -6,6 +6,36 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.4] - 2026-07-03
10
+
11
+ ### Changed
12
+
13
+ - Curated all builtin workflow model chains against Atomic's agentic-coding benchmark (pass@1 / avg cost per task, 2026-07-02) under a role-based placement principle: reviewer stages keep best-in-class verification models (`anthropic/claude-fable-5:xhigh`, `openai-codex/gpt-5.5:xhigh`, and `zai/glm-5.2:xhigh` for third-family diversity), every other stage leads with the best measured performance-per-dollar candidate (`ralph` prompt-engineer and the `deep-research-codebase` planner move to `openai-codex/gpt-5.5:xhigh`, the explorer to `openai-codex/gpt-5.5:low`), strictly dominated models (`claude-sonnet-5`, `claude-sonnet-4.6`, `gemini-3.1-pro`, `gemini-3.5-flash`) and unbenchmarked entries (`gpt-5.4-mini`, `claude-haiku-4.5`) were dropped, and every remaining chain entry corresponds to a benchmark datapoint. `open-claude-design` keeps its Anthropic-led chain with `claude-fable-5:xhigh` primary.
14
+ - Normalized all GLM-5.2 chain entries to the model's two real reasoning tiers: native `zai`/`zai-coding-cn` entries in medium-tier chains now say `:high` explicitly (replacing misleading `:medium` labels that silently billed at the "high" tier), judgment-tier chains keep `:xhigh`, and the `openrouter/z-ai/glm-5.2` mirror is now always `:xhigh`.
15
+ - Aligned the workflows extension peer dependency with upstream pi TUI `^0.80.3`.
16
+
17
+ ### Fixed
18
+
19
+ - Fixed attached workflow stage viewers so the host `app.tools.expand` keybinding (Ctrl+O by default) toggles live-detail/tool-output expansion just like the main chat, including custom keybinding remaps ([#1607](https://github.com/bastani-inc/atomic/issues/1607)).
20
+ - Fixed workflow stage model fallback so request/context incompatibility failures (HTTP 400/413/422, unsupported tool/parameter, context-window overflow, `invalid_request`/`bad_request`/`too_large` errors) advance the chain to the next candidate, falling back to the current user-selected model when no configured candidate can serve the request; refusals, content-filter/safety blocks, cancellations, and task failures still stop the chain ([#1580](https://github.com/bastani-inc/atomic/issues/1580)).
21
+ - Fixed the builtin `goal` reviewer and `deep-research-codebase` planner model fallback chains missing the `openrouter/anthropic/claude-fable-5` mirror of their primary model, matching the ordering used by the other builtin chains.
22
+ - Classified generic provider `Connection error.` / `fetch failed` transport outages as explicit workflow transport errors so stage fallback metadata can distinguish them from ordinary provider/model outages while preserving the normal next-model fallback order.
23
+ - Fixed workflow lifecycle notices for structured workflow outputs whose returned `status` is `failed` or `blocked`: the runtime now records those runs as failed/blocked instead of successful completions, preserves their returned output, carries blocked summaries into lifecycle notice reasons, marks returned failures non-resumable with explicit terminal failure metadata, and emits failure/blocked lifecycle cards rather than success notices.
24
+
25
+ ## [0.9.4-alpha.11] - 2026-07-03
26
+
27
+ ### Fixed
28
+
29
+ - Fixed attached workflow stage viewers so the host `app.tools.expand` keybinding (Ctrl+O by default) toggles live-detail/tool-output expansion just like the main chat, including custom keybinding remaps ([#1607](https://github.com/bastani-inc/atomic/issues/1607)).
30
+
31
+ ## [0.9.4-alpha.9] - 2026-07-02
32
+
33
+ ### Changed
34
+
35
+ - Changed the Claude Fable 5 reasoning level back from `high` to `xhigh` across all builtin workflow model chains (`ralph` prompt-engineer/reviewer-a/reviewer-b/reviewer-c, `goal` reviewer, `deep-research-codebase` planner, and `open-claude-design`), covering both the native `anthropic/claude-fable-5` entries and their OpenRouter mirrors; this reverts the `xhigh` → `high` change shipped in 0.9.4-alpha.8.
36
+ - Curated all builtin workflow model chains against Atomic's agentic-coding benchmark (pass@1 / avg cost per task, 2026-07-02) under a role-based placement principle: **reviewers get best-in-class verification quality, every other stage gets the best measured performance-per-dollar**. Reviewer stages keep `anthropic/claude-fable-5:xhigh` (70% / $13.41, `ralph` reviewer-a and the `goal` reviewer), `openai-codex/gpt-5.5:xhigh` (67% / $7.23, reviewer-b), and `zai/glm-5.2:xhigh` (44% / $3.92, reviewer-c for third-family diversity). Non-reviewer stages moved to perf-per-dollar primaries: `ralph` prompt-engineer and the `deep-research-codebase` planner from `claude-fable-5:xhigh` to `openai-codex/gpt-5.5:xhigh` (−3pts for half the cost, with `fable-5:xhigh` as the first cross-family fallback), and the `deep-research-codebase` explorer from unbenchmarked `gpt-5.4-mini:low` to the measured cheap-tier value point `openai-codex/gpt-5.5:low` ($1.20 / task, 28 steps, 9.4k output tokens), backed only by measured fallbacks (`claude-opus-4.8:low` at 41% / $2.29, then `glm-5.2:high`). Unbenchmarked models (`gpt-5.4-mini`, `claude-haiku-4.5`) and unmeasured levels (`gemini-3.5-flash:low`) are removed entirely — every chain entry now corresponds to a benchmark datapoint. Dropped strictly dominated candidates from every chain: `claude-sonnet-5` (40–54% at $4.08–$26.40 per task with up to 268 steps), `claude-sonnet-4.6` (30% / $5.52), `gemini-3.1-pro` (12% / $9.48), and `gemini-3.5-flash` (37% / $7.34 with 276k output tokens). Moved `claude-opus-4.8` fallback entries from `:xhigh` to `:high` — its cost/value point (52% / $4.28 vs 54% / $8.01) — everywhere except `open-claude-design`, which keeps an Anthropic-led chain (`fable-5:xhigh` primary, Opus at `:xhigh`) since design quality, not $/task, is its objective. Added `anthropic/claude-fable-5:low` (60% / $3.76) as the Anthropic candidate in the medium-tier `ralph` research/orchestrator and `goal` worker chains.
37
+ - Normalized all GLM-5.2 chain entries to the model's two real reasoning tiers: GLM-5.2's thinking-level map collapses `minimal`/`low`/`medium`/`high` to its "high" effort and `xhigh` to "max", so the previous `zai/glm-5.2:medium` entries in the `ralph` research/orchestrator and `goal` worker chains silently ran (and billed) at the "high" tier under a misleading label. Native `zai`/`zai-coding-cn` entries in medium-tier chains now say `:high` explicitly, judgment-tier chains keep `:xhigh` (→ "max"), and the `openrouter/z-ai/glm-5.2` mirror — which only maps `:xhigh` — is now always `:xhigh` instead of unsupported `:medium`.
38
+
9
39
  ## [0.9.4-alpha.8] - 2026-07-02
10
40
 
11
41
  ### Changed