fix(coding-agent): preserve override role provenance
This commit is contained in:
@@ -40,6 +40,7 @@
|
||||
- Fixed Herdr rejecting the macOS development launcher because its foreground process was reported as `bun` instead of `omp`.
|
||||
- Completed usage-aware model fallback across startup, queued turns, same-turn tool continuations, ACP/TUI confirmation cancellation, eligible account reselection, cooldown restoration, and isolated subagent settings so low-usage handoffs remain lossless and cannot consume cancelled queued work.
|
||||
- Fixed Agent Hub opening and selection becoming O(all rows) on large rosters: row rendering is now lazy around the selected viewport, and observer lookup is O(1) by id instead of copy-sorting every session per row.
|
||||
- Fixed persisted Agent Hub rows dropping an explicit caller model role when a subagent used a model override, preserving role provenance after restart.
|
||||
- Fixed the bash interceptor blocking `grep`/`cat`/`find` used as a downstream pipeline stage (e.g. `printf 'x\n' | grep x`); a stage consuming piped stdin cannot be replaced by a path-based dedicated tool, so it is no longer matched, while standalone and first-stage searches stay intercepted ([#7496](https://github.com/can1357/oh-my-pi/issues/7496)).
|
||||
- Fixed floating rejections from cmux browser guest JavaScript terminating the main process and every active session; attributable rejections now fail the browser run as tool errors while unrelated process rejections retain the fatal path ([#7365](https://github.com/can1357/oh-my-pi/issues/7365)).
|
||||
- Fixed the Windows bash tool silently taking down the whole omp process when a command blocked until its timeout: cancelling a timed-out run walked the spawned child's descendant tree from raw `th32ParentProcessID` links, and a recycled pid matching the harness's stale recorded parent pid could enumerate omp as a false descendant and `TerminateProcess` it, killing the session with no `session_exit` record. Run-cancellation sweeps now refuse to signal the harness or any process collected beneath it, while still reaping the timed-out target when it owns a recycled ancestor pid ([#7452](https://github.com/can1357/oh-my-pi/issues/7452)).
|
||||
|
||||
@@ -3127,7 +3127,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
||||
task,
|
||||
tools: session.getActiveToolNames(),
|
||||
agent: agent.name,
|
||||
modelRole: modelRole ?? resolveExplicitModelRole(agent.model, subagentSettings),
|
||||
modelRole: modelRole ?? resolveExplicitModelRole(modelOverride ?? agent.model, subagentSettings),
|
||||
resolvedModel: progress.resolvedModel,
|
||||
readOnly: isReadOnlyAgent(agent),
|
||||
spawns: spawnsEnv,
|
||||
|
||||
@@ -365,4 +365,25 @@ describe("runSubprocess parent-discovery pass-through (issue #2190)", () => {
|
||||
const forwarded = spy.mock.calls[0]?.[0];
|
||||
expect(forwarded?.thinkingLevel).toBe(ThinkingLevel.Low);
|
||||
});
|
||||
it("persists an explicit role from a caller model override", async () => {
|
||||
const model = getBundledModel("anthropic", "claude-sonnet-4-5");
|
||||
if (!model) throw new Error("Expected claude-sonnet-4-5 model to exist");
|
||||
const settings = Settings.isolated({
|
||||
modelRoles: { reviewer: `${model.provider}/${model.id}` },
|
||||
});
|
||||
const session = yieldEmittingSession();
|
||||
const initSpy = vi.spyOn(session.sessionManager, "appendSessionInit");
|
||||
vi.spyOn(sdkModule, "createAgentSession").mockResolvedValue(createSessionResult(session));
|
||||
|
||||
const result = await runSubprocess({
|
||||
...baseOptions,
|
||||
id: "subagent-model-override-role",
|
||||
modelOverride: "@reviewer",
|
||||
settings,
|
||||
modelRegistry: createModelRegistry(model),
|
||||
});
|
||||
|
||||
expect(result.exitCode).toBe(0);
|
||||
expect(initSpy).toHaveBeenCalledWith(expect.objectContaining({ modelRole: "reviewer" }));
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user