fix(app): permission notifications

This commit is contained in:
Adam
2026-02-26 20:36:10 -06:00
parent 4205fbd2aa
commit e9a7c71141
6 changed files with 131 additions and 16 deletions

View File

@@ -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", () => {

View File

@@ -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(() => {

View File

@@ -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)
}