diff options
| author | Adam <[email protected]> | 2026-02-26 20:36:10 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-02-26 20:36:10 -0600 |
| commit | e9a7c7114184d0092c114ce7a7d9446cf0d366cc (patch) | |
| tree | 9255b5a23422d4b5ecdc9df77da17993aaab7cfd /packages/app/src/pages | |
| parent | 4205fbd2aa98c6f62c8caae94e909a6048afbf53 (diff) | |
| download | opencode-e9a7c7114184d0092c114ce7a7d9446cf0d366cc.tar.gz opencode-e9a7c7114184d0092c114ce7a7d9446cf0d366cc.zip | |
fix(app): permission notifications
Diffstat (limited to 'packages/app/src/pages')
3 files changed, 44 insertions, 7 deletions
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<T>(session: Session[], request: Record<string, T[] | undefined>, sessionID?: string) { +function sessionTreeRequest<T>( + session: Session[], + request: Record<string, T[] | undefined>, + sessionID?: string, + include: (item: T) => boolean = () => true, +) { if (!sessionID) return const map = session.reduce((acc, item) => { @@ -23,23 +28,25 @@ function sessionTreeRequest<T>(session: Session[], request: Record<string, T[] | } } - const id = ids.find((id) => !!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<string, PermissionRequest[] | undefined>, sessionID?: string, + include?: (item: PermissionRequest) => boolean, ) { - return sessionTreeRequest(session, request, sessionID) + return sessionTreeRequest(session, request, sessionID, include) } export function sessionQuestionRequest( session: Session[], request: Record<string, QuestionRequest[] | undefined>, sessionID?: string, + include?: (item: QuestionRequest) => boolean, ) { - return sessionTreeRequest(session, request, sessionID) + return sessionTreeRequest(session, request, sessionID, include) } |
