summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/context
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-27 06:17:40 -0600
committerAdam <[email protected]>2026-02-27 06:17:40 -0600
commitdfa02811178af1af602f59f8cdbcb3f3e319f103 (patch)
treebb4e088da85d590a66b62fe5f1278a97af203e52 /packages/app/src/context
parent4a940969947654deca40454503491793ce1b347c (diff)
downloadopencode-dfa02811178af1af602f59f8cdbcb3f3e319f103.tar.gz
opencode-dfa02811178af1af602f59f8cdbcb3f3e319f103.zip
fix(app): auto-accept permissions
Diffstat (limited to 'packages/app/src/context')
-rw-r--r--packages/app/src/context/permission-auto-respond.test.ts25
-rw-r--r--packages/app/src/context/permission-auto-respond.ts13
-rw-r--r--packages/app/src/context/permission.tsx9
3 files changed, 37 insertions, 10 deletions
diff --git a/packages/app/src/context/permission-auto-respond.test.ts b/packages/app/src/context/permission-auto-respond.test.ts
index 1fa1ff3de..8657427d7 100644
--- a/packages/app/src/context/permission-auto-respond.test.ts
+++ b/packages/app/src/context/permission-auto-respond.test.ts
@@ -31,12 +31,33 @@ describe("autoRespondsPermission", () => {
expect(autoRespondsPermission({ root: true }, sessions, permission("child"), "/tmp/project")).toBe(true)
})
- test("ignores auto-accept from unrelated sessions", () => {
+ test("defaults to auto-accept when no lineage override exists", () => {
const sessions = [session({ id: "root" }), session({ id: "child", parentID: "root" }), session({ id: "other" })]
const autoAccept = {
other: true,
}
- expect(autoRespondsPermission(autoAccept, sessions, permission("child"), "/tmp/project")).toBe(false)
+ expect(autoRespondsPermission(autoAccept, sessions, permission("child"), "/tmp/project")).toBe(true)
+ })
+
+ test("inherits a parent session's false override", () => {
+ const directory = "/tmp/project"
+ const sessions = [session({ id: "root" }), session({ id: "child", parentID: "root" })]
+ const autoAccept = {
+ [`${base64Encode(directory)}/root`]: false,
+ }
+
+ expect(autoRespondsPermission(autoAccept, sessions, permission("child"), directory)).toBe(false)
+ })
+
+ test("prefers a child override over parent override", () => {
+ const directory = "/tmp/project"
+ const sessions = [session({ id: "root" }), session({ id: "child", parentID: "root" })]
+ const autoAccept = {
+ [`${base64Encode(directory)}/root`]: false,
+ [`${base64Encode(directory)}/child`]: true,
+ }
+
+ expect(autoRespondsPermission(autoAccept, sessions, permission("child"), directory)).toBe(true)
})
})
diff --git a/packages/app/src/context/permission-auto-respond.ts b/packages/app/src/context/permission-auto-respond.ts
index e45e5f51c..cabd514e7 100644
--- a/packages/app/src/context/permission-auto-respond.ts
+++ b/packages/app/src/context/permission-auto-respond.ts
@@ -5,6 +5,11 @@ export function acceptKey(sessionID: string, directory?: string) {
return `${base64Encode(directory)}/${sessionID}`
}
+function accepted(autoAccept: Record<string, boolean>, sessionID: string, directory?: string) {
+ const key = acceptKey(sessionID, directory)
+ return autoAccept[key] ?? autoAccept[sessionID]
+}
+
function sessionLineage(session: { id: string; parentID?: string }[], sessionID: string) {
const parent = session.reduce((acc, item) => {
if (item.parentID) acc.set(item.id, item.parentID)
@@ -29,8 +34,8 @@ export function autoRespondsPermission(
permission: { sessionID: string },
directory?: string,
) {
- return sessionLineage(session, permission.sessionID).some((id) => {
- const key = acceptKey(id, directory)
- return autoAccept[key] ?? autoAccept[id] ?? false
- })
+ const value = sessionLineage(session, permission.sessionID)
+ .map((id) => accepted(autoAccept, id, directory))
+ .find((item): item is boolean => item !== undefined)
+ return value ?? true
}
diff --git a/packages/app/src/context/permission.tsx b/packages/app/src/context/permission.tsx
index d63d4d568..73ee08c9a 100644
--- a/packages/app/src/context/permission.tsx
+++ b/packages/app/src/context/permission.tsx
@@ -115,8 +115,8 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
}
function isAutoAccepting(sessionID: string, directory?: string) {
- const key = acceptKey(sessionID, directory)
- return store.autoAccept[key] ?? store.autoAccept[sessionID] ?? false
+ const session = directory ? globalSync.child(directory, { bootstrap: false })[0].session : []
+ return autoRespondsPermission(store.autoAccept, session, { sessionID }, directory)
}
function shouldAutoRespond(permission: PermissionRequest, directory?: string) {
@@ -168,10 +168,11 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
function disable(sessionID: string, directory?: string) {
bumpEnableVersion(sessionID, directory)
- const key = directory ? acceptKey(sessionID, directory) : undefined
+ const key = directory ? acceptKey(sessionID, directory) : sessionID
setStore(
produce((draft) => {
- if (key) delete draft.autoAccept[key]
+ draft.autoAccept[key] = false
+ if (!directory) return
delete draft.autoAccept[sessionID]
}),
)