1- import { createMemo , onCleanup } from "solid-js"
1+ import { createEffect , createMemo , onCleanup } from "solid-js"
22import { createStore , produce } from "solid-js/store"
33import { createSimpleContext } from "@opencode-ai/ui/context"
44import type { PermissionRequest } from "@opencode-ai/sdk/v2/client"
@@ -7,7 +7,7 @@ import { useGlobalSDK } from "@/context/global-sdk"
77import { useGlobalSync } from "./global-sync"
88import { useParams } from "@solidjs/router"
99import { decode64 } from "@/utils/base64"
10- import { acceptKey , autoRespondsPermission } from "./permission-auto-respond"
10+ import { acceptKey , directoryAcceptKey , isDirectoryAutoAccepting , autoRespondsPermission } from "./permission-auto-respond"
1111
1212type PermissionRespondFn = ( input : {
1313 sessionID : string
@@ -76,6 +76,25 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
7676 } ) ,
7777 )
7878
79+ // When config has permission: "allow", auto-enable directory-level auto-accept
80+ createEffect ( ( ) => {
81+ if ( ! ready ( ) ) return
82+ const directory = decode64 ( params . dir )
83+ if ( ! directory ) return
84+ const [ childStore ] = globalSync . child ( directory )
85+ const perm = childStore . config . permission
86+ if ( typeof perm === "string" && perm === "allow" ) {
87+ const key = directoryAcceptKey ( directory )
88+ if ( store . autoAccept [ key ] === undefined ) {
89+ setStore (
90+ produce ( ( draft ) => {
91+ draft . autoAccept [ key ] = true
92+ } ) ,
93+ )
94+ }
95+ }
96+ } )
97+
7998 const MAX_RESPONDED = 1000
8099 const RESPONDED_TTL_MS = 60 * 60 * 1000
81100 const responded = new Map < string , number > ( )
@@ -119,6 +138,10 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
119138 return autoRespondsPermission ( store . autoAccept , session , { sessionID } , directory )
120139 }
121140
141+ function isAutoAcceptingDirectory ( directory : string ) {
142+ return isDirectoryAutoAccepting ( store . autoAccept , directory )
143+ }
144+
122145 function shouldAutoRespond ( permission : PermissionRequest , directory ?: string ) {
123146 const session = directory ? globalSync . child ( directory , { bootstrap : false } ) [ 0 ] . session : [ ]
124147 return autoRespondsPermission ( store . autoAccept , session , permission , directory )
@@ -142,6 +165,36 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
142165 } )
143166 onCleanup ( unsubscribe )
144167
168+ function enableDirectory ( directory : string ) {
169+ const key = directoryAcceptKey ( directory )
170+ setStore (
171+ produce ( ( draft ) => {
172+ draft . autoAccept [ key ] = true
173+ } ) ,
174+ )
175+
176+ globalSDK . client . permission
177+ . list ( { directory } )
178+ . then ( ( x ) => {
179+ if ( ! isAutoAcceptingDirectory ( directory ) ) return
180+ for ( const perm of x . data ?? [ ] ) {
181+ if ( ! perm ?. id ) continue
182+ if ( ! shouldAutoRespond ( perm , directory ) ) continue
183+ respondOnce ( perm , directory )
184+ }
185+ } )
186+ . catch ( ( ) => undefined )
187+ }
188+
189+ function disableDirectory ( directory : string ) {
190+ const key = directoryAcceptKey ( directory )
191+ setStore (
192+ produce ( ( draft ) => {
193+ draft . autoAccept [ key ] = false
194+ } ) ,
195+ )
196+ }
197+
145198 function enable ( sessionID : string , directory : string ) {
146199 const key = acceptKey ( sessionID , directory )
147200 const version = bumpEnableVersion ( sessionID , directory )
@@ -185,6 +238,7 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
185238 return shouldAutoRespond ( permission , directory )
186239 } ,
187240 isAutoAccepting,
241+ isAutoAcceptingDirectory,
188242 toggleAutoAccept ( sessionID : string , directory : string ) {
189243 if ( isAutoAccepting ( sessionID , directory ) ) {
190244 disable ( sessionID , directory )
@@ -193,6 +247,13 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
193247
194248 enable ( sessionID , directory )
195249 } ,
250+ toggleAutoAcceptDirectory ( directory : string ) {
251+ if ( isAutoAcceptingDirectory ( directory ) ) {
252+ disableDirectory ( directory )
253+ return
254+ }
255+ enableDirectory ( directory )
256+ } ,
196257 enableAutoAccept ( sessionID : string , directory : string ) {
197258 if ( isAutoAccepting ( sessionID , directory ) ) return
198259 enable ( sessionID , directory )
@@ -201,6 +262,11 @@ export const { use: usePermission, provider: PermissionProvider } = createSimple
201262 disable ( sessionID , directory )
202263 } ,
203264 permissionsEnabled,
265+ isPermissionAllowAll ( directory : string ) {
266+ const [ childStore ] = globalSync . child ( directory )
267+ const perm = childStore . config . permission
268+ return typeof perm === "string" && perm === "allow"
269+ } ,
204270 }
205271 } ,
206272} )
0 commit comments