@bastani/atomic 0.9.19-alpha.8 → 0.9.19
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 +105 -0
- package/dist/builtin/intercom/CHANGELOG.md +38 -0
- package/dist/builtin/intercom/README.md +7 -7
- package/dist/builtin/intercom/broker/client.ts +4 -0
- package/dist/builtin/intercom/broker/send-handler.ts +18 -1
- package/dist/builtin/intercom/index.bundle.mjs +20 -17
- package/dist/builtin/intercom/package.json +1 -1
- package/dist/builtin/intercom/skills/intercom/SKILL.md +3 -3
- package/dist/builtin/intercom/types.ts +1 -1
- package/dist/builtin/mcp/CHANGELOG.md +8 -0
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +30 -0
- package/dist/builtin/subagents/package.json +1 -1
- package/dist/builtin/web-access/CHANGELOG.md +20 -0
- package/dist/builtin/web-access/index.bundle.mjs +19 -17
- package/dist/builtin/web-access/package.json +1 -1
- package/dist/builtin/workflows/CHANGELOG.md +66 -0
- package/dist/builtin/workflows/package.json +1 -1
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +324 -40
- package/dist/builtin/workflows/src/index.js +97 -18
- package/dist/core/extensions/api-types.d.ts +2 -0
- package/dist/core/extensions/api-types.d.ts.map +1 -1
- package/dist/core/extensions/api-types.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader-api.d.ts.map +1 -1
- package/dist/core/extensions/loader-api.js.map +1 -1
- package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-host-modules.js +3 -1
- package/dist/core/extensions/loader-host-modules.js.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/loader-virtual-modules.js +2 -0
- package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
- package/dist/core/extensions/reactive-widget.d.ts +6 -0
- package/dist/core/extensions/reactive-widget.d.ts.map +1 -1
- package/dist/core/extensions/reactive-widget.js +7 -1
- package/dist/core/extensions/reactive-widget.js.map +1 -1
- package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
- package/dist/core/extensions/runner-shortcuts.js +32 -3
- package/dist/core/extensions/runner-shortcuts.js.map +1 -1
- package/dist/core/extensions/runtime-types.d.ts +4 -0
- package/dist/core/extensions/runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/runtime-types.js.map +1 -1
- package/dist/core/extensions/ui-types.d.ts +20 -0
- package/dist/core/extensions/ui-types.d.ts.map +1 -1
- package/dist/core/extensions/ui-types.js.map +1 -1
- package/dist/core/keybinding-identity.d.ts +4 -0
- package/dist/core/keybinding-identity.d.ts.map +1 -0
- package/dist/core/keybinding-identity.js +10 -0
- package/dist/core/keybinding-identity.js.map +1 -0
- package/dist/core/keybindings.d.ts +10 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +7 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/index-extensions.d.ts +1 -1
- package/dist/index-extensions.d.ts.map +1 -1
- package/dist/index-extensions.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/scroll-widget.d.ts +23 -0
- package/dist/modes/interactive/components/scroll-widget.d.ts.map +1 -0
- package/dist/modes/interactive/components/scroll-widget.js +61 -0
- package/dist/modes/interactive/components/scroll-widget.js.map +1 -0
- package/dist/modes/interactive/interactive-extension-runtime.js +10 -3
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +3 -2
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts +4 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +15 -7
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/engine-dialog-host.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-dialog-host.js +4 -1
- package/dist/modes/interactive-engine/engine-dialog-host.js.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.js +1 -1
- package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts +12 -1
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
- package/dist/modes/interactive-engine/protocol.js +45 -2
- package/dist/modes/interactive-engine/protocol.js.map +1 -1
- package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-component.js +18 -8
- package/dist/modes/interactive-engine/remote-component.js.map +1 -1
- package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-extension-ui.js +2 -1
- package/dist/modes/rpc/rpc-extension-ui.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +1 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +4 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/extensions/api-reference.md +2 -0
- package/docs/extensions/authoring.md +2 -0
- package/docs/intercom/reference.md +4 -0
- package/docs/intercom.md +4 -4
- package/docs/keybindings.md +17 -0
- package/docs/tui.md +34 -0
- package/docs/web-access.md +10 -0
- package/docs/workflows/api-reference.md +2 -0
- package/docs/workflows/operations.md +8 -0
- package/npm-shrinkwrap.json +32 -32
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,111 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.19] - 2026-09-13
|
|
6
|
+
|
|
7
|
+
Cumulative release of the `0.9.19-alpha.1` through `0.9.19-alpha.12` prereleases. Per-change details remain in the unchanged prerelease sections below.
|
|
8
|
+
|
|
9
|
+
### Breaking Changes
|
|
10
|
+
|
|
11
|
+
- Overwriting an existing file with `write` requires this session to have observed the exact content being replaced. Missing or stale observations return typed `FILE_MUTATION_CONFLICT` errors with requester identity and recovery guidance. Creating files and overwriting files the session has read, written or edited remain supported ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
|
|
12
|
+
- `WriteOperations` requires `readFile`, returning `undefined` only for absence, and `writeFile` accepts optional `WriteFileOptions`. Custom/remote implementations supply reads for generated-file and observation checks; existing writers may ignore the options but lose exclusive-create semantics ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
|
|
13
|
+
- Workflow controls use `/workflow pause`, `/workflow quit` and `/workflow resume`; lifecycle pause events use `action: "pause"`. The workflow tool supports run, stage and durable-tool pause targets.
|
|
14
|
+
- Bundled subagent terminal control is now `kill`, not `interrupt`, including calls using `runId`. Killed children cannot resume; launch a fresh child for follow-up work.
|
|
15
|
+
- Bundled `code_search` requires `repoName` in `owner/repo` format and uses DeepWiki MCP without an Exa fallback. `fetch_content` requires a nonempty `urls` array instead of singular `url`; update existing calls. `web_search` is unchanged.
|
|
16
|
+
- Intercom removed model-facing `retryToken` fields and owns bounded reconnect retries. Explicit `replyTo` selectors reject invalid or stale threads rather than falling back; use `action: "pending"` to select an unresolved question.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Added owner-bound background shell and agent tasks with one execution per admitted attempt, observation-only yielding, retained output/transcripts, owner-scoped cancellation and independent cleanup. SDK contexts expose trusted task adapters, snapshot subscriptions and replay-safe completion delivery ([#2884](https://github.com/bastani-inc/atomic/pull/2884)).
|
|
21
|
+
- Added per-call Bash/PowerShell foreground-first or background observation, `{ action: "wait", id, budgetMs }` for existing tasks, and `kill({ id })` for owned background shell tasks. Observation does not extend execution timeout or owner lifetime; unsupported background requests fail before execution.
|
|
22
|
+
- Added shared `/tasks` inspection with a compact inline picker, fullscreen detail/transcript/input pages, paging, confirmed cancellation and stable selection. Main and attached stage chats show background counts below the composer and readable completion notifications.
|
|
23
|
+
- Added a searchable `/agents` catalog with source grouping and configuration details.
|
|
24
|
+
- Added supervised Windows ConPTY execution with Job Object containment before resume and confirmed cleanup, without an unsupervised fallback. The command SDK accepts direct-executable `shell: { program, args }` and `inheritEnv` controls.
|
|
25
|
+
- Added workflow activity observers and typed lifecycle, activity, stage-completion and heartbeat hooks with ordered snapshots, bounded queues and reload-safe leases. The built-in Herdr reporter combines agent/task activity, workflow execution and approval waits, supports `herdr.enabled` opt-out, and reports parent session identity ([#2891](https://github.com/bastani-inc/atomic/issues/2891)).
|
|
26
|
+
- Added `reason: "project_trust"` to UI prompt lifecycle events, including paired isolated-engine notifications, so integrations can observe trust decisions ([#2873](https://github.com/bastani-inc/atomic/issues/2873)).
|
|
27
|
+
- Editable workflow-stage chats discover source-qualified skills and expand submissions once through stage admission. Graph cards show effective model/thinking identity, including fast suffixes and live fallbacks ([#1859](https://github.com/bastani-inc/atomic/pull/1859) by [@sina85](https://github.com/sina85)).
|
|
28
|
+
- Added per-model compaction overrides for `reserveTokens` and `preserve_recent`, with non-negative safe-integer validation and fallback to ordinary settings/defaults across manual, automatic and post-tool compaction.
|
|
29
|
+
- Extension widgets can opt into height-capped fullscreen viewports with local wheel scrolling, overflow-only scrollbars and scroll-position feedback. The workflow list uses local scrolling with configurable Alt+K/J shortcuts, labeled Option on macOS, while retaining Alt+PageUp/PageDown aliases and editor-binding precedence.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- Built-in read, edit, write and shell tools prefer strict JSON-schema sampling where supported; other experimental hints remain opt-in.
|
|
34
|
+
- Task receipts and details display resolved model/reasoning, grouped counts, themed status, recent activity, bounded previews and narrow-terminal layouts. Only active background work contributes to the footer; retained results remain in `/tasks`.
|
|
35
|
+
- Native Windows owner-bound shell calls automatically yield after the owner's observation budget, normally ten seconds. PowerShell uses encoded transport; execution timeouts remain separate, and unsupported owned WSL bash stdin transport remains refused. Suspend opens a PowerShell subshell without freezing background tasks.
|
|
36
|
+
- Guidance routes user questions through structured question tools when available, favors normal shell observation budgets over repeated short polls, and keeps blocking work local while overlapping independent delegation. Requests to work "quickly" select inline execution without hidden workflows or skipped validation.
|
|
37
|
+
- Model-choice guidance consults eval documentation and Artificial Analysis; automation guidance uses PyAutoGUI for desktop, playwright-cli for browsers, and Herdr with supported fallbacks for terminals.
|
|
38
|
+
- Open Claude Design starts with Fable 5.1 at medium, followed by Copilot Fable 5.1 and Astra at medium, with Fable-first OpenRouter fallbacks. Debugger uses Astra/Fable at medium and Sol at high; Goal/Ralph reviewers use Astra/Sol at high, and orchestration/research/design fallbacks use Fable at medium and Sol at high.
|
|
39
|
+
- Intercom lists lead with exact session IDs and workflow paths. Sends and asks interrupt working recipients within the same task/generation, retaining ordered messages and completed side effects rather than restarting work.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- Restored offline embedded PostgreSQL discovery in compiled archives and all eight target-selected archive/npm runtimes, retaining scriptless installs and existing v18 clusters. Windows ARM64 still requires Windows 11 x64 emulation.
|
|
44
|
+
- Embedded Postgres starts on Windows administrative accounts using restricted tokens while retaining exact-process shutdown. Early startup exit reports actual logs; Unicode environments, executable lookup, batch/explicit-command launchers and safe verbatim paths work without handle leaks or cross-process stream inheritance.
|
|
45
|
+
- Rejected edits no longer authorize themselves on retry by recording a new snapshot tag. Drift, deletion, unreadable targets and permission changes return typed conflicts with exact requester identity and recovery guidance. Writes exclusively claim new paths, preserve observations after cancellation that follows a completed write, and retain standalone `local://` observations ([#2329](https://github.com/bastani-inc/atomic/issues/2329)).
|
|
46
|
+
- Bounded noisy engine diagnostic history and routed stderr/MuPDF diagnostics through deferred, terminal-safe status output, preserving split Unicode and failure details without corrupting fullscreen or RPC JSON output ([#2964](https://github.com/bastani-inc/atomic/issues/2964)).
|
|
47
|
+
- Fixed npm-installed task supervisor class initialization and missing upstream AI imports. First-load and Windows-reloaded TypeScript extensions share live host classes/singletons, including the upstream-compatible import, without losing dependency edits.
|
|
48
|
+
- Workflow fallback releases failed-attempt Intercom ownership before replacement. Repeated nested workflow calls no longer collide during fallback ([#3020](https://github.com/bastani-inc/atomic/issues/3020)).
|
|
49
|
+
- Foreground subagent waits yield to parent steering and Intercom messages without cancelling children. Parallel coordination preserves active/queued siblings, same-child messages precede completion, and queued-child cancellation cleans up unused worktrees and branches.
|
|
50
|
+
- Task completion retries retain delivery identity without relaunching work, including restored outboxes, native shell settlement and `/tasks` cancellations. Foreground-only shells do not create duplicate background notifications or model turns.
|
|
51
|
+
- Fixed yielded shell waits replaying the first output page, honored owner wait policies, disclosed retained output gaps, and bounded output pages to 1 MiB under a shared disk cap ([#2972](https://github.com/bastani-inc/atomic/pull/2972), [#2905](https://github.com/bastani-inc/atomic/pull/2905)).
|
|
52
|
+
- Live transcripts stream updates without reopening, preserve historical paging and configured shortcuts, and reject stale task-detail results after selection changes. Long Windows transcripts reuse unchanged rendering to reduce CPU without dropping history.
|
|
53
|
+
- Isolated sessions use the engine's task owner and inspector, with `/tasks` autocomplete and live metrics. Task rows reattach after transcript replacement, old owners clear on session switches, and inspection failures remain retryable instead of rejecting unhandled.
|
|
54
|
+
- Stage pause cancels owned admitted/active tasks and waits for cleanup while preserving messages and sibling work; ordinary chat interruption leaves background tasks running. Explicit subagent kill and grouped cancellation outcomes remain consistent through parent-cancellation races.
|
|
55
|
+
- Corrected SDK task Results, cursors, opaque leases, wait policies and cleanup races. Subscription disposal/overflow and throwing callbacks are contained; exact strings/numbers, bounded activity replay and protected settlement IDs survive native conversion, and NaN waits no longer panic ([#2884](https://github.com/bastani-inc/atomic/pull/2884)).
|
|
56
|
+
- Fixed macOS cleanup failing immediately on temporary unreaped process-group zombies while retaining bounded, confirmed cleanup.
|
|
57
|
+
- Herdr registration survives reload and session replacement without stale runners or child shutdown clearing parent ownership. Failed identity reports retry, background tasks prevent false idle, output-cap continuations remain working, and settled workflow failures retain attention without a false active wait.
|
|
58
|
+
- Navigation through `/tasks`, `/agents` and workflow graphs no longer creates false Herdr approval blocks. Answered prompts and acknowledged workflow blocks clear correctly even with slow observers; genuine pending approvals remain blocked.
|
|
59
|
+
- Concurrent inline approvals retain the surviving prompt and input focus. Task navigation does not cancel queued questionnaires, isolated cancellation removes loading placeholders, and background counts coexist with questions and MCP context on narrow terminals.
|
|
60
|
+
- Filled theme backgrounds survive nested resets and truncation, including completion cards. Workflow lists retain row caps and viewed-run anchors through clipping, live changes and resize.
|
|
61
|
+
- Resume trust is prepared before disposing the outgoing session and retained on failed preflight. Startup and isolated trust waits reach eligible lifecycle observers without loading untrusted extensions or replaying dialogs ([#2873](https://github.com/bastani-inc/atomic/issues/2873)).
|
|
62
|
+
- Internal-URL expansion rejects unsafe shell syntax while safely quoting bare resolved URLs; PowerShell apostrophes remain literal. Commands without resolved URLs are unchanged.
|
|
63
|
+
- Intercom excludes non-agent routing/prompt/tool connections without hiding busy agents or invalidating connected aliases. Roster updates synchronize with broker acceptance; targeted replies keep exact correlation, and delivery retries preserve FIFO order without duplicate cards ([#2895](https://github.com/bastani-inc/atomic/pull/2895)).
|
|
64
|
+
- Capped retry backoff with `retry.maxAgentDelayMs`, defaulting to 60 seconds, while preserving provider limits. Retry countdowns use Atomic's themed indicator ([#8826](https://github.com/earendil-works/pi/issues/8826)).
|
|
65
|
+
- Fixed Anthropic object-union schemas and Grok acceptance of the bundled bash command/wait schema while local validation still rejects mixed inputs. Extension registration rejects missing or nonobject schema containers ([#2190](https://github.com/bastani-inc/atomic/pull/2190) by [@elefthei](https://github.com/elefthei), [#3031](https://github.com/bastani-inc/atomic/issues/3031), [#9300](https://github.com/earendil-works/pi/issues/9300)).
|
|
66
|
+
- Updated patched Hono/js-yaml dependencies and provider SDKs; Google's consecutive tool-call limit returns an error. Extension model registries expose authenticated custom-provider streams, and Radius login chooses an available discovered model.
|
|
67
|
+
- Settings writes preserve inherited `.pi` provenance, concurrent primary edits and explicit Atomic overrides instead of copying inherited values into `.atomic` ([#2299](https://github.com/bastani-inc/atomic/issues/2299)).
|
|
68
|
+
- Direct steering/follow-up calls run extension input handlers before admission, preserving transformed text/images and RPC attribution. Tree navigation refuses active compaction/summarization without disturbing the current branch.
|
|
69
|
+
- Stage skill autocomplete reuses shared attachment without repeated checkpoints, ended recoverable blocks resume rather than return snapshot-only success, and cancelled stage-chat pause avoids unhandled rejection.
|
|
70
|
+
- Released unused alternate-folder Git watchers and timers without disturbing other chat footers ([#2926](https://github.com/bastani-inc/atomic/pull/2926)).
|
|
71
|
+
- Restored the Gondolin example after legacy grep API removal, keeping search on the host and guest-only searches in the routed shell ([#2482](https://github.com/bastani-inc/atomic/pull/2482)).
|
|
72
|
+
|
|
73
|
+
## [0.9.19-alpha.12] - 2026-09-13
|
|
74
|
+
|
|
75
|
+
### Fixed
|
|
76
|
+
|
|
77
|
+
- Grok accepts the bundled bash tool schema for command execution and task waits, while local validation still rejects mixed inputs ([#3031](https://github.com/bastani-inc/atomic/issues/3031)).
|
|
78
|
+
|
|
79
|
+
## [0.9.19-alpha.11] - 2026-09-13
|
|
80
|
+
|
|
81
|
+
### Fixed
|
|
82
|
+
|
|
83
|
+
- Repeated nested `ctx.workflow()` invocations no longer collide on Intercom route ownership during model fallback.
|
|
84
|
+
|
|
85
|
+
## [0.9.19-alpha.10] - 2026-09-13
|
|
86
|
+
|
|
87
|
+
### Added
|
|
88
|
+
|
|
89
|
+
- Extension widgets can opt into a height-capped fullscreen viewport with widget-local wheel scrolling, an overflow-only scrollbar, and scroll-position feedback in both in-process and isolated-engine sessions. Existing widgets retain their default behavior.
|
|
90
|
+
- The main-chat workflow list supports local wheel scrolling with an overflow-only slim scrollbar and configurable Alt+K/J shortcuts, labeled Option on macOS. Alt+PageUp/PageDown remain aliases, configured editor bindings take precedence, and the list keeps its row cap and run anchors through clipping and resize.
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- Workflow model fallback cleans up the failed attempt's Intercom ownership before registering its replacement, preventing duplicate live-stage ownership warnings without weakening route protections ([#3020](https://github.com/bastani-inc/atomic/issues/3020)).
|
|
95
|
+
|
|
96
|
+
## [0.9.19-alpha.9] - 2026-09-12
|
|
97
|
+
|
|
98
|
+
### Breaking Changes
|
|
99
|
+
|
|
100
|
+
- Explicit Intercom `action: "reply"` selectors reject stale, unknown, empty, or sender-mismatched threads instead of falling back. Use `action: "pending"` and `replyTo: "<pending-ask-id>"` for unresolved questions.
|
|
101
|
+
|
|
102
|
+
### Changed
|
|
103
|
+
|
|
104
|
+
- Intercom agent lists put exact copyable session IDs and workflow paths first, with useful metadata and meaningful names secondary rather than redundant generated aliases.
|
|
105
|
+
|
|
106
|
+
### Fixed
|
|
107
|
+
|
|
108
|
+
- Intercom targeted replies now complete the requested ask when an unrelated message is active, rather than delivering a response with the wrong thread ID or refusing it.
|
|
109
|
+
|
|
5
110
|
## [0.9.19-alpha.7] - 2026-09-12
|
|
6
111
|
|
|
7
112
|
### Fixed
|
|
@@ -4,6 +4,44 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.9.19] - 2026-09-13
|
|
8
|
+
|
|
9
|
+
Cumulative release of the `0.9.19-alpha.2` through `0.9.19-alpha.9` prereleases. Per-change details remain in the unchanged prerelease sections below.
|
|
10
|
+
|
|
11
|
+
### Breaking Changes
|
|
12
|
+
|
|
13
|
+
- Removed the model-facing `retryToken` parameter and result field. Intercom owns bounded reconnect retries; each new tool call remains a distinct operation, including identical messages.
|
|
14
|
+
- Explicit `replyTo` selectors reject stale, unknown, empty or sender-mismatched threads instead of falling back. Use `pending` to select the exact unresolved question.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- Agent lists lead with copyable full session IDs and canonical workflow paths, followed by meaningful names, status, working directory and future queued counts. Live/terminal reply capability is separate from idle activity; closed workflow generations report post-mortem-only or unavailable routing.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- `send` and `ask` interrupt a working subagent or live workflow stage's current model call or cancellable tool and process messages in the same execution. Arrival order, persistence retries, duplicate suppression and exact reply correlation survive cancellation without replaying completed side effects.
|
|
23
|
+
- Targeted replies complete the requested ask even when an unrelated message is active. Cancelled turns without a reply retain the pending ask's context.
|
|
24
|
+
- Recoverable disconnects retry up to three times within one invocation with the same delivery identity. Cancellation stops retries; unresolved outcomes warn against automatic resending, and client retry state is released on exit.
|
|
25
|
+
- Broker refusals reject outstanding registered-client requests with the actual reason instead of timing out or reporting a generic disconnect. Lazy initialization, relay and cleanup diagnostics use the owning interactive session's notifications rather than raw console output.
|
|
26
|
+
- Recipient discovery excludes workflow routing/control connections and model-less prompt/tool nodes. Malformed purposes are rejected, legacy omitted purposes remain supported, and roster updates wait for broker processing. Same-name non-agent nodes do not hide genuine duplicate agents or invalidate connected aliases ([#2895](https://github.com/bastani-inc/atomic/pull/2895)).
|
|
27
|
+
- Terminal noninteractive children reject asks promptly, including socket-write races. Retained connected workflow stages preserve reply correlation after leaving the active roster; closed stages without post-mortem routing return lifecycle guidance.
|
|
28
|
+
- Busy noninteractive refusals return correlated delivery errors without starting another parent turn. Owner-bound completion waits for same-child messages in order, retries failed delivery, and never repeats task execution.
|
|
29
|
+
- Parallel child-to-parent requests use correlated replies without ending siblings, preserving empty questions, omitted decision notes and ordered attachments. Sends and progress remain nonblocking; single-child claimed handoffs are unchanged.
|
|
30
|
+
|
|
31
|
+
## [0.9.19-alpha.9] - 2026-09-12
|
|
32
|
+
|
|
33
|
+
### Breaking Changes
|
|
34
|
+
|
|
35
|
+
- Explicit `reply` selectors now fail closed: stale, unknown, empty, or sender-mismatched `replyTo` values no longer fall back to another active or pending thread. Use `pending` to select the exact unresolved question.
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- Agent-visible Intercom lists lead with copyable full session IDs and canonical workflow paths, keeping status, working directory, meaningful names, and future queued counts without redundant generated aliases.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- Targeted replies select the requested sender's pending ask even when an unrelated message triggered the current turn, so a delivered reply no longer leaves that ask waiting on the wrong thread.
|
|
44
|
+
|
|
7
45
|
## [0.9.19-alpha.6] - 2026-09-11
|
|
8
46
|
|
|
9
47
|
### Fixed
|
|
@@ -57,7 +57,7 @@ A session becomes intercom-connected when all of these are true:
|
|
|
57
57
|
|
|
58
58
|
The session list, ALT+M picker, and group counts include connected agent sessions only. Internal workflow routing/control connections, model-less `ctx.ui` prompts, and `ctx.tool` nodes are hidden and cannot receive ordinary messages, even by a known ID or through a supervisor route. This includes run-level prompts and retained completed synthetic prompt stages. An agent executing a tool, including `tool:workflow`, or awaiting human input remains visible and messageable.
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
Unnamed sessions retain a runtime-only alias such as `subagent-chat-1a2b3c4d-1111-4222-8333-123456789abc` for name lookup. Agent lists omit this redundant alias and lead with the copyable full session ID. Meaningful names remain secondary metadata; resume titles are unchanged.
|
|
61
61
|
|
|
62
62
|
## Quick Start
|
|
63
63
|
|
|
@@ -76,10 +76,10 @@ The agent can list sessions and send messages using the `intercom` tool. Tool ca
|
|
|
76
76
|
```typescript
|
|
77
77
|
// List active sessions
|
|
78
78
|
intercom({ action: "list" })
|
|
79
|
-
// → **Current session
|
|
80
|
-
// →
|
|
81
|
-
// → **Other sessions:**
|
|
82
|
-
// →
|
|
79
|
+
// → **Current session** (groups: default):
|
|
80
|
+
// → - `20d43841-1111-4222-8333-123456789abc` [self, idle] ~/projects/api (claude-sonnet-4) name: executor
|
|
81
|
+
// → **Other visible sessions and workflow stages:**
|
|
82
|
+
// → - `6332faab-1111-4222-8333-123456789abc` [same cwd, thinking] ~/projects/api (claude-sonnet-4) name: research
|
|
83
83
|
|
|
84
84
|
// Add a named membership (it is created if no session is there yet)
|
|
85
85
|
intercom({ action: "join", group: "api-review" })
|
|
@@ -156,7 +156,7 @@ Verify they see each other from either session:
|
|
|
156
156
|
|
|
157
157
|
```typescript
|
|
158
158
|
intercom({ action: "list" })
|
|
159
|
-
// →
|
|
159
|
+
// → - `6332faab-1111-4222-8333-123456789abc` [same cwd, idle] ~/projects/api (claude-sonnet-4) name: worker
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
### The Conversation
|
|
@@ -383,7 +383,7 @@ When multiple live agent stages share a name, `ask` refuses the ambiguous target
|
|
|
383
383
|
|
|
384
384
|
**`ask`** — Sends a message and waits for a live recipient to reply (10-minute timeout). Invocation control supports a live ask into an owned isolated subgroup, and the exact broker-recorded reply resolves the waiting tool call at the asker without opening reverse or lateral group access. Ask to an uninitialized stage remains refused with `pending_stage_ask_unsupported`; use queued `send` instead, because holding a reply waiter until a stage eventually starts would be unbounded. A recipient disconnect after live delivery fails only that peer's exact wait promptly; the timeout remains the backstop while the recipient stays connected. Up to `maxPendingAsks` blocking asks (default: 6) may run concurrently, including same-target and mixed-target fan-out. Replies resolve by exact sender and message ID, so out-of-order replies cannot cross-settle another call. When capacity is full, new asks receive a structured refusal.
|
|
385
385
|
|
|
386
|
-
**`reply`**
|
|
386
|
+
**`reply`** without selectors replies to the current intercom-triggered message, or otherwise the single unresolved inbound ask. Explicit `to` selects a pending ask from that exact name/full session ID, even during another sender's turn. If that sender has multiple asks, use `pending` and pass the exact message ID as `replyTo`. Explicit `replyTo` selects only that pending ask or the exact active ordinary message; stale, unknown, or empty IDs fail instead of falling back. When both selectors are supplied, the sender must match the selected thread. A successful reply keeps that sender/thread pair across internal retries.
|
|
387
387
|
|
|
388
388
|
**`pending`** — Lists unresolved inbound asks with sender, message ID, elapsed time, and a short preview. Useful when replying after the original triggered turn.
|
|
389
389
|
|
|
@@ -38,6 +38,8 @@ export interface SendOptions {
|
|
|
38
38
|
logicalTarget?: string;
|
|
39
39
|
/** Public reply must use the broker's exact pending reverse question route. */
|
|
40
40
|
requirePendingReply?: true;
|
|
41
|
+
/** An explicit reply selector must resolve to this frozen recipient, never a namesake. */
|
|
42
|
+
expectedRecipientId?: string;
|
|
41
43
|
/** Broker-authorized identity for a canonical-path ask, delivered before its recipient can reply. */
|
|
42
44
|
onReplyTarget?: (sessionId: string) => void;
|
|
43
45
|
}
|
|
@@ -1004,6 +1006,7 @@ export class IntercomClient extends EventEmitter {
|
|
|
1004
1006
|
transportTarget: to,
|
|
1005
1007
|
logicalSignature: buildSendSignature(options.logicalTarget ?? to, options),
|
|
1006
1008
|
requirePendingReply: options.requirePendingReply ?? false,
|
|
1009
|
+
...(options.expectedRecipientId === undefined ? {} : { expectedRecipientId: options.expectedRecipientId }),
|
|
1007
1010
|
});
|
|
1008
1011
|
acquired = this.pendingSends.acquire(messageId, pendingSignature, 10000);
|
|
1009
1012
|
} catch (error) {
|
|
@@ -1028,6 +1031,7 @@ export class IntercomClient extends EventEmitter {
|
|
|
1028
1031
|
to,
|
|
1029
1032
|
...(options.logicalTarget === undefined ? {} : { logicalTarget: options.logicalTarget }),
|
|
1030
1033
|
...(options.requirePendingReply === undefined ? {} : { requirePendingReply: options.requirePendingReply }),
|
|
1034
|
+
...(options.expectedRecipientId === undefined ? {} : { expectedRecipientId: options.expectedRecipientId }),
|
|
1031
1035
|
...(options.onReplyTarget === undefined ? {} : { resolveReplyTarget: true as const }),
|
|
1032
1036
|
message,
|
|
1033
1037
|
attemptId: acquired.attempt.attemptId,
|
|
@@ -143,6 +143,12 @@ export function handleBrokerSend(
|
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
const requirePendingReply = clientMessage.requirePendingReply === true;
|
|
146
|
+
const hasExpectedRecipientId = Object.prototype.hasOwnProperty.call(clientMessage, "expectedRecipientId");
|
|
147
|
+
if (hasExpectedRecipientId && (typeof clientMessage.expectedRecipientId !== "string" || !clientMessage.expectedRecipientId.trim())) {
|
|
148
|
+
write(socket, { type: "delivery_failed", messageId, attemptId, reason: "Invalid expectedRecipientId format" });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const expectedRecipientId = hasExpectedRecipientId ? clientMessage.expectedRecipientId as string : undefined;
|
|
146
152
|
if (Object.prototype.hasOwnProperty.call(clientMessage, "channel")) {
|
|
147
153
|
write(socket, { type: "delivery_failed", messageId: message.id, attemptId, reason: "Invalid channel" });
|
|
148
154
|
return;
|
|
@@ -152,6 +158,10 @@ export function handleBrokerSend(
|
|
|
152
158
|
write(socket, { type: "delivery_failed", messageId, attemptId, reason: "Invalid requirePendingReply message" });
|
|
153
159
|
return;
|
|
154
160
|
}
|
|
161
|
+
if (expectedRecipientId !== undefined && (supervisorSend || message.replyTo === undefined || message.expectsReply === true)) {
|
|
162
|
+
write(socket, { type: "delivery_failed", messageId, attemptId, reason: "Invalid expectedRecipientId message" });
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
155
165
|
|
|
156
166
|
|
|
157
167
|
const fromSession = currentId ? sessions.get(currentId) : undefined;
|
|
@@ -161,7 +171,8 @@ export function handleBrokerSend(
|
|
|
161
171
|
}
|
|
162
172
|
const senderIdentity = fromSession.registrationReturnAddress ?? fromSession.info.id;
|
|
163
173
|
const logicalTarget = typeof clientMessage.logicalTarget === "string" ? clientMessage.logicalTarget : clientMessage.to;
|
|
164
|
-
const
|
|
174
|
+
const messageSignature = buildMessageSendSignature(logicalTarget, message, senderIdentity);
|
|
175
|
+
const baseSignature = expectedRecipientId === undefined ? messageSignature : JSON.stringify({ expectedRecipientId, messageSignature });
|
|
165
176
|
const signature = requirePendingReply
|
|
166
177
|
? JSON.stringify({
|
|
167
178
|
requirePendingReply: true,
|
|
@@ -221,6 +232,12 @@ export function handleBrokerSend(
|
|
|
221
232
|
const resolution = exactIdTarget
|
|
222
233
|
? ({ kind: "resolved", session: exactIdTarget.info } as const)
|
|
223
234
|
: resolveSessionTarget(candidates, trimmedTo);
|
|
235
|
+
if (expectedRecipientId !== undefined && (resolution.kind !== "resolved" || resolution.session.id !== expectedRecipientId)) {
|
|
236
|
+
write(socket, { type: "delivery_failed", messageId, attemptId,
|
|
237
|
+
reason: resolution.kind === "resolved" ? "Reply target does not match the expected recipient" : sessionTargetFailureReason(clientMessage.to, resolution),
|
|
238
|
+
});
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
224
241
|
if (resolution.kind === "resolved") {
|
|
225
242
|
const target = sessions.get(resolution.session.id);
|
|
226
243
|
if (!target) {
|
|
@@ -1247,7 +1247,8 @@ var init_client = __esm(() => {
|
|
|
1247
1247
|
const pendingSignature = JSON.stringify({
|
|
1248
1248
|
transportTarget: to,
|
|
1249
1249
|
logicalSignature: buildSendSignature(options.logicalTarget ?? to, options),
|
|
1250
|
-
requirePendingReply: options.requirePendingReply ?? false
|
|
1250
|
+
requirePendingReply: options.requirePendingReply ?? false,
|
|
1251
|
+
...options.expectedRecipientId === undefined ? {} : { expectedRecipientId: options.expectedRecipientId }
|
|
1251
1252
|
});
|
|
1252
1253
|
acquired = this.pendingSends.acquire(messageId, pendingSignature, 1e4);
|
|
1253
1254
|
} catch (error) {
|
|
@@ -1273,6 +1274,7 @@ var init_client = __esm(() => {
|
|
|
1273
1274
|
to,
|
|
1274
1275
|
...options.logicalTarget === undefined ? {} : { logicalTarget: options.logicalTarget },
|
|
1275
1276
|
...options.requirePendingReply === undefined ? {} : { requirePendingReply: options.requirePendingReply },
|
|
1277
|
+
...options.expectedRecipientId === undefined ? {} : { expectedRecipientId: options.expectedRecipientId },
|
|
1276
1278
|
...options.onReplyTarget === undefined ? {} : { resolveReplyTarget: true },
|
|
1277
1279
|
message,
|
|
1278
1280
|
attemptId: acquired.attempt.attemptId,
|
|
@@ -2008,22 +2010,22 @@ class ReplyTracker {
|
|
|
2008
2010
|
}
|
|
2009
2011
|
resolveReplyTarget(options, now = Date.now()) {
|
|
2010
2012
|
this.pruneExpired(now);
|
|
2011
|
-
if (options.replyTo) {
|
|
2012
|
-
const exact = this.pendingAsks.get(options.replyTo);
|
|
2013
|
-
if (exact)
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
return exact;
|
|
2013
|
+
if (options.replyTo !== undefined) {
|
|
2014
|
+
const exact = this.pendingAsks.get(options.replyTo) ?? (this.currentTurnContext?.message.id === options.replyTo && !this.currentTurnContext.message.expectsReply ? this.currentTurnContext : undefined);
|
|
2015
|
+
if (!exact)
|
|
2016
|
+
throw new Error(`No reply context for "${options.replyTo}"`);
|
|
2017
|
+
if (options.to !== undefined) {
|
|
2018
|
+
const resolution = resolveSessionTarget([exact.from], options.to);
|
|
2019
|
+
if (resolution.kind !== "resolved")
|
|
2020
|
+
throw new Error(`Reply context "${options.replyTo}" is not from "${options.to}"`);
|
|
2020
2021
|
}
|
|
2022
|
+
return exact;
|
|
2021
2023
|
}
|
|
2022
|
-
if (this.currentTurnContext) {
|
|
2024
|
+
if (options.to === undefined && this.currentTurnContext) {
|
|
2023
2025
|
return this.currentTurnContext;
|
|
2024
2026
|
}
|
|
2025
2027
|
const pending = Array.from(this.pendingAsks.values());
|
|
2026
|
-
if (options.to) {
|
|
2028
|
+
if (options.to !== undefined) {
|
|
2027
2029
|
const senders = [...new Map(pending.map((context) => [context.from.id, context.from])).values()];
|
|
2028
2030
|
const resolution = resolveSessionTarget(senders, options.to);
|
|
2029
2031
|
if (resolution.kind !== "resolved") {
|
|
@@ -2446,13 +2448,13 @@ function formatSessionLabel(session, duplicates) {
|
|
|
2446
2448
|
return duplicates.has(session.name.toLowerCase()) ? `${session.name} (${session.id})` : session.name;
|
|
2447
2449
|
}
|
|
2448
2450
|
function formatSessionListRow(session, currentCwd, isSelf) {
|
|
2449
|
-
const name = session.name
|
|
2451
|
+
const name = session.name && session.name !== session.id && session.name !== resolveIntercomPresenceName(undefined, session.id) ? ` name: ${session.name}` : "";
|
|
2450
2452
|
const normalizedGroup = normalizeGroup(session.group);
|
|
2451
2453
|
const groupTag = normalizedGroup !== DEFAULT_GROUP ? `group: ${normalizedGroup}` : undefined;
|
|
2452
2454
|
const capabilityTag = session.replyCapability === undefined ? undefined : `replyCapability: ${session.replyCapability}`;
|
|
2453
2455
|
const tags = [isSelf ? "self" : session.cwd === currentCwd ? "same cwd" : undefined, session.status, capabilityTag, groupTag].filter((tag) => Boolean(tag));
|
|
2454
2456
|
const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
|
|
2455
|
-
return
|
|
2457
|
+
return `- \`${session.id}\`${suffix} ${session.cwd} (${session.model})${name}`;
|
|
2456
2458
|
}
|
|
2457
2459
|
function previewText(value, maxLength = 72) {
|
|
2458
2460
|
if (typeof value !== "string") {
|
|
@@ -3192,10 +3194,10 @@ async function resolveReplySender(client, logicalTarget, sendTarget) {
|
|
|
3192
3194
|
return { kind: "unresolved" };
|
|
3193
3195
|
}
|
|
3194
3196
|
function formatWorkflowStageRow(stage) {
|
|
3195
|
-
return `-
|
|
3197
|
+
return `- \`${stage.target}\` [${stage.lifecycle.toUpperCase()}] workflow stage: ${stage.stageName}${stage.sessionId === undefined ? "" : ` session: \`${stage.sessionId}\``}`;
|
|
3196
3198
|
}
|
|
3197
3199
|
function formatWorkflowFutureStageRow(stage) {
|
|
3198
|
-
return `-
|
|
3200
|
+
return `- \`${stage.target}\` [future] ${stage.queuedCount} queued message${stage.queuedCount === 1 ? "" : "s"}`;
|
|
3199
3201
|
}
|
|
3200
3202
|
function registerIntercomTool(pi, deps) {
|
|
3201
3203
|
const retryIdentities = new RetryIdentityReservations({ maxEntries: deps.retryIdentityMaxEntries });
|
|
@@ -3949,12 +3951,13 @@ ${replyText}${replyAttachments}` }],
|
|
|
3949
3951
|
messageId: replyMessageId,
|
|
3950
3952
|
logicalTarget: replyLogicalTarget,
|
|
3951
3953
|
...route.expectsReply ? { requirePendingReply: true } : {},
|
|
3954
|
+
...to === undefined && replyTo === undefined ? {} : { expectedRecipientId: route.senderId },
|
|
3952
3955
|
text: message,
|
|
3953
3956
|
attachments,
|
|
3954
3957
|
replyTo: route.messageId
|
|
3955
3958
|
});
|
|
3956
3959
|
let result = await sendReply(replySendTo);
|
|
3957
|
-
if (to === undefined && result.delivered === false && result.reasonCode === "session_not_found" && route.senderName !== undefined) {
|
|
3960
|
+
if (to === undefined && replyTo === undefined && result.delivered === false && result.reasonCode === "session_not_found" && route.senderName !== undefined) {
|
|
3958
3961
|
result = await sendReply(route.senderName);
|
|
3959
3962
|
}
|
|
3960
3963
|
if (result.queued === true) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/intercom",
|
|
3
|
-
"version": "0.9.19
|
|
3
|
+
"version": "0.9.19",
|
|
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": [
|
|
@@ -67,11 +67,11 @@ intercom({
|
|
|
67
67
|
|
|
68
68
|
### Pattern 2: Quick Status Check
|
|
69
69
|
|
|
70
|
-
Before sending, verify who's connected.
|
|
70
|
+
Before sending, verify who's connected. Each list row leads with a copyable full session ID or canonical workflow path. Names are secondary; redundant generated aliases are omitted from the list but remain valid targets.
|
|
71
71
|
|
|
72
72
|
```typescript
|
|
73
73
|
intercom({ action: "list" })
|
|
74
|
-
// →
|
|
74
|
+
// → - `6332faab-1111-4222-8333-123456789abc` [idle] /workspace (model) name: planner
|
|
75
75
|
intercom({ action: "ask", to: "6332faab-1111-4222-8333-123456789abc", message: "Which option should I use?" })
|
|
76
76
|
```
|
|
77
77
|
|
|
@@ -128,7 +128,7 @@ intercom({ action: "pending" })
|
|
|
128
128
|
intercom({ action: "reply", to: "planner", message: "Use exponential backoff starting at 100ms." })
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
`
|
|
131
|
+
Explicit `to` selects that sender's pending ask even if another message triggered the current turn. Use `pending` and an exact `replyTo` when the sender has several asks. Stale, unknown, empty, or sender-mismatched explicit selectors fail without replying to another thread. Omit both selectors only when you intend to reply to the active message, or otherwise the single pending ask.
|
|
132
132
|
|
|
133
133
|
### Pattern 4: Broadcast to Multiple Workers
|
|
134
134
|
|
|
@@ -124,7 +124,7 @@ export type ClientMessage =
|
|
|
124
124
|
| { type: "join_group"; requestId: string; group: string }
|
|
125
125
|
| { type: "leave_group"; requestId: string; group?: string }
|
|
126
126
|
| { type: "authorize_supervisor"; requestId: string; childName: string; capability?: string }
|
|
127
|
-
| { type: "send" | "supervisor_send"; to: string; logicalTarget?: string; requirePendingReply?: true; resolveReplyTarget?: true; message: Message; attemptId?: string }
|
|
127
|
+
| { type: "send" | "supervisor_send"; to: string; logicalTarget?: string; requirePendingReply?: true; expectedRecipientId?: string; resolveReplyTarget?: true; message: Message; attemptId?: string }
|
|
128
128
|
| {
|
|
129
129
|
type: "send_pending_stage_notification";
|
|
130
130
|
runId: string;
|
|
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.19] - 2026-09-13
|
|
11
|
+
|
|
12
|
+
Cumulative release of the `0.9.19-alpha.2` prerelease. Per-change details remain in the unchanged prerelease section below.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- MCP call headers identify the server before results arrive, including pending direct tools and gateway calls with explicit or unambiguous targets.
|
|
17
|
+
|
|
10
18
|
## [0.9.19-alpha.2] - 2026-09-08
|
|
11
19
|
|
|
12
20
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/mcp",
|
|
3
|
-
"version": "0.9.19
|
|
3
|
+
"version": "0.9.19",
|
|
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,36 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.19] - 2026-09-13
|
|
6
|
+
|
|
7
|
+
Cumulative release of the `0.9.19-alpha.2` through `0.9.19-alpha.6` prereleases. Per-change details remain in the unchanged prerelease sections below.
|
|
8
|
+
|
|
9
|
+
### Breaking Changes
|
|
10
|
+
|
|
11
|
+
- Renamed terminal control action `interrupt` to `kill`, including calls using `runId`. Replace `subagent({ action: "interrupt", id })` with `subagent({ action: "kill", id })`. The old action is rejected; killed children cannot resume and follow-up work requires a fresh launch.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Added a searchable `/agents` catalog grouped by source with model, tool, description and prompt details.
|
|
16
|
+
- Added the builtin Herdr skill from upstream v0.9.0 with managed-pane safety checks and CLI guidance.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Session-bound launches return owner-bound task observations immediately by default. Explicit foreground observation and `action: "wait"` observe the same execution; yielding does not cancel children or consume additional execution slots ([#2884](https://github.com/bastani-inc/atomic/pull/2884)).
|
|
21
|
+
- Reduced default top-level parallel concurrency from 4 to 3. Explicit overrides remain honored; the per-parent native turn cap remains 4.
|
|
22
|
+
- Launch receipts, compact themed status cards and task details show readable outcomes, activity, elapsed time, tool/token counts and resolved model/reasoning settings, retaining identity through fallback and completion. Live transcripts subscribe to session events.
|
|
23
|
+
- Locator and pattern-finding agents use GPT-5.6 Luna at xhigh with Grok fallbacks at medium. Other agents explicitly select xhigh for OpenRouter Grok fallbacks. Debugger uses Astra and Fable at medium and Sol at high, preserving its fallback order.
|
|
24
|
+
- Delegation guidance keeps immediately blocking work local unless specialist expertise, isolation or an explicit request warrants a child. Parents overlap independent work and wait on dependencies rather than poll. Requests to work "quickly" select inline execution without hidden workflows or skipped validation.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Intercom sends and asks interrupt working children and handle input in the same execution, including startup, preflight and settlement races, without relaunching or losing messages. Explicit abort and owner cancellation remain terminal.
|
|
29
|
+
- Parallel requests wait for correlated replies in the original requester without ending siblings or discarding queued work. Parent observation yielding does not change execution concurrency; exact group commits release foreground observations without replacing executions ([#2884](https://github.com/bastani-inc/atomic/pull/2884)).
|
|
30
|
+
- Published terminal state before child disposal so completed children reject asks they cannot answer. Bound transcripts retain exact Intercom targets, and same-child messages precede completion delivery.
|
|
31
|
+
- Fixed queued-child worktree and branch cleanup on cancellation or owner closure without removing live siblings' worktrees early.
|
|
32
|
+
- Preserved explicit kill during capacity waiting and parent-cancellation races, including grouped Intercom status. Status and kill accept returned owner-bound task IDs.
|
|
33
|
+
- Background cards display known model/reasoning settings at admission without guessing unresolved values. Browsing `/agents` is navigation and no longer reports a false approval or Herdr block.
|
|
34
|
+
|
|
5
35
|
## [0.9.19-alpha.6] - 2026-09-11
|
|
6
36
|
|
|
7
37
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bastani/subagents",
|
|
3
|
-
"version": "0.9.19
|
|
3
|
+
"version": "0.9.19",
|
|
4
4
|
"private": true,
|
|
5
5
|
"description": "Atomic extension for delegating tasks to subagents with parallel execution. Fork of: https://github.com/nicobailon/pi-subagents",
|
|
6
6
|
"contributors": [
|
|
@@ -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.19] - 2026-09-13
|
|
8
|
+
|
|
9
|
+
Cumulative release of the `0.9.19-alpha.6` through `0.9.19-alpha.9` prereleases. Per-change details remain in the unchanged prerelease sections below.
|
|
10
|
+
|
|
11
|
+
### Breaking Changes
|
|
12
|
+
|
|
13
|
+
- `fetch_content` requires a nonempty `urls` array of nonempty strings. Replace `{ url: "..." }` with `{ urls: ["..."] }`. Invalid shapes and unrecognized fields are rejected before fetching; `get_search_content` selectors are unchanged.
|
|
14
|
+
- `code_search` requires `repoName` in `owner/repo` format alongside `query` and uses DeepWiki MCP for public-repository questions instead of Exa. Update query-only calls to include the repository. No API key is required and there is no Exa fallback; `maxTokens` remains a best-effort output bound and `web_search` is unchanged.
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Failed `fetch_content` batches show each URL's error and recovery steps. Retained partial content is labeled incomplete rather than absent.
|
|
19
|
+
- Video frame options are ignored for non-video inputs, preventing video-only errors for webpages and mixed batches. Tool descriptions distinguish page fetching, video analysis and frame extraction.
|
|
20
|
+
|
|
21
|
+
## [0.9.19-alpha.9] - 2026-09-12
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- `fetch_content` ignores video frame options for non-video inputs, so webpages and mixed batches no longer fail with video-only errors. Tool and parameter descriptions now distinguish ordinary page fetching, video analysis, and frame extraction.
|
|
26
|
+
|
|
7
27
|
## [0.9.19-alpha.7] - 2026-09-12
|
|
8
28
|
|
|
9
29
|
### Fixed
|