fix(hub): persist permissionMode across hub restart (#710)

Store the last known permission mode in session metadata so YOLO and other
modes survive hub restarts, resume after archive, and reconnect without
waiting for CLI keepalive.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
HeavyGee
2026-05-27 07:12:42 +08:00
committed by GitHub
co-authored by Cursor
parent 1d03f186d6
commit 45cf002510
4 changed files with 219 additions and 3 deletions
+13 -2
View File
@@ -644,7 +644,9 @@ export class SyncEngine {
return { type: 'error', message: 'No machine online', code: 'no_machine_online' }
}
const effectivePermissionMode = opts?.permissionMode ?? session.permissionMode ?? undefined
const preferredPermissionMode = opts?.permissionMode
?? session.permissionMode
?? session.metadata?.preferredPermissionMode
const spawnResult = await this.rpcGateway.spawnSession(
targetMachine.id,
target.directory,
@@ -656,7 +658,7 @@ export class SyncEngine {
undefined,
resumeToken,
session.effort ?? undefined,
effectivePermissionMode
preferredPermissionMode
)
if (spawnResult.type !== 'success') {
@@ -668,6 +670,15 @@ export class SyncEngine {
return { type: 'error', message: 'Session failed to become active', code: 'resume_failed' }
}
if (preferredPermissionMode !== undefined) {
try {
await this.applySessionConfig(spawnResult.sessionId, { permissionMode: preferredPermissionMode })
} catch (error) {
const message = error instanceof Error ? error.message : 'Failed to restore permission mode'
return { type: 'error', message, code: 'resume_failed' }
}
}
if (spawnResult.sessionId !== access.sessionId) {
// The old session may have already been merged by the automatic dedup path
// (triggered when the spawned CLI sets its agent session ID in metadata).