fix(listener): restore desktop permission mode binding for default scope (#1432)
Co-authored-by: Letta Code <noreply@letta.com>
This commit is contained in:
@@ -194,6 +194,39 @@ describe("listen-client parseServerMessage", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("listen-client permission mode scope keys", () => {
|
||||||
|
test("falls back from legacy default key and migrates to agent-scoped key", () => {
|
||||||
|
const listener = __listenClientTestUtils.createListenerRuntime();
|
||||||
|
|
||||||
|
// Simulate a pre-existing/legacy persisted entry without agent binding.
|
||||||
|
listener.permissionModeByConversation.set(
|
||||||
|
"agent:__unknown__::conversation:default",
|
||||||
|
{
|
||||||
|
mode: "acceptEdits",
|
||||||
|
planFilePath: null,
|
||||||
|
modeBeforePlan: null,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const status = __listenClientTestUtils.buildDeviceStatus(listener, {
|
||||||
|
agent_id: "agent-123",
|
||||||
|
conversation_id: "default",
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(status.current_permission_mode).toBe("acceptEdits");
|
||||||
|
expect(
|
||||||
|
listener.permissionModeByConversation.has(
|
||||||
|
"agent:agent-123::conversation:default",
|
||||||
|
),
|
||||||
|
).toBe(true);
|
||||||
|
expect(
|
||||||
|
listener.permissionModeByConversation.has(
|
||||||
|
"agent:__unknown__::conversation:default",
|
||||||
|
),
|
||||||
|
).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("listen-client approval resolver wiring", () => {
|
describe("listen-client approval resolver wiring", () => {
|
||||||
test("resolves matching pending resolver", async () => {
|
test("resolves matching pending resolver", async () => {
|
||||||
const runtime = __listenClientTestUtils.createRuntime();
|
const runtime = __listenClientTestUtils.createRuntime();
|
||||||
|
|||||||
@@ -37,13 +37,36 @@ export function getConversationPermissionModeState(
|
|||||||
conversationId?: string | null,
|
conversationId?: string | null,
|
||||||
): ConversationPermissionModeState {
|
): ConversationPermissionModeState {
|
||||||
const scopeKey = getPermissionModeScopeKey(agentId, conversationId);
|
const scopeKey = getPermissionModeScopeKey(agentId, conversationId);
|
||||||
return (
|
const normalizedConversationId = normalizeConversationId(conversationId);
|
||||||
runtime.permissionModeByConversation.get(scopeKey) ?? {
|
|
||||||
mode: globalPermissionMode.getMode(),
|
const direct = runtime.permissionModeByConversation.get(scopeKey);
|
||||||
planFilePath: null,
|
if (direct) {
|
||||||
modeBeforePlan: null,
|
return direct;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Backward/interop fallback for default-conversation entries that were
|
||||||
|
// keyed without an agent id (agent:__unknown__). If we find one while a
|
||||||
|
// concrete agent id is available, migrate it to the canonical key.
|
||||||
|
if (normalizedConversationId === "default") {
|
||||||
|
const legacyDefaultKey = getPermissionModeScopeKey(null, "default");
|
||||||
|
const legacyDefault =
|
||||||
|
runtime.permissionModeByConversation.get(legacyDefaultKey);
|
||||||
|
if (legacyDefault) {
|
||||||
|
if (normalizeCwdAgentId(agentId)) {
|
||||||
|
runtime.permissionModeByConversation.set(scopeKey, {
|
||||||
|
...legacyDefault,
|
||||||
|
});
|
||||||
|
runtime.permissionModeByConversation.delete(legacyDefaultKey);
|
||||||
|
}
|
||||||
|
return legacyDefault;
|
||||||
}
|
}
|
||||||
);
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
mode: globalPermissionMode.getMode(),
|
||||||
|
planFilePath: null,
|
||||||
|
modeBeforePlan: null,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setConversationPermissionModeState(
|
export function setConversationPermissionModeState(
|
||||||
|
|||||||
Reference in New Issue
Block a user