From e9a7c7114184d0092c114ce7a7d9446cf0d366cc Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 26 Feb 2026 20:36:10 -0600 Subject: fix(app): permission notifications --- .../composer/session-composer-state.test.ts | 22 ++++++++++++++++++++++ .../session/composer/session-composer-state.ts | 12 ++++++++++-- .../pages/session/composer/session-request-tree.ts | 17 ++++++++++++----- 3 files changed, 44 insertions(+), 7 deletions(-) (limited to 'packages/app/src/pages') diff --git a/packages/app/src/pages/session/composer/session-composer-state.test.ts b/packages/app/src/pages/session/composer/session-composer-state.test.ts index 7b6029eb3..934d3152a 100644 --- a/packages/app/src/pages/session/composer/session-composer-state.test.ts +++ b/packages/app/src/pages/session/composer/session-composer-state.test.ts @@ -55,6 +55,28 @@ describe("sessionPermissionRequest", () => { expect(sessionPermissionRequest(sessions, permissions, "root")).toBeUndefined() }) + + test("skips filtered permissions in the current tree", () => { + const sessions = [session({ id: "root" }), session({ id: "child", parentID: "root" })] + const permissions = { + root: [permission("perm-root", "root")], + child: [permission("perm-child", "child")], + } + + expect(sessionPermissionRequest(sessions, permissions, "root", (item) => item.id !== "perm-root"))?.toMatchObject({ + id: "perm-child", + }) + }) + + test("returns undefined when all tree permissions are filtered out", () => { + const sessions = [session({ id: "root" }), session({ id: "child", parentID: "root" })] + const permissions = { + root: [permission("perm-root", "root")], + child: [permission("perm-child", "child")], + } + + expect(sessionPermissionRequest(sessions, permissions, "root", () => false)).toBeUndefined() + }) }) describe("sessionQuestionRequest", () => { diff --git a/packages/app/src/pages/session/composer/session-composer-state.ts b/packages/app/src/pages/session/composer/session-composer-state.ts index ed65867ef..201846177 100644 --- a/packages/app/src/pages/session/composer/session-composer-state.ts +++ b/packages/app/src/pages/session/composer/session-composer-state.ts @@ -5,15 +5,20 @@ import { useParams } from "@solidjs/router" import { showToast } from "@opencode-ai/ui/toast" import { useGlobalSync } from "@/context/global-sync" import { useLanguage } from "@/context/language" +import { usePermission } from "@/context/permission" import { useSDK } from "@/context/sdk" import { useSync } from "@/context/sync" import { sessionPermissionRequest, sessionQuestionRequest } from "./session-request-tree" export function createSessionComposerBlocked() { const params = useParams() + const permission = usePermission() + const sdk = useSDK() const sync = useSync() const permissionRequest = createMemo(() => - sessionPermissionRequest(sync.data.session, sync.data.permission, params.id), + sessionPermissionRequest(sync.data.session, sync.data.permission, params.id, (item) => { + return !permission.autoResponds(item, sdk.directory) + }), ) const questionRequest = createMemo(() => sessionQuestionRequest(sync.data.session, sync.data.question, params.id)) @@ -30,13 +35,16 @@ export function createSessionComposerState() { const sync = useSync() const globalSync = useGlobalSync() const language = useLanguage() + const permission = usePermission() const questionRequest = createMemo((): QuestionRequest | undefined => { return sessionQuestionRequest(sync.data.session, sync.data.question, params.id) }) const permissionRequest = createMemo((): PermissionRequest | undefined => { - return sessionPermissionRequest(sync.data.session, sync.data.permission, params.id) + return sessionPermissionRequest(sync.data.session, sync.data.permission, params.id, (item) => { + return !permission.autoResponds(item, sdk.directory) + }) }) const blocked = createMemo(() => { diff --git a/packages/app/src/pages/session/composer/session-request-tree.ts b/packages/app/src/pages/session/composer/session-request-tree.ts index f9673e254..03872c091 100644 --- a/packages/app/src/pages/session/composer/session-request-tree.ts +++ b/packages/app/src/pages/session/composer/session-request-tree.ts @@ -1,6 +1,11 @@ import type { PermissionRequest, QuestionRequest, Session } from "@opencode-ai/sdk/v2/client" -function sessionTreeRequest(session: Session[], request: Record, sessionID?: string) { +function sessionTreeRequest( + session: Session[], + request: Record, + sessionID?: string, + include: (item: T) => boolean = () => true, +) { if (!sessionID) return const map = session.reduce((acc, item) => { @@ -23,23 +28,25 @@ function sessionTreeRequest(session: Session[], request: Record !!request[id]?.[0]) + const id = ids.find((id) => request[id]?.some(include)) if (!id) return - return request[id]?.[0] + return request[id]?.find(include) } export function sessionPermissionRequest( session: Session[], request: Record, sessionID?: string, + include?: (item: PermissionRequest) => boolean, ) { - return sessionTreeRequest(session, request, sessionID) + return sessionTreeRequest(session, request, sessionID, include) } export function sessionQuestionRequest( session: Session[], request: Record, sessionID?: string, + include?: (item: QuestionRequest) => boolean, ) { - return sessionTreeRequest(session, request, sessionID) + return sessionTreeRequest(session, request, sessionID, include) } -- cgit v1.2.3