|
|
@@ -388,157 +388,149 @@ export function SessionTurn(
|
|
|
>
|
|
|
<div onClick={autoScroll.handleInteraction}>
|
|
|
<Show when={message()}>
|
|
|
- {(msg) => (
|
|
|
- <div
|
|
|
- ref={autoScroll.contentRef}
|
|
|
- data-message={msg().id}
|
|
|
- data-slot="session-turn-message-container"
|
|
|
- class={props.classes?.container}
|
|
|
- >
|
|
|
- <div data-slot="session-turn-message-content" aria-live="off">
|
|
|
- <Message message={msg()} parts={parts()} interrupted={interrupted()} queued={queued()} />
|
|
|
+ <div
|
|
|
+ ref={autoScroll.contentRef}
|
|
|
+ data-message={message()!.id}
|
|
|
+ data-slot="session-turn-message-container"
|
|
|
+ class={props.classes?.container}
|
|
|
+ >
|
|
|
+ <div data-slot="session-turn-message-content" aria-live="off">
|
|
|
+ <Message message={message()!} parts={parts()} interrupted={interrupted()} queued={queued()} />
|
|
|
+ </div>
|
|
|
+ <Show when={compaction()}>
|
|
|
+ <div data-slot="session-turn-compaction">
|
|
|
+ <Part part={compaction()!} message={message()!} hideDetails />
|
|
|
+ </div>
|
|
|
+ </Show>
|
|
|
+ <Show when={assistantMessages().length > 0}>
|
|
|
+ <div data-slot="session-turn-assistant-content" aria-hidden={working()}>
|
|
|
+ <AssistantParts
|
|
|
+ messages={assistantMessages()}
|
|
|
+ showAssistantCopyPartID={assistantCopyPartID()}
|
|
|
+ turnDurationMs={turnDurationMs()}
|
|
|
+ working={working()}
|
|
|
+ showReasoningSummaries={showReasoningSummaries()}
|
|
|
+ shellToolDefaultOpen={props.shellToolDefaultOpen}
|
|
|
+ editToolDefaultOpen={props.editToolDefaultOpen}
|
|
|
+ />
|
|
|
</div>
|
|
|
- <Show when={compaction()}>
|
|
|
- {(part) => (
|
|
|
- <div data-slot="session-turn-compaction">
|
|
|
- <Part part={part()} message={msg()} hideDetails />
|
|
|
- </div>
|
|
|
- )}
|
|
|
- </Show>
|
|
|
- <Show when={assistantMessages().length > 0}>
|
|
|
- <div data-slot="session-turn-assistant-content" aria-hidden={working()}>
|
|
|
- <AssistantParts
|
|
|
- messages={assistantMessages()}
|
|
|
- showAssistantCopyPartID={assistantCopyPartID()}
|
|
|
- turnDurationMs={turnDurationMs()}
|
|
|
- working={working()}
|
|
|
- showReasoningSummaries={showReasoningSummaries()}
|
|
|
- shellToolDefaultOpen={props.shellToolDefaultOpen}
|
|
|
- editToolDefaultOpen={props.editToolDefaultOpen}
|
|
|
+ </Show>
|
|
|
+ <Show when={showThinking()}>
|
|
|
+ <div data-slot="session-turn-thinking">
|
|
|
+ <TextShimmer text={i18n.t("ui.sessionTurn.status.thinking")} />
|
|
|
+ <Show when={!showReasoningSummaries()}>
|
|
|
+ <TextReveal
|
|
|
+ text={reasoningHeading()}
|
|
|
+ class="session-turn-thinking-heading"
|
|
|
+ travel={25}
|
|
|
+ duration={700}
|
|
|
/>
|
|
|
- </div>
|
|
|
- </Show>
|
|
|
- <Show when={showThinking()}>
|
|
|
- <div data-slot="session-turn-thinking">
|
|
|
- <TextShimmer text={i18n.t("ui.sessionTurn.status.thinking")} />
|
|
|
- <Show when={!showReasoningSummaries()}>
|
|
|
- <TextReveal
|
|
|
- text={reasoningHeading()}
|
|
|
- class="session-turn-thinking-heading"
|
|
|
- travel={25}
|
|
|
- duration={700}
|
|
|
- />
|
|
|
- </Show>
|
|
|
- </div>
|
|
|
- </Show>
|
|
|
- <SessionRetry status={status()} show={active()} />
|
|
|
- <Show when={edited() > 0 && !working()}>
|
|
|
- <div data-slot="session-turn-diffs">
|
|
|
- <Collapsible open={open()} onOpenChange={setOpen} variant="ghost">
|
|
|
- <Collapsible.Trigger>
|
|
|
- <div data-component="session-turn-diffs-trigger">
|
|
|
- <div data-slot="session-turn-diffs-title">
|
|
|
- <span data-slot="session-turn-diffs-label">
|
|
|
- {i18n.t("ui.sessionReview.change.modified")}
|
|
|
- </span>
|
|
|
- <span data-slot="session-turn-diffs-count">
|
|
|
- {edited()} {i18n.t(edited() === 1 ? "ui.common.file.one" : "ui.common.file.other")}
|
|
|
- </span>
|
|
|
- <div data-slot="session-turn-diffs-meta">
|
|
|
- <DiffChanges changes={diffs()} variant="bars" />
|
|
|
- <Collapsible.Arrow />
|
|
|
- </div>
|
|
|
+ </Show>
|
|
|
+ </div>
|
|
|
+ </Show>
|
|
|
+ <SessionRetry status={status()} show={active()} />
|
|
|
+ <Show when={edited() > 0 && !working()}>
|
|
|
+ <div data-slot="session-turn-diffs">
|
|
|
+ <Collapsible open={open()} onOpenChange={setOpen} variant="ghost">
|
|
|
+ <Collapsible.Trigger>
|
|
|
+ <div data-component="session-turn-diffs-trigger">
|
|
|
+ <div data-slot="session-turn-diffs-title">
|
|
|
+ <span data-slot="session-turn-diffs-label">{i18n.t("ui.sessionReview.change.modified")}</span>
|
|
|
+ <span data-slot="session-turn-diffs-count">
|
|
|
+ {edited()} {i18n.t(edited() === 1 ? "ui.common.file.one" : "ui.common.file.other")}
|
|
|
+ </span>
|
|
|
+ <div data-slot="session-turn-diffs-meta">
|
|
|
+ <DiffChanges changes={diffs()} variant="bars" />
|
|
|
+ <Collapsible.Arrow />
|
|
|
</div>
|
|
|
</div>
|
|
|
- </Collapsible.Trigger>
|
|
|
- <Collapsible.Content>
|
|
|
- <Show when={open()}>
|
|
|
- <div data-component="session-turn-diffs-content">
|
|
|
- <Accordion
|
|
|
- multiple
|
|
|
- style={{ "--sticky-accordion-offset": "40px" }}
|
|
|
- value={expanded()}
|
|
|
- onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
|
|
|
- >
|
|
|
- <For each={diffs()}>
|
|
|
- {(diff) => {
|
|
|
- const active = createMemo(() => expanded().includes(diff.file))
|
|
|
- const [visible, setVisible] = createSignal(false)
|
|
|
-
|
|
|
- createEffect(
|
|
|
- on(
|
|
|
- active,
|
|
|
- (value) => {
|
|
|
- if (!value) {
|
|
|
- setVisible(false)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- requestAnimationFrame(() => {
|
|
|
- if (!active()) return
|
|
|
- setVisible(true)
|
|
|
- })
|
|
|
- },
|
|
|
- { defer: true },
|
|
|
- ),
|
|
|
- )
|
|
|
-
|
|
|
- return (
|
|
|
- <Accordion.Item value={diff.file}>
|
|
|
- <StickyAccordionHeader>
|
|
|
- <Accordion.Trigger>
|
|
|
- <div data-slot="session-turn-diff-trigger">
|
|
|
- <span data-slot="session-turn-diff-path">
|
|
|
- <Show when={diff.file.includes("/")}>
|
|
|
- <span data-slot="session-turn-diff-directory">
|
|
|
- {`\u202A${getDirectory(diff.file)}\u202C`}
|
|
|
- </span>
|
|
|
- </Show>
|
|
|
- <span data-slot="session-turn-diff-filename">
|
|
|
- {getFilename(diff.file)}
|
|
|
+ </div>
|
|
|
+ </Collapsible.Trigger>
|
|
|
+ <Collapsible.Content>
|
|
|
+ <Show when={open()}>
|
|
|
+ <div data-component="session-turn-diffs-content">
|
|
|
+ <Accordion
|
|
|
+ multiple
|
|
|
+ style={{ "--sticky-accordion-offset": "40px" }}
|
|
|
+ value={expanded()}
|
|
|
+ onChange={(value) => setExpanded(Array.isArray(value) ? value : value ? [value] : [])}
|
|
|
+ >
|
|
|
+ <For each={diffs()}>
|
|
|
+ {(diff) => {
|
|
|
+ const active = createMemo(() => expanded().includes(diff.file))
|
|
|
+ const [visible, setVisible] = createSignal(false)
|
|
|
+
|
|
|
+ createEffect(
|
|
|
+ on(
|
|
|
+ active,
|
|
|
+ (value) => {
|
|
|
+ if (!value) {
|
|
|
+ setVisible(false)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ requestAnimationFrame(() => {
|
|
|
+ if (!active()) return
|
|
|
+ setVisible(true)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ { defer: true },
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ return (
|
|
|
+ <Accordion.Item value={diff.file}>
|
|
|
+ <StickyAccordionHeader>
|
|
|
+ <Accordion.Trigger>
|
|
|
+ <div data-slot="session-turn-diff-trigger">
|
|
|
+ <span data-slot="session-turn-diff-path">
|
|
|
+ <Show when={diff.file.includes("/")}>
|
|
|
+ <span data-slot="session-turn-diff-directory">
|
|
|
+ {`\u202A${getDirectory(diff.file)}\u202C`}
|
|
|
</span>
|
|
|
+ </Show>
|
|
|
+ <span data-slot="session-turn-diff-filename">{getFilename(diff.file)}</span>
|
|
|
+ </span>
|
|
|
+ <div data-slot="session-turn-diff-meta">
|
|
|
+ <span data-slot="session-turn-diff-changes">
|
|
|
+ <DiffChanges changes={diff} />
|
|
|
+ </span>
|
|
|
+ <span data-slot="session-turn-diff-chevron">
|
|
|
+ <Icon name="chevron-down" size="small" />
|
|
|
</span>
|
|
|
- <div data-slot="session-turn-diff-meta">
|
|
|
- <span data-slot="session-turn-diff-changes">
|
|
|
- <DiffChanges changes={diff} />
|
|
|
- </span>
|
|
|
- <span data-slot="session-turn-diff-chevron">
|
|
|
- <Icon name="chevron-down" size="small" />
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </Accordion.Trigger>
|
|
|
- </StickyAccordionHeader>
|
|
|
- <Accordion.Content>
|
|
|
- <Show when={visible()}>
|
|
|
- <div data-slot="session-turn-diff-view" data-scrollable>
|
|
|
- <Dynamic
|
|
|
- component={fileComponent}
|
|
|
- mode="diff"
|
|
|
- before={{ name: diff.file, contents: diff.before }}
|
|
|
- after={{ name: diff.file, contents: diff.after }}
|
|
|
- />
|
|
|
</div>
|
|
|
- </Show>
|
|
|
- </Accordion.Content>
|
|
|
- </Accordion.Item>
|
|
|
- )
|
|
|
- }}
|
|
|
- </For>
|
|
|
- </Accordion>
|
|
|
- </div>
|
|
|
- </Show>
|
|
|
- </Collapsible.Content>
|
|
|
- </Collapsible>
|
|
|
- </div>
|
|
|
- </Show>
|
|
|
- <Show when={error()}>
|
|
|
- <Card variant="error" class="error-card">
|
|
|
- {errorText()}
|
|
|
- </Card>
|
|
|
- </Show>
|
|
|
- </div>
|
|
|
- )}
|
|
|
+ </div>
|
|
|
+ </Accordion.Trigger>
|
|
|
+ </StickyAccordionHeader>
|
|
|
+ <Accordion.Content>
|
|
|
+ <Show when={visible()}>
|
|
|
+ <div data-slot="session-turn-diff-view" data-scrollable>
|
|
|
+ <Dynamic
|
|
|
+ component={fileComponent}
|
|
|
+ mode="diff"
|
|
|
+ before={{ name: diff.file, contents: diff.before }}
|
|
|
+ after={{ name: diff.file, contents: diff.after }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </Show>
|
|
|
+ </Accordion.Content>
|
|
|
+ </Accordion.Item>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </For>
|
|
|
+ </Accordion>
|
|
|
+ </div>
|
|
|
+ </Show>
|
|
|
+ </Collapsible.Content>
|
|
|
+ </Collapsible>
|
|
|
+ </div>
|
|
|
+ </Show>
|
|
|
+ <Show when={error()}>
|
|
|
+ <Card variant="error" class="error-card">
|
|
|
+ {errorText()}
|
|
|
+ </Card>
|
|
|
+ </Show>
|
|
|
+ </div>
|
|
|
</Show>
|
|
|
{props.children}
|
|
|
</div>
|