From 9fbd3814af94bc8326cc700c609dee3b6bf642fd Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Thu, 20 Nov 2025 14:32:14 -0600 Subject: [PATCH] wip --- .../src/cli/cmd/tui/routes/session/index.tsx | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 678b306bd..cc56e2057 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -100,6 +100,24 @@ export function Session() { const messages = createMemo(() => sync.data.message[route.sessionID] ?? []) const permissions = createMemo(() => sync.data.permission[route.sessionID] ?? []) + // Collect permissions from current session AND all child sessions + const allPermissions = createMemo(() => { + const current = sync.data.permission[route.sessionID] ?? [] + const children = sync.data.session.filter((x) => x.parentID === route.sessionID) + const childPermissions = children.flatMap((child) => { + const perms = sync.data.permission[child.id] ?? [] + return perms.map((p) => ({ + permission: p, + childSessionID: child.id, + childTitle: child.title, + })) + }) + return [ + ...current.map((p) => ({ permission: p, childSessionID: undefined, childTitle: undefined })), + ...childPermissions, + ] + }) + const pending = createMemo(() => { return messages().findLast((x) => x.role === "assistant" && !x.time.completed)?.id }) @@ -148,23 +166,23 @@ export function Session() { const keybind = useKeybind() const processedPermissions = new Set() - // Handle permission requests with dialog + // Handle permission requests with dialog (including child sessions) createEffect(() => { - const first = permissions()[0] + const first = allPermissions()[0] if (!first) return // If we've already processed this permission, don't show dialog again - if (processedPermissions.has(first.id)) return + if (processedPermissions.has(first.permission.id)) return // Only show dialog if no other dialogs are open if (dialog.stack.length > 0) return - DialogPermission.show(dialog, first, (response: "once" | "always" | "reject") => { - processedPermissions.add(first.id) + DialogPermission.show(dialog, first.permission, (response: "once" | "always" | "reject") => { + processedPermissions.add(first.permission.id) sdk.client.postSessionIdPermissionsPermissionId({ path: { - permissionID: first.id, - id: route.sessionID, + permissionID: first.permission.id, + id: first.childSessionID ?? route.sessionID, }, body: { response: response, @@ -831,7 +849,7 @@ export function Session() { (prompt = r)} - disabled={permissions().length > 0} + disabled={allPermissions().length > 0} onSubmit={() => { toBottom() }}