@bastani/atomic 0.9.11-alpha.9 → 0.9.11
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.
- package/CHANGELOG.md +134 -0
- package/README.md +1 -1
- package/dist/builtin/intercom/CHANGELOG.md +6 -0
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/subagent-relay.ts +8 -5
- package/dist/builtin/mcp/CHANGELOG.md +10 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +20 -0
- package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
- package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
- package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
- package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
- package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
- package/dist/builtin/subagents/agents/worker.md +2 -2
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/subagents/src/extension/notification-content.ts +14 -9
- package/dist/builtin/subagents/src/runs/background/notify.ts +20 -4
- package/dist/builtin/web-access/CHANGELOG.md +20 -0
- package/dist/builtin/web-access/content-tools.ts +1 -0
- package/dist/builtin/web-access/flat-string.ts +37 -0
- package/dist/builtin/web-access/github-api.ts +2 -1
- package/dist/builtin/web-access/github-extract.ts +3 -2
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +57 -0
- package/dist/builtin/workflows/builtin/goal-ledger.ts +6 -4
- package/dist/builtin/workflows/builtin/goal-runner.ts +2 -1
- package/dist/builtin/workflows/builtin/goal.ts +1 -1
- package/dist/builtin/workflows/builtin/ralph-core.ts +8 -9
- package/dist/builtin/workflows/builtin/ralph-forked-prompts.ts +2 -4
- package/dist/builtin/workflows/builtin/ralph-models.ts +4 -4
- package/dist/builtin/workflows/builtin/ralph-runner.ts +5 -8
- package/dist/builtin/workflows/builtin/ralph.ts +2 -1
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/durable/completed-catalog.ts +14 -8
- package/dist/builtin/workflows/src/durable/completed-inspection.ts +10 -11
- package/dist/builtin/workflows/src/durable/resume-catalog.ts +1 -1
- package/dist/builtin/workflows/src/durable/resume-eligibility.ts +42 -0
- package/dist/builtin/workflows/src/durable/resume-runtime.ts +36 -37
- package/dist/builtin/workflows/src/durable/tool-primitive.ts +10 -2
- package/dist/builtin/workflows/src/engine/run.ts +1 -0
- package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +12 -8
- package/dist/builtin/workflows/src/extension/hil-answer-notifications.ts +5 -2
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +1966 -880
- package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +6 -3
- package/dist/builtin/workflows/src/extension/postmortem-deps.ts +3 -2
- package/dist/builtin/workflows/src/extension/render-result.ts +4 -11
- package/dist/builtin/workflows/src/extension/runtime-durable-resume.ts +17 -20
- package/dist/builtin/workflows/src/extension/runtime.ts +3 -3
- package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +3 -7
- package/dist/builtin/workflows/src/extension/workflow-durable-resume-command.ts +21 -24
- package/dist/builtin/workflows/src/extension/workflow-resume-picker-rows.ts +38 -26
- package/dist/builtin/workflows/src/extension/workflow-resume-shadow.ts +2 -1
- package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +56 -64
- package/dist/builtin/workflows/src/extension/workflow-schema.ts +2 -2
- package/dist/builtin/workflows/src/extension/workflow-status-summary.ts +0 -5
- package/dist/builtin/workflows/src/extension/workflow-targets.ts +17 -20
- package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +1 -1
- package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +24 -51
- package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +7 -29
- package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +5 -13
- package/dist/builtin/workflows/src/extension/workflow-tool.ts +4 -13
- package/dist/builtin/workflows/src/runs/background/quit.ts +4 -3
- package/dist/builtin/workflows/src/runs/background/run-inspect.ts +8 -8
- package/dist/builtin/workflows/src/runs/background/status.ts +2 -1
- package/dist/builtin/workflows/src/runs/background/workflow-lifecycle-aggregate.ts +2 -1
- package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +5 -5
- package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +4 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +2 -0
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +23 -8
- package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +6 -2
- package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +5 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +56 -10
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +6 -0
- package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +137 -6
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +2 -0
- package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +2 -0
- package/dist/builtin/workflows/src/shared/expanded-workflow-graph.ts +159 -10
- package/dist/builtin/workflows/src/shared/flat-string.ts +33 -0
- package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +144 -0
- package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +2 -3
- package/dist/builtin/workflows/src/shared/run-id.ts +36 -0
- package/dist/builtin/workflows/src/shared/store-internal.ts +32 -3
- package/dist/builtin/workflows/src/shared/store-observation.ts +10 -0
- package/dist/builtin/workflows/src/shared/store-public-types.ts +8 -0
- package/dist/builtin/workflows/src/shared/store-run-methods.ts +14 -0
- package/dist/builtin/workflows/src/shared/store-types.ts +4 -0
- package/dist/builtin/workflows/src/shared/types.ts +2 -0
- package/dist/builtin/workflows/src/shared/workflow-artifacts.ts +261 -0
- package/dist/builtin/workflows/src/tui/dispatch-confirm.ts +39 -23
- package/dist/builtin/workflows/src/tui/graph-canvas.ts +26 -9
- package/dist/builtin/workflows/src/tui/graph-view-constants.ts +3 -0
- package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +95 -98
- package/dist/builtin/workflows/src/tui/graph-view-render.ts +7 -20
- package/dist/builtin/workflows/src/tui/graph-view-state.ts +160 -13
- package/dist/builtin/workflows/src/tui/layout.ts +8 -2
- package/dist/builtin/workflows/src/tui/node-card.ts +57 -45
- package/dist/builtin/workflows/src/tui/overlay-adapter.ts +4 -2
- package/dist/builtin/workflows/src/tui/prompt-card-render.ts +291 -21
- package/dist/builtin/workflows/src/tui/prompt-card.ts +1 -1
- package/dist/builtin/workflows/src/tui/renderers.ts +0 -1
- package/dist/builtin/workflows/src/tui/run-detail.ts +52 -35
- package/dist/builtin/workflows/src/tui/run-identity-rows.ts +97 -0
- package/dist/builtin/workflows/src/tui/session-overlays.ts +24 -3
- package/dist/builtin/workflows/src/tui/session-picker.ts +94 -41
- package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +190 -26
- package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +52 -18
- package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +9 -5
- package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +44 -4
- package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +3 -1
- package/dist/builtin/workflows/src/tui/stage-chat-view.ts +3 -2
- package/dist/builtin/workflows/src/tui/status-list.ts +67 -45
- package/dist/builtin/workflows/src/tui/store-widget-installer.ts +7 -6
- package/dist/builtin/workflows/src/tui/widget.ts +49 -40
- package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +15 -10
- package/dist/builtin/workflows/src/tui/workflow-resume-selector.ts +21 -8
- package/dist/core/agent-session-accessors.d.ts.map +1 -1
- package/dist/core/agent-session-accessors.js +5 -0
- package/dist/core/agent-session-accessors.js.map +1 -1
- package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-auto-compaction.js +5 -0
- package/dist/core/agent-session-auto-compaction.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +3 -0
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +2 -1
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-message-queue.d.ts +3 -7
- package/dist/core/agent-session-message-queue.d.ts.map +1 -1
- package/dist/core/agent-session-message-queue.js +27 -13
- package/dist/core/agent-session-message-queue.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +5 -3
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
- package/dist/core/agent-session-persistent-custom-messages.js +6 -3
- package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-post-tool-compaction.js +11 -2
- package/dist/core/agent-session-post-tool-compaction.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +5 -3
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-tree.js +4 -0
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +4 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +1 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage-backends.d.ts.map +1 -1
- package/dist/core/auth-storage-backends.js +12 -1
- package/dist/core/auth-storage-backends.js.map +1 -1
- package/dist/core/bounded-model-refresh.d.ts +14 -0
- package/dist/core/bounded-model-refresh.d.ts.map +1 -0
- package/dist/core/bounded-model-refresh.js +38 -0
- package/dist/core/bounded-model-refresh.js.map +1 -0
- package/dist/core/context-tool-pairing.d.ts +4 -4
- package/dist/core/context-tool-pairing.js +4 -4
- package/dist/core/context-tool-pairing.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +26 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/messages.d.ts +18 -6
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +46 -18
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-refresh-timeout.d.ts +9 -0
- package/dist/core/model-refresh-timeout.d.ts.map +1 -0
- package/dist/core/model-refresh-timeout.js +9 -0
- package/dist/core/model-refresh-timeout.js.map +1 -0
- package/dist/core/model-runtime-snapshot.d.ts +3 -0
- package/dist/core/model-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/model-runtime-snapshot.js +59 -0
- package/dist/core/model-runtime-snapshot.js.map +1 -1
- package/dist/core/model-runtime.d.ts +7 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +72 -17
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +4 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-core.d.ts +1 -1
- package/dist/core/session-manager-core.d.ts.map +1 -1
- package/dist/core/session-manager-core.js +2 -2
- package/dist/core/session-manager-core.js.map +1 -1
- package/dist/core/session-manager-entries.d.ts +1 -1
- package/dist/core/session-manager-entries.d.ts.map +1 -1
- package/dist/core/session-manager-entries.js +2 -1
- package/dist/core/session-manager-entries.js.map +1 -1
- package/dist/core/session-manager-history.d.ts.map +1 -1
- package/dist/core/session-manager-history.js +2 -2
- package/dist/core/session-manager-history.js.map +1 -1
- package/dist/core/session-manager-types.d.ts +3 -0
- package/dist/core/session-manager-types.d.ts.map +1 -1
- package/dist/core/session-manager-types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main-app-mode.d.ts +1 -0
- package/dist/main-app-mode.d.ts.map +1 -1
- package/dist/main-app-mode.js +3 -0
- package/dist/main-app-mode.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts +7 -2
- package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-actions.js +13 -4
- package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts +3 -1
- package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-editor.js +2 -2
- package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.d.ts +3 -0
- package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host-events.js +5 -4
- package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.d.ts +16 -2
- package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-session-host.js +35 -5
- package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +0 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +25 -35
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.js +2 -1
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +1 -1
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +4 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-model-routing.js +4 -1
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-pause.d.ts +3 -1
- package/dist/modes/interactive/interactive-pause.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-pause.js +5 -1
- package/dist/modes/interactive/interactive-pause.js.map +1 -1
- package/dist/modes/interactive/interactive-queueing.js +3 -3
- package/dist/modes/interactive/interactive-queueing.js.map +1 -1
- package/dist/modes/interactive-engine/engine-health.d.ts +6 -0
- package/dist/modes/interactive-engine/engine-health.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-health.js +15 -1
- package/dist/modes/interactive-engine/engine-health.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js +1 -1
- package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts +1 -0
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +7 -1
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js +5 -1
- package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-command-handler.js +23 -7
- package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.js +1 -1
- package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +2 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/custom-provider.md +3 -3
- package/docs/extensions.md +3 -1
- package/docs/index.md +10 -0
- package/docs/keybindings.md +1 -1
- package/docs/models.md +2 -0
- package/docs/providers.md +7 -3
- package/docs/quickstart.md +7 -1
- package/docs/session-format.md +2 -0
- package/docs/termux.md +3 -1
- package/docs/usage.md +3 -2
- package/docs/workflows.md +82 -46
- package/npm-shrinkwrap.json +59 -27
- package/package.json +3 -3
- package/dist/builtin/workflows/src/tui/toast.ts +0 -107
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,140 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.11] - 2026-08-03
|
|
6
|
+
|
|
7
|
+
Cumulative release of the `0.9.11-alpha.1` – `0.9.11-alpha.12` prereleases. The summary below covers the user-visible outcome of that work; the per-change detail remains in the prerelease sections below.
|
|
8
|
+
|
|
9
|
+
### Breaking Changes
|
|
10
|
+
|
|
11
|
+
- Adopted pi 0.83.0 (`@earendil-works/pi-agent-core`, `pi-ai`, `pi-tui` at `^0.83.0`), which moves the bundled TypeBox to 1.3.7 and **removes seven deprecated APIs**. Atomic inherits the removal exactly as upstream shipped it with no compatibility shim, so an extension, skill, workflow, or MCP schema still calling one of these fails to compile and to run. Atomic's own sources use none of them.
|
|
12
|
+
|
|
13
|
+
| Removed API | Replacement |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| `Type.Options(type, options)` | `Type.With(type, options)` — straight rename |
|
|
16
|
+
| `Type.Base` | `Type.Refine()` + `Type.Unsafe()` |
|
|
17
|
+
| `Type.Promise(item)` | none — model the resolved value and validate after `await` |
|
|
18
|
+
| `Type.Awaited(type)` | none — use the resolved type itself |
|
|
19
|
+
| `Type.Iterator(items)` / `Type.AsyncIterator(items)` | none — drain first, then `Type.Array(items)` |
|
|
20
|
+
| `Value.Mutate(current, next)` | `Value.Patch(current, Value.Diff(current, next))` — returns a **new** value rather than assigning in place |
|
|
21
|
+
|
|
22
|
+
- Replaced Atomic's legacy extension OAuth registration bridge with provider-owned authentication from `@earendil-works/pi-ai`, and adopted pi's provider-owned `ModelRuntime` architecture for model composition, credentials, streaming, and catalog refresh. The bridge functions (`registerOAuthProvider`, `getOAuthApiKey`, and the rest) and their credential/status types are gone from the package root; `AuthStorage` now implements pi's asynchronous `CredentialStore` contract, so its synchronous compatibility methods and provider-auth helpers were removed in favour of `read`, `list`, `modify`, `delete`, and `ModelRuntime`; `ModelRegistry` is now the thin synchronous extension-compatibility facade constructed as `new ModelRegistry(runtime)`; and `CreateAgentSessionOptions` takes `modelRuntime` instead of `authStorage`/`modelRegistry`. Extensions must declare OAuth or API-key authentication on their provider registration, and `streamSimple` implementations are now scoped to their registered provider.
|
|
23
|
+
- Model configuration follows pi's single-file `ModelConfig` contract: Atomic reads one `models.json` from the active agent directory and no longer reads project-scoped `.atomic/models.json`, falls back to `~/.pi/agent/models.json`, or merges layered files. Move project-scoped custom providers and models into the agent-directory file. Catalog refreshes also use pi's exact timeout semantics — `modelRefreshTimeoutMs` applies only to the initial runtime creation refresh, and `/model` owns its own 15-second timeout.
|
|
24
|
+
- Removed all Atomic-specific GitHub Copilot handling; `github-copilot` is now an ordinary upstream provider sourced entirely from `pi-ai`. The live CAPI catalog fetch and disk cache, enterprise/GHE base-URL routing, the Gemini tool-schema sanitizer, the Anthropic `message_stop` SSE repair, and Copilot prompt-limit guidance are all gone. Because pi's bundled context windows can exceed what Copilot's API enforces, long sessions on affected models may overrun the server-side cap instead of compacting first ([#1608](https://github.com/bastani-inc/atomic/issues/1608)).
|
|
25
|
+
- Removed the short/long context-window selection feature, which upstream pi does not have: the `contextWindowOptions` / `defaultContextWindow` / `maxInputTokens` model fields, the `/model` picker, `--context-window`, the `defaultContextWindow(s)` settings, the `set_context_window` and `get_available_context_windows` RPC commands, the `context_window_changed` event, the `contextWindow` / `contextWindowStrict` SDK and workflow-stage options, the related root exports, and the `(1m)` / `(long)` token in subagent and workflow model strings. A model's `contextWindow` is now a single catalog value.
|
|
26
|
+
- Isolated interactive `ctx.ui.custom()` components that consume Ctrl+C must declare `{ handlesCtrlC: true }`. Without it the first Ctrl+C is the host escape and closes the focused component, resolving its promise with `undefined`. Bundled workflow and MCP surfaces were migrated; third-party extensions binding Ctrl+C need the one-line addition.
|
|
27
|
+
- Changed the published `runVerbatimCompaction` SDK export to a request object: `runVerbatimCompaction(preparation, model, { resolveAuth, signal, thinkingLevel, urgency, ...options })`. Pre-resolved credentials become a `resolveAuth(model)` callback because a borrowed fallback model needs its own credentials, and `urgency` is required with no default so only a `load_bearing` caller can reach the context-destroying fresh rung. The persisted `CompactionEntry` shape, resume, and the compaction hooks are preserved.
|
|
28
|
+
- Workflow run targets now require the full 36-character run UUID; typed prefixes are no longer resolved by any command or `runId` action, and a malformed target is rejected with a diagnostic distinct from `Run not found:` so a truncated paste is diagnosable. Stage targets are matched exactly, so `build` will not select `build-check`. Every user-facing surface already prints the full id.
|
|
29
|
+
- The RPC `login_provider` response no longer carries the API key it just stored. `RpcLoginProviderResult` dropped its `credential` member; `type` confirms which kind of credential was saved.
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- Added first-class Alpine/musl Linux support for x64 and arm64, including native search and PTY bindings and the `atomic-linux-x64-musl.tar.gz` and `atomic-linux-arm64-musl.tar.gz` archives. The musl archives omit the clipboard binding and glibc-linked `@embedded-postgres/*` binaries, so Atomic falls back to Linux clipboard commands/OSC52 and durable Alpine workflows require external Postgres.
|
|
34
|
+
- Added `atomic auth print-api-key` and `atomic auth print-bearer-token`, which print exactly one named credential to stdout while every warning and diagnostic goes to stderr, so `KEY=$(atomic auth print-api-key --model gpt-5.5)` cannot capture noise. `--model` is required, `--provider` and `--model` are the only accepted options, there is no file or clipboard sink, and `print-bearer-token` refreshes a token with less than `--min-expiry` (default `30m`) remaining. Failures are distinguishable by exit code 1–9, including a partial-write exit that tells you to discard the output. Documented in `docs/usage.md` and `docs/security.md`.
|
|
35
|
+
- Added a compaction rung ladder so a compaction that must succeed always does. The range planner returns typed outcomes instead of ranges-or-throw; a terminal attempt borrows the next `settings.fallbackModels` entry for one planner request resolved with that candidate's own credentials, without changing the session model or history; an overflowing planner request withholds the oldest region lines and retries; and when every model is exhausted, a load-bearing compaction starts a fresh context window — a loud (`✻ Context cleared (compaction degraded)`) and durable (`details.rung: "fresh"`) model-free rung. Manual `/compact` and threshold auto-compaction may borrow a model but can never clear context. **A configured fallback model may now receive the compaction transcript.**
|
|
36
|
+
- Added a built-in, hidden llama.cpp router provider with `/login llama.cpp`, `LLAMA_BASE_URL`/`LLAMA_API_KEY` configuration, loaded-model discovery, and the `/llama` manager for load, unload, reconnect, and Hugging Face GGUF download flows.
|
|
37
|
+
- Added provider-metadata-driven `/login` with direct `/login <provider>` routing and autocomplete, OpenRouter PKCE and Kimi Code device subscription login, API-key login for Qwen Token Plan, Radius, and GitHub Copilot, and immediate post-login model refresh without transporting credentials to the frontend.
|
|
38
|
+
- Added Claude Opus 5 to the Anthropic and Amazon Bedrock catalog paths with adaptive thinking/`xhigh`, Bedrock inference profiles, prompt caching, and strict-tool metadata.
|
|
39
|
+
- Added end-to-end constrained tool sampling to extension/SDK tool definitions and model catalogs: strict JSON Schema `prefer`/`require`, OpenAI grammar tools with Lark/regex variants, and `supportsStrictMode` / `supportsStrictTools` / `supportsOpenAIGrammarTools` flags exposed through additive optional `ModelInfo.compat` ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
|
|
40
|
+
- Added execution-time session metadata to every bash execution path through `ATOMIC_SESSION_ID`, `ATOMIC_SESSION_FILE`, `ATOMIC_PROVIDER`, `ATOMIC_MODEL`, and `ATOMIC_REASONING_LEVEL` with exact `PI_*` aliases, plus request-correlated `bash_execution_update` RPC events that separate stdout from stderr and support concurrent requests and per-request cancellation ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
|
|
41
|
+
- Added `ctx.scopedModels` to the extension context: the read-only list of models scoped to the current session, resolving at access time and handing back a fresh copy on every read so an extension cannot widen its own scope. Documented in `docs/extensions.md`.
|
|
42
|
+
- Added durable, searchable companion transcripts for every workflow stage that declares `output:`, run-scoped durable artifact directories under `~/.atomic/workflows/runs/<runId>/` (overridable with `ATOMIC_WORKFLOW_ARTIFACT_DIR`) with state-aware retention, explicit warnings for degenerate stage artifacts, and a real artifact-integrity probe in the shared resume predicate.
|
|
43
|
+
- Added extension lifecycle hooks `before_provider_headers` and `agent_settled`, durable `entry_appended` events with `registerEntryRenderer()`, named/hidden `InlineExtension` descriptors, and the public `ModelRuntime` facade, `readStoredCredential`, and session-context conversion helpers on the SDK surface.
|
|
44
|
+
- Added global `httpProxy`, duration-string and `"disabled"` HTTP idle timeouts, package `autoload: false` project deltas, `oauth: "radius"` custom gateways, global/project scope switching in `atomic config`, and the `get_available_thinking_levels` RPC command.
|
|
45
|
+
- Added Ctrl+X copy-last-message, clipboard text fallback when image paste finds no image, durable cache-miss attribution with waste totals, per-model session usage and cost breakdowns including tool and summary work, and Atomic's first-run theme preview with explicit analytics opt-in (no analytics data is transmitted by this change).
|
|
46
|
+
|
|
47
|
+
### Changed
|
|
48
|
+
|
|
49
|
+
- Reworked interactive startup and working motion around Atomic's revision-3 identity: the ∀ banner assembles inward before its identity beat, and main and workflow-stage surfaces keep the one-cell `∀` visible on a theme-aware dark → accent → bright → accent → dark luminance ramp at 88 ms while retaining all 453 randomized working verbs. `NO_COLOR` keeps regular/bold activity without color escapes, and reduced motion keeps a static accent `∀` ([#1883](https://github.com/bastani-inc/atomic/issues/1883)).
|
|
50
|
+
- Made interactive startup dramatically faster on Windows: installed builds ship the builtin workflows extension as a single prebundled ESM file instead of transpiling a ~300-file module graph per launch (~7 s → ~1.1 s on a test VM), and the CLI enables Node's persistent on-disk V8 compile cache so host and engine child reuse compiled bytecode across runs ([#1962](https://github.com/bastani-inc/atomic/issues/1962)).
|
|
51
|
+
- Removed the fixed 1 MiB size limit from RPC and isolated interactive-engine JSONL transport; commands, responses, events, and render frames now pass through in full ([#1985](https://github.com/bastani-inc/atomic/issues/1985)).
|
|
52
|
+
- A stored OAuth token is now refreshed once fewer than five minutes of validity remain, rather than at expiry, so a long turn is not started on a credential that dies mid-request. The refresh runs inside the `auth.json` lock, so concurrent sessions refresh it once between them.
|
|
53
|
+
- The OpenRouter login now accepts a pasted final redirect URL, or the authorization code alone, for remote and headless machines where the browser cannot reach the loopback callback.
|
|
54
|
+
- A provider that ends a turn with an unrecognised terminal reason now surfaces a provider error naming the raw reason instead of reporting an ordinary successful stop, and assistant messages carry a new `pending` stop reason while streaming. Documented in `docs/providers.md`, `docs/custom-provider.md`, `docs/rpc.md`, and `docs/session-format.md`.
|
|
55
|
+
- Workflow run identifiers are shown as full UUIDs across the BACKGROUND widget, status views, run pickers, and control messages; the four-workflow BACKGROUND display cap is gone; and `workflow({ action: "status", format: "json" })` no longer includes `runIdPrefix` — read `runId`.
|
|
56
|
+
- Added Orwell's six writing rules from "Politics and the English Language" to the core default system prompt's `Guidelines` section, and the startup `RESOURCES` disclosure now lists `SYSTEM.md` and `APPEND_SYSTEM.md` alongside the `AGENTS.md`/`CLAUDE.md` context files.
|
|
57
|
+
- Synchronized the bundled `impeccable` skill tree with upstream 4.0.3 (four surface modes, new routing and craft-floor guidance, a `doctor` drift check, documenter and finish-reviewer agents), and verified the `playwright-cli` and `liteparse` trees against their upstream baselines.
|
|
58
|
+
- Updated the bundled user documentation for the current subagent, workflow-stage, reviewer, and `prompt-engineer` prompt contracts, removing response prefilling and private-reasoning requests for GPT-5.6, Claude Opus 5, and Claude Fable 5 compatibility.
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- Fixed the isolated interactive engine losing or duplicating your typed input. A submission the engine never accepted now returns to the editor exactly as typed — through every submit route, including `/atomic`, deferred slash commands, streaming steer sends, `!bash`, `/compact`, and Alt+Enter — with its own draft carried end to end so two similar submissions cannot restore each other's text, and without a misleading red transport error beside it. Work the engine *had* started is no longer offered back as unsent: the child announces ownership of every correlated request before its handler can touch the shell, so a silent `!touch marker && sleep 400` is not re-invited for a second run. The interactive-engine protocol version is now `2`.
|
|
63
|
+
- Fixed a total interactive-TUI lockup when the engine generation behind a mounted remote custom UI died, which previously left components mounted forever with input trapped and required killing the process from another terminal. Engine death is now a host-local lifecycle event that closes every remote component from the dead generation, settles its promises, releases widget keys, resets terminal modes, and refocuses the editor without waiting for a replacement.
|
|
64
|
+
- Fixed interrupting a tool call terminating the interactive engine and reporting `Engine terminated; … result unknown`. Escape now simply requests cooperative cancellation and waits for it — interrupting never terminates or restarts the engine and never discards in-flight tool state — and every cooperative-cancellation command (`abort`, `abort_bash`, `abort_compaction`, `abort_retry`, `cancel_login_provider`) is exempt from the generic 30-second RPC deadline.
|
|
65
|
+
- Added recovery from an unexpected interactive-engine exit — one automatic replacement attempt with the calm status `Interactive engine stopped unexpectedly; restarting.` — and kept an explicit Ctrl+C escape hatch for a provably wedged engine. Reopening an inactive session after such an exit now derives explicit error results for unanswered `toolUse` calls without rewriting its append-only JSONL, so the session is usable again instead of permanently pending.
|
|
66
|
+
- Fixed the interactive engine exporting its private control values (`ATOMIC_INTERACTIVE_ENGINE_CHILD`, `_HOST_PID`, `_GUARD_FILE`, `_API_KEY`) to every process it spawned, which made nested `atomic` runs start in engine mode, misdirected process guardians, disabled subagent idle watchdogs, and leaked an `--api-key` credential to every child. Those values now travel in an owner-only bootstrap file read once and unlinked by the child.
|
|
67
|
+
- Fixed OAuth logins being destroyed by an unrelated model-catalog refresh. A timed-out or partially failed post-login refresh used to roll freshly acquired tokens back to the previous credential and — because providers rotate refresh tokens — could permanently strand the account behind repeating `invalid_grant` failures. Freshly persisted credentials now always survive the refresh.
|
|
68
|
+
- Fixed `/model` and `/logout` hanging. The selector's 15-second abort now crosses the engine RPC boundary and covers credential reload, model refreshes run in a concurrent correlated lane so selection stays responsive, and `/logout` publishes credential removal immediately instead of timing out after it had already deleted the credential. Newly authenticated providers also appear without a restart ([#1918](https://github.com/bastani-inc/atomic/issues/1918)).
|
|
69
|
+
- Fixed Anthropic subscription login on Bun-hosted Linux sessions remaining at `Exchanging authorization code for tokens...`, caused by Bun not exposing Undici's CommonJS `install()` helper through its ESM namespace, so the configured transport was silently never used.
|
|
70
|
+
- Fixed RPC `save_provider_credential` writes disappearing after restart (they were stored as non-persistent runtime overrides), `ANTHROPIC_AUTH_TOKEN` header-only bearer authentication being rejected across catalog and request paths, and GitHub Copilot requests failing with `421 Misdirected Request` for `COPILOT_GITHUB_TOKEN` users on business, enterprise, and GHE tenants ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
|
|
71
|
+
- Fixed a mid-turn compaction leaving the turn unsendable, which the provider rejected with an unrecoverable `400 ... each tool_use must have a single result`. The post-tool preflight returned the agent's live internal message array, so every later turn duplicated assistant messages and tool results; it now returns its own copy, with provider-side deduplication and a descriptive pre-conversion guard as defence in depth ([#2051](https://github.com/bastani-inc/atomic/issues/2051)).
|
|
72
|
+
- Fixed reasoning tokens being able to fail a compaction outright. The planner capped its own request at `0.8 × reserveTokens` — an input-side reserve reused as an output cap — so a high-reasoning session could spend the whole budget thinking and return no deletion records, killing the active turn during a mid-turn preflight. The planner now sends no `max_tokens` at all; branch summarization received the same fix.
|
|
73
|
+
- Fixed compaction rebuilding the retained recent messages as structured blocks after the boundary, which could produce out-of-order provider blocks and a rejected request. The `preserve_recent` tail is now serialized with the same transcript grammar and concatenated onto the boundary, losslessly: retained tool results keep their full text and retained images stay as image blocks.
|
|
74
|
+
- Fixed repeated `/compact` presses starting several overlapping compactions. `AgentSession.compact()` is now single-flight — a second manual request joins the run in flight rather than emitting a duplicate boundary — and messages queued before an automatic compaction no longer stay stuck until Escape ([#1984](https://github.com/bastani-inc/atomic/issues/1984)).
|
|
75
|
+
- Fixed `/reload` re-transpiling and re-evaluating the entire transitive TypeScript graph of every extension on Windows and in compiled builds even when nothing changed. A per-extension SHA256 graph manifest now lets an unchanged graph reuse its evaluated factory; reloading the five builtin packages drops from ~25 s cold / ~16 s warm to ~90 ms ([#2069](https://github.com/bastani-inc/atomic/issues/2069)).
|
|
76
|
+
- Fixed interactive startup crashing with `Interactive engine did not become ready within 5000 ms` on machines with slow cold starts; the fixed deadline is removed while a dead process or broken transport still fails fast ([#1962](https://github.com/bastani-inc/atomic/issues/1962)).
|
|
77
|
+
- Fixed the external editor failing on Windows whenever the editor path, its arguments, or the temporary prompt path contained a space, and fixed the compiled package CLI crashing before TUI startup when invoked from another working directory ([#1995](https://github.com/bastani-inc/atomic/issues/1995)).
|
|
78
|
+
- Fixed physical Escape and Ctrl+C depending on the configurable `app.clear` action, which could send Escape to the engine stop branch and strip Ctrl+C of its host route. Both are now matched by physical key identity, and a single Ctrl+C again dismisses the `/login` popups instead of clearing the hidden editor and risking a double-press exit.
|
|
79
|
+
- Fixed session-tree navigation being accepted while a response was still streaming, which stranded the in-flight turn's tool results on the abandoned branch, and fixed a startup session switch rendering every agent event twice.
|
|
80
|
+
- Fixed inherited `.pi` extensions conflicting with Atomic-bundled resources, extension-contributed skills, prompts, and themes losing their package source metadata after a resource reload, and a nested linked git worktree loading the repository's `AGENTS.md`/`CLAUDE.md` twice ([#1955](https://github.com/bastani-inc/atomic/issues/1955)).
|
|
81
|
+
- Fixed workflow reliability from the parent-session side: stage `output:` no longer lost to an admitted external turn, `reads:` references fail loudly when an artifact is missing instead of handing the model an empty file, the resume picker stops offering stale or non-resumable runs, fast named workflows no longer leave a stale "still running" claim, queued work no longer escapes a controlled pause ([#1983](https://github.com/bastani-inc/atomic/issues/1983)), and tool-only workflows are no longer reported failed after their durable side effects completed ([#1991](https://github.com/bastani-inc/atomic/issues/1991)).
|
|
82
|
+
- Fixed the RPC `bash` command bypassing extension `user_bash` handlers, so sandbox and remote-shell extensions see an RPC request exactly as they see `user_bash`.
|
|
83
|
+
- Fixed a failed `git` package install leaving a half-written checkout that silently suppressed the next repair, and hardened the archive and SQLite path-selector parsers against polynomial-time regex backtracking (CodeQL `js/polynomial-redos`) with no change to accepted selector syntax.
|
|
84
|
+
- Fixed PDF extraction dropping text and streaming `TypeError: Math.sumPrecise is not a function` on Node runtimes without `Math.sumPrecise` by exact-pinning `unpdf` to `1.7.0` instead of letting it float to 1.8.0 ([#2141](https://github.com/bastani-inc/atomic/issues/2141)).
|
|
85
|
+
|
|
86
|
+
## [0.9.11-alpha.12] - 2026-08-03
|
|
87
|
+
|
|
88
|
+
### Fixed
|
|
89
|
+
|
|
90
|
+
- Fixed PDF extraction dropping text and streaming `TypeError: Math.sumPrecise is not a function` warnings on Node runtimes that do not implement `Math.sumPrecise`. The `unpdf` dependency was declared as the floating range `^1.6.2`, which resolves to 1.8.0 in a published or global install; that release's bundled PDF.js v6.1 dropped the guarded fallback and calls the builtin unconditionally, so extraction threw per glyph, emitted font-substitution warnings, and silently returned fewer text items. `unpdf` is now exact-pinned to `1.7.0`, the newest release that still ships the fallback, so no install can float to 1.8.0 ([#2141](https://github.com/bastani-inc/atomic/issues/2141)).
|
|
91
|
+
- Upgraded the pinned `unpdf` from 1.6.2 to 1.7.0, which adds `cMapUrl` CJK font support under Node, destroys internally created document proxies and canvas resources, and preserves line breaks in `extractText` with `mergePages`.
|
|
92
|
+
|
|
93
|
+
## [0.9.11-alpha.11] - 2026-08-03
|
|
94
|
+
|
|
95
|
+
### Breaking Changes
|
|
96
|
+
|
|
97
|
+
- Workflow run targets now require the full 36-character run UUID. Typed prefixes are no longer resolved by any command or workflow-tool action that accepts `runId`, including `status`, `stages`, `stage`, `transcript`, `send`, `pause`, `resume`, `interrupt`, and `quit`, and by `/workflow connect`, `/workflow attach`, and `/workflow resume`. A target that is not a well-formed 8-4-4-4-12 hex UUID — a prefix, a 32-character dashless id, or a same-length non-hex string — is rejected with `Run id must be a full 36-character UUID; got "339e05a4" (8 chars).`, which is deliberately distinct from `Run not found:` so a truncated paste is diagnosable as truncated rather than looking like a stale run. Since every user-facing surface already prints the full id, copy it back verbatim. Because ids are unique and now matched exactly, run-target ambiguity is unreachable and the "Ambiguous run prefix" diagnostic is gone.
|
|
98
|
+
- Stage targets are now matched exactly. A `stageId` resolves by exact stage id — a bare UUID at the root, the full `runId:stageId` composite for a stage inside a nested `ctx.workflow(...)` import, or `tool:<argsHash>` for a `ctx.tool` node — or by exact stage or tool name. Prefixes and partial names no longer resolve, so `build` will not select `build-check`. Stage ids are deliberately **not** held to the 36-character rule, because nested and tool identifiers are legitimately longer or differently shaped; nested-stage and tool-node targeting are unchanged. Two stages sharing an exact name still return the existing ambiguity diagnostic.
|
|
99
|
+
|
|
100
|
+
### Changed
|
|
101
|
+
|
|
102
|
+
- Removed the four-workflow display cap from the BACKGROUND widget so every qualifying top-level run is rendered.
|
|
103
|
+
- Moved durable workflow run artifacts—including goal ledgers, Ralph implementation notes, QA evidence video paths, and worktree task outputs—from per-invocation OS temp directories to the run-scoped durable root under the Atomic config directory (`~/.atomic/workflows/runs/<runId>/`, overridable with `ATOMIC_WORKFLOW_ARTIFACT_DIR`), so they survive OS temp purges and follow state-aware retention.
|
|
104
|
+
- Toggling tool-output expansion (`ctrl+o`) no longer prints a `Tool output: expanded` / `Tool output: collapsed` status line. The chat re-renders in the new state, which is the same information without the extra line.
|
|
105
|
+
|
|
106
|
+
- Workflow run identifiers are now shown as full UUIDs across the BACKGROUND widget, status and detail views, run pickers, control messages, and awaiting-input attribution banners. BACKGROUND cards use a two-line identity layout at 80 columns and wider, while narrow chat surfaces wrap full ids without cutting them or breaking their borders. The public `workflow({ action: "status", format: "json" })` payload no longer includes `runIdPrefix`; read `runId` instead, which now carries the full id. The `/workflow connect` run picker now shows five runs at a time and scrolls to additional retained runs with the arrow keys or mouse wheel. The picker's type-to-filter box still narrows by name substring or id prefix, since that selects a row from a list rather than resolving a typed id.
|
|
107
|
+
|
|
108
|
+
### Fixed
|
|
109
|
+
|
|
110
|
+
- Fixed Escape aborts restoring queued steering and follow-up messages to the editor in the main interactive chat and attached workflow-stage chats instead of leaving them stuck in the pending-message queue.
|
|
111
|
+
- Fixed `/model <model_name>` waiting indefinitely when a model-catalog refresh never settles; it now stops after the interactive 15-second deadline and searches cached models.
|
|
112
|
+
- Quit workflow cards now expire from the BACKGROUND widget after the same recent-run window as finished cards while remaining resumable and discoverable through workflow status; the header count now matches the rendered cards after expiry.
|
|
113
|
+
- Fixed detached foreground subagent completion notifications rendering as an unstyled dump of the full child output. They now use the same structured, collapsed notification UI as background completions while preserving the distinct detached-task wording, and persisted notifications with custom labels remain parseable.
|
|
114
|
+
- Fixed workflow-stage re-attach status falling back to `Working...` while context compaction is still active; the active compaction reason now survives host remounts so manual compaction, threshold auto-compaction, and overflow recovery retain their factual status labels.
|
|
115
|
+
- Fixed workflow stage file output being lost when an admitted external turn (for example an async subagent completion) arrived while the stage was still running: the deterministic `output:` write re-derived its content from session state at close time, so a trailing acknowledgement could overwrite the stage's real deliverable. Every stage that declares `output:` now also gets a durable, searchable companion transcript outside the repository tree, and the receipt names both paths with the intended access pattern, so the work remains recoverable regardless of which turn was persisted. The runner does not attempt to infer which turn was the intended deliverable; it writes the stage's final assistant message, and the receipt reports one fact only — an empty artifact.
|
|
116
|
+
- Fixed the workflow resume picker offering stale or non-resumable runs. Picker and command paths now share one resumability predicate and revalidate durable state before displaying a target, while explicit ids retain their explanatory rejection.
|
|
117
|
+
- Fixed workflow `reads:` references to fail loudly when an artifact path no longer exists instead of handing the model an empty, silently missing context file.
|
|
118
|
+
- Fixed relayed terminal subagent results retaining their stable stage-admission identity when delivered through the intercom ordering barrier, so an acknowledgement turn cannot arrive without the admission marker that identifies it in a running stage's companion transcript.
|
|
119
|
+
- Fixed a failed companion-transcript write reporting a bogus `Output file error` for an output artifact that was written correctly, and returning the full stage text under `outputMode: "file-only"` instead of the compact reference. A transcript failure now degrades to a warning naming the transcript path while the saved-output reference is unchanged, and artifact-retention pruning failures no longer propagate into the stage receipt.
|
|
120
|
+
- Fixed `createWorkflowArtifactDirectory()` attributing artifacts to the ambient most-recently-started run rather than the workflow that created them, and returning one shared directory whose fixed artifact filenames could overwrite each other. Every builtin call site now passes its owning run id, and each call receives a unique directory beneath that run.
|
|
121
|
+
- Fixed the workflow resume picker re-offering a live run as a durable row after the shared resumability predicate rejected it for missing artifacts or checkpoints. Rejected non-running snapshots are now suppressed from live and durable resumable rows, while completed inspection rows remain available; active-running snapshots retain their existing durable fallback.
|
|
122
|
+
|
|
123
|
+
### Added
|
|
124
|
+
- Added first-class Alpine/musl Linux support for x64 and arm64, including native search and PTY bindings and the `atomic-linux-x64-musl.tar.gz` and `atomic-linux-arm64-musl.tar.gz` release archives. The musl archives omit the clipboard native binding and glibc-linked `@embedded-postgres/*` binaries: Atomic falls back to Linux clipboard commands/OSC52, while durable Alpine workflows require external Postgres via `DBOS_SYSTEM_DATABASE_URL` or Docker; otherwise the existing loud non-durable in-memory fallback applies.
|
|
125
|
+
- Added state-aware retention for durable workflow artifact directories: only terminal or unowned runs older than `WORKFLOW_ARTIFACT_RETENTION_MS` are pruned, while running, paused, quit, blocked, and awaiting-input runs keep live resume dependencies. Aging out a terminal run now deletes its durable entry first and removes the artifact directory only when that deletion succeeds, so a surviving durable record can never reference deleted files.
|
|
126
|
+
- Added durable, searchable companion transcripts for every workflow stage that declares `output:`. The caller's receipt names both the artifact and transcript paths and says to search with `rg`, read narrow line ranges, and never read the transcript whole; under `outputMode: "file-only"`, that receipt is the entire handoff.
|
|
127
|
+
- Added explicit warnings for degenerate stage artifacts instead of silently persisting them: an empty write or a write that only points to its own output path directs the reader to the companion transcript.
|
|
128
|
+
- Added a real artifact-integrity probe to the shared resume predicate. A run whose snapshot references a run-scoped artifact path is offered for resume only while that run directory still exists, and durable-checkpoint eligibility is supplied from the authoritative loadable check, so `/workflow resume` matches the documented behaviour instead of relying on flags no caller set.
|
|
129
|
+
|
|
130
|
+
## [0.9.11-alpha.10] - 2026-08-01
|
|
131
|
+
|
|
132
|
+
### Fixed
|
|
133
|
+
|
|
134
|
+
- Fixed an isolated interactive-engine exit after an admitted tool call leaving that session permanently pending and unusable on resume. Reopening an inactive session now derives explicit error results for unanswered `toolUse` calls without rewriting its append-only JSONL, so the transcript can render, compact, and accept another prompt while preserving that the interrupted command's side effects are unknown. Unexpected-restart notices now also retain the bounded exit kind, code, or signal that triggered recovery while excluding child stderr.
|
|
135
|
+
- Fixed Anthropic subscription login on Bun-hosted Linux sessions remaining at `Exchanging authorization code for tokens...`. Atomic's HTTP setup relied on Undici's CommonJS `install()` helper, but Bun does not expose that helper through its ESM namespace, so source-mode and compiled interactive-engine processes silently kept Bun's native `fetch` instead of the configured Undici transport. Atomic now installs the exported Undici web globals explicitly under Bun. Login completion also ends when the provider credential is persisted and publishes that provider against the already-loaded model snapshot immediately; cache restoration, ambient availability checks, and catalog discovery no longer run inside the successful credential transaction, so none can keep the login dialog open after the provider appears in `auth.json`.
|
|
136
|
+
- Fixed existing authenticated users being unable to select a model, or seeing `Refreshing model catalogs…` indefinitely, after an isolated or direct `/model` refresh stalled. The frontend's 15-second abort previously never crossed the engine RPC boundary, the engine started its deadline only after an unbounded credential/availability reload, and the selector assumed refresh work would honor cancellation. The shared deadline now covers credential reload and catalog work inside the engine, the selector races that deadline itself and replaces the progress state on both timeout and rejection, and model refreshes use a concurrent correlated lane so selection remains responsive while catalogs update. Existing `auth.json` credentials remain compatible and no `~/.atomic` reset is required.
|
|
137
|
+
- Fixed `/logout` timing out after it had already deleted the credential, leaving the provider in `/model` until restart and preventing the selector from reopening. Logout now publishes credential removal immediately, skips post-logout catalog refreshes, bounds the local probe for authentication that remains in the environment, and prevents a model refresh started before the mutation from overwriting the newer login or logout snapshot when it eventually settles.
|
|
138
|
+
|
|
5
139
|
## [0.9.11-alpha.9] - 2026-08-01
|
|
6
140
|
|
|
7
141
|
### Breaking Changes
|
package/README.md
CHANGED
|
@@ -79,7 +79,7 @@ atomic
|
|
|
79
79
|
|
|
80
80
|
Then just talk to Atomic. By default, Atomic gives the model six coding tools: `read`, `write`, `edit`, `bash`, `find`, and `search`. The model uses these to fulfill your requests. `read`, `search`, `write`, and successful `edit` calls emit session-scoped hashline anchors (`[path#TAG]` plus `LINE:text`) so the model can make stale-safe line edits; see [docs/tools.md](docs/tools.md). Add capabilities via [skills](#skills), [prompt templates](#prompt-templates), [extensions](#extensions), or [Atomic packages](#atomic-packages).
|
|
81
81
|
|
|
82
|
-
**Platform notes:** [Windows](docs/windows.md) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md)
|
|
82
|
+
**Platform notes:** [Windows](docs/windows.md) | [Alpine/musl Linux](docs/index.md#alpine-and-musl-linux-archives) | [Termux (Android)](docs/termux.md) | [tmux](docs/tmux.md) | [Terminal setup](docs/terminal-setup.md) | [Shell aliases](docs/shell-aliases.md)
|
|
83
83
|
|
|
84
84
|
---
|
|
85
85
|
|
|
@@ -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.11] - 2026-08-03
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Released with Atomic 0.9.11. No functional intercom changes since 0.9.10; the extension now runs under the reworked isolated-engine and workflow-group behaviour shipped by the host.
|
|
12
|
+
|
|
7
13
|
## [0.9.11-alpha.1] - 2026-07-20
|
|
8
14
|
|
|
9
15
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/intercom",
|
|
3
|
-
"version": "0.9.11
|
|
3
|
+
"version": "0.9.11",
|
|
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": [
|
|
@@ -33,6 +33,7 @@ async function dispatchRelayFallback(
|
|
|
33
33
|
pi: ExtensionAPI,
|
|
34
34
|
prefix: Array<{ customType: string; content: string; display: boolean; details?: unknown }>,
|
|
35
35
|
terminalMessage: { customType: string; content: string; display: boolean; details?: unknown },
|
|
36
|
+
stageAdmissionKey: string,
|
|
36
37
|
): Promise<void> {
|
|
37
38
|
let delivered = 0;
|
|
38
39
|
try {
|
|
@@ -40,7 +41,7 @@ async function dispatchRelayFallback(
|
|
|
40
41
|
await pi.sendMessage(message, { deliverAs: "steer" });
|
|
41
42
|
delivered += 1;
|
|
42
43
|
}
|
|
43
|
-
await pi.sendMessage(terminalMessage, { triggerTurn: true });
|
|
44
|
+
await pi.sendMessage(terminalMessage, { triggerTurn: true, stageAdmissionKey });
|
|
44
45
|
} catch (error) {
|
|
45
46
|
const failure = new Error(error instanceof Error ? error.message : String(error), { cause: error });
|
|
46
47
|
Object.assign(failure, { terminalPreludeDelivered: delivered });
|
|
@@ -57,6 +58,7 @@ export function registerSubagentRelay(pi: ExtensionAPI, deps: SubagentRelayDeps)
|
|
|
57
58
|
status: string,
|
|
58
59
|
messageText: string,
|
|
59
60
|
terminalBarrier?: { runId: string; terminalId?: string; sourceSessionTargets: string[] },
|
|
61
|
+
requestId?: string,
|
|
60
62
|
): Promise<void> {
|
|
61
63
|
const now = Date.now();
|
|
62
64
|
const entry = {
|
|
@@ -82,10 +84,11 @@ export function registerSubagentRelay(pi: ExtensionAPI, deps: SubagentRelayDeps)
|
|
|
82
84
|
display: true,
|
|
83
85
|
details: entry,
|
|
84
86
|
};
|
|
87
|
+
const stageAdmissionKey = `intercom:${requestId ?? entry.message.id}`;
|
|
85
88
|
if (typeof pi.sendMessages === "function") {
|
|
86
|
-
return pi.sendMessages([...prefix, terminalMessage], { triggerTurn: true });
|
|
89
|
+
return pi.sendMessages([...prefix, terminalMessage], { triggerTurn: true, stageAdmissionKey });
|
|
87
90
|
}
|
|
88
|
-
return dispatchRelayFallback(pi, prefix, terminalMessage);
|
|
91
|
+
return dispatchRelayFallback(pi, prefix, terminalMessage, stageAdmissionKey);
|
|
89
92
|
},
|
|
90
93
|
};
|
|
91
94
|
Object.defineProperty(payload, "terminalOwner", { value: pi });
|
|
@@ -139,13 +142,13 @@ export function registerSubagentRelay(pi: ExtensionAPI, deps: SubagentRelayDeps)
|
|
|
139
142
|
void delivery.catch(() => {});
|
|
140
143
|
localDeliveriesInFlight.set(parsed.requestId, { signature, completion: delivery });
|
|
141
144
|
try {
|
|
142
|
-
void deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier).then(deferred.resolve, deferred.reject);
|
|
145
|
+
void deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier, parsed.requestId).then(deferred.resolve, deferred.reject);
|
|
143
146
|
} catch (error) {
|
|
144
147
|
deferred.reject(error);
|
|
145
148
|
}
|
|
146
149
|
void delivery.finally(() => { localDeliveriesInFlight.delete(parsed.requestId!); }).catch(() => {});
|
|
147
150
|
} else if (!delivery) {
|
|
148
|
-
delivery = deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier);
|
|
151
|
+
delivery = deliverLocalSubagentRelayMessage(options.sender, options.status, parsed.message, options.terminalBarrier, parsed.requestId);
|
|
149
152
|
}
|
|
150
153
|
await delivery;
|
|
151
154
|
if (parsed.requestId) localDeliveries.record(parsed.requestId, signature);
|
|
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.11] - 2026-08-03
|
|
11
|
+
|
|
12
|
+
### Removed
|
|
13
|
+
|
|
14
|
+
- Removed Cursor MCP configuration discovery and the `cursor` compatibility import kind ([#1994](https://github.com/bastani-inc/atomic/issues/1994)).
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Declared `handlesCtrlC` on the `/mcp` panel, the `/mcp setup` panel, and the MCP OAuth panel, so Ctrl+C still reaches each panel's own handler — and its cancel and cleanup work — in isolated interactive sessions.
|
|
19
|
+
|
|
10
20
|
## [0.9.11-alpha.9] - 2026-08-01
|
|
11
21
|
|
|
12
22
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/mcp",
|
|
3
|
-
"version": "0.9.11
|
|
3
|
+
"version": "0.9.11",
|
|
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,26 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.11] - 2026-08-03
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Adopted Claude Opus 5 across every builtin subagent `fallbackModels` policy and normalized provider ordering: each Anthropic family lists its direct `anthropic/...` candidate ahead of the `github-copilot/...` mirror, Opus 5 leads the Anthropic group (`:high` for the debugger, `:low` elsewhere), and `claude-fable-5` gains its missing Copilot mirror.
|
|
10
|
+
- Reworked all nine bundled agent system prompts and all seven chain task templates for GPT-5.6, Claude Opus 5, and Claude Fable 5. Agent bodies are outcome-first with explicit success, evidence, output, escalation, and stop contracts, shrinking from 1,418 to 561 lines. Removing repeated self-verification and requests to reproduce internal reasoning also avoids Claude Fable 5 `reasoning_extraction` refusals that could force model fallback. Frontmatter and exported behaviour are unchanged.
|
|
11
|
+
- Made the builtin debugger write-capable with the same tool list as `worker`, so it applies the smallest in-scope fix after proving the root cause, and gave it the `tdd`, `playwright-cli`, and `tmux` skills plus Intercom coordination.
|
|
12
|
+
- Generalized orchestration guidance across parent chats and workflow stages: orchestrators preserve each agent's declared model and fallback policy by default, explicit overrides require a user request or documented need, and every invocation shares one invocation-specific Intercom group while retaining `contact_supervisor` escalation.
|
|
13
|
+
|
|
14
|
+
### Removed
|
|
15
|
+
|
|
16
|
+
- Removed Cursor MCP compatibility imports from delegated direct-tool resolution and Cursor model candidates from every builtin subagent fallback policy ([#1994](https://github.com/bastani-inc/atomic/issues/1994)).
|
|
17
|
+
- Removed the `(1m)` context-window token from every builtin fallback policy; candidates now use the model's catalog context window (`github-copilot/claude-opus-4.8:medium`).
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
- Fixed startup artifact cleanup escaping isolated agent directories, and made it far cheaper: the global scan now stays inside a host-provided sessions root, runs at most once per 24 hours per root behind a `.last-cleanup` marker and an exclusive `.cleanup.lock`, is deferred ten minutes after startup, and stops at the first entry newer than the cutoff instead of recursively stat-ing whole subtrees — eliminating tens of thousands of synchronous fs calls on long-lived machines ([#2070](https://github.com/bastani-inc/atomic/issues/2070)).
|
|
22
|
+
- Fixed worktree setup hooks being reported as failed when they never read their stdin. A hook that exited before the JSON input flushed made `spawnSync` report `EPIPE` and tore down the whole worktree even though the hook had completed; the child's exit status and output are now authoritative. Timeouts and other spawn errors stay fatal.
|
|
23
|
+
- Fixed foreground subagent runs that detached for intercom coordination completing silently. A detached single, chain, or parallel child now delivers a "Detached subagent task" completion, failure, or paused notice to the parent session through the same deduplicated, turn-triggering pipeline as background completions, including per-child `(n/m)` attribution.
|
|
24
|
+
|
|
5
25
|
## [0.9.11-alpha.9] - 2026-08-01
|
|
6
26
|
|
|
7
27
|
### 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: openai-codex/gpt-5.6-
|
|
12
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
11
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
12
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-fable-5:low, anthropic/claude-opus-4-8:medium, github-copilot/claude-opus-4.8:medium, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/x-ai/grok-4.5, 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: openai-codex/gpt-5.6-
|
|
6
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
5
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
6
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-fable-5:low, anthropic/claude-opus-4-8:medium, github-copilot/claude-opus-4.8:medium, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/x-ai/grok-4.5, 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-codex/gpt-5.6-
|
|
6
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
5
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
6
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:low, github-copilot/gpt-5.5:low, openai/gpt-5.5:low, anthropic/claude-opus-4-8:low, github-copilot/claude-opus-4.8:low, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/x-ai/grok-4.5, openrouter/z-ai/glm-5.2:xhigh
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Role and goal
|
|
@@ -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: openai-codex/gpt-5.6-
|
|
6
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
5
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
6
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-fable-5:low, anthropic/claude-opus-4-8:medium, github-copilot/claude-opus-4.8:medium, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/x-ai/grok-4.5, 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-codex/gpt-5.6-
|
|
6
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
5
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
6
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:low, github-copilot/gpt-5.5:low, openai/gpt-5.5:low, anthropic/claude-opus-4-8:low, github-copilot/claude-opus-4.8:low, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/x-ai/grok-4.5, openrouter/z-ai/glm-5.2:xhigh
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Role and goal
|
|
@@ -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: openai-codex/gpt-5.6-
|
|
6
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
5
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
6
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-fable-5:low, anthropic/claude-opus-4-8:medium, github-copilot/claude-opus-4.8:medium, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/x-ai/grok-4.5, openrouter/z-ai/glm-5.2:xhigh
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Role and goal
|
|
@@ -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-codex/gpt-5.6-
|
|
6
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
5
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
6
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:low, github-copilot/gpt-5.5:low, openai/gpt-5.5:low, anthropic/claude-opus-4-8:low, github-copilot/claude-opus-4.8:low, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:low, openrouter/anthropic/claude-opus-4-8:low, openrouter/x-ai/grok-4.5, openrouter/z-ai/glm-5.2:xhigh
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
## Role and goal
|
|
@@ -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: openai-codex/gpt-5.6-
|
|
9
|
-
fallbackModels: github-copilot/gpt-5.6-
|
|
8
|
+
model: openai-codex/gpt-5.6-luna:max
|
|
9
|
+
fallbackModels: github-copilot/gpt-5.6-luna:max, openai/gpt-5.6-luna:max, anthropic/claude-opus-5:low, github-copilot/claude-opus-5:low, openai-codex/gpt-5.5:medium, github-copilot/gpt-5.5:medium, openai/gpt-5.5:medium, anthropic/claude-fable-5:low, github-copilot/claude-fable-5:low, anthropic/claude-opus-4-8:medium, github-copilot/claude-opus-4.8:medium, xai/grok-4.5:high, zai/glm-5.2:high, zai-coding-cn/glm-5.2:high, openrouter/openai/gpt-5.6-luna:max, openrouter/anthropic/claude-opus-5:low, openrouter/openai/gpt-5.5:medium, openrouter/anthropic/claude-fable-5:low, openrouter/anthropic/claude-opus-4-8:medium, openrouter/x-ai/grok-4.5, 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.11
|
|
3
|
+
"version": "0.9.11",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension for delegating tasks to subagents with chains, parallel execution, and background runs. Fork of: https://github.com/nicobailon/pi-subagents",
|
|
6
6
|
"contributors": [
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import type { SubagentNotifyDetails } from "../runs/background/notify.ts";
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
["Background task completed: **", "completed"],
|
|
5
|
-
["Background task failed: **", "failed"],
|
|
6
|
-
["Background task paused: **", "paused"],
|
|
7
|
-
] as const;
|
|
3
|
+
const HEADER_STATUSES = ["completed", "failed", "paused"] as const;
|
|
8
4
|
|
|
9
5
|
function isHeaderLineTerminator(character: string): boolean {
|
|
10
6
|
return character === "\r" || character === "\u2028" || character === "\u2029";
|
|
@@ -15,10 +11,19 @@ function isWhitespace(character: string | undefined): boolean {
|
|
|
15
11
|
}
|
|
16
12
|
|
|
17
13
|
function parseHeader(header: string): Pick<SubagentNotifyDetails, "agent" | "status" | "taskInfo"> | undefined {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
14
|
+
let markerIndex = -1;
|
|
15
|
+
let status: SubagentNotifyDetails["status"] | undefined;
|
|
16
|
+
for (const candidateStatus of HEADER_STATUSES) {
|
|
17
|
+
const candidateMarker = ` ${candidateStatus}: **`;
|
|
18
|
+
const candidateIndex = header.indexOf(candidateMarker);
|
|
19
|
+
if (candidateIndex < 1 || (markerIndex >= 0 && candidateIndex >= markerIndex)) continue;
|
|
20
|
+
markerIndex = candidateIndex;
|
|
21
|
+
status = candidateStatus;
|
|
22
|
+
}
|
|
23
|
+
if (markerIndex < 1 || !status) return undefined;
|
|
24
|
+
const label = header.slice(0, markerIndex);
|
|
25
|
+
if (label !== label.trim() || [...label].some(isHeaderLineTerminator)) return undefined;
|
|
26
|
+
const suffix = header.slice(markerIndex + ` ${status}: **`.length);
|
|
22
27
|
|
|
23
28
|
if (suffix.endsWith("**")) {
|
|
24
29
|
const agent = suffix.slice(0, -2);
|
|
@@ -198,8 +198,8 @@ export default function registerSubagentNotify(pi: ExtensionAPI): () => void {
|
|
|
198
198
|
|
|
199
199
|
const taskInfo =
|
|
200
200
|
result.taskIndex !== undefined && result.totalTasks !== undefined
|
|
201
|
-
? `
|
|
202
|
-
:
|
|
201
|
+
? `(${result.taskIndex + 1}/${result.totalTasks})`
|
|
202
|
+
: undefined;
|
|
203
203
|
|
|
204
204
|
const sessionLine = result.shareUrl
|
|
205
205
|
? `Session: ${result.shareUrl}`
|
|
@@ -214,8 +214,23 @@ export default function registerSubagentNotify(pi: ExtensionAPI): () => void {
|
|
|
214
214
|
typeof result.noticeLabel === "string" && result.noticeLabel.trim()
|
|
215
215
|
? result.noticeLabel.trim()
|
|
216
216
|
: "Background task";
|
|
217
|
+
let sessionLabel: string | undefined;
|
|
218
|
+
let sessionValue: string | undefined;
|
|
219
|
+
if (sessionLine) {
|
|
220
|
+
const separator = sessionLine.indexOf(":");
|
|
221
|
+
sessionLabel = sessionLine.slice(0, separator).toLowerCase();
|
|
222
|
+
sessionValue = sessionLine.slice(separator + 1).trim();
|
|
223
|
+
}
|
|
224
|
+
const details: SubagentNotifyDetails = {
|
|
225
|
+
agent,
|
|
226
|
+
status,
|
|
227
|
+
...(taskInfo ? { taskInfo } : {}),
|
|
228
|
+
resultPreview: displaySummary,
|
|
229
|
+
...(result.durationMs !== undefined ? { durationMs: result.durationMs } : {}),
|
|
230
|
+
...(sessionLabel && sessionValue ? { sessionLabel, sessionValue } : {}),
|
|
231
|
+
};
|
|
217
232
|
const content = [
|
|
218
|
-
`${noticeLabel} ${status}: **${agent}**${taskInfo}`,
|
|
233
|
+
`${noticeLabel} ${status}: **${agent}**${taskInfo ? ` ${taskInfo}` : ""}`,
|
|
219
234
|
"",
|
|
220
235
|
displaySummary,
|
|
221
236
|
sessionLine ? "" : undefined,
|
|
@@ -224,10 +239,11 @@ export default function registerSubagentNotify(pi: ExtensionAPI): () => void {
|
|
|
224
239
|
.filter((line) => line !== undefined)
|
|
225
240
|
.join("\n");
|
|
226
241
|
|
|
227
|
-
const terminalMessage = {
|
|
242
|
+
const terminalMessage: TerminalPreludeMessage = {
|
|
228
243
|
customType: "subagent-notify",
|
|
229
244
|
content,
|
|
230
245
|
display: true,
|
|
246
|
+
details,
|
|
231
247
|
};
|
|
232
248
|
const deliveryOptions = { triggerTurn: true, stageAdmissionKey: `subagent:${key}` } as const;
|
|
233
249
|
const succeed = (): void => {
|
|
@@ -4,6 +4,26 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.9.11] - 2026-08-03
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Fixed PDF extraction dropping text and streaming `TypeError: Math.sumPrecise is not a function` on Node runtimes without `Math.sumPrecise`. `unpdf` is now exact-pinned to `1.7.0` — the newest release that still ships the guarded fallback — instead of floating to 1.8.0, and that upgrade also adds `cMapUrl` CJK font support, releases document proxies and canvas resources, and preserves line breaks in `extractText` ([#2141](https://github.com/bastani-inc/atomic/issues/2141)).
|
|
12
|
+
- Fixed retained GitHub README truncations by copying bounded text into flat strings before storing long-lived results ([#2151](https://github.com/bastani-inc/atomic/issues/2151)).
|
|
13
|
+
|
|
14
|
+
## [0.9.11-alpha.12] - 2026-08-03
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Fixed PDF extraction dropping text and streaming `TypeError: Math.sumPrecise is not a function` warnings on Node runtimes that do not implement `Math.sumPrecise`. The `unpdf` dependency was declared as the floating range `^1.6.2`, which resolves to 1.8.0 in a published or global install; that release's bundled PDF.js v6.1 dropped the guarded fallback and calls the builtin unconditionally, so extraction threw per glyph, emitted font-substitution warnings, and silently returned fewer text items. On the reported 17-page arXiv PDF this cost 69 text items and 221 characters. `unpdf` is now exact-pinned to `1.7.0`, the newest release that still ships the fallback, so no install can float to 1.8.0 ([#2141](https://github.com/bastani-inc/atomic/issues/2141)).
|
|
19
|
+
- Upgraded the pinned `unpdf` from 1.6.2 to 1.7.0, which adds `cMapUrl` CJK font support under Node, destroys internally created document proxies and canvas resources, and preserves line breaks in `extractText` with `mergePages`.
|
|
20
|
+
|
|
21
|
+
## [0.9.11-alpha.11] - 2026-08-03
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- Fixed retained GitHub README truncations by copying bounded text into flat strings before storing long-lived results ([#2151](https://github.com/bastani-inc/atomic/issues/2151)).
|
|
26
|
+
|
|
7
27
|
## [0.9.11-alpha.1] - 2026-07-20
|
|
8
28
|
|
|
9
29
|
### Changed
|
|
@@ -44,6 +44,7 @@ export function registerContentTools(pi: ExtensionAPI, deps: RegisterContentTool
|
|
|
44
44
|
|
|
45
45
|
renderCall(args, theme) {
|
|
46
46
|
const { query } = args as { query?: string };
|
|
47
|
+
// This status-line preview is built and dropped within the same turn, so a bare slice is sufficient.
|
|
47
48
|
const display = !query
|
|
48
49
|
? "(no query)"
|
|
49
50
|
: query.length > 70 ? query.slice(0, 67) + "..." : query;
|