Skip to content

Commit 0576df9

Browse files
committed
fix(providers): reject rollback during initialized Claude wakes
1 parent a61a2ef commit 0576df9

3 files changed

Lines changed: 46 additions & 5 deletions

File tree

‎apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts‎

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6026,7 +6026,12 @@ describe("ClaudeAdapterV2 background wake turns", () => {
60266026
assert.equal(admissionError._tag, "ProviderAdapterProtocolError");
60276027
}).pipe(
60286028
Effect.provide(
6029-
Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
6029+
Layer.mergeAll(
6030+
IdAllocator.layer,
6031+
McpProviderSessions.layer,
6032+
NodeServices.layer,
6033+
NodeCrypto.layer,
6034+
),
60306035
),
60316036
),
60326037
);
@@ -6073,7 +6078,12 @@ describe("ClaudeAdapterV2 background wake turns", () => {
60736078
yield* Deferred.succeed(releaseTerminal, undefined);
60746079
}).pipe(
60756080
Effect.provide(
6076-
Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
6081+
Layer.mergeAll(
6082+
IdAllocator.layer,
6083+
McpProviderSessions.layer,
6084+
NodeServices.layer,
6085+
NodeCrypto.layer,
6086+
),
60776087
),
60786088
),
60796089
);
@@ -6121,7 +6131,12 @@ describe("ClaudeAdapterV2 background wake turns", () => {
61216131
assert.isDefined(harness.getOpenedOptions());
61226132
}).pipe(
61236133
Effect.provide(
6124-
Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
6134+
Layer.mergeAll(
6135+
IdAllocator.layer,
6136+
McpProviderSessions.layer,
6137+
NodeServices.layer,
6138+
NodeCrypto.layer,
6139+
),
61256140
),
61266141
),
61276142
);
@@ -6145,7 +6160,12 @@ describe("ClaudeAdapterV2 background wake turns", () => {
61456160
assert.strictEqual(error, expected);
61466161
}).pipe(
61476162
Effect.provide(
6148-
Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
6163+
Layer.mergeAll(
6164+
IdAllocator.layer,
6165+
McpProviderSessions.layer,
6166+
NodeServices.layer,
6167+
NodeCrypto.layer,
6168+
),
61496169
),
61506170
),
61516171
);
@@ -11268,6 +11288,19 @@ describe("ClaudeAdapterV2 background wake turns", () => {
1126811288
assert.lengthOf(harness.continuationRequests, 0);
1126911289
yield* harness.offerAndWait(wakeTurnInit);
1127011290
assert.lengthOf(harness.continuationRequests, 1);
11291+
const admissionError = yield* harness.runtime.withRollbackAdmission!(
11292+
{
11293+
providerThread: harness.providerThread,
11294+
providerThreadTurns: [],
11295+
target: {
11296+
type: "thread_start",
11297+
checkpointId: CheckpointId.make("wake-init-admission"),
11298+
appRunOrdinal: 0,
11299+
},
11300+
},
11301+
() => Effect.die("an initialized native wake must exclude restoration"),
11302+
).pipe(Effect.flip);
11303+
assert.equal(admissionError._tag, "ProviderAdapterProtocolError");
1127111304
assert.equal(harness.continuationRequests[0]?.detail, WAKE_SUMMARY);
1127211305

1127311306
yield* harness.runtime.startTurn(

‎apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11491,6 +11491,9 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* (
1149111491
: rollbackInput.providerThread.goal;
1149211492
if (
1149311493
currentTurn !== null ||
11494+
[...(yield* Ref.get(wakeBuffers)).values()].some((entry) =>
11495+
entry.messages.some(isClaudeTurnStartMessage),
11496+
) ||
1149411497
goal?.status === "active" ||
1149511498
(yield* runtime.hasPendingBackgroundWork!)
1149611499
) {

‎apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8058,7 +8058,12 @@ describe("CodexAdapterV2 post-settle continuation", () => {
80588058
}).pipe(
80598059
Effect.scoped,
80608060
Effect.provide(
8061-
Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer),
8061+
Layer.mergeAll(
8062+
IdAllocator.layer,
8063+
McpProviderSessions.layer,
8064+
NodeServices.layer,
8065+
NodeCrypto.layer,
8066+
),
80628067
),
80638068
),
80648069
);

0 commit comments

Comments
 (0)