feat: 完成第二版类型清理
This commit is contained in:
1 parent
4c0a655a1c
commit
d7a729ca68
604 files changed
+595
-953
No files matched your search
@@ -11,6 +11,9 @@ import { hasThinkingContent, Message } from './Message.js';
|
||||
import { MessageModel } from './MessageModel.js';
|
||||
import { shouldRenderStatically } from './Messages.js';
|
||||
import { MessageTimestamp } from './MessageTimestamp.js';
|
||||
|
||||
/** Narrowed content block shape used for type assertions on MessageContent arrays. */
|
||||
type ContentBlockLike = { type: string; name?: string; input?: unknown; id?: string; text?: string };
|
||||
import { OffscreenFreeze } from './OffscreenFreeze.js';
|
||||
export type Props = {
|
||||
message: RenderableMessage;
|
||||
@@ -51,18 +54,18 @@ export function hasContentAfterIndex(messages: RenderableMessage[], index: numbe
|
||||
for (let i = index + 1; i < messages.length; i++) {
|
||||
const msg = messages[i];
|
||||
if (msg?.type === 'assistant') {
|
||||
const content = msg.message.content[0];
|
||||
const content = (msg.message.content as ContentBlockLike[])[0];
|
||||
if (content?.type === 'thinking' || content?.type === 'redacted_thinking') {
|
||||
continue;
|
||||
}
|
||||
if (content?.type === 'tool_use') {
|
||||
if (getToolSearchOrReadInfo(content.name, content.input, tools).isCollapsible) {
|
||||
if (getToolSearchOrReadInfo(content.name!, content.input, tools).isCollapsible) {
|
||||
continue;
|
||||
}
|
||||
// Non-collapsible tool uses appear in syntheticStreamingToolUseMessages
|
||||
// before their ID is added to inProgressToolUseIDs. Skip while streaming
|
||||
// to avoid briefly finalizing the read group.
|
||||
if (streamingToolUseIDs.has(content.id)) {
|
||||
if (streamingToolUseIDs.has(content.id!)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -73,7 +76,7 @@ export function hasContentAfterIndex(messages: RenderableMessage[], index: numbe
|
||||
}
|
||||
// Tool results arrive while the collapsed group is still being built
|
||||
if (msg?.type === 'user') {
|
||||
const content = msg.message.content[0];
|
||||
const content = (msg.message.content as ContentBlockLike[])[0];
|
||||
if (content?.type === 'tool_result') {
|
||||
continue;
|
||||
}
|
||||
@@ -81,7 +84,7 @@ export function hasContentAfterIndex(messages: RenderableMessage[], index: numbe
|
||||
// Collapsible grouped_tool_use messages arrive transiently before being
|
||||
// merged into the current collapsed group on the next render cycle
|
||||
if (msg?.type === 'grouped_tool_use') {
|
||||
const firstInput = msg.messages[0]?.message.content[0]?.input;
|
||||
const firstInput = (msg.messages[0]?.message.content as ContentBlockLike[])?.[0]?.input;
|
||||
if (getToolSearchOrReadInfo(msg.toolName, firstInput, tools).isCollapsible) {
|
||||
continue;
|
||||
}
|
||||
@@ -296,8 +299,8 @@ function _temp(c) {
|
||||
export function isMessageStreaming(msg: RenderableMessage, streamingToolUseIDs: Set<string>): boolean {
|
||||
if (msg.type === 'grouped_tool_use') {
|
||||
return msg.messages.some(m => {
|
||||
const content = m.message.content[0];
|
||||
return content?.type === 'tool_use' && streamingToolUseIDs.has(content.id);
|
||||
const content = (m.message.content as ContentBlockLike[])[0];
|
||||
return content?.type === 'tool_use' && streamingToolUseIDs.has(content.id!);
|
||||
});
|
||||
}
|
||||
if (msg.type === 'collapsed_read_search') {
|
||||
@@ -315,8 +318,8 @@ export function isMessageStreaming(msg: RenderableMessage, streamingToolUseIDs:
|
||||
export function allToolsResolved(msg: RenderableMessage, resolvedToolUseIDs: Set<string>): boolean {
|
||||
if (msg.type === 'grouped_tool_use') {
|
||||
return msg.messages.every(m => {
|
||||
const content = m.message.content[0];
|
||||
return content?.type === 'tool_use' && resolvedToolUseIDs.has(content.id);
|
||||
const content = (m.message.content as ContentBlockLike[])[0];
|
||||
return content?.type === 'tool_use' && resolvedToolUseIDs.has(content.id!);
|
||||
});
|
||||
}
|
||||
if (msg.type === 'collapsed_read_search') {
|
||||
@@ -324,9 +327,9 @@ export function allToolsResolved(msg: RenderableMessage, resolvedToolUseIDs: Set
|
||||
return toolIds.every(id => resolvedToolUseIDs.has(id));
|
||||
}
|
||||
if (msg.type === 'assistant') {
|
||||
const block = msg.message.content[0];
|
||||
const block = (msg.message.content as ContentBlockLike[])[0];
|
||||
if (block?.type === 'server_tool_use') {
|
||||
return resolvedToolUseIDs.has(block.id);
|
||||
return resolvedToolUseIDs.has(block.id!);
|
||||
}
|
||||
}
|
||||
const toolUseID = getToolUseID(msg);
|
||||
@@ -365,7 +368,7 @@ export function areMessageRowPropsEqual(prev: Props, next: Props): boolean {
|
||||
// lastThinkingBlockId affects thinking block visibility — but only for
|
||||
// messages that HAVE thinking content. Checking unconditionally busts the
|
||||
// memo for every scrollback message whenever thinking starts/stops (CC-941).
|
||||
if (prev.lastThinkingBlockId !== next.lastThinkingBlockId && hasThinkingContent(next.message)) {
|
||||
if (prev.lastThinkingBlockId !== next.lastThinkingBlockId && hasThinkingContent(next.message as Parameters<typeof hasThinkingContent>[0])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -380,4 +383,3 @@ export function areMessageRowPropsEqual(prev: Props, next: Props): boolean {
|
||||
return true;
|
||||
}
|
||||
export const MessageRow = React.memo(MessageRowImpl, areMessageRowPropsEqual);
|
||||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbW1hbmQiLCJCb3giLCJTY3JlZW4iLCJUb29scyIsIlJlbmRlcmFibGVNZXNzYWdlIiwiZ2V0RGlzcGxheU1lc3NhZ2VGcm9tQ29sbGFwc2VkIiwiZ2V0VG9vbFNlYXJjaE9yUmVhZEluZm8iLCJnZXRUb29sVXNlSWRzRnJvbUNvbGxhcHNlZEdyb3VwIiwiaGFzQW55VG9vbEluUHJvZ3Jlc3MiLCJidWlsZE1lc3NhZ2VMb29rdXBzIiwiRU1QVFlfU1RSSU5HX1NFVCIsImdldFByb2dyZXNzTWVzc2FnZXNGcm9tTG9va3VwIiwiZ2V0U2libGluZ1Rvb2xVc2VJRHNGcm9tTG9va3VwIiwiZ2V0VG9vbFVzZUlEIiwiaGFzVGhpbmtpbmdDb250ZW50IiwiTWVzc2FnZSIsIk1lc3NhZ2VNb2RlbCIsInNob3VsZFJlbmRlclN0YXRpY2FsbHkiLCJNZXNzYWdlVGltZXN0YW1wIiwiT2Zmc2NyZWVuRnJlZXplIiwiUHJvcHMiLCJtZXNzYWdlIiwiaXNVc2VyQ29udGludWF0aW9uIiwiaGFzQ29udGVudEFmdGVyIiwidG9vbHMiLCJjb21tYW5kcyIsInZlcmJvc2UiLCJpblByb2dyZXNzVG9vbFVzZUlEcyIsIlNldCIsInN0cmVhbWluZ1Rvb2xVc2VJRHMiLCJzY3JlZW4iLCJjYW5BbmltYXRlIiwib25PcGVuUmF0ZUxpbWl0T3B0aW9ucyIsImxhc3RUaGlua2luZ0Jsb2NrSWQiLCJsYXRlc3RCYXNoT3V0cHV0VVVJRCIsImNvbHVtbnMiLCJpc0xvYWRpbmciLCJsb29rdXBzIiwiUmV0dXJuVHlwZSIsImhhc0NvbnRlbnRBZnRlckluZGV4IiwibWVzc2FnZXMiLCJpbmRleCIsImkiLCJsZW5ndGgiLCJtc2ciLCJ0eXBlIiwiY29udGVudCIsIm5hbWUiLCJpbnB1dCIsImlzQ29sbGFwc2libGUiLCJoYXMiLCJpZCIsImZpcnN0SW5wdXQiLCJ0b29sTmFtZSIsIk1lc3NhZ2VSb3dJbXBsIiwidDAiLCIkIiwiX2MiLCJpc1RyYW5zY3JpcHRNb2RlIiwiaXNHcm91cGVkIiwiaXNDb2xsYXBzZWQiLCJ0MSIsImlzQWN0aXZlQ29sbGFwc2VkR3JvdXAiLCJ0MiIsImRpc3BsYXlNZXNzYWdlIiwiZGlzcGxheU1zZyIsInQzIiwicHJvZ3Jlc3NNZXNzYWdlc0Zvck1lc3NhZ2UiLCJ0NCIsInNpYmxpbmdUb29sVXNlSURzIiwiaXNTdGF0aWMiLCJzaG91bGRBbmltYXRlIiwidDUiLCJ0NiIsIm0iLCJzb21lIiwidG9vbFVzZUlEIiwiX3RlbXAiLCJ0aW1lc3RhbXAiLCJtb2RlbCIsImhhc01ldGFkYXRhIiwidDciLCJ1bmRlZmluZWQiLCJ0OCIsIm1lc3NhZ2VFbCIsInQ5IiwidDEwIiwiYyIsImlzTWVzc2FnZVN0cmVhbWluZyIsInRvb2xJZHMiLCJhbGxUb29sc1Jlc29sdmVkIiwicmVzb2x2ZWRUb29sVXNlSURzIiwiZXZlcnkiLCJibG9jayIsImFyZU1lc3NhZ2VSb3dQcm9wc0VxdWFsIiwicHJldiIsIm5leHQiLCJwcmV2SXNMYXRlc3RCYXNoIiwidXVpZCIsIm5leHRJc0xhdGVzdEJhc2giLCJpc1N0cmVhbWluZyIsImlzUmVzb2x2ZWQiLCJNZXNzYWdlUm93IiwibWVtbyJdLCJzb3VyY2VzIjpbIk1lc3NhZ2VSb3cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgeyBDb21tYW5kIH0gZnJvbSAnLi4vY29tbWFuZHMuanMnXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgdHlwZSB7IFNjcmVlbiB9IGZyb20gJy4uL3NjcmVlbnMvUkVQTC5qcydcbmltcG9ydCB0eXBlIHsgVG9vbHMgfSBmcm9tICcuLi9Ub29sLmpzJ1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJhYmxlTWVzc2FnZSB9IGZyb20gJy4uL3R5cGVzL21lc3NhZ2UuanMnXG5pbXBvcnQge1xuICBnZXREaXNwbGF5TWVzc2FnZUZyb21Db2xsYXBzZWQsXG4gIGdldFRvb2xTZWFyY2hPclJlYWRJbmZvLFxuICBnZXRUb29sVXNlSWRzRnJvbUNvbGxhcHNlZEdyb3VwLFxuICBoYXNBbnlUb29sSW5Qcm9ncmVzcyxcbn0gZnJvbSAnLi4vdXRpbHMvY29sbGFwc2VSZWFkU2VhcmNoLmpzJ1xuaW1wb3J0IHtcbiAgdHlwZSBidWlsZE1lc3NhZ2VMb29rdXBzLFxuICBFTVBUWV9TVFJJTkdfU0VULFxuICBnZXRQcm9ncmVzc01lc3NhZ2VzRnJvbUxvb2t1cCxcbiAgZ2V0U2libGluZ1Rvb2xVc2VJRHNGcm9tTG9va3VwLFxuICBnZXRUb29sVXNlSUQsXG59IGZyb20gJy4uL3V0aWxzL21lc3NhZ2VzLmpzJ1xuaW1wb3J0IHsgaGFzVGhpbmtpbmdDb250ZW50LCBNZXNzYWdlIH0gZnJvbSAnLi9NZXNzYWdlLmpzJ1xuaW1wb3J0IHsgTWVzc2FnZU1vZGVsIH0gZnJvbSAnLi9NZXNzYWdlTW9kZWwuanMnXG5pbXBvcnQgeyBzaG91bGRSZW5kZXJTdGF0aWNhbGx5IH0gZnJvbSAnLi9NZXNzYWdlcy5qcydcbmltcG9ydCB7IE1lc3NhZ2VUaW1lc3RhbXAgfSBmcm9tICcuL01lc3NhZ2VUaW1lc3RhbXAuanMnXG5pbXBvcnQgeyBPZmZzY3JlZW5GcmVlemUgfSBmcm9tICcuL09mZnNjcmVlbkZyZWV6ZS5qcydcblxuZXhwb3J0IHR5cGUgUHJvcHMgPSB7XG4gIG1lc3NhZ2U6IFJlbmRlcmFibGVNZXNzYWdlXG4gIC8qKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBtZXNzYWdlIGluIHJlbmRlcmFibGVNZXNzYWdlcyBpcyBhbHNvIGEgdXNlciBtZXNzYWdlLiAqL1xuICBpc1VzZXJDb250aW51YXRpb246IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgaXMgbm9uLXNraXBwYWJsZSBjb250ZW50IGFmdGVyIHRoaXMgbWVzc2FnZSBpbiByZW5kZXJhYmxlTWVzc2FnZXMuXG4gICAqIE9ubHkgbmVlZHMgdG8gYmUgYWNjdXJhdGUgZm9yIGBjb2xsYXBzZWRfcmVhZF9zZWFyY2hgIG1lc3NhZ2VzIOKAlCB1c2VkIHRvIGRlY2lkZVxuICAgKiBpZiB0aGUgY29sbGFwc2VkIGdyb3VwIHNwaW5uZXIgc2hvdWxkIHN0YXkgYWN0aXZlLiBQYXNzIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgaGFzQ29udGVudEFmdGVyOiBib29sZWFuXG4gIHRvb2xzOiBUb29sc1xuICBjb21tYW5kczogQ29tbWFuZFtdXG4gIHZlcmJvc2U6IGJvb2xlYW5cbiAgaW5Qcm9ncmVzc1Rvb2xVc2VJRHM6IFNldDxzdHJpbmc+XG4gIHN0cmVhbWluZ1Rvb2xVc2VJRHM6IFNldDxzdHJpbmc+XG4gIHNjcmVlbjogU2NyZWVuXG4gIGNhbkFuaW1hdGU6IGJvb2xlYW5cbiAgb25PcGVuUmF0ZUxpbWl0T3B0aW9ucz86ICgpID0+IHZvaWRcbiAgbGFzdFRoaW5raW5nQmxvY2tJZDogc3RyaW5nIHwgbnVsbFxuICBsYXRlc3RCYXNoT3V0cHV0VVVJRDogc3RyaW5nIHwgbnVsbFxuICBjb2x1bW5zOiBudW1iZXJcbiAgaXNMb2FkaW5nOiBib29sZWFuXG4gIGxvb2t1cHM6IFJldHVyblR5cGU8dHlwZW9mIGJ1aWxkTWVzc2FnZUxvb2t1cHM+XG59XG5cbi8qKlxuICogU2NhbnMgZm9yd2FyZCBmcm9tIGBpbmRleCsxYCB0byBjaGVjayBpZiBhbnkgXCJyZWFsXCIgY29udGVudCBmb2xsb3dzLiBVc2VkIHRvXG4gKiBkZWNpZGUgd2hldGhlciBhIGNvbGxhcHNlZCByZWFkL3NlYXJjaCBncm91cCBzaG91bGQgc3RheSBpbiBpdHMgYWN0aXZlXG4gKiAoZ3JleSBkb3QsIHByZXNlbnQtdGVuc2UgXCJSZWFkaW5n4oCmXCIpIHN0YXRlIHdoaWxlIHRoZSBxdWVyeSBpcyBzdGlsbCBsb2FkaW5nLlxuICpcbiAqIEV4cG9ydGVkIHNvIE1lc3NhZ2VzLnRzeCBjYW4gY29tcHV0ZSB0aGlzIG9uY2UgcGVyIG1lc3NhZ2UgYW5kIHBhc3MgdGhlXG4gKiByZXN1bHQgYXMgYSBib29sZWFuIHByb3Ag4oCUIGF2b2lkcyBwYXNzaW5nIHRoZSBmdWxsIGByZW5kZXJhYmxlTWVzc2FnZXNgIGFycmF5XG4gKiB0byBlYWNoIE1lc3NhZ2VSb3cgKHdoaWNoIFJlYWN0IENvbXBpbGVyIHdvdWxkIHBpbiBpbiB0aGUgZmliZXIncyBtZW1
Line truncated
|
||||
Reference in new issue
Block a user