Skip to content

Commit ccb346e

Browse files
test(opencode): cover resumed permission tightening
Implemented With: Codex via gpt-6-luna on OpenAI through T3 Code
1 parent dae600e commit ccb346e

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

‎packages/provider-opencode/src/server/adapter.test.ts‎

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ const makeOpenCodeRuntimeHarness = Effect.fn("makeOpenCodeRuntimeHarness")(funct
239239
const makePermissionRuleHarness = Effect.fn("makePermissionRuleHarness")(function* (
240240
suffix: string,
241241
nativeSession: { readonly id: string; readonly parentID?: string },
242+
initialMode: ProviderAdapter.ProviderAdapterV2RuntimePolicy["runtimeMode"] = "approval-required",
242243
) {
243244
const nativeEvents = asyncEventStream();
244245
const createdPermissions: Array<unknown> = [];
@@ -282,12 +283,12 @@ const makePermissionRuleHarness = Effect.fn("makePermissionRuleHarness")(functio
282283
threadId,
283284
providerSessionId: ProviderSessionId.make(`session-${suffix}`),
284285
modelSelection,
285-
runtimePolicy: runtimePolicy("approval-required", { cwd: "/workspace" }),
286+
runtimePolicy: runtimePolicy(initialMode, { cwd: "/workspace" }),
286287
});
287288
const providerThread = yield* runtime.ensureThread({
288289
threadId,
289290
modelSelection,
290-
runtimePolicy: runtimePolicy("approval-required", { cwd: "/workspace" }),
291+
runtimePolicy: runtimePolicy(initialMode, { cwd: "/workspace" }),
291292
});
292293
return {
293294
createdPermissions,
@@ -2352,6 +2353,36 @@ describe("OpenCodeAdapterV2", () => {
23522353
),
23532354
);
23542355

2356+
it.effect("reapplies the restricted rules when a full-access session is resumed", () =>
2357+
Effect.gen(function* () {
2358+
const harness = yield* makePermissionRuleHarness(
2359+
"resume-restricted-policy",
2360+
{ id: "root" },
2361+
"full-access",
2362+
);
2363+
assert.equal(
2364+
permissionAction(harness.createdPermissions[0] as PermissionRuleset, "bash"),
2365+
"allow",
2366+
);
2367+
2368+
yield* harness.runtime.resumeThread({
2369+
providerThread: harness.providerThread,
2370+
threadId: harness.threadId,
2371+
modelSelection: harness.modelSelection,
2372+
runtimePolicy: runtimePolicy("approval-required", { cwd: "/workspace" }),
2373+
});
2374+
2375+
assert.equal(harness.updatedPermissions.length, 1);
2376+
assert.equal(
2377+
permissionAction(harness.updatedPermissions[0] as PermissionRuleset, "bash"),
2378+
"ask",
2379+
);
2380+
}).pipe(
2381+
Effect.provide(Layer.merge(IdAllocator.layer, McpProviderSessions.layer)),
2382+
Effect.scoped,
2383+
),
2384+
);
2385+
23552386
it.effect("keeps the rules of a resumed native child session", () =>
23562387
Effect.gen(function* () {
23572388
// A server restart drops the in-memory subagent marker, so the native

0 commit comments

Comments
 (0)