Skip to content

Commit fe82a76

Browse files
authored
thinking header enforce first word must be past tense, dim text after verb (#298119)
* thinking headers: dim text after first word on finalize When a thinking header finalizes, everything past the first word (assumed to be a past tense verb) renders at 0.7 opacity while the verb itself stays at full opacity. * thinking titles: enforce first word must be a past tense verb * thinking: remove top gap before first list item * thinking: normalize streaming title detail line-height * thinking: avoid inline-baseline header height jitter * fix jump
1 parent 7822fcf commit fe82a76

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.ts

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -583,13 +583,41 @@ export class ChatThinkingContentPart extends ChatCollapsibleContentPart implemen
583583
}
584584
}
585585

586+
private setFinalizedTitle(title: string): void {
587+
if (!this._collapseButton) {
588+
return;
589+
}
590+
591+
const labelElement = this._collapseButton.labelElement;
592+
labelElement.textContent = '';
593+
594+
const firstSpaceIndex = title.indexOf(' ');
595+
if (firstSpaceIndex === -1) {
596+
// Single word title, no need to split
597+
labelElement.textContent = title;
598+
} else {
599+
const verb = title.substring(0, firstSpaceIndex);
600+
const rest = title.substring(firstSpaceIndex);
601+
602+
const verbSpan = $('span');
603+
verbSpan.textContent = verb;
604+
labelElement.appendChild(verbSpan);
605+
606+
const restSpan = $('span.chat-thinking-title-detail-text');
607+
restSpan.textContent = rest;
608+
labelElement.appendChild(restSpan);
609+
}
610+
611+
this._collapseButton.element.ariaLabel = title;
612+
}
613+
586614
private setDropdownClickable(clickable: boolean): void {
587615
if (this._collapseButton) {
588616
this._collapseButton.element.style.pointerEvents = clickable ? 'auto' : 'none';
589617
}
590618

591619
if (!clickable && this.streamingCompleted) {
592-
super.setTitle(this.lastExtractedTitle ?? this.currentTitle);
620+
this.setFinalizedTitle(this.lastExtractedTitle ?? this.currentTitle);
593621
}
594622
}
595623

@@ -745,7 +773,7 @@ export class ChatThinkingContentPart extends ChatCollapsibleContentPart implemen
745773

746774
if (this.content.generatedTitle) {
747775
this.currentTitle = this.content.generatedTitle;
748-
super.setTitle(this.content.generatedTitle);
776+
this.setFinalizedTitle(this.content.generatedTitle);
749777
return;
750778
}
751779

@@ -755,7 +783,7 @@ export class ChatThinkingContentPart extends ChatCollapsibleContentPart implemen
755783
this.currentTitle = existingTitle;
756784
this.content.generatedTitle = existingTitle;
757785
this.setGeneratedTitleOnAllParts(existingTitle);
758-
super.setTitle(existingTitle);
786+
this.setFinalizedTitle(existingTitle);
759787
return;
760788
}
761789

@@ -787,7 +815,7 @@ export class ChatThinkingContentPart extends ChatCollapsibleContentPart implemen
787815
this.currentTitle = title;
788816
this.content.generatedTitle = title;
789817
this.setGeneratedTitleOnAllParts(title);
790-
super.setTitle(title);
818+
this.setFinalizedTitle(title);
791819
return;
792820
}
793821

@@ -837,6 +865,7 @@ export class ChatThinkingContentPart extends ChatCollapsibleContentPart implemen
837865
OUTPUT FORMAT:
838866
- MUST be a single sentence
839867
- MUST be under 10 words
868+
- The FIRST word MUST be a past tense verb (e.g. "Updated", "Reviewed", "Created", "Searched", "Analyzed")
840869
- No quotes, no trailing punctuation
841870
842871
GENERAL:
@@ -962,9 +991,7 @@ ${this.hookCount > 0 ? `EXAMPLES WITH BLOCKED CONTENT (from hooks):
962991

963992
if (generatedTitle && !this._store.isDisposed) {
964993
this.currentTitle = generatedTitle;
965-
if (this._collapseButton) {
966-
this._collapseButton.label = generatedTitle;
967-
}
994+
this.setFinalizedTitle(generatedTitle);
968995
this.content.generatedTitle = generatedTitle;
969996
this.setGeneratedTitleOnAllParts(generatedTitle);
970997
return;
@@ -1018,7 +1045,7 @@ ${this.hookCount > 0 ? `EXAMPLES WITH BLOCKED CONTENT (from hooks):
10181045

10191046
if (this._collapseButton) {
10201047
this._collapseButton.icon = Codicon.check;
1021-
this._collapseButton.label = finalLabel;
1048+
this.setFinalizedTitle(finalLabel);
10221049
}
10231050

10241051
this.updateDropdownClickability();

src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
}
1919

2020
> .chat-used-context-label .monaco-button.monaco-icon-button {
21+
display: flex;
22+
align-items: center;
2123
line-height: 1.5em;
2224
font-size: 13px;
2325

@@ -35,11 +37,18 @@
3537

3638
.rendered-markdown.chat-thinking-title-detail {
3739
display: inline;
40+
font-size: inherit;
41+
line-height: inherit;
3842

3943
> p {
4044
display: inline;
45+
margin: 0;
4146
}
4247
}
48+
49+
.chat-thinking-title-detail-text {
50+
opacity: 0.7;
51+
}
4352
}
4453

4554
&.chat-thinking-active > .chat-used-context-label .monaco-button.monaco-icon-button {
@@ -160,7 +169,6 @@
160169
padding: 6px 12px 6px 24px;
161170
position: relative;
162171
font-size: var(--vscode-chat-font-size-body-s);
163-
164172
.progress-container {
165173
margin-bottom: 0px;
166174
padding-top: 0px;

0 commit comments

Comments
 (0)