@bastani/atomic 0.8.2 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/builtin/intercom/package.json +1 -1
  3. package/dist/builtin/mcp/package.json +1 -1
  4. package/dist/builtin/subagents/CHANGELOG.md +1 -0
  5. package/dist/builtin/subagents/README.md +1 -1
  6. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  7. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  8. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  9. package/dist/builtin/subagents/agents/codebase-online-researcher.md +22 -22
  10. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  11. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  12. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  13. package/dist/builtin/subagents/agents/debugger.md +1 -1
  14. package/dist/builtin/subagents/package.json +1 -1
  15. package/dist/builtin/subagents/skills/subagent/SKILL.md +1 -1
  16. package/dist/builtin/subagents/src/runs/background/async-execution.ts +3 -2
  17. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +3 -1
  18. package/dist/builtin/subagents/src/runs/foreground/execution.ts +1 -0
  19. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +8 -1
  20. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +7 -1
  21. package/dist/builtin/subagents/src/shared/types.ts +2 -0
  22. package/dist/builtin/web-access/package.json +2 -2
  23. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +2 -0
  24. package/dist/builtin/workflows/builtin/ralph.ts +5 -0
  25. package/dist/builtin/workflows/package.json +1 -1
  26. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.8.3] - 2026-05-17
6
+
7
+ ### Changed
8
+
9
+ - Pinned `@j178/prek` to 0.3.13 to keep hook installation stable.
10
+
11
+ ## [0.8.3-0] - 2026-05-17
12
+
13
+ ### Changed
14
+
15
+ - Pinned `@j178/prek` to 0.3.13 to keep hook installation stable.
16
+
5
17
  ## [0.8.2] - 2026-05-16
6
18
 
7
19
  ### Changed
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/intercom",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "private": true,
5
5
  "description": "Atomic extension providing a private coordination channel between parent and child agent sessions.",
