@bastani/atomic 0.9.18-alpha.5 → 0.9.18-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -0
- package/README.md +3 -3
- package/dist/builtin/intercom/CHANGELOG.md +39 -0
- package/dist/builtin/intercom/README.md +22 -2
- package/dist/builtin/intercom/broker/broker.ts +676 -128
- package/dist/builtin/intercom/broker/client.ts +151 -35
- package/dist/builtin/intercom/broker/delivered-message-cache.ts +497 -37
- package/dist/builtin/intercom/broker/framing.ts +4 -2
- package/dist/builtin/intercom/broker/paths.ts +10 -0
- package/dist/builtin/intercom/broker/pending-send-registry.ts +1 -2
- package/dist/builtin/intercom/broker/send-handler.ts +311 -52
- package/dist/builtin/intercom/broker/send-signature.ts +4 -2
- package/dist/builtin/intercom/broker/socket-writes.ts +103 -0
- package/dist/builtin/intercom/broker/spawn.ts +9 -4
- package/dist/builtin/intercom/index.bundle.mjs +1410 -212
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/intercom/recoverable-disconnect.ts +52 -0
- package/dist/builtin/intercom/retry-policy.ts +8 -0
- package/dist/builtin/intercom/skills/intercom/SKILL.md +17 -9
- package/dist/builtin/intercom/types.ts +27 -8
- package/dist/builtin/intercom/workflow-stage-path-matching.ts +90 -0
- package/dist/builtin/intercom/workflow-stage-target.ts +57 -0
- package/dist/builtin/mcp/index.bundle.mjs +427 -126
- package/dist/builtin/mcp/package.json +2 -2
- package/dist/builtin/subagents/CHANGELOG.md +19 -0
- package/dist/builtin/subagents/README.md +3 -3
- 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 +11 -11
- 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/debugger.md +3 -3
- package/dist/builtin/subagents/agents/worker.md +2 -2
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/subagents/skills/qlty/SKILL.md +29 -101
- package/dist/builtin/subagents/skills/qlty/references/manual-configuration.md +52 -0
- package/dist/builtin/subagents/skills/subagent/SKILL.md +11 -11
- package/dist/builtin/subagents/src/extension/index.bundle.mjs +49 -132
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +46 -0
- package/dist/builtin/workflows/README.md +7 -7
- package/dist/builtin/workflows/builtin/adversarial-verification.js +2 -2
- package/dist/builtin/workflows/builtin/{chunk-szz1ajz9.js → chunk-42s7sw0b.js} +9 -2
- package/dist/builtin/workflows/builtin/{chunk-2dqb5s2q.js → chunk-79fjkcvh.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-n58a7v26.js → chunk-b0v2xab1.js} +181 -10
- package/dist/builtin/workflows/builtin/{chunk-fghhy2a5.js → chunk-ed4jfn5t.js} +23 -5
- package/dist/builtin/workflows/builtin/{chunk-h3r2vkzc.js → chunk-hqpe2cyx.js} +60 -21
- package/dist/builtin/workflows/builtin/{chunk-hzzn6adg.js → chunk-k3w87x8y.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-82ha8p41.js → chunk-n8h4yyew.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-qwzvgxnq.js → chunk-reqr3sr3.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-c53y8bdh.js → chunk-wgccch41.js} +1 -1
- package/dist/builtin/workflows/builtin/{chunk-0x6e303p.js → chunk-zbekjqew.js} +20 -7
- package/dist/builtin/workflows/builtin/{chunk-29wrp38a.js → chunk-ze5x3d1r.js} +1 -1
- package/dist/builtin/workflows/builtin/classify-and-act.js +2 -2
- package/dist/builtin/workflows/builtin/fan-out-and-synthesize.js +2 -2
- package/dist/builtin/workflows/builtin/generate-and-filter.js +2 -2
- package/dist/builtin/workflows/builtin/goal.js +3 -3
- package/dist/builtin/workflows/builtin/index.js +11 -11
- package/dist/builtin/workflows/builtin/loop-until-done.js +2 -2
- package/dist/builtin/workflows/builtin/open-claude-design.js +2 -2
- package/dist/builtin/workflows/builtin/ralph.js +3 -3
- package/dist/builtin/workflows/builtin/steering-context.js +1 -1
- package/dist/builtin/workflows/builtin/tournament.js +2 -2
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +39 -52
- package/dist/builtin/workflows/skills/prompt-engineer/references/advanced_patterns.md +9 -37
- package/dist/builtin/workflows/skills/prompt-engineer/references/claude_fable_5.md +49 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/claude_fable_5_1.md +57 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/claude_opus_4_8.md +57 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/claude_opus_5.md +47 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/claude_sonnet_5.md +57 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_5_5.md +60 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_5_6.md +58 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_6_astra.md +58 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/quality_improvement.md +18 -4
- package/dist/builtin/workflows/src/extension/index.bundle.mjs +3194 -737
- package/dist/builtin/workflows/src/index.js +899 -436
- package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +0 -10
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +4 -0
- package/dist/cli/list-models.js.map +1 -1
- package/dist/client/index.d.ts +1 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -2
- package/dist/client/index.js.map +1 -1
- package/dist/config.d.ts +0 -9
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -45
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +8 -6
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +1 -0
- 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-models.d.ts.map +1 -1
- package/dist/core/agent-session-models.js +3 -4
- package/dist/core/agent-session-models.js.map +1 -1
- package/dist/core/agent-session-queue-pause.d.ts.map +1 -1
- package/dist/core/agent-session-queue-pause.js +6 -0
- package/dist/core/agent-session-queue-pause.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +13 -5
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-tool-hooks.js +1 -1
- package/dist/core/agent-session-tool-hooks.js.map +1 -1
- package/dist/core/agent-session-tree.d.ts.map +1 -1
- package/dist/core/agent-session-tree.js +8 -0
- package/dist/core/agent-session-tree.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +2 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js +4 -4
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/extensions/api-types.d.ts +8 -2
- 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/context-types.d.ts +12 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -1
- package/dist/core/extensions/runner-shortcuts.js +0 -1
- package/dist/core/extensions/runner-shortcuts.js.map +1 -1
- package/dist/core/fast-model-routing-transport.d.ts +12 -0
- package/dist/core/fast-model-routing-transport.d.ts.map +1 -0
- package/dist/core/{codex-fast-mode-transport.js → fast-model-routing-transport.js} +29 -29
- package/dist/core/fast-model-routing-transport.js.map +1 -0
- package/dist/core/fast-model-routing.d.ts +57 -0
- package/dist/core/fast-model-routing.d.ts.map +1 -0
- package/dist/core/fast-model-routing.js +201 -0
- package/dist/core/fast-model-routing.js.map +1 -0
- package/dist/core/fast-model-variants.d.ts +98 -0
- package/dist/core/fast-model-variants.d.ts.map +1 -0
- package/dist/core/fast-model-variants.js +148 -0
- package/dist/core/fast-model-variants.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +4 -2
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +0 -10
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -8
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-resolver-initial.js +1 -1
- package/dist/core/model-resolver-initial.js.map +1 -1
- package/dist/core/model-runtime-streaming.d.ts +14 -1
- package/dist/core/model-runtime-streaming.d.ts.map +1 -1
- package/dist/core/model-runtime-streaming.js +25 -3
- package/dist/core/model-runtime-streaming.js.map +1 -1
- package/dist/core/model-runtime.d.ts +39 -2
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +91 -7
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer-internal.d.ts.map +1 -1
- package/dist/core/provider-composer-internal.js +8 -2
- package/dist/core/provider-composer-internal.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +18 -18
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager-archive.d.ts.map +1 -1
- package/dist/core/session-manager-archive.js +25 -2
- package/dist/core/session-manager-archive.js.map +1 -1
- package/dist/core/settings-manager-core.d.ts +0 -2
- package/dist/core/settings-manager-core.d.ts.map +1 -1
- package/dist/core/settings-manager-core.js +2 -9
- package/dist/core/settings-manager-core.js.map +1 -1
- package/dist/core/settings-manager-internals.d.ts +0 -1
- package/dist/core/settings-manager-internals.d.ts.map +1 -1
- package/dist/core/settings-manager-internals.js.map +1 -1
- package/dist/core/settings-manager-ui-accessors.d.ts +0 -8
- package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
- package/dist/core/settings-manager-ui-accessors.js +0 -53
- package/dist/core/settings-manager-ui-accessors.js.map +1 -1
- package/dist/core/settings-manager.d.ts +1 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-types.d.ts +0 -5
- package/dist/core/settings-types.d.ts.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +0 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.js +7 -7
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/edit.d.ts +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +128 -3
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/hashline.d.ts +2 -2
- package/dist/core/tools/hashline.d.ts.map +1 -1
- package/dist/core/tools/hashline.js +40 -10
- package/dist/core/tools/hashline.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +8 -8
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/workflow-stage-admission.d.ts +6 -0
- package/dist/core/workflow-stage-admission.d.ts.map +1 -1
- package/dist/core/workflow-stage-admission.js +14 -0
- package/dist/core/workflow-stage-admission.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 +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/atomic-working-status.d.ts +4 -0
- package/dist/modes/interactive/components/atomic-working-status.d.ts.map +1 -1
- package/dist/modes/interactive/components/atomic-working-status.js +26 -1
- package/dist/modes/interactive/components/atomic-working-status.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +7 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +43 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +0 -6
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -2
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/index.js +0 -1
- package/dist/modes/interactive/components/index.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +6 -11
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -5
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +3 -19
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +1 -2
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +4 -11
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/transcript-follow-indicator.js +3 -3
- package/dist/modes/interactive/components/transcript-follow-indicator.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +8 -8
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-autocomplete.js +5 -16
- package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.js +2 -9
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-deferred-startup.js +3 -0
- package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-editor-actions.js +2 -2
- package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-custom-ui.js +1 -0
- package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-dialogs.js +7 -0
- package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-runtime.js +20 -10
- package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-hotkeys-debug.js +1 -5
- package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
- package/dist/modes/interactive/interactive-initial-session-binding.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-initial-session-binding.js +3 -0
- package/dist/modes/interactive/interactive-initial-session-binding.js.map +1 -1
- package/dist/modes/interactive/interactive-input-handling.js +0 -8
- package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +5 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +15 -9
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -3
- package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-deps.js +1 -3
- package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -12
- 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 +10 -13
- package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +29 -0
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +2 -32
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-routing.js +1 -5
- package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -5
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-slash-commands.js +6 -13
- package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +19 -13
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-tui.js +27 -3
- package/dist/modes/interactive/interactive-tui.js.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
- package/dist/modes/interactive-engine/isolated-runtime.js +4 -1
- package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js +13 -6
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +33 -18
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/custom-provider.md +2 -0
- package/docs/development.md +17 -0
- package/docs/docs.json +14 -2
- package/docs/extensions.md +9 -4
- package/docs/intercom.md +41 -7
- package/docs/keybindings.md +8 -6
- package/docs/models/evals.md +394 -0
- package/docs/models/model-selection.md +54 -27
- package/docs/models/pareto-efficiency.md +33 -16
- package/docs/models.md +37 -1
- package/docs/packages.md +2 -2
- package/docs/providers.md +44 -20
- package/docs/quickstart.md +8 -6
- package/docs/rpc.md +3 -3
- package/docs/sdk.md +2 -16
- package/docs/settings.md +19 -22
- package/docs/skills.md +4 -2
- package/docs/subagents.md +9 -3
- package/docs/tools/edit.md +373 -0
- package/docs/tools.md +3 -7
- package/docs/tui.md +2 -1
- package/docs/usage.md +3 -5
- package/docs/workflows/api-reference.md +1395 -0
- package/docs/workflows/authoring.md +678 -0
- package/docs/workflows/builtins.md +245 -0
- package/docs/workflows/operations.md +811 -0
- package/docs/workflows/reliable-design.md +2099 -0
- package/docs/workflows/verification.md +62 -0
- package/docs/workflows.md +15 -5183
- package/npm-shrinkwrap.json +584 -69
- package/package.json +7 -7
- package/dist/client/remote-session.d.ts +0 -64
- package/dist/client/remote-session.d.ts.map +0 -1
- package/dist/client/remote-session.js +0 -351
- package/dist/client/remote-session.js.map +0 -1
- package/dist/client/transcript.d.ts +0 -12
- package/dist/client/transcript.d.ts.map +0 -1
- package/dist/client/transcript.js +0 -98
- package/dist/client/transcript.js.map +0 -1
- package/dist/core/codex-fast-mode-transport.d.ts +0 -12
- package/dist/core/codex-fast-mode-transport.d.ts.map +0 -1
- package/dist/core/codex-fast-mode-transport.js.map +0 -1
- package/dist/core/codex-fast-mode.d.ts +0 -53
- package/dist/core/codex-fast-mode.d.ts.map +0 -1
- package/dist/core/codex-fast-mode.js +0 -249
- package/dist/core/codex-fast-mode.js.map +0 -1
- package/dist/modes/interactive/components/fast-mode-selector.d.ts +0 -27
- package/dist/modes/interactive/components/fast-mode-selector.d.ts.map +0 -1
- package/dist/modes/interactive/components/fast-mode-selector.js +0 -107
- package/dist/modes/interactive/components/fast-mode-selector.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -53
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -360
- package/dist/server/create-harness.js.map +0 -1
- package/docs/models/artificial-analysis-index.md +0 -83
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,94 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.18-alpha.7] - 2026-09-05
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Fullscreen mouse-wheel scrolling moves five times as far while Alt is held, through the Pi TUI 0.85.1 update ([upstream #9166](https://github.com/earendil-works/pi/pull/9166)).
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Updated Pi runtime dependencies to 0.85.1, preserving Atomic's CLI startup, published client API, and footer watcher behavior.
|
|
14
|
+
|
|
15
|
+
## [0.9.18-alpha.6] - 2026-09-04
|
|
16
|
+
|
|
17
|
+
### Breaking Changes
|
|
18
|
+
|
|
19
|
+
- Replaced the `/fast` toggle with explicit selectable fast model identity. `/fast`, its selector UI, the `codexFastMode.chat`/`codexFastMode.workflow` settings, the `ATOMIC_CODEX_FAST_MODE` environment variable, chat-versus-workflow scope inheritance, and every public export tied to that toggle state are removed with no compatibility shim or migration. Select fast inference by choosing a fast model.
|
|
20
|
+
- Removed the `ENV_CODEX_FAST_MODE`, `CODEX_FAST_MODE_SERVICE_TIER`, `CodexFastModeResolvedSettings`, `CodexFastModeScope`, `formatCodexFastModeModelLabel`, `getCodexFastModeScope`, `hasSupportedCodexFastModeModel`, `isCodexFastModeCandidateModelId`, `isCodexFastModeEnabledForScope`, `isCodexFastModeSupportedModel`, `isCodexFastModeSupportedProvider`, `shouldApplyCodexFastMode`, `shouldApplyCodexFastModeForScope`, `withCodexFastModeHeaders`, `CODEX_FAST_MODE_ORIGINATOR`, and `CODEX_FAST_MODE_ROUTING_HEADER` package exports, and the `getCodexFastModeSettings`/`setCodexFastModeSettings` settings-manager methods. `usesChatGptCodexTransport` and `usesFirstPartyCodexRouting` remain, now exported from `core/fast-model-routing.ts` alongside `getModelFastRoute`, `resolveUpstreamModelId`, `withFastRouteStreamOptions`, and `withCodexFastRouteHeaders`; `CODEX_FAST_ROUTE_ORIGINATOR` and `CODEX_FAST_ROUTE_HEADER` come from `core/fast-model-routing-transport.ts`. All of them remain importable from the package root.
|
|
21
|
+
- Removed the environment-sourced runtime settings-override layer, which existed only to inherit the fast-mode toggle into child sessions. Effective settings are now the global-then-project merge.
|
|
22
|
+
- Cloudflare AI Gateway binding transport no longer falls back to `gateway(id).run(...)`. `createGatewayBindingFetch` requires `binding.fetch()`.
|
|
23
|
+
- `WorkflowPendingStageDelivery`, exported from the package root, now requires a `fail(reason: Error): void` member. A delivery owner that has run out of recovery calls it to settle the stage's pending delivery terminally; `ready()` has no timeout, so a delivery nobody can settle leaves its stage parked forever. Implementers of the interface must add `fail(reason)`.
|
|
24
|
+
- Removed the experimental remote-session lease API, transcript projection helpers, and harness factory after Pi 0.85 replaced their underlying contracts. `@bastani/atomic/client` now re-exports the service-addressed `@earendil-works/pi-client` API.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Embedded PostgreSQL now provisions durable DBOS storage offline at runtime on Linux musl x64/ARM64 and Windows ARM64. npm installs receive only the matching runtime through the platform-specific native package, standalone archives carry only their target runtime, and Windows ARM64 deliberately runs PostgreSQL x64 through Windows 11 x64 emulation rather than claiming native ARM64 support.
|
|
29
|
+
- Added `supportsMidConvoEffort` to custom Anthropic Messages model compatibility settings.
|
|
30
|
+
- Added transcript notices for Anthropic thinking blocks dropped during provider recovery when cache miss notices are enabled.
|
|
31
|
+
- `models.json` now accepts `compat.vllmPriority` on `openai-completions` models. Atomic sends it as the top-level `priority` request field, which vLLM uses to order queued requests when it runs with `--scheduling-policy priority`; lower values are handled earlier and the server default is `0`. Set it on a background or batch model so its long prefills queue behind interactive sessions ([#9004](https://github.com/earendil-works/pi/pull/9004)).
|
|
32
|
+
- Eligible providers now publish a second selectable model whose canonical ID is the base model ID plus `-fast`, for example `openai-codex/gpt-5.6-sol-fast`. It appears in `/model`, `atomic --list-models`, workflow model catalogs, and scoped-model lists next to its normal sibling, is persisted and restored by that exact ID, and accepts a thinking suffix (`openai-codex/gpt-5.6-sol-fast:medium`). Normal and fast IDs stay distinct fallback candidates, usage rows, and model-attempt records.
|
|
33
|
+
- First-party OpenAI and OpenAI Codex models route fast requests by sending the **base** upstream model ID plus the fixed `service_tier: priority`, preserving the existing first-party Codex `originator: codex_cli_rs` and `x-codex-routing-hint` HTTP/SSE and WebSocket contract. GitHub Copilot exposes only the fast sibling IDs its OAuth account catalog advertises when the corresponding base catalog model exists, and sends those real suffixed IDs with no OpenAI service-tier field. Renamed providers, proxies, Azure OpenAI, OpenRouter, and generic OpenAI-compatible providers publish no synthetic fast variants.
|
|
34
|
+
- A `models.json` `modelOverrides` entry keyed on a derived `-fast` model ID now applies to that derived entry, after derivation. Overriding the base model still flows through by inheritance; a fast-specific override wins over the inherited value, and the entry's routing metadata survives the override.
|
|
35
|
+
- New `core/fast-model-variants.ts` exports (`deriveFastModelVariants`, `withFastModelVariants`, `fastModelId`, `usesOpenAIFastServiceTier`, `isNativeFastRouteApi`, `copilotAdvertisedFastModelIds`, `FAST_MODEL_ID_SUFFIX`, `FAST_MODEL_SERVICE_TIER`, and the `FastModelVariantDiagnostic`/`FastModelVariantDerivation`/`FastModelVariantsOptions` types), plus `ModelRuntime.getFastModelVariantDiagnostics()` and `ModelRuntime.getWarning()`.
|
|
36
|
+
- A provider, `models.json` custom model, or extension that already owns an exact `-fast` model ID wins: Atomic keeps that model exactly as declared, suppresses the derived duplicate, and reports an actionable warning in the interactive startup notices and from `--list-models`. The interactive notice renders on every launch, and is re-read after deferred extension loading so a collision an extension provider introduces is reported too. Fast behavior comes only from explicit route metadata, never from the `-fast` suffix.
|
|
37
|
+
- Added a clickable "Jump to latest message" label with the `tui.altScreen.bottom` shortcut to the fullscreen transcript while it is scrolled up ([#9080](https://github.com/earendil-works/pi/pull/9080) by [@rwachtler](https://github.com/rwachtler)).
|
|
38
|
+
- Gemini 3.8 Flash is now selectable in Atomic on Google (`google/gemini-3.8-flash`), Google Vertex, GitHub Copilot, opencode zen, OpenRouter (`openrouter/google/gemini-3.8-flash` and its `:batch` variant), and the Vercel AI Gateway. Provider metadata follows the upstream catalogs: Google, Google Vertex, opencode zen, and OpenRouter currently advertise a 1,048,576-token context window and 65,536 maximum output tokens; models.dev advertises 1,000,000 and 64,000 for GitHub Copilot; the Vercel AI Gateway advertises 1,000,000 and 65,536. Google, Google Vertex, opencode zen, OpenRouter, and GitHub Copilot offer low, medium, and high; the Vercel AI Gateway publishes no per-model thinking levels, so its entry also offers off and minimal. Run `--list-models` for the current catalog and the models your account can access ([#9076](https://github.com/earendil-works/pi/issues/9076)).
|
|
39
|
+
- Claude Fable 5 and Claude Fable 5.1 are now present in the generated GitHub Copilot catalog with models.dev limits, pricing, and reasoning metadata. Copilot account availability remains gated by the authenticated model picker.
|
|
40
|
+
- Baseten's models.dev-backed catalog now includes `zai-org/GLM-5.3-Fast` with the limits, pricing, inputs, and reasoning levels models.dev advertises.
|
|
41
|
+
- GPT-6-Astra is now selectable through OpenAI, OpenAI Codex, Amazon Bedrock, OpenRouter, and the Vercel AI Gateway. Atomic derives distinct `openai/gpt-6-astra-fast` and `openai-codex/gpt-6-astra-fast` identities through the existing fast-model catalog overlay. The Codex fast identity sends upstream model `gpt-6-astra` with `service_tier: priority` while preserving the `codex_cli_rs` originator, the `model=gpt-6-astra;tier=priority` routing hint, session restore identity, usage attribution, and 2× request-time price accounting. Bedrock publishes the direct, global, and US IDs unchanged and sends `low` through `max` reasoning effort. The current dynamic OpenRouter catalog contributes `openai/gpt-6-astra` and `openai/gpt-6-astra-pro`; Vercel contributes `openai/gpt-6-astra` and its own route-less `openai/gpt-6-astra-fast`. Astra accepts text and image input, supports 128,000 output tokens, and retains each provider's long-context pricing above 272,000 aggregate input tokens.
|
|
42
|
+
- Added provisional GitHub Copilot Astra support. `github-copilot/gpt-6-astra-fast` is derived only when the OAuth account catalog advertises that exact ID, and sends the suffixed ID without an OpenAI priority tier. The fallback base entry uses known Astra capabilities and zero costs for unknown Copilot pricing; it does not establish service availability.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- Updated all upstream Pi runtime dependencies to 0.85.0.
|
|
47
|
+
- Reduced fullscreen transcript search latency on large transcripts through pi-tui 0.85.0's cached search index and visible-match highlighting.
|
|
48
|
+
- Changed the default interactive working copy from `Working...` to `Working` (and `Working (esc Interrupt)` while resetting extension UI) while preserving Atomic's animated `∀` luminance ramp in its standalone status row. Custom editors may opt into placing the indicator in their top border.
|
|
49
|
+
- Replaced the fullscreen transcript's dock-reserved `Jump to bottom` row with the centered `Jump to latest message` overlay, so scrolling up no longer shrinks the transcript viewport by one row.
|
|
50
|
+
- Aligned the shared workflow-stage-chat jump indicator with that overlay: `↓ Jump to latest message · <tui.altScreen.bottom>`, matching upstream pi's shortcut display.
|
|
51
|
+
- `ModelRuntime` now attaches the first-party ChatGPT Codex routing identity itself, so a standalone `stream()`/`complete()`/`streamSimple()`/`completeSimple()` request on a route-bearing fast Codex model sends `originator: codex_cli_rs` and `x-codex-routing-hint: model=<base-upstream-model>;tier=priority` exactly as an agent-session turn does, and installs the WebSocket handshake identity that only CLI entrypoints used to install. It is applied after auth headers are merged, because the routing wrapper mutates a header object that header merging would otherwise copy. A normal model still sends `originator: pi` and no hint even when a caller requests the priority tier, and an extension that supplies its own stream function for a model's API keeps full ownership of its transport.
|
|
52
|
+
- `ModelRuntime.canRestoreUnknownModel()` takes an optional second `modelId` argument, and session restore now passes it. A GitHub Copilot `-fast` model ID is refused when the stored credential does not advertise it or when an advertised fast sibling has no corresponding base model in the catalog, so the existing `Could not restore model …` warning fires rather than silently constructing a route-less identity. It consults the same per-account lists the Copilot provider's own model filter uses, so a Copilot model the account advertises as ordinary still restores even when its name ends in `-fast`. Other providers keep the provider-scoped answer.
|
|
53
|
+
- `withCodexFastRouteHeaders` no longer takes an `enabled` flag, and the runtime transport wrapper no longer derives identity from a caller flag or the final payload tier. Both paths derive the first-party Codex identity from the model's own `fastRoute` — added only when that route declares the priority tier and the model uses first-party Codex routing — and the routing hint names the route's upstream model ID instead of the canonical `-fast` ID. A caller or payload hook therefore cannot grant fast identity to a normal model.
|
|
54
|
+
- No fast variant is derived for a model whose API is served by a registered extension's own stream function, including a natively registered provider. Atomic cannot enforce the route through a transport it does not serialize, so publishing a `-fast` choice the extension may not honor is the same hazard as publishing one for an adapter that cannot carry the tier. Such a provider keeps its normal models and its transport untouched.
|
|
55
|
+
- Fast variants are derived only for models on an adapter that can actually carry `service_tier` (`openai-responses` and `openai-codex-responses`). An `openai`/`openai-codex` model on `openai-completions` no longer offers a `-fast` choice that would have silently sent an ordinary request.
|
|
56
|
+
- `ModelRuntime.getProvider()` now returns the same published provider as `getProviders()`, so every catalog accessor agrees about derived `-fast` models. It is the registered provider behind a `{ ...provider, getModels }` overlay, so `auth`, `login`, `stream`, and `streamSimple` remain the same function references; use `getRegisteredNativeProvider()` when you need the exact registered object.
|
|
57
|
+
- The chat footer, startup banner, workflow stage labels, and subagent result labels no longer append a separate `fast` marker. The selected model ID carries the `-fast` suffix itself, so a subagent renders as `codebase-analyzer (openai-codex/gpt-5.6-sol-fast · thinking medium)`.
|
|
58
|
+
- The `edit` tool's model-facing hashline guidance now includes compact worked examples and anti-patterns for commonly rejected patch shapes, and correctly identifies native Rust tree-sitter block resolution as primary with the brace/indent heuristic as its fallback. The hashline reference documentation is now a specification covering inputs, verified tolerated shapes, outputs, worked examples, limits, literal error messages, and warnings.
|
|
59
|
+
- OpenAI Responses models that advertise explicit prompt-cache support, including GPT-5.6 and GPT-6 Astra, now use `prompt_cache_options.ttl: "30m"` for long cache retention. Earlier Responses models retain `prompt_cache_retention: "24h"`; no-cache and short-cache requests continue to omit unsupported fields.
|
|
60
|
+
|
|
61
|
+
- Interactive model and thinking selections, including cycling shortcuts, now automatically become startup defaults. Scoped-model cycle-list changes also save immediately. Removed the Ctrl+S save-default shortcuts and UI.
|
|
62
|
+
|
|
63
|
+
### Fixed
|
|
64
|
+
|
|
65
|
+
- Fixed configurable save keybindings in the model and thinking selectors ([#8797](https://github.com/earendil-works/pi/issues/8797)).
|
|
66
|
+
- Fixed RPC abort requests reporting success without cancelling an in-progress manual compaction ([#8920](https://github.com/earendil-works/pi/issues/8920)).
|
|
67
|
+
- Fixed forked sessions losing a compaction boundary that referenced a removed label ([#8989](https://github.com/earendil-works/pi/issues/8989)).
|
|
68
|
+
- Fixed session imports overwriting an existing stored session with the same filename ([#8985](https://github.com/earendil-works/pi/issues/8985)).
|
|
69
|
+
- Fixed fd and rg auto-downloads failing behind exhausted shared GitHub API quotas by resolving release versions from GitHub's web redirect ([#8708](https://github.com/earendil-works/pi/issues/8708)).
|
|
70
|
+
- Fixed JPEG orientation detection stopping at a non-EXIF APP1 segment before the EXIF segment ([#8616](https://github.com/earendil-works/pi/issues/8616)).
|
|
71
|
+
- Fixed model-invocable skills disappearing when the bash tool is available but the read tool is not ([#8552](https://github.com/earendil-works/pi/issues/8552)).
|
|
72
|
+
- Fixed concurrent `/share` commands overwriting one another's temporary session export ([#8613](https://github.com/earendil-works/pi/issues/8613)).
|
|
73
|
+
- Fixed resumed sessions omitting persisted notices for Anthropic thinking blocks dropped during provider recovery.
|
|
74
|
+
- Fixed proxied plain-HTTP provider requests hanging after a tool call by tunneling them with CONNECT ([#8134](https://github.com/earendil-works/pi/issues/8134)).
|
|
75
|
+
- Fixed GitHub Copilot Claude Fable models to run through the Anthropic Messages adapter, so a selected thinking level reaches the provider instead of being dropped ([#8961](https://github.com/earendil-works/pi/issues/8961)).
|
|
76
|
+
- Fixed every Fireworks GLM model to use the OpenAI-compatible completions endpoint. Previously only the `glm-5p2` family did, so newer entries such as `glm-5p3` were served over the Anthropic-compatible endpoint ([#8978](https://github.com/earendil-works/pi/issues/8978)).
|
|
77
|
+
- Fixed the `write` tool reporting UTF-16 code-unit counts as byte counts by removing the misleading count. Every write confirmation now reads `Successfully wrote to <path>` ([#8979](https://github.com/earendil-works/pi/issues/8979)).
|
|
78
|
+
- Fixed the `write` tool mistaking user-authored lines beginning with `Successfully wrote to` for copied tool confirmation text and silently discarding them. A copied confirmation is now recognized only when it names the complete path the write was asked for, its resolved or cwd-relative form, or the copied snapshot's own path, so prose that merely shares a prefix or a basename is written through unchanged.
|
|
79
|
+
- Restricted synthetic fast aliases and first-party Codex routing identity to the explicit OpenAI/OpenAI Codex model route, suppressed aliases over native extension transports, and prevented Copilot from restoring an advertised fast ID without its base catalog model.
|
|
80
|
+
- Fixed signal-killed child processes reporting a null exit code that callers could mistake for success; Unix signals now use the shell convention `128 + signal`, with unknown signal names falling back to the non-zero status 128 ([#8994](https://github.com/earendil-works/pi/pull/8994)).
|
|
81
|
+
- Fixed Linux managed-tool downloads to use statically linked musl archives for fd and ripgrep on both x64 and ARM64 ([#9070](https://github.com/earendil-works/pi/pull/9070) by [@charlesisworkinghard](https://github.com/charlesisworkinghard)).
|
|
82
|
+
- Fixed a jump-to-latest click discarding other mouse reports delivered in the same terminal input chunk.
|
|
83
|
+
- Fixed branch summaries failing when reasoning consumes a 2048-token output cap by raising the cap to 4096 tokens, clamped to the model's `maxTokens` ([#8845](https://github.com/earendil-works/pi/issues/8845)).
|
|
84
|
+
- Pinned managed fd downloads on darwin/x64 to 10.3.0, matching upstream pi's known-good archive for that host ([#8708](https://github.com/earendil-works/pi/issues/8708)).
|
|
85
|
+
- Fixed model catalog refresh errors in the `/model` selector rendering without the blank line used by the corresponding success status.
|
|
86
|
+
|
|
87
|
+
- Resumed workflows can no longer report completion after changed control flow omits their unfinished durable tool. Normal returns and explicit completed exits require exact frontier consumption. New model/task and child-workflow execution, including stage/task worktree setup, is rejected while that frontier is pending; completed work stays cached and cancellation controls retain precedence.
|
|
88
|
+
|
|
89
|
+
### Removed
|
|
90
|
+
|
|
91
|
+
- Removed the Ctrl+X copy-message/selection action to avoid confusion with workflow navigation. `/copy` and automatic mouse-selection copying remain available.
|
|
92
|
+
|
|
5
93
|
## [0.9.18-alpha.5] - 2026-09-01
|
|
6
94
|
|
|
7
95
|
### Added
|
package/README.md
CHANGED
|
@@ -152,7 +152,7 @@ The interface from top to bottom:
|
|
|
152
152
|
|
|
153
153
|
- **Startup header** - Shows shortcuts (`/hotkeys` for all), loaded AGENTS.md files, prompt templates, skills, and extensions
|
|
154
154
|
- **Messages** - Your messages, assistant responses, tool calls and results, notifications, errors, and extension UI
|
|
155
|
-
- **Editor** - Where you type; border color indicates thinking level
|
|
155
|
+
- **Editor** - Where you type; border color indicates thinking level, with streaming activity shown in a separate status row
|
|
156
156
|
- **Footer** - Working directory, session name, total token/cache usage, cost, context usage, current model
|
|
157
157
|
|
|
158
158
|
The editor can be temporarily replaced by other UI, like built-in `/settings` or custom UI from extensions (e.g., a Q&A tool that lets the user answer model questions in a structured format). [Extensions](#extensions) can also replace the editor, add widgets above/below it, a status line, custom footer, or overlays.
|
|
@@ -176,8 +176,8 @@ Type `/` in the editor to trigger commands. [Extensions](#extensions) can regist
|
|
|
176
176
|
| Command | Description |
|
|
177
177
|
|---------|-------------|
|
|
178
178
|
| `/login`, `/logout` | OAuth authentication |
|
|
179
|
-
| `/model` | Switch models
|
|
180
|
-
| `/thinking` | Switch thinking level
|
|
179
|
+
| `/model` | Switch models and automatically save the startup default |
|
|
180
|
+
| `/thinking` | Switch thinking level and automatically save the startup default |
|
|
181
181
|
| `/scoped-models` | Enable/disable models for CTRL+P cycling |
|
|
182
182
|
| `/settings` | Theme, message delivery, transport, and other preferences |
|
|
183
183
|
| `/resume` | Pick from previous sessions |
|
|
@@ -4,6 +4,45 @@ All notable changes to the `pi-intercom` extension will be documented in this fi
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.9.18-alpha.7] - 2026-09-05
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Host sessions that join multiple workflow groups retain workflow broadcast and pending-stage routing after reconnecting. Registration now preserves the startup home group instead of treating the most recently joined group as the session's origin; workflow workers still cannot gain another invocation's control authority through joins or reconnects.
|
|
12
|
+
|
|
13
|
+
## [0.9.18-alpha.6] - 2026-09-04
|
|
14
|
+
|
|
15
|
+
### Breaking Changes
|
|
16
|
+
|
|
17
|
+
- Workflow-stage targets now accept only root-anchored `workflow:<rootRunId>/<segment>[/<segment>...]` paths. The legacy `<runId>:<stageKey>` form is refused with a canonical-path migration hint.
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Workflow-stage routing now supports literal, run-id, and glob path segments, sticky delivery to every future match, and `workflow:<rootRunId>/**` broadcast to live and future descendants until root termination.
|
|
22
|
+
- `intercom list` now surfaces persisted possible future literals, patterns, and child paths with queued counts. Valid targets outside the known set queue with a `notInKnownSet` warning and produce a terminal undeliverable notification only when never delivered.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- Intercom tool guidance, the bundled skill, and workflow-stage discovery documentation now teach canonical path targets, globs, sticky broadcasts, speculative acceptance, terminal settlement, and live-only asks.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- A recoverable broker disconnect no longer surfaces as a workflow-stage failure. Most visibly, a subagent launch no longer aborts with `Client disconnected` as its entire result: the supervisor-authorization request is advisory, so a transient disconnect now lets the launch proceed with supervisor metadata omitted, exactly as a runtime with no provider already did. Eager stage warm-up during `session_start` no longer reports the disconnect through the host extension-error channel, and the background event relays no longer log `Intercom event relay failed …` into the stage output.
|
|
31
|
+
- A workflow-stage warm-up that loses the broker now has a retry owner. Previously nothing rescheduled it, so a stage holding queued pending messages could wait indefinitely for a delivery that never came. The wrapper now retries the warm-up on the same bounded reconnect backoff, and the next entry covers what happens when those attempts run out.
|
|
32
|
+
- An exhausted workflow-stage warm-up retry no longer writes `Intercom could not reconnect for workflow stage "…" after 5 attempts` into the host session's transcript, and no longer leaves that stage waiting forever. The bounded retry previously ended with a raw `console.error`, which the root session paints into the main chat area, and nothing settled the stage's pending delivery — so the stage stayed running on an untimed `pendingStageDelivery.ready()` with no owner and no signal. The wrapper now hands the delivery a typed `IntercomWarmUpExhaustedError` through the `fail(reason)` member of the `WorkflowPendingStageDelivery` contract, and the workflow side settles `ready()` exactly once with a stage-scoped `WorkflowPendingStageDeliveryFailedError` naming the run, stage id, and stage name, so the stage ends `failed` at its own lifecycle boundary and spends no model retry or fallback candidate on a delivery no candidate could have received. Transient reconnects stay silent and keep retrying, a late success still delivers queued messages in admission order before stage work, and shutdown still cancels the retry silently. Nothing is dropped: after the terminal signal the queue is left untouched rather than marked delivered to a stage that will not read it, a stage with nothing queued still starts normally, and a duplicate `fail()`, a `fail()` before the first `ready()`, and a late drain are all safe. A host whose `fail` implementation throws cannot turn its own contract violation into an uncaught exception or an unhandled rejection in the session, and still gets no transcript output.
|
|
33
|
+
- Recoverable-disconnect classification requires the typed error raised inside the broker client rather than message text or a copyable marker property, so protocol, authentication, configuration, non-recoverable initialization, terminal relay, exhausted-retry, user-initiated, and identically worded unrelated failures all stay visible and actionable.
|
|
34
|
+
- The broker no longer writes to a departing peer's ended socket. A session was retired only when its connection finally closed, so a peer that half-closed — or one the broker itself ended after refusing a registration — stayed in the routing table and every later broadcast wrote into a socket whose writable side was gone. Node destroys the socket synchronously for such a write, so one departure cascaded into further disconnects and filled the 8 KiB `broker.log` with `ERR_STREAM_WRITE_AFTER_END` traces, leaving no room for any other diagnostic. Sessions are now retired as soon as their socket stops accepting frames, and every broker write checks writability as part of the write itself.
|
|
35
|
+
- A session the broker ended is no longer advertised by `intercom list` and no longer acked as `delivered`. Previously a `send` to such a session was answered `delivered` while the peer received nothing, and the fabricated delivery record then refused the honest retry with `message_id_conflict`, leaving the message permanently undeliverable under its stable id. Delivery-producing sends now wait for the socket write callback, so an immediate asynchronous reset cannot be acknowledged before its failure arrives. A send that cannot be handed to its target fails with `Session not found`, keeps the message id retryable, and opens no reply authorization for a message that was never sent. Pending-stage routing and notifications fail the same way instead of stalling for their full acknowledgement timeout, and a sticky broadcast reports only the stages it actually reached.
|
|
36
|
+
- A transport reset on an already-registered broker connection now enters the bounded reconnect path instead of failing the caller. `ECONNRESET`, `EPIPE`, and their relatives were stored raw and rejected pending work with the raw error, which the recoverable-disconnect classifier does not recognize, so an ordinary broker restart bypassed recovery. Such a reset is now the typed recoverable disconnect with the original transport error preserved as `cause`; the raw error still reaches `error` listeners, a protocol error that is followed by a socket error keeps its own diagnosis, and pre-registration failures are unchanged.
|
|
37
|
+
- A recoverable `Client disconnected` result and both model-visible Intercom tool registrations now return/describe an opaque `retryToken` for the exact failed `send`, `ask`, or `reply`. Only an explicit matching claim reuses identity; a tokenless byte-identical call is always a distinct intentional operation. Concurrent failures receive separate process-local tokens, and invalid, expired, foreign-session, mismatched, concurrent, exhausted, or settled claims fail before sending. Omitted attachments and an explicit empty list remain distinct caller arguments, while attachment object member order is canonical. Each token allows at most three claimed attempts without extending the original 11-minute deadline.
|
|
38
|
+
- A claimed retry no longer releases its accepted identity on an intermediate resolved nondelivery. `delivered: false`, `Session not found`, durable-authority uncertainty/capacity refusal, and another typed disconnect preserve and visibly return the same token/ID for the remaining bounded attempts; delivered or queued success settles it. This prevents an accepted operation with a lost acknowledgement from minting a second ID after an inconclusive retry.
|
|
39
|
+
- Stable-message retries remain reconnect-safe: retry signatures use reconnect-stable sender/recipient authority and preserve the model-issued target verbatim while transport resolution changes independently. Canonical attachment object member order is ignored, while attachment omission, array order/duplicates, raw target aliases, whitespace, and reply fields remain significant.
|
|
40
|
+
- A retry token for an implicit `reply` now retains the originally resolved sender and question route. An exact retry validates its caller-visible arguments before consulting mutable reply state, so a later inbound ask cannot make it ambiguous or steal its correlation. Public implicit `reply` still prefers the recorded exact sender ID while it is live; only a departed ID uses the authorized name fallback, ambiguity fails closed with the still-valid token, and explicit `to`/`replyTo` stay verbatim.
|
|
41
|
+
- Retry-token capacity is now reserved before a fresh operation can consume an ID, open a confirmation prompt, resolve a target/reply route, or send. Live token claims still work at full capacity, settled tombstones are discarded, and releasing or expiring an in-flight/retained identity reopens capacity without evicting live authority.
|
|
42
|
+
- Local subagent result relay delivery now reserves its process-local deduplication identity before the chat side effect and accepts it before positive acknowledgement. The 10,001st live ID, conflicts, invalid state, and uncertain in-flight replays fail closed without delivery or success acknowledgement; a proven side-effect failure forgets only its exact reservation, while an acceptance failure remains uncertain so replay cannot duplicate it.
|
|
43
|
+
- Broker acceptance records now persist as fixed keyed SHA-256 HMAC authority rather than canonical plaintext signatures, so SQLite/WAL/SHM never contain message or attachment text and low-entropy payloads cannot be tested without the paired random key. The configurable Intercom directory and database/key artifacts are corrected to owner-only POSIX modes (`0700`/`0600`), while Windows permission semantics remain unchanged. Missing/malformed key-database pairs, corrupt records, capacity, and uncertain reservations fail closed; digest-based byte accounting, 12-minute restart durability, and 10,000-record/64 MiB bounds remain enforced.
|
|
44
|
+
- Closed workflow stages suppress late messages from the subagent runs they own, without dropping messages from other stages' children. Cancelled sends stop before transport when possible; already-submitted sends preserve their delivery receipts and disconnect retry identities ([#2840](https://github.com/bastani-inc/atomic/issues/2840)).
|
|
45
|
+
|
|
7
46
|
## [0.9.18-alpha.5] - 2026-09-01
|
|
8
47
|
|
|
9
48
|
### Fixed
|
|
@@ -184,6 +184,11 @@ intercom({
|
|
|
184
184
|
|
|
185
185
|
To coordinate two plain chat sessions without changing startup config, have each call `intercom({ action: "join", group: "NAME" })`. Joining adds a membership without changing the session ID or removing existing memberships. Calls to `list`, `send`, and `ask` can then reach any session sharing at least one membership. Use `intercom({ action: "groups" })` to discover every available name, connected-session count, and membership marker. Call `intercom({ action: "leave", group: "NAME" })` to remove one membership while keeping the others, or bare `leave` to reset to the original home group. `contact_supervisor` keeps its dedicated capability-based cross-group behavior.
|
|
186
186
|
|
|
187
|
+
Joined memberships survive broker reconnects without replacing the session's
|
|
188
|
+
startup identity. An ordinary host can therefore control several joined workflow
|
|
189
|
+
invocations, while a workflow worker cannot gain another invocation's parent-control
|
|
190
|
+
authority by joining its group and reconnecting.
|
|
191
|
+
|
|
187
192
|
**Worker finds something unexpected — escalates and waits:**
|
|
188
193
|
```typescript
|
|
189
194
|
intercom({
|
|
@@ -335,10 +340,11 @@ The supervisor can reply with plain JSON or a fenced `json` block. If the reply
|
|
|
335
340
|
| Parameter | Type | Description |
|
|
336
341
|
|-----------|------|-------------|
|
|
337
342
|
| `action` | string | `"list"`, `"groups"`, `"join"`, `"leave"`, `"send"`, `"ask"`, `"reply"`, `"pending"`, or `"status"` |
|
|
338
|
-
| `to` | string | Exact session name/full session ID, or
|
|
343
|
+
| `to` | string | Exact session name/full session ID, or `workflow:<rootRunId>/<segment>[/<segment>...]`; `*` matches one segment and `**` any depth. Sends support pending/future patterns and broadcast; `ask` requires a live target. |
|
|
339
344
|
| `message` | string | Message text (for send/ask/reply) |
|
|
340
345
|
| `attachments` | array | Optional `file`, `snippet`, or `context` attachments |
|
|
341
346
|
| `replyTo` | string | Optional message ID for threading or replying to an `ask` |
|
|
347
|
+
| `retryToken` | string | Opaque claim returned by a retryable `send`/`ask`/`reply` failure; valid only with the exact same caller arguments. Omit it for fresh operations. |
|
|
342
348
|
| `group` | string | Group name for `join` or optional targeted `leave`; read-only filter for `list`/`status`. `send`/`ask` require a shared membership. |
|
|
343
349
|
|
|
344
350
|
### contact_supervisor
|
|
@@ -367,7 +373,7 @@ Only registered in sessions where `pi-subagents` supplied the required child bri
|
|
|
367
373
|
|
|
368
374
|
**`list`** — Keeps session-listing semantics: returns the current session and every active session sharing at least one membership. Pass `group` for a read-only view of one group.
|
|
369
375
|
|
|
370
|
-
Live target lookup accepts only an exact full Intercom session ID or an exact case-insensitive session name. `intercom list`
|
|
376
|
+
Live target lookup accepts only an exact full Intercom session ID or an exact case-insensitive session name. Join `workflow:<rootRunId>` and use `intercom list` to see materialized `PENDING`/`RUNNING` workflow stages with canonical `workflow:<rootRunId>/<segment>[/<segment>...]` paths, plus possible future literals, globs, nested paths, and their queued counts. `*` matches one segment and `**` any depth. `workflow:<rootRunId>/**` reaches live stages now and remains sticky for every future stage until root termination; narrower patterns behave the same for their matches. A valid path outside the known set queues with `notInKnownSet` and settles undeliverable at terminal only if never delivered. Use `ask` only on live targets. An eligible invocation member has directional list/send/live-ask control over stages in owned `workflow:<rootRunId>/...` subgroups. A subgroup stage or another workflow root cannot turn a mutable join into parent control; sibling subgroups stay isolated, and explicit `group: "default"` remains non-owned.
|
|
371
377
|
|
|
372
378
|
**`send`** — Sends through ordinary Intercom. Live workflow-stage sessions receive messages immediately and return `delivered`. Known pending invocation-owned stages queue durably and return the distinct `queued` result with its FIFO position; a main-chat session that explicitly joined the owning invocation group may use that route. Pending `group: "default"` stages remain ineligible, and an ineligible attempt is refused with `Target workflow run is in a different intercom group`. Each exact run/stage key retains at most 50 queued messages; the next send is refused rather than evicting an older one. Delivery occurs before the first model turn under **Messages received before you started**, with sender identity and `Sent:` timestamp separate from the task prompt. Resume/replay, broker restart, and stage-attempt restart preserve exactly-once delivery by logical message ID. Skipped, cancelled, and terminal-before-initialization destinations make pending messages undeliverable and notify the sender. If the sender reconnects with a new broker UUID, notification fallback requires one unique same-group match for the immutable registration-time name; mutable presence names/groups, cross-group matches, and ambiguous duplicates are rejected. The broker trusts that initial name/group as host-orchestration metadata, while the original display/provenance remains unchanged in the durable record. Live sends remain immediate by default; `confirmSend: true` still enables confirmation for non-reply sends.
|
|
373
379
|
|
|
@@ -453,6 +459,18 @@ graph TB
|
|
|
453
459
|
|
|
454
460
|
The broker is a standalone TypeScript process that manages session registration and message routing. It auto-spawns when the first session that invokes Intercom needs it and exits after 5 seconds when it last has no registered sessions, including brokers that never received a connection and sockets that close before register. Clients reconnect automatically if the broker disappears and later comes back. A failed reconnect schedules the next attempt on a bounded backoff (1s, 2s, 5s, 10s, then 30s) once it releases reconnect ownership, so a transient failure never leaves a live session with nothing owning recovery; a failed explicit tool or overlay connection still returns its error to the caller and leaves the retry behind. A reconnect that fails after the broker already accepted it closes that connection first, so a session never appears twice in `intercom list`.
|
|
455
461
|
|
|
462
|
+
An explicit `send`, `ask`, or `reply` that reports the typed `Client disconnected` failure returns an opaque `retryToken`. Retry the exact action and arguments with that token, up to three claimed attempts. A tokenless call is always a fresh intentional operation even if byte-identical, and concurrent failures receive separate tokens. Tokens are unguessable and process-local, scoped to this tool registration/session and one canonical operation; invalid, expired, foreign, mismatched, in-flight, exhausted, and settled claims fail before sending. Attachment object member order is canonical, but omission is distinct from an explicit empty array and attachment array order/duplicates remain exact. The identity expires at the original 11-minute deadline (the 10-minute `ask` window plus one minute), which retries never extend.
|
|
463
|
+
|
|
464
|
+
A token-claimed retry preserves the same token and message ID after `delivered: false`, `Session not found`, durable-authority uncertainty/capacity refusal, or another typed disconnect; each claim consumes one of the three attempts. It settles on delivered/queued success or a genuinely conclusive non-recoverable outcome. Initial tokenless nondelivery and unrelated/non-recoverable error classification stay unchanged.
|
|
465
|
+
|
|
466
|
+
The broker keeps accepted-operation authority for 12 minutes in `delivered-messages.sqlite`. It stores canonical signatures only as fixed keyed SHA-256 HMAC digests, with the random key in `delivered-messages.key`; message text and attachment contents never reach SQLite, and the key prevents offline guesses for low-entropy messages by other local users. On POSIX the Intercom directory is corrected to `0700` and database/WAL/SHM/key artifacts to `0600`; missing or malformed key/database pairs and corrupt digest records fail closed. The broker retains at most 10,000 live authority records and 64 MiB of digest/routing authority.
|
|
467
|
+
|
|
468
|
+
The broker reserves an identity durably before forwarding, then marks it accepted after confirmed write and before acknowledging the sender. This survives broker replacement without redelivery. A deduplicated ask remains answerable after reconnect: implicit public `reply` uses the exact recorded sender ID while it is live, even alongside a same-name peer; only a departed ID falls back to authorized reconnect/name resolution, where ambiguity and changed identity/groups fail without sending. An implicit reply retry also retains its original sender/question snapshot, so later inbound asks cannot redirect or invalidate it. Explicit `to` and `replyTo` remain verbatim and `requirePendingReply` still binds the exact pending thread. Legacy sends without logical-target metadata retain transport-target behavior.
|
|
469
|
+
|
|
470
|
+
Retry state is independently bounded and fails closed at pressure. A fresh client operation reserves one of 1,000 identity slots before consuming an ID, showing confirmation UI, resolving its target/reply route, or sending; existing token claims remain available when full. Capacity reopens when an in-flight or retained identity is released or expires, and settled tombstones are discarded without evicting live authority. The broker likewise refuses new delivery rather than evicting live authority, then accepts again after TTL cleanup. The local subagent result relay applies the same order in memory—reserve before its chat side effect, accept before positive acknowledgement—and refuses the 10,001st live ID or an uncertain replay without performing the side effect. SQLite transactions serialize replacement-broker access.
|
|
471
|
+
|
|
472
|
+
A workflow stage warming up before its heavy module exists is the one case the reconnect backoff cannot own, so the lightweight wrapper retries that warm-up on the same bounded schedule. When those attempts run out it writes nothing to the console: it hands the stage's pending delivery a typed terminal reason through the delivery contract's required `fail(reason)`, and the workflow side fails that stage with a stage-scoped, non-retryable error instead of leaving it waiting on `pendingStageDelivery.ready()`. No model retry or fallback candidate is spent on it, since every candidate would be refused the same instructions. Queued messages are left queued rather than delivered to a stage that will not read them.
|
|
473
|
+
|
|
456
474
|
Messages use length-prefixed JSON over a local socket/pipe transport (4-byte length + JSON payload) to handle fragmentation properly. The protocol includes request correlation for session listing, explicit delivery failures, and validation for malformed or out-of-order messages.
|
|
457
475
|
|
|
458
476
|
Async extension work (startup, inbound flushes, reconnects, overlays, and relays) no-ops if the session shuts down or reloads before it settles.
|
|
@@ -462,6 +480,8 @@ Runtime files live under the active agent directory. Atomic defaults to `~/.atom
|
|
|
462
480
|
- `broker.sock` — Unix domain socket for communication (macOS/Linux only; Windows uses a named pipe instead)
|
|
463
481
|
- `broker-launch.vbs` — Windows helper script used to launch the broker without a console window
|
|
464
482
|
- `broker.pid` — Broker process ID
|
|
483
|
+
- `delivered-messages.sqlite` — bounded durable authority containing keyed digests, never plaintext payloads
|
|
484
|
+
- `delivered-messages.key` — random owner-only HMAC key paired with the authority database
|
|
465
485
|
- `broker.spawn.lock` — Short-lived lock used to avoid duplicate auto-spawns
|
|
466
486
|
- `broker.log` — Broker stderr, truncated on every spawn and capped at 8 KiB by the broker itself
|
|
467
487
|
- `config.json` — User configuration
|