@@ -27,6 +27,38 @@ class DebugLogger implements Logger {
2727 }
2828}
2929
30+ // ---------------------------------------------------------------------------
31+ // JXA-based TCC permission probes (fallback when native .node module absent)
32+ // ---------------------------------------------------------------------------
33+
34+ /** Probe accessibility by asking System Events for a process list. */
35+ function checkAccessibilityJXA ( ) : boolean {
36+ try {
37+ const result = Bun . spawnSync ( {
38+ cmd : [ 'osascript' , '-e' , 'tell application "System Events" to get name of every process whose background only is false' ] ,
39+ stdout : 'pipe' ,
40+ stderr : 'pipe' ,
41+ } )
42+ return result . exitCode === 0
43+ } catch {
44+ return false
45+ }
46+ }
47+
48+ /** Probe screen recording by attempting a 1x1 screencapture. */
49+ function checkScreenRecordingJXA ( ) : boolean {
50+ try {
51+ const result = Bun . spawnSync ( {
52+ cmd : [ 'screencapture' , '-x' , '-R' , '0,0,1,1' , '/dev/null' ] ,
53+ stdout : 'pipe' ,
54+ stderr : 'pipe' ,
55+ } )
56+ return result . exitCode === 0
57+ } catch {
58+ return false
59+ }
60+ }
61+
3062let cached : ComputerUseHostAdapter | undefined
3163
3264/**
@@ -47,8 +79,19 @@ export function getComputerUseHostAdapter(): ComputerUseHostAdapter {
4779 ensureOsPermissions : async ( ) => {
4880 if ( process . platform !== 'darwin' ) return { granted : true }
4981 const cu = requireComputerUseSwift ( )
50- const accessibility = ( cu as any ) . tcc . checkAccessibility ( )
51- const screenRecording = ( cu as any ) . tcc . checkScreenRecording ( )
82+ const tcc = ( cu as any ) . tcc
83+ // Native Swift .node module provides tcc.checkAccessibility/checkScreenRecording.
84+ // When absent (decompiled/reverse-engineered build), fall back to JXA probes.
85+ if ( tcc ) {
86+ const accessibility = tcc . checkAccessibility ( )
87+ const screenRecording = tcc . checkScreenRecording ( )
88+ return accessibility && screenRecording
89+ ? { granted : true }
90+ : { granted : false , accessibility, screenRecording }
91+ }
92+ // JXA fallback: try to query System Events (accessibility) and screencapture (screen recording).
93+ const accessibility = checkAccessibilityJXA ( )
94+ const screenRecording = checkScreenRecordingJXA ( )
5295 return accessibility && screenRecording
5396 ? { granted : true }
5497 : { granted : false , accessibility, screenRecording }
0 commit comments