6
6
  "contributors": [
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/mcp",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "private": true,
5
5
  "description": "Atomic extension that adapts MCP (Model Context Protocol) servers into the coding agent.",
6
6
  "contributors": [
@@ -14,6 +14,7 @@
14
14
  ### Added
15
15
 
16
16
  ### Fixed
17
+ - Append the current user-selected model as the final subagent fallback candidate, so retryable provider/model failures still get one last attempt after configured `fallbackModels` are exhausted.
17
18
 
18
19
  ## [0.24.2] - 2026-05-10
19
20
 
@@ -448,7 +448,7 @@ Important fields:
448
448
  | `tools` | Builtin tool allowlist. `mcp:` entries select direct MCP tools when `pi-mcp-adapter` is installed. |
449
449
  | `extensions` | Omitted means normal extensions; empty means no extensions; comma-separated values allowlist specific extensions. |
450
450
  | `model` | Default model. Bare ids prefer the current provider when possible, then unique registry matches. |
451
- | `fallbackModels` | Ordered backup models for provider/model failures such as quota, auth, timeout, or unavailable model. Ordinary task failures do not trigger fallback. |
451
+ | `fallbackModels` | Ordered backup models for provider/model failures such as quota, auth, timeout, or unavailable model. The current user-selected model is automatically appended as the last fallback and de-duplicated. Ordinary task failures do not trigger fallback. |
452
452
  | `thinking` | Appended as a `:level` suffix at runtime unless a suffix is already present. |
453
453
  | `systemPromptMode` | `replace` by default; `append` keeps Pi’s base prompt. |
454
454
  | `inheritProjectContext` | Keeps or strips inherited project instruction blocks. |
@@ -9,7 +9,7 @@ description: |
9
9
  - Code that has gotten messy after several iterations.
10
10
  tools: read, edit, write, grep, find, ls, bash
11
11
  model: openai/gpt-5.5
12
- fallbackModels: github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
12
+ fallbackModels: openai-codex/gpt-5.5, github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
13
13
  thinking: low
14
14
  ---
15
15
 
@@ -3,7 +3,7 @@ name: codebase-analyzer
3
3
  description: Analyzes codebase implementation details. Call the codebase-analyzer agent when you need to find detailed information about specific components.
4
4
  tools: read, grep, find, ls, bash
5
5
  model: openai/gpt-5.5
6
- fallbackModels: github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
6
+ fallbackModels: openai-codex/gpt-5.5, github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
7
7
  thinking: low
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: codebase-locator
3
3
  description: Locates files, directories, and components relevant to a feature or task. Basically a "super search/find/ls tool."
4
4
  tools: read, grep, find, ls, bash
5
5
  model: openai/gpt-5.4-mini
6
- fallbackModels: github-copilot/gpt-5.4-mini, anthropic/claude-haiku-4-5, github-copilot/claude-haiku-4.5
6
+ fallbackModels: openai-codex/gpt-5.4-mini, github-copilot/gpt-5.4-mini, anthropic/claude-haiku-4-5, github-copilot/claude-haiku-4.5
7
7
  thinking: low
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: codebase-online-researcher
3
3
  description: Online research for up-to-date documentation and library-source knowledge. Use when you need authoritative external information — official docs, ecosystem context, version-specific behavior, GitHub permalinks into open-source libraries, or video tutorials.
4
4
  tools: read, grep, find, ls, bash, write, web_search, fetch_content, get_search_content
5
5
  model: openai/gpt-5.5
6
- fallbackModels: github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
6
+ fallbackModels: openai-codex/gpt-5.5, github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
7
7
  thinking: low
8
8
  skills: playwright-cli
9
9
  ---
@@ -27,11 +27,11 @@ For JS-heavy or auth-gated pages, fall back to invoking `playwright-cli` through
27
27
 
28
28
  Pi executes tool calls sequentially, even when you emit multiple calls in one turn. But batching independent calls in a single turn still saves LLM round-trips (~5-10s each). Use these patterns:
29
29
 
30
- | Pattern | When | Actually parallel? |
31
- | -------------------------------- | --------------------------------------------------------- | ----------------------------- |
32
- | Batch tool calls in one turn | Independent ops (web_search + fetch_content + read) | No, but saves round-trips |
33
- | `fetch_content({ urls: [...] })` | Multiple URLs to fetch | Yes (3 concurrent) |
34
- | Bash with `&` + `wait` | Multiple git/gh commands | Yes (OS-level) |
30
+ | Pattern | When | Actually parallel? |
31
+ | -------------------------------- | --------------------------------------------------- | ------------------------- |
32
+ | Batch tool calls in one turn | Independent ops (web_search + fetch_content + read) | No, but saves round-trips |
33
+ | `fetch_content({ urls: [...] })` | Multiple URLs to fetch | Yes (3 concurrent) |
34
+ | Bash with `&` + `wait` | Multiple git/gh commands | Yes (OS-level) |
35
35
 
36
36
  ## Web Fetch Strategy (token-efficient order)
37
37
 
@@ -63,12 +63,12 @@ When the question is about an open-source library — its internals, why somethi
63
63
 
64
64
  ### Step 1: Classify the request
65
65
 
66
- | Type | Trigger | Primary approach |
67
- | --------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------- |
68
- | **Conceptual** | "How do I use X?", "Best practice for Y?" | `web_search` + `fetch_content` on README/docs |
69
- | **Implementation** | "How does X implement Y?", "Show me the source" | `fetch_content` (clone) + `grep`/`read` + permalinks |
70
- | **Context / History** | "Why was this changed?", "History of X?" | `git log`, `git blame`, `git show` + `gh search issues/prs` |
71
- | **Comprehensive** | Complex or ambiguous "deep dive" | All of the above |
66
+ | Type | Trigger | Primary approach |
67
+ | --------------------- | ----------------------------------------------- | ----------------------------------------------------------- |
68
+ | **Conceptual** | "How do I use X?", "Best practice for Y?" | `web_search` + `fetch_content` on README/docs |
69
+ | **Implementation** | "How does X implement Y?", "Show me the source" | `fetch_content` (clone) + `grep`/`read` + permalinks |
70
+ | **Context / History** | "Why was this changed?", "History of X?" | `git log`, `git blame`, `git show` + `gh search issues/prs` |
71
+ | **Comprehensive** | Complex or ambiguous "deep dive" | All of the above |
72
72
 
73
73
  ### Step 2: Research by type
74
74
 
@@ -303,15 +303,15 @@ For library-source answers, every code claim should look like the citation examp
303
303
 
304
304
  ## Failure Recovery
305
305
 
306
- | Failure | Recovery |
307
- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
308
- | `grep` finds nothing | Broaden the query; try concept names instead of exact function names. |
309
- | `gh` CLI rate limited | Use the already-cloned repo under `/tmp/pi-github-repos/` for git operations instead. |
310
- | Repo too large to clone | `fetch_content` returns an API-only view automatically; use that, or add `forceClone: true` if you must clone. |
311
- | File not found in the clone | A branch name with slashes may have misresolved; list the repo tree and navigate manually. |
312
- | Uncertain about implementation | State your uncertainty explicitly, propose a hypothesis, and show what evidence you did find. |
313
- | Video extraction fails | Ensure Chrome is signed into gemini.google.com (free) or set `GEMINI_API_KEY`. |
314
- | Page returns 403 / bot block | Gemini fallback triggers automatically; no action needed if Gemini is configured. |
315
- | `web_search` fails | Check provider config; try explicit `provider: "gemini"` if a Perplexity key is missing. |
306
+ | Failure | Recovery |
307
+ | ------------------------------ | -------------------------------------------------------------------------------------------------------------- |
308
+ | `grep` finds nothing | Broaden the query; try concept names instead of exact function names. |
309
+ | `gh` CLI rate limited | Use the already-cloned repo under `/tmp/pi-github-repos/` for git operations instead. |
310
+ | Repo too large to clone | `fetch_content` returns an API-only view automatically; use that, or add `forceClone: true` if you must clone. |
311
+ | File not found in the clone | A branch name with slashes may have misresolved; list the repo tree and navigate manually. |
312
+ | Uncertain about implementation | State your uncertainty explicitly, propose a hypothesis, and show what evidence you did find. |
313
+ | Video extraction fails | Ensure Chrome is signed into gemini.google.com (free) or set `GEMINI_API_KEY`. |
314
+ | Page returns 403 / bot block | Gemini fallback triggers automatically; no action needed if Gemini is configured. |
315
+ | `web_search` fails | Check provider config; try explicit `provider: "gemini"` if a Perplexity key is missing. |
316
316
 
317
317
  Remember: you are the user's expert guide to technical research. Lean on `fetch_content` first with the `/llms.txt` → `Accept: text/markdown` → `playwright-cli` fallback chain to efficiently pull authoritative content, clone open-source repos when implementation evidence is needed, store anything reusable under `research/web/`, and deliver comprehensive, up-to-date answers with exact citations and GitHub permalinks. Answer directly — skip preamble like "I'll help you with…" and go straight to findings.
@@ -3,7 +3,7 @@ name: codebase-pattern-finder
3
3
  description: Find similar implementations, usage examples, or existing patterns in the codebase that can be modeled after.
4
4
  tools: read, grep, find, ls, bash
5
5
  model: openai/gpt-5.4-mini
6
- fallbackModels: github-copilot/gpt-5.4-mini, anthropic/claude-haiku-4-5, github-copilot/claude-haiku-4.5
6
+ fallbackModels: openai-codex/gpt-5.4-mini, github-copilot/gpt-5.4-mini, anthropic/claude-haiku-4-5, github-copilot/claude-haiku-4.5
7
7
  thinking: low
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: codebase-research-analyzer
3
3
  description: Analyzes local research documents to extract high-value insights, decisions, and technical details while filtering out noise. Use this when you want to deep dive on a research topic or understand the rationale behind decisions.
4
4
  tools: read, grep, find, ls, bash
5
5
  model: openai/gpt-5.5
6
- fallbackModels: github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
6
+ fallbackModels: openai-codex/gpt-5.5, github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
7
7
  thinking: low
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: codebase-research-locator
3
3
  description: Discovers local research documents that are relevant to the current research task.
4
4
  tools: read, grep, find, ls, bash
5
5
  model: openai/gpt-5.4-mini
6
- fallbackModels: github-copilot/gpt-5.4-mini, anthropic/claude-haiku-4-5, github-copilot/claude-haiku-4.5
6
+ fallbackModels: openai-codex/gpt-5.4-mini, github-copilot/gpt-5.4-mini, anthropic/claude-haiku-4-5, github-copilot/claude-haiku-4.5
7
7
  thinking: low
8
8
  ---
9
9
 
@@ -3,7 +3,7 @@ name: debugger
3
3
  description: Debug errors, test failures, and unexpected behavior. Use PROACTIVELY when encountering issues, analyzing stack traces, or investigating system problems.
4
4
  tools: read, edit, write, grep, find, ls, bash, web_search, fetch_content, get_search_content
5
5
  model: openai/gpt-5.5
6
- fallbackModels: github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
6
+ fallbackModels: openai-codex/gpt-5.5, github-copilot/gpt-5.5, anthropic/claude-opus-4-7, github-copilot/claude-opus-4.7
7
7
  thinking: high
8
8
  skills: tdd, playwright-cli
9
9
  ---
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/subagents",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "private": true,
5
5
  "description": "Atomic extension for delegating tasks to subagents with chains, parallel execution, and TUI clarification.",
6
6
  "contributors": [
@@ -129,7 +129,7 @@ Builtin agents load at the lowest priority. Project agents override user agents,
129
129
  | `code-simplifier` | Clean up recently changed code without changing behavior | `openai/gpt-5.5` | low | read, edit, write, grep, find, ls, bash | **Writer.** Scopes to recently modified code by default; preserves all observable behavior. |
130
130
  | `debugger` | Reproduce, diagnose, and fix failing behavior | `openai/gpt-5.5` | high | read, edit, write, grep, find, ls, bash, web_search, fetch_content, get_search_content | **Writer.** Has the `tdd` and `playwright-cli` skills. Inspect-only mode requires an explicit instruction. |
131
131
 
132
- Each builtin declares an explicit `model` and `fallbackModels` chain (typically `github-copilot/<same>`, then `anthropic/claude-opus-4-7`, then `github-copilot/claude-opus-4.7`). Override per run with inline config:
132
+ Each builtin declares an explicit `model` and `fallbackModels` chain (typically `github-copilot/<same>`, then `anthropic/claude-opus-4-7`, then `github-copilot/claude-opus-4.7`). The current user-selected model is automatically appended as the last fallback and de-duplicated. Override per run with inline config:
133
133
 
134
134
  ```text
135
135
  /run codebase-analyzer[model=anthropic/claude-sonnet-4] "Trace the auth flow"
@@ -88,6 +88,7 @@ interface AsyncExecutionContext {
88
88
  cwd: string;
89
89
  currentSessionId: string;
90
90
  currentModelProvider?: string;
91
+ currentModel?: string;
91
92
  }
92
93
 
93
94
  interface AsyncChainParams {
@@ -317,7 +318,7 @@ export function executeAsyncChain(
317
318
  cwd: stepCwd,
318
319
  model,
319
320
  thinking: resolveEffectiveThinking(model, a.thinking),
320
- modelCandidates: buildModelCandidates(behavior.model ?? a.model, a.fallbackModels, availableModels, ctx.currentModelProvider).map((candidate) =>
321
+ modelCandidates: buildModelCandidates(behavior.model ?? a.model, a.fallbackModels, availableModels, ctx.currentModelProvider, ctx.currentModel).map((candidate) =>
321
322
  applyThinkingSuffix(candidate, a.thinking),
322
323
  ),
323
324
  tools: a.tools,
@@ -544,7 +545,7 @@ export function executeAsyncSingle(
544
545
  cwd: runnerCwd,
545
546
  model,
546
547
  thinking: resolveEffectiveThinking(model, agentConfig.thinking),
547
- modelCandidates: buildModelCandidates(params.modelOverride ?? agentConfig.model, agentConfig.fallbackModels, availableModels, ctx.currentModelProvider).map((candidate) =>
548
+ modelCandidates: buildModelCandidates(params.modelOverride ?? agentConfig.model, agentConfig.fallbackModels, availableModels, ctx.currentModelProvider, ctx.currentModel).map((candidate) =>
548
549
  applyThinkingSuffix(candidate, agentConfig.thinking),
549
550
  ),
550
551
  tools: agentConfig.tools,
@@ -56,7 +56,7 @@ import {
56
56
  MAX_CONCURRENCY,
57
57
  resolveChildMaxSubagentDepth,
58
58
  } from "../../shared/types.ts";
59
- import { resolveModelCandidate } from "../shared/model-fallback.ts";
59
+ import { currentModelFullId, resolveModelCandidate } from "../shared/model-fallback.ts";
60
60
  import { validateFileOnlyOutputMode } from "../shared/single-output.ts";
61
61
 
62
62
  interface ChainExecutionDetailsInput {
@@ -247,6 +247,7 @@ async function runParallelChainTasks(input: ParallelChainRunInput): Promise<Sing
247
247
  modelOverride: effectiveModel,
248
248
  availableModels: input.availableModels,
249
249
  preferredModelProvider: input.ctx.model?.provider,
250
+ currentModel: currentModelFullId(input.ctx.model),
250
251
  skills: behavior.skills === false ? [] : behavior.skills,
251
252
  onUpdate: input.onUpdate
252
253
  ? (progressUpdate) => {
@@ -796,6 +797,7 @@ export async function executeChain(params: ChainExecutionParams): Promise<ChainE
796
797
  modelOverride: effectiveModel,
797
798
  availableModels,
798
799
  preferredModelProvider: ctx.model?.provider,
800
+ currentModel: currentModelFullId(ctx.model),
799
801
  skills: behavior.skills === false ? [] : behavior.skills,
800
802
  onUpdate: onUpdate
801
803
  ? (p) => {
@@ -773,6 +773,7 @@ export async function runSync(
773
773
  agent.fallbackModels,
774
774
  options.availableModels,
775
775
  options.preferredModelProvider,
776
+ options.currentModel,
776
777
  );
777
778
  const attemptedModels: string[] = [];
778
779
  const modelAttempts: ModelAttempt[] = [];
@@ -13,7 +13,7 @@ import { handleManagementAction } from "../../agents/agent-management.ts";
13
13
  import { buildDoctorReport } from "../../extension/doctor.ts";
14
14
  import { clearPendingForegroundControlNotices } from "../../extension/control-notices.ts";
15
15
  import { runSync } from "./execution.ts";
16
- import { resolveModelCandidate } from "../shared/model-fallback.ts";
16
+ import { currentModelFullId, resolveModelCandidate } from "../shared/model-fallback.ts";
17
17
  import { aggregateParallelOutputs } from "../shared/parallel-utils.ts";
18
18
  import { recordRun } from "../shared/run-history.ts";
19
19
  import {
@@ -481,6 +481,7 @@ async function resumeAsyncRun(input: {
481
481
  cwd: input.requestCwd,
482
482
  currentSessionId: input.deps.state.currentSessionId,
483
483
  currentModelProvider: input.ctx.model?.provider,
484
+ currentModel: currentModelFullId(input.ctx.model),
484
485
  },
485
486
  cwd: effectiveCwd,
486
487
  maxOutput: input.params.maxOutput,
@@ -891,6 +892,7 @@ function runAsyncPath(data: ExecutionContextData, deps: ExecutorDeps): AgentTool
891
892
  cwd: ctx.cwd,
892
893
  currentSessionId: deps.state.currentSessionId!,
893
894
  currentModelProvider: ctx.model?.provider,
895
+ currentModel: currentModelFullId(ctx.model),
894
896
  };
895
897
  const availableModels: ModelInfo[] = ctx.modelRegistry.getAvailable().map(toModelInfo);
896
898
  const currentMaxSubagentDepth = resolveCurrentMaxSubagentDepth(deps.config.maxSubagentDepth);
@@ -1081,6 +1083,7 @@ async function runChainPath(data: ExecutionContextData, deps: ExecutorDeps): Pro
1081
1083
  cwd: ctx.cwd,
1082
1084
  currentSessionId: deps.state.currentSessionId!,
1083
1085
  currentModelProvider: ctx.model?.provider,
1086
+ currentModel: currentModelFullId(ctx.model),
1084
1087
  };
1085
1088
  const asyncChain = wrapChainTasksForFork(chainResult.requestedAsync.chain, params.context);
1086
1089
  return executeAsyncChain(id, {
@@ -1314,6 +1317,7 @@ async function runForegroundParallelTasks(input: ForegroundParallelRunInput): Pr
1314
1317
  modelOverride: input.modelOverrides[index],
1315
1318
  availableModels: input.availableModels,
1316
1319
  preferredModelProvider: input.ctx.model?.provider,
1320
+ currentModel: currentModelFullId(input.ctx.model),
1317
1321
  skills: effectiveSkills === false ? [] : effectiveSkills,
1318
1322
  onUpdate: input.onUpdate
1319
1323
  ? (progressUpdate) => {
@@ -1490,6 +1494,7 @@ async function runParallelPath(data: ExecutionContextData, deps: ExecutorDeps):
1490
1494
  cwd: ctx.cwd,
1491
1495
  currentSessionId: deps.state.currentSessionId!,
1492
1496
  currentModelProvider: ctx.model?.provider,
1497
+ currentModel: currentModelFullId(ctx.model),
1493
1498
  };
1494
1499
  const parallelTasks = tasks.map((t, i) => {
1495
1500
  const taskText = params.context === "fork" ? wrapForkTask(taskTexts[i]!) : taskTexts[i]!;
@@ -1767,6 +1772,7 @@ async function runSinglePath(data: ExecutionContextData, deps: ExecutorDeps): Pr
1767
1772
  cwd: ctx.cwd,
1768
1773
  currentSessionId: deps.state.currentSessionId!,
1769
1774
  currentModelProvider: ctx.model?.provider,
1775
+ currentModel: currentModelFullId(ctx.model),
1770
1776
  };
1771
1777
  return executeAsyncSingle(id, {
1772
1778
  agent: params.agent!,
@@ -1873,6 +1879,7 @@ async function runSinglePath(data: ExecutionContextData, deps: ExecutorDeps): Pr
1873
1879
  modelOverride,
1874
1880
  availableModels,
1875
1881
  preferredModelProvider: currentProvider,
1882
+ currentModel: currentModelFullId(ctx.model),
1876
1883
  skills: effectiveSkills,
1877
1884
  });
1878
1885
  if (foregroundControl?.currentIndex === 0) {
@@ -44,10 +44,11 @@ export function buildModelCandidates(
44
44
  fallbackModels: string[] | undefined,
45
45
  availableModels: AvailableModelInfo[] | undefined,
46
46
  preferredProvider?: string,
47
+ currentModel?: string,
47
48
  ): string[] {
48
49
  const seen = new Set<string>();
49
50
  const candidates: string[] = [];
50
- for (const raw of [primaryModel, ...(fallbackModels ?? [])]) {
51
+ for (const raw of [primaryModel, ...(fallbackModels ?? []), currentModel]) {
51
52
  if (!raw) continue;
52
53
  const normalized = resolveModelCandidate(raw.trim(), availableModels, preferredProvider);
53
54
  if (!normalized || seen.has(normalized)) continue;
@@ -57,6 +58,11 @@ export function buildModelCandidates(
57
58
  return candidates;
58
59
  }
59
60
 
61
+ export function currentModelFullId(model: { provider: string; id: string } | undefined): string | undefined {
62
+ if (!model) return undefined;
63
+ return `${String(model.provider)}/${model.id}`;
64
+ }
65
+
60
66
  const RETRYABLE_MODEL_FAILURE_PATTERNS = [
61
67
  /rate\s*limit/i,
62
68
  /too many requests/i,
@@ -484,6 +484,8 @@ export interface RunSyncOptions {
484
484
  availableModels?: Array<{ provider: string; id: string; fullId: string }>;
485
485
  /** Current parent-session provider to prefer for ambiguous bare model ids */
486
486
  preferredModelProvider?: string;
487
+ /** Current parent-session model to try after configured fallback models */
488
+ currentModel?: string;
487
489
  /** Skills to inject (overrides agent default if provided) */
488
490
  skills?: string[];
489
491
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "private": true,
5
5
  "description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction.",
6
6
  "contributors": [
@@ -45,7 +45,7 @@
45
45
  }
46
46
  },
47
47
  "dependencies": {
48
- "@mozilla/readability": "^0.5.0",
48
+ "@mozilla/readability": "^0.6.0",
49
49
  "linkedom": "^0.16.0",
50
50
  "p-limit": "^6.1.0",
51
51
  "turndown": "^7.2.0",
@@ -190,6 +190,7 @@ export default defineWorkflow("deep-research-codebase")
190
190
  let plannerModelConfig = {
191
191
  model: "openai/gpt-5.5",
192
192
  fallbackModels: [
193
+ "openai-codex/gpt-5.5",
193
194
  "github-copilot/gpt-5.5",
194
195
  "anthropic/claude-opus-4-7",
195
196
  "github-copilot/claude-opus-4.7",
@@ -201,6 +202,7 @@ export default defineWorkflow("deep-research-codebase")
201
202
  let explorerModelConfig = {
202
203
  model: "openai/gpt-5.4-mini",
203
204
  fallbackModels: [
205
+ "openai-codex/gpt-5.4-mini",
204
206
  "github-copilot/gpt-5.4-mini",
205
207
  "anthropic/claude-haiku-4-5",
206
208
  "github-copilot/claude-haiku-4.5",
@@ -157,6 +157,7 @@ export default defineWorkflow("ralph")
157
157
  let plannerModelConfig = {
158
158
  model: "openai/gpt-5.5",
159
159
  fallbackModels: [
160
+ "openai-codex/gpt-5.5",
160
161
  "github-copilot/gpt-5.5",
161
162
  "anthropic/claude-opus-4-7",
162
163
  "github-copilot/claude-opus-4.7",
@@ -168,6 +169,7 @@ export default defineWorkflow("ralph")
168
169
  let orchestratorModelConfig = {
169
170
  model: "openai/gpt-5.5",
170
171
  fallbackModels: [
172
+ "openai-codex/gpt-5.5",
171
173
  "github-copilot/gpt-5.5",
172
174
  "anthropic/claude-sonnet-4-6",
173
175
  "github-copilot/claude-sonnet-4.6",
@@ -179,6 +181,7 @@ export default defineWorkflow("ralph")
179
181
  let simplifierModelConfig = {
180
182
  model: "openai/gpt-5.5",
181
183
  fallbackModels: [
184
+ "openai-codex/gpt-5.5",
182
185
  "github-copilot/gpt-5.5",
183
186
  "anthropic/claude-sonnet-4-6",
184
187
  "github-copilot/claude-sonnet-4.6",
@@ -190,6 +193,7 @@ export default defineWorkflow("ralph")
190
193
  let reviewerModelConfig = {
191
194
  model: "openai/gpt-5.5",
192
195
  fallbackModels: [
196
+ "openai-codex/gpt-5.5",
193
197
  "github-copilot/gpt-5.5",
194
198
  "anthropic/claude-opus-4-7",
195
199
  "github-copilot/claude-opus-4.7",
@@ -201,6 +205,7 @@ export default defineWorkflow("ralph")
201
205
  let explorerModelConfig = {
202
206
  model: "openai/gpt-5.4-mini",
203
207
  fallbackModels: [
208
+ "openai-codex/gpt-5.4-mini",
204
209
  "github-copilot/gpt-5.4-mini",
205
210
  "anthropic/claude-haiku-4-5",
206
211
  "github-copilot/claude-haiku-4.5",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/workflows",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "private": true,
5
5
  "description": "pi extension for multi-stage workflow authoring and execution.",
6
6
  "contributors": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/atomic",
3
- "version": "0.8.2",
3
+ "version": "0.8.3",
4
4
  "description": "Atomic coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -47,7 +47,7 @@
47
47
  "@earendil-works/pi-tui": "^0.74.0",
48
48
  "@modelcontextprotocol/ext-apps": "^1.2.2",
49
49
  "@modelcontextprotocol/sdk": "^1.25.1",
50
- "@mozilla/readability": "^0.5.0",
50
+ "@mozilla/readability": "^0.6.0",
51
51
  "@silvia-odwyer/photon-node": "^0.3.4",
52
52
  "chalk": "^5.5.0",
53
53
  "diff": "^8.0.2",
@@ -65,7 +65,7 @@
65
65
  "typebox": "^1.1.24",
66
66
  "undici": "^7.19.1",
67
67
  "unpdf": "^1.6.2",
68
- "yaml": "^2.8.2",
68
+ "yaml": "^2.9.0",
69
69
  "zod": "^3.25.0 || ^4.0.0"
70
70
  },
71
71
  "overrides": {