feat(tui): add yolo permission mode (#33279)

Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
This commit is contained in:
Dax 2026-06-30 01:08:29 -04:00 committed by GitHub
commit 0a5bed2bc2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 133 additions and 36 deletions

View file

@ -7,6 +7,7 @@ export interface Args {
continue?: boolean
sessionID?: string
fork?: boolean
auto?: boolean
}
export const { use: useArgs, provider: ArgsProvider } = createSimpleContext({

View file

@ -12,6 +12,7 @@ import { readJson, writeJsonAtomic } from "../util/persistence"
import { useTheme } from "./theme"
import { useToast } from "../ui/toast"
import { useRoute } from "./route"
import { usePermission } from "./permission"
export type LocalTheme = {
secondary: RGBA
@ -56,6 +57,9 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
const theme = useTheme().theme
const route = useRoute()
const paths = useTuiPaths()
const args = useArgs()
const event = useEvent()
const permission = usePermission()
function isModelValid(model: { providerID: string; modelID: string }) {
const provider = sync.data.provider.find((item) => item.id === model.providerID)
@ -190,7 +194,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
if (state.pending) save()
})
const args = useArgs()
const fallbackModel = createMemo(() => {
if (args.model) {
const { providerID, modelID } = parseModel(args.model)
@ -446,8 +449,6 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
if (state.pending) save()
})
const event = useEvent()
const slots = createMemo(() => {
const existing = new Set(sync.data.session.filter((x) => x.parentID === undefined).map((x) => x.id))
return sessionStore.pinned.filter((id) => existing.has(id)).slice(0, 9)
@ -534,6 +535,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
agent,
mcp,
session,
permission,
}
return result
},

View file

@ -0,0 +1,26 @@
import { createStore } from "solid-js/store"
import { useArgs } from "./args"
import { createSimpleContext } from "./helper"
export type PermissionMode = "auto" | "normal"
export const { use: usePermission, provider: PermissionProvider } = createSimpleContext({
name: "Permission",
init: () => {
const args = useArgs()
const [store, setStore] = createStore<{ mode: PermissionMode }>({
mode: args.auto ? "auto" : "normal",
})
return {
get mode() {
return store.mode
},
set(mode: PermissionMode) {
setStore("mode", mode)
},
toggle() {
setStore("mode", (mode) => (mode === "auto" ? "normal" : "auto"))
},
}
},
})

View file

@ -31,6 +31,7 @@ import { useArgs } from "./args"
import { batch, onMount } from "solid-js"
import path from "path"
import { useKV } from "./kv"
import { usePermission } from "./permission"
const emptyConsoleState: ConsoleState = {
consoleManagedProviders: [],
@ -59,6 +60,7 @@ export const {
init: () => {
const startup = useTuiStartup()
const kv = useKV()
const permission = usePermission()
const [store, setStore] = createStore<{
status: "loading" | "partial" | "complete"
provider: Provider[]
@ -165,7 +167,7 @@ export const {
.then((x) => (x.data ?? []).toSorted((a, b) => a.id.localeCompare(b.id)))
}
event.subscribe((event, { workspace }) => {
event.subscribe((event, { directory, workspace }) => {
switch (event.type) {
case "server.instance.disposed":
void bootstrap()
@ -187,6 +189,15 @@ export const {
case "permission.asked": {
const request = event.properties
if (permission.mode === "auto") {
void sdk.client.permission.reply({
requestID: request.id,
reply: "once",
directory,
workspace,
})
break
}
const requests = store.permission[request.sessionID]
if (!requests) {
setStore("permission", request.sessionID, [request])