/)?.[0]
+ const input = src.match(/
/)?.[0]
+
+ expect(overlay).toContain('dir="auto"')
+ expect(input).toContain('class="prompt-input"')
+ expect(input).toContain('dir="auto"')
+ })
+})
diff --git a/packages/kilo-vscode/tests/unit/use-file-mention.test.ts b/packages/kilo-vscode/tests/unit/use-file-mention.test.ts
index 5e2fefc569..cb06763a7d 100644
--- a/packages/kilo-vscode/tests/unit/use-file-mention.test.ts
+++ b/packages/kilo-vscode/tests/unit/use-file-mention.test.ts
@@ -5,6 +5,34 @@ import type { ExtensionMessage, WebviewMessage } from "../../webview-ui/src/type
const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
+function textarea(value: string, cursor: number, dir: "ltr" | "rtl") {
+ const state = { cursor }
+ return {
+ value,
+ get selectionStart() {
+ return state.cursor
+ },
+ get selectionEnd() {
+ return state.cursor
+ },
+ matches: (selector: string) => selector === `:dir(${dir})`,
+ setSelectionRange: (start: number) => {
+ state.cursor = start
+ },
+ } as unknown as HTMLTextAreaElement
+}
+
+function key(key: "ArrowLeft" | "ArrowRight") {
+ const state = { prevented: 0 }
+ return {
+ state,
+ event: {
+ key,
+ preventDefault: () => state.prevented++,
+ } as unknown as KeyboardEvent,
+ }
+}
+
describe("useFileMention", () => {
it("keeps previous file results visible while the next search is pending", async () => {
const posted: WebviewMessage[] = []
@@ -186,4 +214,62 @@ describe("useFileMention", () => {
dispose.fn?.()
})
+
+ it("keeps mention block arrow navigation aligned with left-to-right prompt direction", async () => {
+ const ctx = {
+ postMessage: () => {},
+ onMessage: () => () => {},
+ }
+
+ const dispose: { fn?: () => void } = {}
+ const mention = createRoot((root) => {
+ dispose.fn = root
+ return useFileMention(ctx, undefined, () => false)
+ })
+
+ const text = "See @src/main.ts now"
+ mention.addPaths(["src/main.ts"], "/repo")
+
+ const right = key("ArrowRight")
+ const input = textarea(text, "See ".length, "ltr")
+ expect(mention.handleArrowKey(right.event, input)).toBe(true)
+ expect(input.selectionStart).toBe("See @src/main.ts".length)
+ expect(right.state.prevented).toBe(1)
+
+ const left = key("ArrowLeft")
+ expect(mention.handleArrowKey(left.event, input)).toBe(true)
+ expect(input.selectionStart).toBe("See ".length)
+ expect(left.state.prevented).toBe(1)
+
+ dispose.fn?.()
+ })
+
+ it("keeps mention block arrow navigation aligned for right-to-left languages", async () => {
+ const ctx = {
+ postMessage: () => {},
+ onMessage: () => () => {},
+ }
+
+ const dispose: { fn?: () => void } = {}
+ const mention = createRoot((root) => {
+ dispose.fn = root
+ return useFileMention(ctx, undefined, () => false)
+ })
+
+ const text = "فایل @src/main.ts را ببین"
+ mention.addPaths(["src/main.ts"], "/repo")
+
+ const left = key("ArrowLeft")
+ const input = textarea(text, "فایل ".length, "rtl")
+ expect(mention.handleArrowKey(left.event, input)).toBe(true)
+ expect(input.selectionStart).toBe("فایل @src/main.ts".length)
+ expect(left.state.prevented).toBe(1)
+
+ const right = key("ArrowRight")
+ expect(mention.handleArrowKey(right.event, input)).toBe(true)
+ expect(input.selectionStart).toBe("فایل ".length)
+ expect(right.state.prevented).toBe(1)
+
+ dispose.fn?.()
+ })
})
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx
index f3b39c2cdb..d3f59a0d42 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx
+++ b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx
@@ -474,7 +474,13 @@ export const NewWorktreeDialog: Component<{ onClose: () => void; defaultBaseBran