diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css index 78d574d8a135..ae3c6bd88bdd 100644 --- a/packages/ui/src/components/message-part.css +++ b/packages/ui/src/components/message-part.css @@ -277,13 +277,35 @@ } } +[data-component="reasoning-part-trigger"] { + width: 100%; + min-height: 24px; + display: flex; + align-items: center; + justify-content: flex-start; + gap: 0px; + cursor: pointer; + + [data-slot="reasoning-part-label"] { + font-family: var(--font-family-sans); + font-size: 14px; + font-weight: var(--font-weight-medium); + line-height: var(--line-height-large); + color: var(--text-strong); + } + + [data-slot="collapsible-arrow"] { + color: var(--icon-weaker); + } +} + [data-component="reasoning-part"] { width: 100%; color: var(--text-base); line-height: var(--line-height-normal); [data-component="markdown"] { - margin-top: 16px; + margin-top: 4px; font-style: normal; font-size: 13px; color: var(--text-weak); diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 35912e119d40..859c0300e7ad 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -181,6 +181,7 @@ export interface MessagePartProps { virtualizeDiff?: boolean showAssistantCopyPartID?: string | null turnDurationMs?: number + working?: boolean } export type PartComponent = Component @@ -705,6 +706,8 @@ export function AssistantParts(props: { return part().get(entry.ref.messageID)?.get(entry.ref.partID) }) + const tail = createMemo(() => entryAccessor().key === last()) + return ( @@ -714,6 +717,7 @@ export function AssistantParts(props: { showAssistantCopyPartID={props.showAssistantCopyPartID} turnDurationMs={props.turnDurationMs} defaultOpen={partDefaultOpen(item()!, props.shellToolDefaultOpen, props.editToolDefaultOpen)} + working={props.working && tail()} /> @@ -1274,6 +1278,7 @@ export function Part(props: MessagePartProps) { virtualizeDiff={props.virtualizeDiff} showAssistantCopyPartID={props.showAssistantCopyPartID} turnDurationMs={props.turnDurationMs} + working={props.working} /> ) @@ -1580,19 +1585,35 @@ PART_MAPPING["text"] = function TextPartDisplay(props) { PART_MAPPING["reasoning"] = function ReasoningPartDisplay(props) { const data = useData() + const i18n = useI18n() const part = () => props.part as ReasoningPart const streaming = createMemo( () => props.message.role === "assistant" && typeof (props.message as AssistantMessage).time.completed !== "number", ) const text = () => readPartText(data.store.part_text_accum_delta, part()) + const [open, setOpen] = createSignal(true) return ( -
- }> - - -
+ + +
+ + + + + + +
+
+ +
+ }> + + +
+
+
) } diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts index dd8cfed6f98f..c1824e9c0d8d 100644 --- a/packages/ui/src/i18n/ar.ts +++ b/packages/ui/src/i18n/ar.ts @@ -67,6 +67,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "تفكير - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "جمع الأفكار", "ui.sessionTurn.status.consideringNextSteps": "النظر في الخطوات التالية", + "ui.sessionTurn.status.reasoning": "التفكير", + "ui.sessionTurn.status.reasoningSummary": "ملخّص التفكير", "ui.messagePart.questions.dismissed": "تم رفض الأسئلة", "ui.messagePart.compaction": "تم ضغط الجلسة", diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts index 4b2c418ca501..1652653188d4 100644 --- a/packages/ui/src/i18n/br.ts +++ b/packages/ui/src/i18n/br.ts @@ -67,6 +67,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Pensando - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Organizando pensamentos", "ui.sessionTurn.status.consideringNextSteps": "Considerando próximos passos", + "ui.sessionTurn.status.reasoning": "Raciocínio", + "ui.sessionTurn.status.reasoningSummary": "Resumo do Raciocínio", "ui.messagePart.questions.dismissed": "Perguntas descartadas", "ui.messagePart.compaction": "Sessão compactada", diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts index be041f147133..c187dff561f8 100644 --- a/packages/ui/src/i18n/bs.ts +++ b/packages/ui/src/i18n/bs.ts @@ -71,6 +71,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Razmišljanje - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Sređivanje misli", "ui.sessionTurn.status.consideringNextSteps": "Razmatranje sljedećih koraka", + "ui.sessionTurn.status.reasoning": "Razmišljanje", + "ui.sessionTurn.status.reasoningSummary": "Sažetak Razmišljanja", "ui.messagePart.questions.dismissed": "Pitanja odbačena", "ui.messagePart.compaction": "Sesija sažeta", diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts index 91adc52e9d45..e69a9bff305d 100644 --- a/packages/ui/src/i18n/da.ts +++ b/packages/ui/src/i18n/da.ts @@ -66,6 +66,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Tænker - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Samler tanker", "ui.sessionTurn.status.consideringNextSteps": "Overvejer næste skridt", + "ui.sessionTurn.status.reasoning": "Ræsonnering", + "ui.sessionTurn.status.reasoningSummary": "Ræsonnerings Oversigt", "ui.messagePart.questions.dismissed": "Spørgsmål afvist", "ui.messagePart.compaction": "Session komprimeret", diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts index 7b36859bf6de..bfcb83feeb7c 100644 --- a/packages/ui/src/i18n/de.ts +++ b/packages/ui/src/i18n/de.ts @@ -72,6 +72,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Denken - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Gedanken sammeln", "ui.sessionTurn.status.consideringNextSteps": "Nächste Schritte erwägen", + "ui.sessionTurn.status.reasoning": "Überlegung", + "ui.sessionTurn.status.reasoningSummary": "Überlegungs Zusammenfassung", "ui.messagePart.questions.dismissed": "Fragen verworfen", "ui.messagePart.compaction": "Sitzung komprimiert", diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts index 0f691a214cac..4a6a7e4fe5df 100644 --- a/packages/ui/src/i18n/en.ts +++ b/packages/ui/src/i18n/en.ts @@ -74,6 +74,8 @@ export const dict: Record = { "ui.sessionTurn.status.thinkingWithTopic": "Thinking - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Gathering thoughts", "ui.sessionTurn.status.consideringNextSteps": "Considering next steps", + "ui.sessionTurn.status.reasoning": "Reasoning", + "ui.sessionTurn.status.reasoningSummary": "Reasoning Summary", "ui.messagePart.diagnostic.error": "Error", "ui.messagePart.title.edit": "Edit", diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts index f883531031b0..d4a229b3c1db 100644 --- a/packages/ui/src/i18n/es.ts +++ b/packages/ui/src/i18n/es.ts @@ -67,6 +67,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Pensando - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Recopilando pensamientos", "ui.sessionTurn.status.consideringNextSteps": "Considerando siguientes pasos", + "ui.sessionTurn.status.reasoning": "Razonamiento", + "ui.sessionTurn.status.reasoningSummary": "Resumen del Razonamiento", "ui.messagePart.questions.dismissed": "Preguntas descartadas", "ui.messagePart.compaction": "Sesión compactada", diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts index 3ae122d35eeb..f3cf08aee35e 100644 --- a/packages/ui/src/i18n/fr.ts +++ b/packages/ui/src/i18n/fr.ts @@ -67,6 +67,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Réflexion - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Rassemblement des idées", "ui.sessionTurn.status.consideringNextSteps": "Examen des prochaines étapes", + "ui.sessionTurn.status.reasoning": "Raisonnement", + "ui.sessionTurn.status.reasoningSummary": "Résumé du Raisonnement", "ui.messagePart.questions.dismissed": "Questions ignorées", "ui.messagePart.compaction": "Session compactée", diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts index 1b50cb5ff158..1110f4301a32 100644 --- a/packages/ui/src/i18n/ja.ts +++ b/packages/ui/src/i18n/ja.ts @@ -66,6 +66,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "思考中 - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "考えをまとめています", "ui.sessionTurn.status.consideringNextSteps": "次のステップを検討中", + "ui.sessionTurn.status.reasoning": "推論", + "ui.sessionTurn.status.reasoningSummary": "推論サマリー", "ui.messagePart.questions.dismissed": "質問をスキップしました", "ui.messagePart.compaction": "セッションを圧縮しました", diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts index d6c480364d3f..8dae09a3436f 100644 --- a/packages/ui/src/i18n/ko.ts +++ b/packages/ui/src/i18n/ko.ts @@ -67,6 +67,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "생각 중 - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "생각 정리 중", "ui.sessionTurn.status.consideringNextSteps": "다음 단계 고려 중", + "ui.sessionTurn.status.reasoning": "추론", + "ui.sessionTurn.status.reasoningSummary": "추론 요약", "ui.messagePart.questions.dismissed": "질문 무시됨", "ui.messagePart.compaction": "세션 압축됨", diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts index ecf67219d52f..53a826e2f288 100644 --- a/packages/ui/src/i18n/no.ts +++ b/packages/ui/src/i18n/no.ts @@ -70,6 +70,8 @@ export const dict: Record = { "ui.sessionTurn.status.thinkingWithTopic": "Tenker - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Samler tanker", "ui.sessionTurn.status.consideringNextSteps": "Vurderer neste trinn", + "ui.sessionTurn.status.reasoning": "Resonnering", + "ui.sessionTurn.status.reasoningSummary": "Resonnerings Sammendrag", "ui.messagePart.questions.dismissed": "Spørsmål avvist", "ui.messagePart.compaction": "Økt komprimert", diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts index 6ef40d2dafdc..ee509ba50941 100644 --- a/packages/ui/src/i18n/pl.ts +++ b/packages/ui/src/i18n/pl.ts @@ -66,6 +66,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Myślenie - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Zbieranie myśli", "ui.sessionTurn.status.consideringNextSteps": "Rozważanie kolejnych kroków", + "ui.sessionTurn.status.reasoning": "Rozumowanie", + "ui.sessionTurn.status.reasoningSummary": "Podsumowanie Rozumowania", "ui.messagePart.questions.dismissed": "Pytania odrzucone", "ui.messagePart.compaction": "Sesja skompaktowana", diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts index ed5c4e8f4f7c..1f583831055e 100644 --- a/packages/ui/src/i18n/ru.ts +++ b/packages/ui/src/i18n/ru.ts @@ -66,6 +66,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Размышление - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Сбор мыслей", "ui.sessionTurn.status.consideringNextSteps": "Рассмотрение следующих шагов", + "ui.sessionTurn.status.reasoning": "Рассуждение", + "ui.sessionTurn.status.reasoningSummary": "Сводка Рассуждений", "ui.messagePart.questions.dismissed": "Вопросы отклонены", "ui.messagePart.compaction": "Сессия сжата", diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts index e2534041ab20..1e5d014e6c3d 100644 --- a/packages/ui/src/i18n/th.ts +++ b/packages/ui/src/i18n/th.ts @@ -68,6 +68,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "กำลังคิด - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "รวบรวมความคิด", "ui.sessionTurn.status.consideringNextSteps": "พิจารณาขั้นตอนถัดไป", + "ui.sessionTurn.status.reasoning": "การใช้เหตุผล", + "ui.sessionTurn.status.reasoningSummary": "สรุปการใช้เหตุผล", "ui.messagePart.questions.dismissed": "ละทิ้งคำถามแล้ว", "ui.messagePart.compaction": "บีบอัดเซสชันแล้ว", diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts index 0ce4a73b6f52..356766592feb 100644 --- a/packages/ui/src/i18n/tr.ts +++ b/packages/ui/src/i18n/tr.ts @@ -73,6 +73,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "Düşünüyor - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Düşünceler toplanıyor", "ui.sessionTurn.status.consideringNextSteps": "Sonraki adımlar değerlendiriliyor", + "ui.sessionTurn.status.reasoning": "Akıl Yürütme", + "ui.sessionTurn.status.reasoningSummary": "Akıl Yürütme Özeti", "ui.messagePart.questions.dismissed": "Sorular reddedildi", "ui.messagePart.compaction": "Oturum sıkıştırıldı", diff --git a/packages/ui/src/i18n/uk.ts b/packages/ui/src/i18n/uk.ts index 8bfb3e4404dc..e8d04fc01889 100644 --- a/packages/ui/src/i18n/uk.ts +++ b/packages/ui/src/i18n/uk.ts @@ -65,6 +65,8 @@ export const dict: Record = { "ui.sessionTurn.status.thinkingWithTopic": "Міркування — {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "Збирання думок", "ui.sessionTurn.status.consideringNextSteps": "Розгляд наступних кроків", + "ui.sessionTurn.status.reasoning": "Міркування", + "ui.sessionTurn.status.reasoningSummary": "Підсумок міркувань", "ui.messagePart.diagnostic.error": "Помилка", "ui.messagePart.title.edit": "Редагувати", diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts index 1a385620f191..8e4ebab5bad0 100644 --- a/packages/ui/src/i18n/zh.ts +++ b/packages/ui/src/i18n/zh.ts @@ -70,6 +70,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "思考:{{topic}}", "ui.sessionTurn.status.gatheringThoughts": "正在整理思路", "ui.sessionTurn.status.consideringNextSteps": "正在考虑下一步", + "ui.sessionTurn.status.reasoning": "推理", + "ui.sessionTurn.status.reasoningSummary": "推理摘要", "ui.messagePart.questions.dismissed": "问题已忽略", "ui.messagePart.compaction": "会话已压缩", diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts index 941e1df636b7..8e969a2f5bb2 100644 --- a/packages/ui/src/i18n/zht.ts +++ b/packages/ui/src/i18n/zht.ts @@ -70,6 +70,8 @@ export const dict = { "ui.sessionTurn.status.thinkingWithTopic": "思考 - {{topic}}", "ui.sessionTurn.status.gatheringThoughts": "正在整理思緒", "ui.sessionTurn.status.consideringNextSteps": "正在考慮下一步", + "ui.sessionTurn.status.reasoning": "推理", + "ui.sessionTurn.status.reasoningSummary": "推理摘要", "ui.messagePart.questions.dismissed": "問題已略過", "ui.messagePart.compaction": "工作階段已壓縮",