authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-02-26 21:08:38-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-02-26 21:26:35-08:00
log8ef653fcc0270855a7e39140664e584083e759b4
tree4b109cf58599e2baaa20c060855fe0d93048fe0a
parentfb8d66b8d321ce58a52768560cdc3349d7db878d

Persist required approval policy and sandbox mode for sessions

- Make `approvalPolicy` and `sandboxMode` required in orchestration contracts and turn-start flow - Add defaults in provider reactors/ingestion to guarantee values are always set - Store and hydrate both fields in projection persistence, snapshots, and related tests

19 files changed, 106 insertions(+), 36 deletions(-)

apps/server/integration/orchestrationEngine.integration.test.ts+2
......@@ -136,6 +136,8 @@ const startTurn = (input: {
136136 text: input.text,
137137 attachments: [],
138138 },
139 approvalPolicy: "on-request",
140 sandboxMode: "workspace-write",
139141 createdAt: nowIso(),
140142 });
141143
apps/server/src/orchestration/Layers/CheckpointReactor.test.ts+16
......@@ -317,6 +317,8 @@ describe("CheckpointReactor", () => {
317317 providerName: "codex",
318318 providerSessionId: asSessionId("sess-1"),
319319 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
320 approvalPolicy: "on-request",
321 sandboxMode: "workspace-write",
320322 activeTurnId: null,
321323 lastError: null,
322324 updatedAt: createdAt,
......@@ -394,6 +396,8 @@ describe("CheckpointReactor", () => {
394396 providerName: "codex",
395397 providerSessionId: asSessionId("sess-1"),
396398 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
399 approvalPolicy: "on-request",
400 sandboxMode: "workspace-write",
397401 activeTurnId: null,
398402 lastError: null,
399403 updatedAt: createdAt,
......@@ -445,6 +449,8 @@ describe("CheckpointReactor", () => {
445449 text: "start turn",
446450 attachments: [],
447451 },
452 approvalPolicy: "on-request",
453 sandboxMode: "workspace-write",
448454 createdAt: new Date().toISOString(),
449455 }),
450456 );
......@@ -481,6 +487,8 @@ describe("CheckpointReactor", () => {
481487 providerName: "codex",
482488 providerSessionId: asSessionId("sess-missing"),
483489 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-missing"),
490 approvalPolicy: "on-request",
491 sandboxMode: "workspace-write",
484492 activeTurnId: asTurnId("turn-missing-cwd"),
485493 lastError: null,
486494 updatedAt: createdAt,
......@@ -529,6 +537,8 @@ describe("CheckpointReactor", () => {
529537 providerName: "codex",
530538 providerSessionId: asSessionId("sess-1"),
531539 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
540 approvalPolicy: "on-request",
541 sandboxMode: "workspace-write",
532542 activeTurnId: null,
533543 lastError: null,
534544 updatedAt: createdAt,
......@@ -580,6 +590,8 @@ describe("CheckpointReactor", () => {
580590 providerName: "codex",
581591 providerSessionId: asSessionId("sess-1"),
582592 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
593 approvalPolicy: "on-request",
594 sandboxMode: "workspace-write",
583595 activeTurnId: null,
584596 lastError: null,
585597 updatedAt: createdAt,
......@@ -634,6 +646,8 @@ describe("CheckpointReactor", () => {
634646 providerName: "codex",
635647 providerSessionId: asSessionId("sess-1"),
636648 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
649 approvalPolicy: "on-request",
650 sandboxMode: "workspace-write",
637651 activeTurnId: null,
638652 lastError: null,
639653 updatedAt: createdAt,
......@@ -713,6 +727,8 @@ describe("CheckpointReactor", () => {
713727 providerName: "codex",
714728 providerSessionId: asSessionId("sess-1"),
715729 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
730 approvalPolicy: "on-request",
731 sandboxMode: "workspace-write",
716732 activeTurnId: null,
717733 lastError: null,
718734 updatedAt: createdAt,
apps/server/src/orchestration/Layers/OrchestrationEngine.test.ts+6
......@@ -92,6 +92,8 @@ describe("OrchestrationEngine", () => {
9292 text: "hello",
9393 attachments: [],
9494 },
95 approvalPolicy: "on-request",
96 sandboxMode: "workspace-write",
9597 createdAt,
9698 }),
9799 );
......@@ -428,6 +430,8 @@ describe("OrchestrationEngine", () => {
428430 text: "hello",
429431 attachments: [],
430432 },
433 approvalPolicy: "on-request" as const,
434 sandboxMode: "workspace-write" as const,
431435 createdAt,
432436 };
433437
......@@ -586,6 +590,8 @@ describe("OrchestrationEngine", () => {
586590 text: "hello",
587591 attachments: [],
588592 },
593 approvalPolicy: "on-request",
594 sandboxMode: "workspace-write",
589595 createdAt: now(),
590596 }),
591597 ),
apps/server/src/orchestration/Layers/ProjectionPipeline.test.ts+4
......@@ -794,6 +794,8 @@ it.effect("restores pending turn-start metadata across projection pipeline resta
794794 payload: {
795795 threadId,
796796 messageId,
797 approvalPolicy: "on-request",
798 sandboxMode: "workspace-write",
797799 createdAt: turnStartedAt,
798800 },
799801 });
......@@ -827,6 +829,8 @@ it.effect("restores pending turn-start metadata across projection pipeline resta
827829 providerName: "codex",
828830 providerSessionId: ProviderSessionId.makeUnsafe("provider-session-restart"),
829831 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-restart"),
832 approvalPolicy: "on-request",
833 sandboxMode: "workspace-write",
830834 activeTurnId: turnId,
831835 lastError: null,
832836 updatedAt: sessionSetAt,
apps/server/src/orchestration/Layers/ProjectionPipeline.ts+2
......@@ -473,6 +473,8 @@ const makeOrchestrationProjectionPipeline = Effect.gen(function* () {
473473 providerName: event.payload.session.providerName,
474474 providerSessionId: event.payload.session.providerSessionId,
475475 providerThreadId: event.payload.session.providerThreadId,
476 approvalPolicy: event.payload.session.approvalPolicy,
477 sandboxMode: event.payload.session.sandboxMode,
476478 activeTurnId: event.payload.session.activeTurnId,
477479 lastError: event.payload.session.lastError,
478480 updatedAt: event.payload.session.updatedAt,
apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.test.ts+6
......@@ -143,6 +143,8 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
143143 provider_name,
144144 provider_session_id,
145145 provider_thread_id,
146 approval_policy,
147 sandbox_mode,
146148 active_turn_id,
147149 last_error,
148150 updated_at
......@@ -153,6 +155,8 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
153155 'codex',
154156 'provider-session-1',
155157 'provider-thread-1',
158 'on-request',
159 'workspace-write',
156160 'turn-1',
157161 NULL,
158162 '2026-02-24T00:00:07.000Z'
......@@ -282,6 +286,8 @@ projectionSnapshotLayer("ProjectionSnapshotQuery", (it) => {
282286 providerName: "codex",
283287 providerSessionId: asProviderSessionId("provider-session-1"),
284288 providerThreadId: asProviderThreadId("provider-thread-1"),
289 approvalPolicy: "on-request",
290 sandboxMode: "workspace-write",
285291 activeTurnId: asTurnId("turn-1"),
286292 lastError: null,
287293 updatedAt: "2026-02-24T00:00:07.000Z",
apps/server/src/orchestration/Layers/ProjectionSnapshotQuery.ts+4
......@@ -196,6 +196,8 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
196196 provider_name AS "providerName",
197197 provider_session_id AS "providerSessionId",
198198 provider_thread_id AS "providerThreadId",
199 approval_policy AS "approvalPolicy",
200 sandbox_mode AS "sandboxMode",
199201 active_turn_id AS "activeTurnId",
200202 last_error AS "lastError",
201203 updated_at AS "updatedAt"
......@@ -378,6 +380,8 @@ const makeProjectionSnapshotQuery = Effect.gen(function* () {
378380 providerName: row.providerName,
379381 providerSessionId: row.providerSessionId,
380382 providerThreadId: row.providerThreadId,
383 approvalPolicy: row.approvalPolicy,
384 sandboxMode: row.sandboxMode,
381385 activeTurnId: row.activeTurnId,
382386 lastError: row.lastError,
383387 updatedAt: row.updatedAt,
apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts+6
......@@ -319,6 +319,8 @@ describe("ProviderCommandReactor", () => {
319319 providerName: "codex",
320320 providerSessionId: asSessionId("sess-1"),
321321 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
322 approvalPolicy: "on-request",
323 sandboxMode: "workspace-write",
322324 activeTurnId: asTurnId("turn-1"),
323325 lastError: null,
324326 updatedAt: now,
......@@ -358,6 +360,8 @@ describe("ProviderCommandReactor", () => {
358360 providerName: "codex",
359361 providerSessionId: asSessionId("sess-1"),
360362 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
363 approvalPolicy: "on-request",
364 sandboxMode: "workspace-write",
361365 activeTurnId: null,
362366 lastError: null,
363367 updatedAt: now,
......@@ -400,6 +404,8 @@ describe("ProviderCommandReactor", () => {
400404 providerName: "codex",
401405 providerSessionId: asSessionId("sess-1"),
402406 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
407 approvalPolicy: "on-request",
408 sandboxMode: "workspace-write",
403409 activeTurnId: null,
404410 lastError: null,
405411 updatedAt: now,
apps/server/src/orchestration/Layers/ProviderCommandReactor.ts+18-14
......@@ -64,6 +64,8 @@ const serverCommandId = (tag: string): CommandId =>
6464
6565const HANDLED_TURN_START_KEY_MAX = 10_000;
6666const HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);
67const DEFAULT_APPROVAL_POLICY: ProviderApprovalPolicy = "never";
68const DEFAULT_SANDBOX_MODE: ProviderSandboxMode = "workspace-write";
6769
6870const make = Effect.gen(function* () {
6971 const orchestrationEngine = yield* OrchestrationEngineService;
......@@ -143,8 +145,10 @@ const make = Effect.gen(function* () {
143145 return yield* Effect.die(new Error(`Thread '${threadId}' was not found in read model.`));
144146 }
145147
146 const desiredApprovalPolicy = options?.approvalPolicy ?? thread.session?.approvalPolicy;
147 const desiredSandboxMode = options?.sandboxMode ?? thread.session?.sandboxMode;
148 const desiredApprovalPolicy =
149 options?.approvalPolicy ?? thread.session?.approvalPolicy ?? DEFAULT_APPROVAL_POLICY;
150 const desiredSandboxMode =
151 options?.sandboxMode ?? thread.session?.sandboxMode ?? DEFAULT_SANDBOX_MODE;
148152 const preferredProvider: ProviderKind | undefined =
149153 thread.session?.providerName === "codex" || thread.session?.providerName === "claudeCode"
150154 ? thread.session.providerName
......@@ -160,8 +164,8 @@ const make = Effect.gen(function* () {
160164 ...(effectiveCwd ? { cwd: effectiveCwd } : {}),
161165 ...(thread.model ? { model: thread.model } : {}),
162166 ...(resumeThreadId ? { resumeThreadId } : {}),
163 ...(desiredApprovalPolicy !== undefined ? { approvalPolicy: desiredApprovalPolicy } : {}),
164 ...(desiredSandboxMode !== undefined ? { sandboxMode: desiredSandboxMode } : {}),
167 approvalPolicy: desiredApprovalPolicy,
168 sandboxMode: desiredSandboxMode,
165169 });
166170
167171 const bindSessionToThread = (session: ProviderSession) =>
......@@ -173,8 +177,8 @@ const make = Effect.gen(function* () {
173177 providerName: session.provider,
174178 providerSessionId: session.sessionId,
175179 providerThreadId: session.threadId ?? null,
176 ...(desiredApprovalPolicy !== undefined ? { approvalPolicy: desiredApprovalPolicy } : {}),
177 ...(desiredSandboxMode !== undefined ? { sandboxMode: desiredSandboxMode } : {}),
180 approvalPolicy: desiredApprovalPolicy,
181 sandboxMode: desiredSandboxMode,
178182 // Provider turn ids are not orchestration turn ids.
179183 activeTurnId: null,
180184 lastError: session.lastError ?? null,
......@@ -211,8 +215,8 @@ const make = Effect.gen(function* () {
211215 readonly attachments?: ReadonlyArray<ChatAttachment>;
212216 readonly model?: string;
213217 readonly effort?: string;
214 readonly approvalPolicy?: ProviderApprovalPolicy;
215 readonly sandboxMode?: ProviderSandboxMode;
218 readonly approvalPolicy: ProviderApprovalPolicy;
219 readonly sandboxMode: ProviderSandboxMode;
216220 readonly createdAt: string;
217221 }) {
218222 const thread = yield* resolveThread(input.threadId);
......@@ -220,8 +224,8 @@ const make = Effect.gen(function* () {
220224 return;
221225 }
222226 const sessionId = yield* ensureSessionForThread(input.threadId, input.createdAt, {
223 ...(input.approvalPolicy !== undefined ? { approvalPolicy: input.approvalPolicy } : {}),
224 ...(input.sandboxMode !== undefined ? { sandboxMode: input.sandboxMode } : {}),
227 approvalPolicy: input.approvalPolicy,
228 sandboxMode: input.sandboxMode,
225229 });
226230 const normalizedInput = toNonEmptyProviderInput(input.messageText);
227231 const normalizedAttachments = input.attachments ?? [];
......@@ -267,10 +271,8 @@ const make = Effect.gen(function* () {
267271 ...(message.attachments !== undefined ? { attachments: message.attachments } : {}),
268272 ...(event.payload.model !== undefined ? { model: event.payload.model } : {}),
269273 ...(event.payload.effort !== undefined ? { effort: event.payload.effort } : {}),
270 ...(event.payload.approvalPolicy !== undefined
271 ? { approvalPolicy: event.payload.approvalPolicy }
272 : {}),
273 ...(event.payload.sandboxMode !== undefined ? { sandboxMode: event.payload.sandboxMode } : {}),
274 approvalPolicy: event.payload.approvalPolicy,
275 sandboxMode: event.payload.sandboxMode,
274276 createdAt: event.payload.createdAt,
275277 });
276278 });
......@@ -347,6 +349,8 @@ const make = Effect.gen(function* () {
347349 providerName: thread.session?.providerName ?? null,
348350 providerSessionId: null,
349351 providerThreadId: null,
352 approvalPolicy: thread.session?.approvalPolicy ?? DEFAULT_APPROVAL_POLICY,
353 sandboxMode: thread.session?.sandboxMode ?? DEFAULT_SANDBOX_MODE,
350354 activeTurnId: null,
351355 lastError: thread.session?.lastError ?? null,
352356 updatedAt: now,
apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.test.ts+4
......@@ -164,6 +164,8 @@ describe("ProviderRuntimeIngestion", () => {
164164 providerName: "codex",
165165 providerSessionId: asSessionId("sess-1"),
166166 providerThreadId: ProviderThreadId.makeUnsafe("provider-thread-1"),
167 approvalPolicy: "on-request",
168 sandboxMode: "workspace-write",
167169 activeTurnId: null,
168170 updatedAt: createdAt,
169171 lastError: null,
......@@ -332,6 +334,8 @@ describe("ProviderRuntimeIngestion", () => {
332334 attachments: [],
333335 },
334336 assistantDeliveryMode: "streaming",
337 approvalPolicy: "on-request",
338 sandboxMode: "workspace-write",
335339 createdAt: now,
336340 }),
337341 );
apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts+8-12
......@@ -3,6 +3,8 @@ import {
33 CommandId,
44 MessageId,
55 type OrchestrationEvent,
6 type ProviderApprovalPolicy,
7 type ProviderSandboxMode,
68 ProviderThreadId,
79 type ThreadId,
810 TurnId,
......@@ -24,6 +26,8 @@ const providerCommandId = (event: ProviderRuntimeEvent, tag: string): CommandId
2426 CommandId.makeUnsafe(`provider:${event.eventId}:${tag}:${crypto.randomUUID()}`);
2527
2628const DEFAULT_ASSISTANT_DELIVERY_MODE: AssistantDeliveryMode = "buffered";
29const DEFAULT_APPROVAL_POLICY: ProviderApprovalPolicy = "never";
30const DEFAULT_SANDBOX_MODE: ProviderSandboxMode = "workspace-write";
2731const TURN_MESSAGE_IDS_BY_TURN_CACHE_CAPACITY = 10_000;
2832const TURN_MESSAGE_IDS_BY_TURN_TTL = Duration.minutes(120);
2933const BUFFERED_MESSAGE_TEXT_BY_MESSAGE_ID_CACHE_CAPACITY = 20_000;
......@@ -371,12 +375,8 @@ const make = Effect.gen(function* () {
371375 providerName: event.provider,
372376 providerSessionId: event.sessionId,
373377 providerThreadId,
374 ...(thread.session?.approvalPolicy !== undefined
375 ? { approvalPolicy: thread.session.approvalPolicy }
376 : {}),
377 ...(thread.session?.sandboxMode !== undefined
378 ? { sandboxMode: thread.session.sandboxMode }
379 : {}),
378 approvalPolicy: thread.session?.approvalPolicy ?? DEFAULT_APPROVAL_POLICY,
379 sandboxMode: thread.session?.sandboxMode ?? DEFAULT_SANDBOX_MODE,
380380 activeTurnId,
381381 lastError,
382382 updatedAt: now,
......@@ -485,12 +485,8 @@ const make = Effect.gen(function* () {
485485 providerName: event.provider,
486486 providerSessionId: event.sessionId,
487487 providerThreadId,
488 ...(thread.session?.approvalPolicy !== undefined
489 ? { approvalPolicy: thread.session.approvalPolicy }
490 : {}),
491 ...(thread.session?.sandboxMode !== undefined
492 ? { sandboxMode: thread.session.sandboxMode }
493 : {}),
488 approvalPolicy: thread.session?.approvalPolicy ?? DEFAULT_APPROVAL_POLICY,
489 sandboxMode: thread.session?.sandboxMode ?? DEFAULT_SANDBOX_MODE,
494490 activeTurnId: toTurnId(event.turnId) ?? null,
495491 lastError: event.message,
496492 updatedAt: now,
apps/server/src/orchestration/commandInvariants.test.ts+2
......@@ -90,6 +90,8 @@ const messageSendCommand: OrchestrationCommand = {
9090 text: "hello",
9191 attachments: [],
9292 },
93 approvalPolicy: "on-request",
94 sandboxMode: "workspace-write",
9395 createdAt: now,
9496};
9597
apps/server/src/orchestration/decider.ts+2-4
......@@ -254,10 +254,8 @@ export const decideOrchestrationCommand = Effect.fn("decideOrchestrationCommand"
254254 ...(command.model !== undefined ? { model: command.model } : {}),
255255 ...(command.effort !== undefined ? { effort: command.effort } : {}),
256256 assistantDeliveryMode: command.assistantDeliveryMode ?? DEFAULT_ASSISTANT_DELIVERY_MODE,
257 ...(command.approvalPolicy !== undefined
258 ? { approvalPolicy: command.approvalPolicy }
259 : {}),
260 ...(command.sandboxMode !== undefined ? { sandboxMode: command.sandboxMode } : {}),
257 approvalPolicy: command.approvalPolicy,
258 sandboxMode: command.sandboxMode,
261259 createdAt: command.createdAt,
262260 },
263261 };
apps/server/src/orchestration/projector.test.ts+4
......@@ -135,6 +135,8 @@ describe("orchestration projector", () => {
135135 payload: {
136136 threadId: "thread-1",
137137 messageId: "message-1",
138 approvalPolicy: "on-request",
139 sandboxMode: "workspace-write",
138140 createdAt: "2026-01-01T00:00:00.000Z",
139141 },
140142 }),
......@@ -193,6 +195,8 @@ describe("orchestration projector", () => {
193195 providerName: "codex",
194196 providerSessionId: "session-1",
195197 providerThreadId: "provider-thread-1",
198 approvalPolicy: "on-request",
199 sandboxMode: "workspace-write",
196200 activeTurnId: "turn-1",
197201 lastError: null,
198202 updatedAt: startedAt,
apps/server/src/persistence/Layers/ProjectionThreadSessions.ts+8
......@@ -25,6 +25,8 @@ const makeProjectionThreadSessionRepository = Effect.gen(function* () {
2525 provider_name,
2626 provider_session_id,
2727 provider_thread_id,
28 approval_policy,
29 sandbox_mode,
2830 active_turn_id,
2931 last_error,
3032 updated_at
......@@ -35,6 +37,8 @@ const makeProjectionThreadSessionRepository = Effect.gen(function* () {
3537 ${row.providerName},
3638 ${row.providerSessionId},
3739 ${row.providerThreadId},
40 ${row.approvalPolicy},
41 ${row.sandboxMode},
3842 ${row.activeTurnId},
3943 ${row.lastError},
4044 ${row.updatedAt}
......@@ -45,6 +49,8 @@ const makeProjectionThreadSessionRepository = Effect.gen(function* () {
4549 provider_name = excluded.provider_name,
4650 provider_session_id = excluded.provider_session_id,
4751 provider_thread_id = excluded.provider_thread_id,
52 approval_policy = excluded.approval_policy,
53 sandbox_mode = excluded.sandbox_mode,
4854 active_turn_id = excluded.active_turn_id,
4955 last_error = excluded.last_error,
5056 updated_at = excluded.updated_at
......@@ -62,6 +68,8 @@ const makeProjectionThreadSessionRepository = Effect.gen(function* () {
6268 provider_name AS "providerName",
6369 provider_session_id AS "providerSessionId",
6470 provider_thread_id AS "providerThreadId",
71 approval_policy AS "approvalPolicy",
72 sandbox_mode AS "sandboxMode",
6573 active_turn_id AS "activeTurnId",
6674 last_error AS "lastError",
6775 updated_at AS "updatedAt"
apps/server/src/persistence/Migrations/005_Projections.ts+2
......@@ -65,6 +65,8 @@ export default Effect.gen(function* () {
6565 provider_name TEXT,
6666 provider_session_id TEXT,
6767 provider_thread_id TEXT,
68 approval_policy TEXT NOT NULL,
69 sandbox_mode TEXT NOT NULL,
6870 active_turn_id TEXT,
6971 last_error TEXT,
7072 updated_at TEXT NOT NULL
apps/server/src/persistence/Services/ProjectionThreadSessions.ts+4
......@@ -9,6 +9,8 @@
99import {
1010 IsoDateTime,
1111 OrchestrationSessionStatus,
12 ProviderApprovalPolicy,
13 ProviderSandboxMode,
1214 ProviderSessionId,
1315 ProviderThreadId,
1416 ThreadId,
......@@ -25,6 +27,8 @@ export const ProjectionThreadSession = Schema.Struct({
2527 providerName: Schema.NullOr(Schema.String),
2628 providerSessionId: Schema.NullOr(ProviderSessionId),
2729 providerThreadId: Schema.NullOr(ProviderThreadId),
30 approvalPolicy: ProviderApprovalPolicy,
31 sandboxMode: ProviderSandboxMode,
2832 activeTurnId: Schema.NullOr(TurnId),
2933 lastError: Schema.NullOr(Schema.String),
3034 updatedAt: IsoDateTime,
apps/server/src/wsServer.test.ts+2
......@@ -1055,6 +1055,8 @@ describe("WebSocket Server", () => {
10551055 attachments: [],
10561056 },
10571057 assistantDeliveryMode: "streaming",
1058 approvalPolicy: "on-request",
1059 sandboxMode: "workspace-write",
10581060 createdAt,
10591061 });
10601062 expect(startTurnResponse.error).toBeUndefined();
packages/contracts/src/orchestration.ts+6-6
......@@ -142,8 +142,8 @@ export const OrchestrationSession = Schema.Struct({
142142 providerName: Schema.NullOr(TrimmedNonEmptyString),
143143 providerSessionId: Schema.NullOr(ProviderSessionId),
144144 providerThreadId: Schema.NullOr(ProviderThreadId),
145 approvalPolicy: Schema.optional(ProviderApprovalPolicy),
146 sandboxMode: Schema.optional(ProviderSandboxMode),
145 approvalPolicy: ProviderApprovalPolicy,
146 sandboxMode: ProviderSandboxMode,
147147 activeTurnId: Schema.NullOr(TurnId),
148148 lastError: Schema.NullOr(TrimmedNonEmptyString),
149149 updatedAt: IsoDateTime,
......@@ -284,8 +284,8 @@ export const ThreadTurnStartCommand = Schema.Struct({
284284 model: Schema.optional(TrimmedNonEmptyString),
285285 effort: Schema.optional(TrimmedNonEmptyString),
286286 assistantDeliveryMode: Schema.optional(AssistantDeliveryMode),
287 approvalPolicy: Schema.optional(ProviderApprovalPolicy),
288 sandboxMode: Schema.optional(ProviderSandboxMode),
287 approvalPolicy: ProviderApprovalPolicy,
288 sandboxMode: ProviderSandboxMode,
289289 createdAt: IsoDateTime,
290290});
291291
......@@ -500,8 +500,8 @@ export const ThreadTurnStartRequestedPayload = Schema.Struct({
500500 model: Schema.optional(TrimmedNonEmptyString),
501501 effort: Schema.optional(TrimmedNonEmptyString),
502502 assistantDeliveryMode: Schema.optional(AssistantDeliveryMode),
503 approvalPolicy: Schema.optional(ProviderApprovalPolicy),
504 sandboxMode: Schema.optional(ProviderSandboxMode),
503 approvalPolicy: ProviderApprovalPolicy,
504 sandboxMode: ProviderSandboxMode,
505505 createdAt: IsoDateTime,
506506});
507507