|
|
@@ -3,8 +3,7 @@ import { createMemo, For, Match, Show, Switch } from "solid-js"
|
|
|
import { Portal, useRenderer, useTerminalDimensions, type JSX } from "@opentui/solid"
|
|
|
import type { TextareaRenderable } from "@opentui/core"
|
|
|
import { useTheme, useThemes } from "../../context/theme"
|
|
|
-import type { PermissionRequest } from "@opencode-ai/client"
|
|
|
-import { useClient } from "../../context/client"
|
|
|
+import type { PermissionReply, PermissionRequest } from "@opencode-ai/client"
|
|
|
import { SplitBorder } from "../../ui/border"
|
|
|
import { useData } from "../../context/data"
|
|
|
import { filetype } from "../../util/filetype"
|
|
|
@@ -15,6 +14,7 @@ import { Keymap } from "../../context/keymap"
|
|
|
import { usePathFormatter } from "../../context/path-format"
|
|
|
import { SimulationSemantics } from "../../simulation/semantics"
|
|
|
import { PatchDiff } from "../../component/patch-diff"
|
|
|
+import { useToast } from "../../ui/toast"
|
|
|
|
|
|
type PermissionStage = "permission" | "always" | "reject"
|
|
|
|
|
|
@@ -110,8 +110,8 @@ function EditBody(props: { file?: string; diff?: string; patch?: string }) {
|
|
|
}
|
|
|
|
|
|
export function PermissionPrompt(props: { request: PermissionRequest; directory?: string }) {
|
|
|
- const client = useClient()
|
|
|
const data = useData()
|
|
|
+ const toast = useToast()
|
|
|
const [store, setStore] = createStore({
|
|
|
stage: "permission" as PermissionStage,
|
|
|
})
|
|
|
@@ -132,6 +132,12 @@ export function PermissionPrompt(props: { request: PermissionRequest; directory?
|
|
|
|
|
|
const theme = useTheme()
|
|
|
|
|
|
+ function reply(value: PermissionReply, message?: string) {
|
|
|
+ void data.session.permission
|
|
|
+ .reply({ sessionID: props.request.sessionID, requestID: props.request.id, reply: value, message })
|
|
|
+ .catch((error: unknown) => toast.error(error))
|
|
|
+ }
|
|
|
+
|
|
|
return (
|
|
|
<Switch>
|
|
|
<Match when={store.stage === "always"}>
|
|
|
@@ -151,11 +157,7 @@ export function PermissionPrompt(props: { request: PermissionRequest; directory?
|
|
|
onSelect={(option) => {
|
|
|
setStore("stage", "permission")
|
|
|
if (option === "cancel") return
|
|
|
- void client.api.permission.reply({
|
|
|
- sessionID: props.request.sessionID,
|
|
|
- reply: "always",
|
|
|
- requestID: props.request.id,
|
|
|
- })
|
|
|
+ reply("always")
|
|
|
}}
|
|
|
/>
|
|
|
</Match>
|
|
|
@@ -164,12 +166,7 @@ export function PermissionPrompt(props: { request: PermissionRequest; directory?
|
|
|
action={props.request.action}
|
|
|
instance={props.request.id}
|
|
|
onConfirm={(message) => {
|
|
|
- void client.api.permission.reply({
|
|
|
- sessionID: props.request.sessionID,
|
|
|
- reply: "reject",
|
|
|
- requestID: props.request.id,
|
|
|
- message: message || undefined,
|
|
|
- })
|
|
|
+ reply("reject", message || undefined)
|
|
|
}}
|
|
|
onCancel={() => {
|
|
|
setStore("stage", "permission")
|
|
|
@@ -265,18 +262,10 @@ export function PermissionPrompt(props: { request: PermissionRequest; directory?
|
|
|
setStore("stage", "reject")
|
|
|
return
|
|
|
}
|
|
|
- void client.api.permission.reply({
|
|
|
- sessionID: props.request.sessionID,
|
|
|
- reply: "reject",
|
|
|
- requestID: props.request.id,
|
|
|
- })
|
|
|
+ reply("reject")
|
|
|
return
|
|
|
}
|
|
|
- void client.api.permission.reply({
|
|
|
- sessionID: props.request.sessionID,
|
|
|
- reply: "once",
|
|
|
- requestID: props.request.id,
|
|
|
- })
|
|
|
+ reply("once")
|
|
|
}}
|
|
|
/>
|
|
|
)
|