Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 44 additions & 6 deletions apps/server/src/orchestration-v2/ProviderSessionManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3631,6 +3631,9 @@ it.effect(
() =>
Effect.gen(function* () {
const state = yield* Ref.make(emptyState);
const settings = yield* ServerSettings.ServerSettingsService.pipe(
Effect.provide(ServerSettings.layerTest()),
);
const effect = Effect.gen(function* () {
const eventSink = yield* EventSink.EventSinkV2;
const idAllocator = yield* IdAllocator.IdAllocatorV2;
Expand Down Expand Up @@ -3737,6 +3740,11 @@ it.effect(
assert.equal((yield* Ref.get(state)).resumeCount, 2);
yield* resumeSecondThread;
assert.equal((yield* Ref.get(state)).resumeCount, 3);
// regression: #26722 a Linked environments change reloads only the idle thread's tools.
yield* settings.updateSettings({ linkedEnvironmentsEnabled: true });
yield* resumeSecondThread;
assert.equal((yield* Ref.get(state)).resumeCount, 4);
assert.deepEqual((yield* Ref.get(state)).unloadedNativeThreadIds, ["native-thread"]);
const subscribe = firstRuntime.subscribeEvents;
assert.isDefined(subscribe);
if (subscribe === undefined) return;
Expand Down Expand Up @@ -3768,23 +3776,34 @@ it.effect(
runtimePolicy,
});
yield* resumeSecondThread;
assert.equal((yield* Ref.get(state)).resumeCount, 4);
assert.equal((yield* Ref.get(state)).resumeCount, 5);

assert.deepEqual((yield* Ref.get(state)).unloadedNativeThreadIds, []);
assert.deepEqual((yield* Ref.get(state)).unloadedNativeThreadIds, ["native-thread"]);

yield* manager.detach({ providerSessionId, threadId: firstThreadId });
assert.isTrue(Option.isSome(yield* manager.get(providerSessionId)));
assert.equal((yield* Ref.get(state)).closeCount, 0);
assert.equal((yield* Ref.get(state)).interruptCount, 1);
assert.deepEqual((yield* Ref.get(state)).unloadedNativeThreadIds, ["native-thread"]);
assert.deepEqual((yield* Ref.get(state)).unloadedNativeThreadIds, [
"native-thread",
"native-thread",
]);

yield* manager.detach({ providerSessionId, threadId: secondThreadId });
yield* TestClock.adjust("1 second");
yield* Effect.yieldNow;
assert.equal((yield* Ref.get(state)).closeCount, 1);
});

yield* effect.pipe(Effect.provide(layerTest({ state, idleTimeoutMs: 1000 })));
yield* effect.pipe(
Effect.provide(
layerTest({
state,
idleTimeoutMs: 1000,
serverSettingsLayer: Layer.succeed(ServerSettings.ServerSettingsService, settings),
}),
),
);
}),
);

Expand Down Expand Up @@ -4187,10 +4206,13 @@ it.effect(
);

it.effect(
"ProviderSessionManagerV2 rejects a second thread when the provider runtime is exclusive",
"ProviderSessionManagerV2 rejects a second thread when the provider runtime is exclusive, and reopens it when Linked environments changes",
() =>
Effect.gen(function* () {
const state = yield* Ref.make(emptyState);
const settings = yield* ServerSettings.ServerSettingsService.pipe(
Effect.provide(ServerSettings.layerTest()),
);
const effect = Effect.gen(function* () {
const eventSink = yield* EventSink.EventSinkV2;
const idAllocator = yield* IdAllocator.IdAllocatorV2;
Expand Down Expand Up @@ -4235,11 +4257,27 @@ it.effect(

assert.equal(error._tag, "ProviderSessionOpenError");
assert.equal((yield* Ref.get(state)).openCount, 1);

// regression: #26722 an exclusive runtime configures MCP at open, so it reopens.
yield* settings.updateSettings({ linkedEnvironmentsEnabled: true });
yield* manager.open({
threadId: firstThreadId,
providerSessionId,
modelSelection,
runtimePolicy,
});
assert.equal((yield* Ref.get(state)).openCount, 2);
assert.equal((yield* Ref.get(state)).closeCount, 1);
});

yield* effect.pipe(
Effect.provide(
layerTest({ state, idleTimeoutMs: 1000, capabilities: ExclusiveCapabilities }),
layerTest({
state,
idleTimeoutMs: 1000,
capabilities: ExclusiveCapabilities,
serverSettingsLayer: Layer.succeed(ServerSettings.ServerSettingsService, settings),
}),
),
);
}),
Expand Down
Loading
Loading