tweak: ensure external dir and bash tool invocations render workdir details
This commit is contained in:
@@ -69,6 +69,7 @@ import { Footer } from "./footer.tsx"
|
|||||||
import { usePromptRef } from "../../context/prompt"
|
import { usePromptRef } from "../../context/prompt"
|
||||||
import { useExit } from "../../context/exit"
|
import { useExit } from "../../context/exit"
|
||||||
import { Filesystem } from "@/util/filesystem"
|
import { Filesystem } from "@/util/filesystem"
|
||||||
|
import { Global } from "@/global"
|
||||||
import { PermissionPrompt } from "./permission"
|
import { PermissionPrompt } from "./permission"
|
||||||
import { QuestionPrompt } from "./question"
|
import { QuestionPrompt } from "./question"
|
||||||
import { DialogExportOptions } from "../../ui/dialog-export-options"
|
import { DialogExportOptions } from "../../ui/dialog-export-options"
|
||||||
@@ -1525,6 +1526,7 @@ function BlockTool(props: { title: string; children: JSX.Element; onClick?: () =
|
|||||||
|
|
||||||
function Bash(props: ToolProps<typeof BashTool>) {
|
function Bash(props: ToolProps<typeof BashTool>) {
|
||||||
const { theme } = useTheme()
|
const { theme } = useTheme()
|
||||||
|
const sync = useSync()
|
||||||
const output = createMemo(() => stripAnsi(props.metadata.output?.trim() ?? ""))
|
const output = createMemo(() => stripAnsi(props.metadata.output?.trim() ?? ""))
|
||||||
const [expanded, setExpanded] = createSignal(false)
|
const [expanded, setExpanded] = createSignal(false)
|
||||||
const lines = createMemo(() => output().split("\n"))
|
const lines = createMemo(() => output().split("\n"))
|
||||||
@@ -1534,11 +1536,36 @@ function Bash(props: ToolProps<typeof BashTool>) {
|
|||||||
return [...lines().slice(0, 10), "…"].join("\n")
|
return [...lines().slice(0, 10), "…"].join("\n")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const workdirDisplay = createMemo(() => {
|
||||||
|
const workdir = props.input.workdir
|
||||||
|
if (!workdir || workdir === ".") return undefined
|
||||||
|
|
||||||
|
const base = sync.data.path.directory
|
||||||
|
if (!base) return undefined
|
||||||
|
|
||||||
|
const absolute = path.resolve(base, workdir)
|
||||||
|
if (absolute === base) return undefined
|
||||||
|
|
||||||
|
const home = Global.Path.home
|
||||||
|
if (!home) return absolute
|
||||||
|
|
||||||
|
const match = absolute === home || absolute.startsWith(home + path.sep)
|
||||||
|
return match ? absolute.replace(home, "~") : absolute
|
||||||
|
})
|
||||||
|
|
||||||
|
const title = createMemo(() => {
|
||||||
|
const desc = props.input.description ?? "Shell"
|
||||||
|
const wd = workdirDisplay()
|
||||||
|
if (!wd) return `# ${desc}`
|
||||||
|
if (desc.includes(wd)) return `# ${desc}`
|
||||||
|
return `# ${desc} in ${wd}`
|
||||||
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Switch>
|
<Switch>
|
||||||
<Match when={props.metadata.output !== undefined}>
|
<Match when={props.metadata.output !== undefined}>
|
||||||
<BlockTool
|
<BlockTool
|
||||||
title={"# " + (props.input.description ?? "Shell")}
|
title={title()}
|
||||||
part={props.part}
|
part={props.part}
|
||||||
onClick={overflow() ? () => setExpanded((prev) => !prev) : undefined}
|
onClick={overflow() ? () => setExpanded((prev) => !prev) : undefined}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -226,7 +226,23 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
|
|||||||
<TextBody icon="◇" title={`Exa Code Search "` + (input().query ?? "") + `"`} />
|
<TextBody icon="◇" title={`Exa Code Search "` + (input().query ?? "") + `"`} />
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.request.permission === "external_directory"}>
|
<Match when={props.request.permission === "external_directory"}>
|
||||||
<TextBody icon="←" title={`Access external directory ` + normalizePath(input().path as string)} />
|
{(() => {
|
||||||
|
const meta = props.request.metadata ?? {}
|
||||||
|
const parent = typeof meta["parentDir"] === "string" ? meta["parentDir"] : undefined
|
||||||
|
const filepath = typeof meta["filepath"] === "string" ? meta["filepath"] : undefined
|
||||||
|
const pattern = props.request.patterns?.[0]
|
||||||
|
const derived =
|
||||||
|
typeof pattern === "string"
|
||||||
|
? pattern.includes("*")
|
||||||
|
? path.dirname(pattern)
|
||||||
|
: pattern
|
||||||
|
: undefined
|
||||||
|
|
||||||
|
const raw = parent ?? filepath ?? derived
|
||||||
|
const dir = normalizePath(raw)
|
||||||
|
|
||||||
|
return <TextBody icon="←" title={`Access external directory ` + dir} />
|
||||||
|
})()}
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={props.request.permission === "doom_loop"}>
|
<Match when={props.request.permission === "doom_loop"}>
|
||||||
<TextBody icon="⟳" title="Continue after repeated failures" />
|
<TextBody icon="⟳" title="Continue after repeated failures" />
|
||||||
|
|||||||
Reference in New Issue
Block a user