Forward subagent permission requests
This commit is contained in:
@@ -1954,6 +1954,15 @@ function getOpenCodeSubAgentMaps(state: OpenCodeEventTranslationState): {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isOpenCodeSessionTrackedByParent(
|
||||||
|
sessionId: string,
|
||||||
|
state: OpenCodeEventTranslationState,
|
||||||
|
): boolean {
|
||||||
|
return (
|
||||||
|
sessionId === state.sessionId || state.subAgentCallIdByChildSessionId?.has(sessionId) === true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function getOpenCodeSubAgentState(
|
function getOpenCodeSubAgentState(
|
||||||
callId: string,
|
callId: string,
|
||||||
state: OpenCodeEventTranslationState,
|
state: OpenCodeEventTranslationState,
|
||||||
@@ -2438,7 +2447,7 @@ function appendOpenCodePermissionAsked(
|
|||||||
state: OpenCodeEventTranslationState,
|
state: OpenCodeEventTranslationState,
|
||||||
events: AgentStreamEvent[],
|
events: AgentStreamEvent[],
|
||||||
): void {
|
): void {
|
||||||
if (event.properties.sessionID !== state.sessionId) {
|
if (!isOpenCodeSessionTrackedByParent(event.properties.sessionID, state)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const metadata = readOpenCodeRecord(event.properties.metadata);
|
const metadata = readOpenCodeRecord(event.properties.metadata);
|
||||||
|
|||||||
@@ -387,6 +387,97 @@ describe("translateOpenCodeEvent", () => {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("forwards permission requests from linked OpenCode subagent sessions", () => {
|
||||||
|
const state = createState();
|
||||||
|
|
||||||
|
translateOpenCodeEvent(
|
||||||
|
{
|
||||||
|
type: "message.part.updated",
|
||||||
|
properties: {
|
||||||
|
part: {
|
||||||
|
id: "part-subagent",
|
||||||
|
sessionID: "session-1",
|
||||||
|
messageID: "message-1",
|
||||||
|
type: "tool",
|
||||||
|
tool: "task",
|
||||||
|
callID: "call-subagent",
|
||||||
|
state: {
|
||||||
|
status: "running",
|
||||||
|
input: {
|
||||||
|
subagent_type: "explore",
|
||||||
|
description: "Explore external config",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
state,
|
||||||
|
);
|
||||||
|
translateOpenCodeEvent(
|
||||||
|
{
|
||||||
|
type: "session.created",
|
||||||
|
properties: {
|
||||||
|
sessionID: "child-session-1",
|
||||||
|
info: {
|
||||||
|
id: "child-session-1",
|
||||||
|
parentID: "session-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
state,
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = translateOpenCodeEvent(
|
||||||
|
{
|
||||||
|
type: "permission.asked",
|
||||||
|
properties: {
|
||||||
|
id: "perm-child-1",
|
||||||
|
sessionID: "child-session-1",
|
||||||
|
permission: "external_directory",
|
||||||
|
patterns: ["/Users/example/.config/nvim"],
|
||||||
|
metadata: {
|
||||||
|
reason: "Need to inspect the requested config directory",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
state,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result).toEqual([
|
||||||
|
{
|
||||||
|
type: "permission_requested",
|
||||||
|
provider: "opencode",
|
||||||
|
request: {
|
||||||
|
id: "perm-child-1",
|
||||||
|
provider: "opencode",
|
||||||
|
name: "external_directory",
|
||||||
|
kind: "tool",
|
||||||
|
title: "Access external directory",
|
||||||
|
description:
|
||||||
|
"Need to inspect the requested config directory - Scope: /Users/example/.config/nvim",
|
||||||
|
input: {
|
||||||
|
patterns: ["/Users/example/.config/nvim"],
|
||||||
|
metadata: {
|
||||||
|
reason: "Need to inspect the requested config directory",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
detail: {
|
||||||
|
type: "unknown",
|
||||||
|
input: {
|
||||||
|
permission: "external_directory",
|
||||||
|
patterns: ["/Users/example/.config/nvim"],
|
||||||
|
metadata: {
|
||||||
|
reason: "Need to inspect the requested config directory",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output: null,
|
||||||
|
},
|
||||||
|
actions: openCodePermissionActions,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it("emits usage_updated after step-finish parts", () => {
|
it("emits usage_updated after step-finish parts", () => {
|
||||||
const state = createState();
|
const state = createState();
|
||||||
state.accumulatedUsage.contextWindowMaxTokens = 400_000;
|
state.accumulatedUsage.contextWindowMaxTokens = 400_000;
|
||||||
|
|||||||
Reference in New Issue
Block a user