diff --git a/components/answered-card.tsx b/components/answered-card.tsx
index ce76b80..1b7c95c 100644
--- a/components/answered-card.tsx
+++ b/components/answered-card.tsx
@@ -4,6 +4,7 @@ import { useState } from "react";
import { ConfidenceRail } from "@/components/confidence-rail";
import { GlyphMark } from "@/components/ui/glyph-mark";
import { ThinkingBlock } from "@/components/thinking-block";
+import { PathText } from "@/components/file-path-chip";
import { cn } from "@/lib/utils";
import { ToolContentResponse } from "@/components/ai-elements/message";
import type { QuestionAnswerData } from "@/src/core";
@@ -153,13 +154,13 @@ export function AnsweredCard({ answer: savedAnswer, input }: { answer: QuestionA
data-testid="answered-other"
className="flex items-center gap-2 rounded-lg border border-primary bg-accent px-3 py-1.5"
>
- “{answer.other}”
+ “”
)}
)}
- {answer.text &&
“{answer.text}”
}
+ {answer.text && }
{/* The confidence record (owner round 6): the slider's rail, disc
removed — the missing handle itself says "this is a record, not a
diff --git a/components/chat.tsx b/components/chat.tsx
index 2d851d1..8c70164 100644
--- a/components/chat.tsx
+++ b/components/chat.tsx
@@ -14,6 +14,7 @@ import {
ConversationScrollButton,
} from "@/components/ai-elements/conversation";
import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message";
+import { PathText } from "@/components/file-path-chip";
import { Reasoning, ReasoningContent, ReasoningTrigger } from "@/components/ai-elements/reasoning";
import { Shimmer } from "@/components/ai-elements/shimmer";
import { BrailleSpinner } from "@/components/braille-spinner";
@@ -687,10 +688,10 @@ export function Chat({
const cycleChatFields = useCallback((): readonly HTMLElement[] => {
const pick = (sel: string) => Array.from(document.querySelectorAll(sel));
return [
- ...pick('[data-testid="reading-thinking-field"] textarea'),
- ...pick('[data-testid="question-dock"] textarea'),
- ...pick('[data-testid="practice-dock"] textarea'),
- ...pick('[data-testid="composer"] textarea'),
+ ...pick('[data-testid="reading-thinking-field"] [data-file-path-input]'),
+ ...pick('[data-testid="question-dock"] [data-file-path-input]'),
+ ...pick('[data-testid="practice-dock"] [data-file-path-input]'),
+ ...pick('[data-testid="composer"] [data-file-path-input]'),
];
}, []);
useFieldCycle(cycleChatFields);
@@ -705,7 +706,7 @@ export function Chat({
* composer: with a question pending the Composer is unmounted, the ref
* is null, and the thinking field is left alone by design. */
const dictationWasActiveRef = useRef(false);
- const composerInputRef = useRef(null);
+ const composerInputRef = useRef(null);
useEffect(() => {
if (dictation.active) {
dictationWasActiveRef.current = true;
@@ -1507,7 +1508,7 @@ export function Chat({
rail as the thinking rows — one quote geometry. */}
You
- {m.parts.filter((p) => p.type === "text").map((p) => p.text).join("\n")}
+
p.type === "text").map((p) => p.text).join("\n")} />
) : (
diff --git a/components/composer.tsx b/components/composer.tsx
index c5c7db4..649862d 100644
--- a/components/composer.tsx
+++ b/components/composer.tsx
@@ -3,6 +3,7 @@
import { ArrowRightIcon, CornerDownLeftIcon, SquareIcon } from "lucide-react";
import { cn } from "@/lib/utils";
import { Hint } from "@/components/ui/hint";
+import { PathInput } from "@/components/path-input";
/**
* The chat composer — content row ONLY (the persistent rounded shell lives in
@@ -59,7 +60,7 @@ export function Composer({
autoFocus?: boolean;
/** The page's handle to the textarea — the dictation-end focus (owner,
* 2026-10-01): a run ending hands the cursor to the bare composer. */
- inputRef?: React.RefObject;
+ inputRef?: React.RefObject;
/** Escape while a dictation runs stops it (STT wave, 2026-09-17). No-op
* when absent — Esc otherwise means nothing in the composer. */
onEscape?: () => void;
@@ -90,10 +91,11 @@ export function Composer({
act();
}}
>
-