diff --git a/apps/server/scripts/record-codex-app-server-replay-fixture.ts b/apps/server/scripts/record-codex-app-server-replay-fixture.ts index d1ca60e411f7..1826f0a3675b 100644 --- a/apps/server/scripts/record-codex-app-server-replay-fixture.ts +++ b/apps/server/scripts/record-codex-app-server-replay-fixture.ts @@ -31,6 +31,7 @@ import { SUBAGENT_CONTINUE_PARENT_PROMPT, SUBAGENT_CONTINUE_PROMPT, SUBAGENT_PROMPT, + SUBAGENT_V2_APPROVAL_PROMPT, SUBAGENT_V2_PROMPT, SUBAGENT_V2_NESTED_PROMPT, THREAD_ROLLBACK_AFTER_PROMPT, @@ -86,6 +87,7 @@ const SCENARIO_NAMES = [ "subagent", "subagent_continue", "subagent_v2", + "subagent_v2_approval", "subagent_v2_nested", "multi_turn", "queued_turn", @@ -469,6 +471,31 @@ function scenarios(): ReadonlyArray { }, ], }, + { + name: "subagent_v2_approval", + fileName: "subagent_v2_approval.ndjson", + description: + "One root turn in approval-required mode whose multi-agent v2 subagent runs a command that needs approval.", + runs: [ + { + name: "spawn-v2-subagent-needing-approval", + description: + "The child inherits the root's approval policy, so its write asks the client for approval on the child's native thread and turn.", + // The adapter's approval-required turn defaults. + turnDefaults: { + approvalPolicy: "untrusted", + sandboxPolicy: { type: "readOnly" }, + }, + steps: [ + { + type: "turn", + label: "spawn-v2-subagent-needing-approval", + prompt: SUBAGENT_V2_APPROVAL_PROMPT, + }, + ], + }, + ], + }, { name: "subagent_v2_nested", fileName: "subagent_v2_nested.ndjson", diff --git a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts index c2610d3630db..5cb6c7671357 100644 --- a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts @@ -1069,6 +1069,26 @@ interface CodexSubagentThreadContext { task: OrchestrationV2Subagent; } +/** + * The top-level turn a (possibly nested) subagent turn runs under, and the + * subagent on that turn's thread that leads to it. Native subagent threads are + * hidden from the sidebar, so their approvals are asked there instead. + */ +const approvalOwnerCodexTurn = ( + context: ActiveCodexTurnContext, +): { + readonly owner: ActiveCodexTurnContext; + readonly subagent: CodexSubagentThreadContext | null; +} => { + let owner = context; + let subagent: CodexSubagentThreadContext | null = null; + while (owner.subagent !== null) { + subagent = owner.subagent; + owner = owner.subagent.parentContext; + } + return { owner, subagent }; +}; + const isDescendantCodexTurn = ( candidate: ActiveCodexTurnContext, ancestor: ActiveCodexTurnContext, @@ -3464,37 +3484,42 @@ export function makeCodexAdapterV2(adapterOptions: CodexAdapterV2Options): Provi }) => Effect.gen(function* () { const createdAt = yield* DateTime.now; - const parentNodeId = idAllocator.derive.nodeFromProviderItem({ - driver: CODEX_PROVIDER, - nativeItemId: input.nativeItemId, - }); + // A subagent's approval is asked on the top-level thread and run, + // under the subagent that asked, where the user can see and answer it. + const { owner, subagent } = approvalOwnerCodexTurn(input.context); + const parentNodeId = + subagent?.subagentNodeId ?? + idAllocator.derive.nodeFromProviderItem({ + driver: CODEX_PROVIDER, + nativeItemId: input.nativeItemId, + }); const ordinal = yield* resolveItemOrdinal( - input.context, + owner, `${input.nativeItemId}:approval:${input.nativeRequestId}`, ); const requestId = yield* idAllocator.allocate.runtimeRequest({ driver: CODEX_PROVIDER, - providerTurnId: input.context.providerTurnId, + providerTurnId: owner.providerTurnId, nativeRequestId: input.nativeRequestId, }); const nodeId = idAllocator.derive.approvalNode({ requestId }); - const providerSessionId = input.context.input.providerThread.providerSessionId; + const providerSessionId = owner.input.providerThread.providerSessionId; if (providerSessionId === null) { return yield* toProtocolError( - `Provider thread ${input.context.providerThread.id} is missing a provider session id.`, + `Provider thread ${owner.providerThread.id} is missing a provider session id.`, ); } const node: OrchestrationV2ExecutionNode = { id: nodeId, - threadId: input.context.projectionThreadId, - runId: input.context.projectionRunId, + threadId: owner.projectionThreadId, + runId: owner.projectionRunId, parentNodeId, - rootNodeId: input.context.rootNodeId, + rootNodeId: owner.rootNodeId, kind: "approval_request", status: "waiting", countsForRun: false, - providerThreadId: input.context.providerThread.id, - providerTurnId: input.context.providerTurnId, + providerThreadId: owner.providerThread.id, + providerTurnId: owner.providerTurnId, nativeItemRef: codexNativeItemRef(input.nativeItemId), runtimeRequestId: requestId, checkpointScopeId: null, @@ -3504,7 +3529,7 @@ export function makeCodexAdapterV2(adapterOptions: CodexAdapterV2Options): Provi const request: OrchestrationV2RuntimeRequest = { id: requestId, nodeId, - providerTurnId: input.context.providerTurnId, + providerTurnId: owner.providerTurnId, nativeRequestRef: { driver: CODEX_PROVIDER, nativeId: input.nativeRequestId, @@ -3521,11 +3546,11 @@ export function makeCodexAdapterV2(adapterOptions: CodexAdapterV2Options): Provi }; const turnItem: OrchestrationV2TurnItem = { id: idAllocator.derive.approvalTurnItem({ requestId }), - threadId: input.context.projectionThreadId, - runId: input.context.projectionRunId, + threadId: owner.projectionThreadId, + runId: owner.projectionRunId, nodeId, - providerThreadId: input.context.providerThread.id, - providerTurnId: input.context.providerTurnId, + providerThreadId: owner.providerThread.id, + providerTurnId: owner.providerTurnId, nativeItemRef: codexNativeItemRef(input.nativeItemId), parentItemId: null, ordinal, diff --git a/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts b/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts index 6a8c1f6e34f5..feff486e03f2 100644 --- a/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/CodexReplayFixtures.integration.test.ts @@ -154,6 +154,18 @@ const scenarioExpectations = { turnCompletedCount: 2, approvalRequestCount: 0, }, + subagent_v2_approval: { + outgoing: ["initialize", "initialized", "thread/start", "turn/start"], + incoming: [ + "item/commandExecution/requestApproval", + "serverRequest/resolved", + "item/completed", + "turn/completed", + ], + turnStartCount: 1, + turnCompletedCount: 2, + approvalRequestCount: 1, + }, subagent_v2_nested: { outgoing: ["initialize", "initialized", "thread/start", "turn/start"], incoming: ["turn/started", "item/completed", "item/agentMessage/delta", "turn/completed"], diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts index e4ad86c397bd..401a2407d980 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorScenario.ts @@ -82,6 +82,8 @@ export type OrchestratorV2ScenarioStep = readonly commandId: CommandId; readonly decision?: ProviderApprovalDecision; readonly answers?: ProviderUserInputAnswers; + /** Captures the shell snapshot under this key while the request is pending. */ + readonly shellSnapshotKeyWhilePending?: string; }; export interface OrchestratorV2Scenario { @@ -556,6 +558,12 @@ export function runOrchestratorV2Scenario( break; case "respond_to_next_runtime_request": { const request = yield* waitForPendingRuntimeRequest(step.threadId); + if (step.shellSnapshotKeyWhilePending !== undefined) { + capturedShellSnapshots.set( + step.shellSnapshotKeyWhilePending, + yield* orchestrator.getShellSnapshot(), + ); + } const result = yield* orchestrator.dispatch({ type: "runtime-request.respond", commandId: step.commandId, diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/index.ts b/apps/server/src/orchestration-v2/testkit/fixtures/index.ts index 768feb5e5ef3..d32e59f865c8 100644 --- a/apps/server/src/orchestration-v2/testkit/fixtures/index.ts +++ b/apps/server/src/orchestration-v2/testkit/fixtures/index.ts @@ -67,6 +67,11 @@ import { assertSubagentContinueOutput } from "./subagent_continue/codex_output.t import { subagentContinueInput } from "./subagent_continue/input.ts"; import { assertSubagentV2Output } from "./subagent_v2/codex_output.ts"; import { subagentV2Input, subagentV2NestedInput } from "./subagent_v2/input.ts"; +import { assertSubagentV2ApprovalOutput } from "./subagent_v2_approval/codex_output.ts"; +import { + SUBAGENT_V2_APPROVAL_POLICY, + subagentV2ApprovalInput, +} from "./subagent_v2_approval/input.ts"; import { assertSubagentV2NestedOutput } from "./subagent_v2_nested/codex_output.ts"; import { assertClaudeThreadRollbackOutput } from "./thread_rollback/claude_output.ts"; import { assertThreadRollbackOutput } from "./thread_rollback/codex_output.ts"; @@ -577,6 +582,19 @@ export const ORCHESTRATOR_REPLAY_FIXTURES: ReadonlyArray subagent-approval.txt and then reply with exactly: Written. Wait for it to finish, then reply with exactly what it said."; export const OPENCODE_SUBAGENT_PROMPT = "Use the task tool exactly once. Delegate to the general subagent with this prompt: Respond exactly CHILD_OK. After the task completes, respond exactly PARENT_OK."; export const SUBAGENT_CONTINUE_PROMPT = @@ -225,6 +227,8 @@ export type OrchestratorFixtureInputStep = OrchestrationV2Command, { readonly type: "runtime-request.respond" } >["decision"]; + /** Captures the shell snapshot under this key while the request is pending. */ + readonly shellSnapshotKeyWhilePending?: string; } | { readonly type: "answer_next_user_input_request"; @@ -660,6 +664,9 @@ export function materializeFixtureInput(input: { threadId: ids.threadId, commandId: commands.at(-1)!.commandId, decision: step.decision ?? "accept", + ...(step.shellSnapshotKeyWhilePending === undefined + ? {} + : { shellSnapshotKeyWhilePending: step.shellSnapshotKeyWhilePending }), }; steps.push({ type: "advance_clock", duration: "1 millis" }); steps.push({ type: "await_thread_idle", threadId: ids.threadId }); diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/codex_output.ts b/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/codex_output.ts new file mode 100644 index 000000000000..bc4a61641a07 --- /dev/null +++ b/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/codex_output.ts @@ -0,0 +1,87 @@ +import { assert } from "@effect/vitest"; +import type { ProviderReplayTranscript } from "@t3tools/contracts"; + +import type { OrchestratorV2ScenarioResult } from "../../OrchestratorScenario.ts"; +import { + assertBaseProjection, + assertSemanticProjectionIntegrity, + assertUserMessagesInclude, + projectionFor, + SUBAGENT_V2_APPROVAL_PROMPT, +} from "../shared.ts"; +import { SUBAGENT_APPROVAL_PENDING_SHELL_KEY } from "./input.ts"; + +/** + * A multi-agent v2 child inherits the root's approval policy, and Codex asks + * for its command approval on the child's own native thread and turn. The + * request is asked on the parent thread and run instead, under the subagent, + * because native subagent threads are hidden from the sidebar. + */ +export function assertSubagentV2ApprovalOutput( + result: OrchestratorV2ScenarioResult, + transcript: ProviderReplayTranscript, +) { + assertBaseProjection({ result, transcript, runCount: 1, runStatuses: ["completed"] }); + + const projection = projectionFor(result, transcript.scenario); + assertSemanticProjectionIntegrity(projection); + assertUserMessagesInclude(projection, [SUBAGENT_V2_APPROVAL_PROMPT]); + const run = projection.runs[0]!; + + assert.lengthOf(projection.subagents, 1); + const subagent = projection.subagents[0]!; + assert.equal(subagent.origin, "provider_native"); + assert.equal(subagent.status, "completed"); + assert.equal(subagent.result, "Written."); + assert.isNotNull(subagent.childThreadId); + + const requests = projection.runtimeRequests; + assert.lengthOf(requests, 1); + const request = requests[0]!; + assert.equal(request.kind, "command"); + assert.equal(request.status, "resolved"); + assert.equal(request.decision, "accept"); + assert.equal( + projection.providerTurns.find((turn) => turn.id === request.providerTurnId)?.runAttemptId, + run.activeAttemptId, + "the request belongs to the parent's root provider turn", + ); + + const node = projection.nodes.find((candidate) => candidate.id === request.nodeId); + assert.isDefined(node); + assert.equal(node.kind, "approval_request"); + assert.equal(node.runId, run.id); + assert.equal(node.parentNodeId, subagent.id, "the approval hangs off the subagent that asked"); + assert.equal(node.status, "completed"); + + const approvalItems = projection.turnItems.filter((item) => item.type === "approval_request"); + assert.lengthOf(approvalItems, 1); + const approval = approvalItems[0]!; + assert.equal(approval.runId, run.id); + assert.equal(approval.status, "completed"); + if (approval.type !== "approval_request") throw new Error("expected an approval item"); + assert.equal(approval.requestId, request.id); + assert.include(approval.prompt ?? "", "subagent-approval.txt"); + + // While Codex waited, the parent reported the approval and the child did not. + const pendingShell = result.capturedShellSnapshots.get(SUBAGENT_APPROVAL_PENDING_SHELL_KEY); + assert.isDefined(pendingShell); + const parentShell = pendingShell.threads.find((thread) => thread.id === projection.thread.id); + assert.equal(parentShell?.pendingRuntimeRequest?.id, request.id); + const childShell = pendingShell.threads.find((thread) => thread.id === subagent.childThreadId); + assert.isDefined(childShell, "the child thread exists while its approval is pending"); + assert.isNull(childShell.pendingRuntimeRequest); + + // The child keeps its own work and answer, and never holds a request. + const child = result.projections.get(subagent.childThreadId!); + assert.isDefined(child); + assert.lengthOf(child.runtimeRequests, 0); + assert.isFalse(child.turnItems.some((item) => item.type === "approval_request")); + const command = child.turnItems.find((item) => item.type === "command_execution"); + assert.equal(command?.status, "completed"); + assert.isTrue( + child.turnItems.some( + (item) => item.type === "assistant_message" && item.text.includes("Written."), + ), + ); +} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/codex_transcript.ndjson b/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/codex_transcript.ndjson new file mode 100644 index 000000000000..46ab28068596 --- /dev/null +++ b/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/codex_transcript.ndjson @@ -0,0 +1,68 @@ +{"type":"transcript_start","provider":"codex","protocol":"codex.app-server","version":"0.156.1","scenario":"subagent_v2_approval","metadata":{"source":"record-codex-app-server-replay-fixture","fileName":"subagent_v2_approval.ndjson","description":"One root turn in approval-required mode whose multi-agent v2 subagent runs a command that needs approval.","model":"gpt-6-luna"}} +{"type":"expect_outbound","label":"initialize","frame":{"id":1,"method":"initialize","params":{"capabilities":{"experimentalApi":true,"optOutNotificationMethods":["turn/diff/updated"]},"clientInfo":{"name":"t3code_desktop","title":"T3 Code Desktop","version":"0.1.0"}}}} +{"type":"emit_inbound","label":"initialize","frame":{"id":1,"result":{"userAgent":"t3code_desktop/0.156.1 (Debian 13.0.0; x86_64) unknown (t3code_desktop; 0.1.0)","codexHome":"/home/replay-user/tmp/codex-subagent-approval-rec/codex-home","platformFamily":"unix","platformOs":"linux"}}} +{"type":"expect_outbound","label":"initialized","frame":{"method":"initialized"}} +{"type":"expect_outbound","label":"thread/start","frame":{"id":2,"method":"thread/start","params":{"config":{"tools.update_plan.enabled":true},"cwd":"","model":"gpt-6-luna"}}} +{"type":"emit_inbound","label":"configWarning","frame":{"method":"configWarning","params":{"summary":"Codex could not find bubblewrap on PATH. Install bubblewrap with your OS package manager. See the sandbox prerequisites: https://developers.openai.com/codex/concepts/sandboxing#prerequisites. Codex will use the bundled bubblewrap in the meantime.","details":null},"emittedAtMs":1790368128814}} +{"type":"emit_inbound","label":"remoteControl/status/changed","frame":{"method":"remoteControl/status/changed","params":{"status":"disabled","serverName":"replay-host","installationId":"00000000-0000-4000-8000-000000000000","environmentId":null},"emittedAtMs":1790368128814}} +{"type":"emit_inbound","label":"account/updated","frame":{"method":"account/updated","params":{"authMode":"chatgpt","planType":"unknown"},"emittedAtMs":1790368129787}} +{"type":"emit_inbound","label":"thread/start","frame":{"id":2,"result":{"thread":{"id":"01a0da41-a28d-7271-b6f6-59123b5bb248","environments":[{"environmentId":"local","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","runtimeWorkspaceRoots":["/home/replay-user/tmp/codex-subagent-approval-rec/repo"]}],"extra":null,"sessionId":"01a0da41-a28d-7271-b6f6-59123b5bb248","forkedFromId":null,"parentThreadId":null,"preview":"","ephemeral":false,"section":null,"sectionEnteredAt":null,"projectId":null,"historyMode":"paginated","modelProvider":"openai","model":"gpt-6-luna","reasoningEffort":null,"createdAt":1790368129,"updatedAt":1790368129,"recencyAt":1790368129,"status":{"type":"idle"},"path":"/home/replay-user/tmp/codex-subagent-approval-rec/codex-home/sessions/2026/09/25/rollout-2026-09-25T13-28-49-01a0da41-a28d-7271-b6f6-59123b5bb248.jsonl","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","cliVersion":"0.156.1","originator":"t3code_desktop","source":"vscode","canAcceptDirectInput":true,"threadSource":null,"agentNickname":null,"agentRole":null,"gitInfo":null,"name":null,"daybreakEnabled":null,"turns":[]},"model":"gpt-6-luna","modelProvider":"openai","serviceTier":null,"disabledPluginIds":[],"cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","runtimeWorkspaceRoots":["/home/replay-user/tmp/codex-subagent-approval-rec/repo"],"instructionSources":[],"approvalPolicy":"on-request","approvalsReviewer":"user","sandbox":{"type":"workspaceWrite","writableRoots":[],"networkAccess":false,"excludeTmpdirEnvVar":false,"excludeSlashTmp":false},"activePermissionProfile":{"id":":workspace","extends":null},"reasoningEffort":null,"multiAgentMode":"explicitRequestOnly"}}} +{"type":"expect_outbound","label":"turn/start","frame":{"id":3,"method":"turn/start","params":{"approvalPolicy":"untrusted","approvalsReviewer":"user","cwd":"","input":[{"text":"Do not run any commands yourself. Spawn one subagent whose only task is to run this exact shell command: printf 'subagent approval fixture' > subagent-approval.txt and then reply with exactly: Written. Wait for it to finish, then reply with exactly what it said.","type":"text"}],"model":"gpt-6-luna","sandboxPolicy":{"type":"readOnly"},"summary":"detailed","threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248"}}} +{"type":"emit_inbound","label":"thread/started","frame":{"method":"thread/started","params":{"thread":{"id":"01a0da41-a28d-7271-b6f6-59123b5bb248","environments":[{"environmentId":"local","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","runtimeWorkspaceRoots":["/home/replay-user/tmp/codex-subagent-approval-rec/repo"]}],"extra":null,"sessionId":"01a0da41-a28d-7271-b6f6-59123b5bb248","forkedFromId":null,"parentThreadId":null,"preview":"","ephemeral":false,"section":null,"sectionEnteredAt":null,"projectId":null,"historyMode":"paginated","modelProvider":"openai","model":"gpt-6-luna","reasoningEffort":null,"createdAt":1790368129,"updatedAt":1790368129,"recencyAt":1790368129,"status":{"type":"idle"},"path":"/home/replay-user/tmp/codex-subagent-approval-rec/codex-home/sessions/2026/09/25/rollout-2026-09-25T13-28-49-01a0da41-a28d-7271-b6f6-59123b5bb248.jsonl","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","cliVersion":"0.156.1","originator":"t3code_desktop","source":"vscode","canAcceptDirectInput":true,"threadSource":null,"agentNickname":null,"agentRole":null,"gitInfo":null,"name":null,"daybreakEnabled":null,"turns":[]}},"emittedAtMs":1790368129812}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","name":"codex_apps","status":"starting","error":null,"failureReason":null},"emittedAtMs":1790368129813}} +{"type":"emit_inbound","label":"thread/settings/updated","frame":{"method":"thread/settings/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","threadSettings":{"disabledPluginIds":[],"cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","approvalPolicy":"untrusted","approvalsReviewer":"user","sandboxPolicy":{"type":"readOnly","networkAccess":false},"activePermissionProfile":null,"model":"gpt-6-luna","modelProvider":"openai","serviceTier":null,"effort":null,"summary":"detailed","collaborationMode":{"mode":"default","settings":{"model":"gpt-6-luna","reasoning_effort":null,"developer_instructions":null}},"multiAgentMode":"explicitRequestOnly","personality":null}},"emittedAtMs":1790368129830}} +{"type":"emit_inbound","label":"turn/start","frame":{"id":3,"result":{"turn":{"id":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","items":[],"itemsView":"notLoaded","status":"inProgress","error":null,"startedAt":null,"completedAt":null,"durationMs":null}}}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","status":{"type":"active","activeFlags":[]}},"emittedAtMs":1790368129893}} +{"type":"emit_inbound","label":"turn/started","frame":{"method":"turn/started","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turn":{"id":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","items":[],"itemsView":"notLoaded","status":"inProgress","error":null,"startedAt":1790368129,"completedAt":null,"durationMs":null}},"emittedAtMs":1790368129894}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","name":"codex_apps","status":"ready","error":null,"failureReason":null},"emittedAtMs":1790368131004}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"userMessage","id":"01a0da41-ac10-7ad2-a779-d1aee58f271c","clientId":null,"content":[{"type":"text","text":"Do not run any commands yourself. Spawn one subagent whose only task is to run this exact shell command: printf 'subagent approval fixture' > subagent-approval.txt and then reply with exactly: Written. Wait for it to finish, then reply with exactly what it said.","text_elements":[]}]},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368132116},"emittedAtMs":1790368132117}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"userMessage","id":"01a0da41-ac10-7ad2-a779-d1aee58f271c","clientId":null,"content":[{"type":"text","text":"Do not run any commands yourself. Spawn one subagent whose only task is to run this exact shell command: printf 'subagent approval fixture' > subagent-approval.txt and then reply with exactly: Written. Wait for it to finish, then reply with exactly what it said.","text_elements":[]}]},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368132116},"emittedAtMs":1790368132137}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","name":"xcodebuildmcp","status":"starting","error":null,"failureReason":null},"emittedAtMs":1790368132176}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"reasoning","id":"rs_03696b8961937e5c016ab6d985d13487d0ae3d53faf40c3669","summary":[],"content":[]},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368134121},"emittedAtMs":1790368134121}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","name":"xcodebuildmcp","status":"ready","error":null,"failureReason":null},"emittedAtMs":1790368134863}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","name":"codex_apps","status":"ready","error":null,"failureReason":null},"emittedAtMs":1790368134863}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"reasoning","id":"rs_03696b8961937e5c016ab6d985d13487d0ae3d53faf40c3669","summary":[],"content":[]},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368136187},"emittedAtMs":1790368136192}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","status":{"type":"idle"}},"emittedAtMs":1790368136376}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"subAgentActivity","id":"call_KrtWrCMa1IBTJ4JEr5CvdJMs","kind":"started","agentThreadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","agentPath":"/root/fixture_writer"},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368136376},"emittedAtMs":1790368136377}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","name":"codex_apps","status":"starting","error":null,"failureReason":null},"emittedAtMs":1790368136377}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"subAgentActivity","id":"call_KrtWrCMa1IBTJ4JEr5CvdJMs","kind":"started","agentThreadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","agentPath":"/root/fixture_writer"},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368136377},"emittedAtMs":1790368136381}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","status":{"type":"active","activeFlags":[]}},"emittedAtMs":1790368136395}} +{"type":"emit_inbound","label":"turn/started","frame":{"method":"turn/started","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turn":{"id":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","items":[],"itemsView":"notLoaded","status":"inProgress","error":null,"startedAt":1790368136,"completedAt":null,"durationMs":null}},"emittedAtMs":1790368136395}} +{"type":"emit_inbound","label":"thread/tokenUsage/updated","frame":{"method":"thread/tokenUsage/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","tokenUsage":{"total":{"totalTokens":16107,"inputTokens":15998,"cachedInputTokens":0,"cacheWriteInputTokens":0,"outputTokens":109,"reasoningOutputTokens":46},"last":{"totalTokens":16107,"inputTokens":15998,"cachedInputTokens":0,"cacheWriteInputTokens":0,"outputTokens":109,"reasoningOutputTokens":46},"modelContextWindow":258400}},"emittedAtMs":1790368136473}} +{"type":"emit_inbound","label":"mcpServer/startupStatus/updated","frame":{"method":"mcpServer/startupStatus/updated","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","name":"codex_apps","status":"ready","error":null,"failureReason":null},"emittedAtMs":1790368137065}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"reasoning","id":"rs_03696b8961937e5c016ab6d989e28087d0ba611ea28e22e961","summary":[],"content":[]},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368138194},"emittedAtMs":1790368138194}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"reasoning","id":"rs_0ea6a125bc4e7661016ab6d98afc1c87d08fca86b24dc3e360","summary":[],"content":[]},"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","startedAtMs":1790368139416},"emittedAtMs":1790368139416}} +{"type":"emit_inbound","label":"item/reasoning/summaryPartAdded","frame":{"method":"item/reasoning/summaryPartAdded","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","itemId":"rs_03696b8961937e5c016ab6d989e28087d0ba611ea28e22e961","summaryIndex":0},"emittedAtMs":1790368140041}} +{"type":"emit_inbound","label":"item/reasoning/summaryTextDelta","frame":{"method":"item/reasoning/summaryTextDelta","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","itemId":"rs_03696b8961937e5c016ab6d989e28087d0ba611ea28e22e961","delta":"**Waiting for agent**","summaryIndex":0},"emittedAtMs":1790368140041}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"reasoning","id":"rs_03696b8961937e5c016ab6d989e28087d0ba611ea28e22e961","summary":["**Waiting for agent**"],"content":[]},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368140127},"emittedAtMs":1790368140130}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"collabAgentToolCall","id":"call_XpVU6N1lxEZ9sxJ0yPNh4dl5","tool":"wait","status":"inProgress","senderThreadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","receiverThreadIds":[],"prompt":null,"model":null,"reasoningEffort":null,"agentsStates":{}},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368140195},"emittedAtMs":1790368140195}} +{"type":"emit_inbound","label":"item/reasoning/summaryPartAdded","frame":{"method":"item/reasoning/summaryPartAdded","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","itemId":"rs_0ea6a125bc4e7661016ab6d98afc1c87d08fca86b24dc3e360","summaryIndex":0},"emittedAtMs":1790368145350}} +{"type":"emit_inbound","label":"item/reasoning/summaryTextDelta","frame":{"method":"item/reasoning/summaryTextDelta","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","itemId":"rs_0ea6a125bc4e7661016ab6d98afc1c87d08fca86b24dc3e360","delta":"**Preparing fixture creation**","summaryIndex":0},"emittedAtMs":1790368145352}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"reasoning","id":"rs_0ea6a125bc4e7661016ab6d98afc1c87d08fca86b24dc3e360","summary":["**Preparing fixture creation**"],"content":[]},"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","completedAtMs":1790368145433},"emittedAtMs":1790368145437}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","status":{"type":"active","activeFlags":["waitingOnApproval"]}},"emittedAtMs":1790368145789}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"commandExecution","id":"exec-27a5374a-5e64-4a9b-88ff-8e1f77aa9745","pluginId":null,"scriptPath":null,"command":"/bin/bash -lc \"printf 'subagent approval fixture' > subagent-approval.txt\"","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","processId":null,"source":"agent","status":"inProgress","commandActions":[{"type":"unknown","command":"printf 'subagent approval fixture' > subagent-approval.txt"}],"aggregatedOutput":null,"exitCode":null,"durationMs":null},"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","startedAtMs":1790368145794},"emittedAtMs":1790368145794}} +{"type":"emit_inbound","label":"item/commandExecution/requestApproval","frame":{"method":"item/commandExecution/requestApproval","id":0,"params":{"kind":"command","threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","itemId":"exec-27a5374a-5e64-4a9b-88ff-8e1f77aa9745","startedAtMs":1790368145788,"environmentId":"local","command":"/bin/bash -lc \"printf 'subagent approval fixture' > subagent-approval.txt\"","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","commandActions":[{"type":"unknown","command":"printf 'subagent approval fixture' > subagent-approval.txt"}],"proposedExecpolicyAmendment":["/bin/bash","-lc","printf 'subagent approval fixture' > subagent-approval.txt"],"availableDecisions":["accept",{"acceptWithExecpolicyAmendment":{"execpolicy_amendment":["/bin/bash","-lc","printf 'subagent approval fixture' > subagent-approval.txt"]}},"cancel"]}}} +{"type":"expect_outbound","label":"item/commandExecution/requestApproval","frame":{"id":0,"result":{"decision":"accept"}}} +{"type":"emit_inbound","label":"serverRequest/resolved","frame":{"method":"serverRequest/resolved","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","requestId":0},"emittedAtMs":1790368145799}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","status":{"type":"active","activeFlags":[]}},"emittedAtMs":1790368145800}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"commandExecution","id":"exec-27a5374a-5e64-4a9b-88ff-8e1f77aa9745","pluginId":null,"scriptPath":null,"command":"/bin/bash -lc \"printf 'subagent approval fixture' > subagent-approval.txt\"","cwd":"/home/replay-user/tmp/codex-subagent-approval-rec/repo","processId":"47188","source":"unifiedExecStartup","status":"completed","commandActions":[{"type":"unknown","command":"printf 'subagent approval fixture' > subagent-approval.txt"}],"aggregatedOutput":null,"exitCode":0,"durationMs":0},"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","completedAtMs":1790368145951},"emittedAtMs":1790368145965}} +{"type":"emit_inbound","label":"thread/tokenUsage/updated","frame":{"method":"thread/tokenUsage/updated","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","tokenUsage":{"total":{"totalTokens":17491,"inputTokens":17352,"cachedInputTokens":0,"cacheWriteInputTokens":0,"outputTokens":139,"reasoningOutputTokens":74},"last":{"totalTokens":17491,"inputTokens":17352,"cachedInputTokens":0,"cacheWriteInputTokens":0,"outputTokens":139,"reasoningOutputTokens":74},"modelContextWindow":258400}},"emittedAtMs":1790368145978}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"agentMessage","id":"msg_0ea6a125bc4e7661016ab6d993285087d0bc47d8d520fbc6a7","text":"","phase":"final_answer","memoryCitation":null,"delivery":null,"questions":null},"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","startedAtMs":1790368147365},"emittedAtMs":1790368147365}} +{"type":"emit_inbound","label":"item/agentMessage/delta","frame":{"method":"item/agentMessage/delta","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","itemId":"msg_0ea6a125bc4e7661016ab6d993285087d0bc47d8d520fbc6a7","delta":"Written"},"emittedAtMs":1790368147365}} +{"type":"emit_inbound","label":"item/agentMessage/delta","frame":{"method":"item/agentMessage/delta","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","itemId":"msg_0ea6a125bc4e7661016ab6d993285087d0bc47d8d520fbc6a7","delta":"."},"emittedAtMs":1790368147365}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"agentMessage","id":"msg_0ea6a125bc4e7661016ab6d993285087d0bc47d8d520fbc6a7","text":"Written.","phase":"final_answer","memoryCitation":null,"delivery":null,"questions":null},"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","completedAtMs":1790368147439},"emittedAtMs":1790368147455}} +{"type":"emit_inbound","label":"thread/tokenUsage/updated","frame":{"method":"thread/tokenUsage/updated","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turnId":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","tokenUsage":{"total":{"totalTokens":35012,"inputTokens":34867,"cachedInputTokens":17152,"cacheWriteInputTokens":0,"outputTokens":145,"reasoningOutputTokens":74},"last":{"totalTokens":17521,"inputTokens":17515,"cachedInputTokens":17152,"cacheWriteInputTokens":0,"outputTokens":6,"reasoningOutputTokens":0},"modelContextWindow":258400}},"emittedAtMs":1790368147513}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"subAgentActivity","id":"subagent-completed-01a0da41-bcb8-7a32-ad7a-f16d41eac795","kind":"completed","agentThreadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","agentPath":"/root/fixture_writer"},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368147526},"emittedAtMs":1790368147527}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","status":{"type":"idle"}},"emittedAtMs":1790368147527}} +{"type":"emit_inbound","label":"turn/completed","frame":{"method":"turn/completed","params":{"threadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","turn":{"id":"01a0da41-bcb8-7a32-ad7a-f16d41eac795","items":[{"type":"agentMessage","id":"msg_0ea6a125bc4e7661016ab6d993285087d0bc47d8d520fbc6a7","text":"Written.","phase":"final_answer","memoryCitation":null,"delivery":null,"questions":null}],"itemsView":"summary","status":"completed","error":null,"startedAt":1790368136,"completedAt":1790368147,"durationMs":11143}},"emittedAtMs":1790368147527}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"subAgentActivity","id":"subagent-completed-01a0da41-bcb8-7a32-ad7a-f16d41eac795","kind":"completed","agentThreadId":"01a0da41-bc86-72e1-a30c-e59a4079f55a","agentPath":"/root/fixture_writer"},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368147526},"emittedAtMs":1790368147531}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"collabAgentToolCall","id":"call_XpVU6N1lxEZ9sxJ0yPNh4dl5","tool":"wait","status":"completed","senderThreadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","receiverThreadIds":[],"prompt":null,"model":null,"reasoningEffort":null,"agentsStates":{}},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368147531},"emittedAtMs":1790368147534}} +{"type":"emit_inbound","label":"thread/tokenUsage/updated","frame":{"method":"thread/tokenUsage/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","tokenUsage":{"total":{"totalTokens":32268,"inputTokens":32127,"cachedInputTokens":15104,"cacheWriteInputTokens":0,"outputTokens":141,"reasoningOutputTokens":54},"last":{"totalTokens":16161,"inputTokens":16129,"cachedInputTokens":15104,"cacheWriteInputTokens":0,"outputTokens":32,"reasoningOutputTokens":8},"modelContextWindow":258400}},"emittedAtMs":1790368147549}} +{"type":"emit_inbound","label":"item/started","frame":{"method":"item/started","params":{"item":{"type":"agentMessage","id":"msg_03696b8961937e5c016ab6d995012487d099704aa73dea56e6","text":"","phase":"final_answer","memoryCitation":null,"delivery":null,"questions":null},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","startedAtMs":1790368149292},"emittedAtMs":1790368149292}} +{"type":"emit_inbound","label":"item/agentMessage/delta","frame":{"method":"item/agentMessage/delta","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","itemId":"msg_03696b8961937e5c016ab6d995012487d099704aa73dea56e6","delta":"Written"},"emittedAtMs":1790368149292}} +{"type":"emit_inbound","label":"item/agentMessage/delta","frame":{"method":"item/agentMessage/delta","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","itemId":"msg_03696b8961937e5c016ab6d995012487d099704aa73dea56e6","delta":"."},"emittedAtMs":1790368149292}} +{"type":"emit_inbound","label":"item/completed","frame":{"method":"item/completed","params":{"item":{"type":"agentMessage","id":"msg_03696b8961937e5c016ab6d995012487d099704aa73dea56e6","text":"Written.","phase":"final_answer","memoryCitation":null,"delivery":null,"questions":null},"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","completedAtMs":1790368149300},"emittedAtMs":1790368149304}} +{"type":"emit_inbound","label":"thread/tokenUsage/updated","frame":{"method":"thread/tokenUsage/updated","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turnId":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","tokenUsage":{"total":{"totalTokens":48498,"inputTokens":48351,"cachedInputTokens":30208,"cacheWriteInputTokens":0,"outputTokens":147,"reasoningOutputTokens":54},"last":{"totalTokens":16230,"inputTokens":16224,"cachedInputTokens":15104,"cacheWriteInputTokens":0,"outputTokens":6,"reasoningOutputTokens":0},"modelContextWindow":258400}},"emittedAtMs":1790368149326}} +{"type":"emit_inbound","label":"thread/status/changed","frame":{"method":"thread/status/changed","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","status":{"type":"idle"}},"emittedAtMs":1790368149332}} +{"type":"emit_inbound","label":"turn/completed","frame":{"method":"turn/completed","params":{"threadId":"01a0da41-a28d-7271-b6f6-59123b5bb248","turn":{"id":"01a0da41-a31f-7741-bda3-ebc5ad36c38f","items":[{"type":"agentMessage","id":"msg_03696b8961937e5c016ab6d995012487d099704aa73dea56e6","text":"Written.","phase":"final_answer","memoryCitation":null,"delivery":null,"questions":null}],"itemsView":"summary","status":"completed","error":null,"startedAt":1790368129,"completedAt":1790368149,"durationMs":19500}},"emittedAtMs":1790368149332}} +{"type":"runtime_exit","status":"success"} diff --git a/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/input.ts b/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/input.ts new file mode 100644 index 000000000000..03d284733d9c --- /dev/null +++ b/apps/server/src/orchestration-v2/testkit/fixtures/subagent_v2_approval/input.ts @@ -0,0 +1,21 @@ +import { SUBAGENT_V2_APPROVAL_PROMPT, type OrchestratorFixtureInput } from "../shared.ts"; + +export const SUBAGENT_APPROVAL_PENDING_SHELL_KEY = "subagent-approval-pending"; + +/** The adapter's approval-required turn policy, which the recording ran under. */ +export const SUBAGENT_V2_APPROVAL_POLICY = { + approvalPolicy: "untrusted", + sandboxPolicy: { type: "readOnly" }, +} as const; + +export function subagentV2ApprovalInput(): OrchestratorFixtureInput { + return { + steps: [ + { type: "message", text: SUBAGENT_V2_APPROVAL_PROMPT }, + { + type: "approve_next_runtime_request", + shellSnapshotKeyWhilePending: SUBAGENT_APPROVAL_PENDING_SHELL_KEY, + }, + ], + }; +}