@agent-native/core 0.101.12 → 0.101.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +8 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/create.ts +45 -8
  5. package/corpus/core/src/client/assistant-ui-recovery.tsx +9 -3
  6. package/corpus/core/src/client/chat/message-components.tsx +25 -2
  7. package/corpus/core/src/client/chat/tool-call-display.tsx +6 -9
  8. package/corpus/core/src/mcp/server.ts +10 -1
  9. package/corpus/core/src/server/agent-chat/framework-prompts.ts +0 -3
  10. package/corpus/core/src/server/agent-chat-plugin.ts +2 -58
  11. package/corpus/core/src/server/prompts/framework-core-compact.ts +0 -1
  12. package/corpus/core/src/server/prompts/framework-core.ts +0 -30
  13. package/corpus/core/src/server/prompts/index.ts +1 -4
  14. package/corpus/templates/chat/app/components/layout/Sidebar.tsx +0 -14
  15. package/corpus/templates/chat/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
  16. package/dist/cli/create.d.ts.map +1 -1
  17. package/dist/cli/create.js +31 -7
  18. package/dist/cli/create.js.map +1 -1
  19. package/dist/client/assistant-ui-recovery.d.ts +2 -0
  20. package/dist/client/assistant-ui-recovery.d.ts.map +1 -1
  21. package/dist/client/assistant-ui-recovery.js +5 -2
  22. package/dist/client/assistant-ui-recovery.js.map +1 -1
  23. package/dist/client/chat/message-components.d.ts +6 -0
  24. package/dist/client/chat/message-components.d.ts.map +1 -1
  25. package/dist/client/chat/message-components.js +14 -1
  26. package/dist/client/chat/message-components.js.map +1 -1
  27. package/dist/client/chat/tool-call-display.d.ts +1 -1
  28. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  29. package/dist/client/chat/tool-call-display.js +5 -8
  30. package/dist/client/chat/tool-call-display.js.map +1 -1
  31. package/dist/collab/awareness.d.ts +2 -2
  32. package/dist/collab/awareness.d.ts.map +1 -1
  33. package/dist/collab/struct-routes.d.ts +1 -1
  34. package/dist/mcp/server.d.ts.map +1 -1
  35. package/dist/mcp/server.js +10 -1
  36. package/dist/mcp/server.js.map +1 -1
  37. package/dist/resources/handlers.d.ts +2 -2
  38. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  39. package/dist/server/agent-chat/framework-prompts.js +0 -3
  40. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  41. package/dist/server/agent-chat-plugin.d.ts +0 -22
  42. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  43. package/dist/server/agent-chat-plugin.js +2 -51
  44. package/dist/server/agent-chat-plugin.js.map +1 -1
  45. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  46. package/dist/server/prompts/framework-core-compact.d.ts +0 -1
  47. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  48. package/dist/server/prompts/framework-core-compact.js +0 -1
  49. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  50. package/dist/server/prompts/framework-core.d.ts +0 -9
  51. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  52. package/dist/server/prompts/framework-core.js +0 -29
  53. package/dist/server/prompts/framework-core.js.map +1 -1
  54. package/dist/server/prompts/index.d.ts +1 -1
  55. package/dist/server/prompts/index.d.ts.map +1 -1
  56. package/dist/server/prompts/index.js +1 -1
  57. package/dist/server/prompts/index.js.map +1 -1
  58. package/dist/server/transcribe-voice.d.ts +1 -1
  59. package/package.json +1 -1
@@ -5,6 +5,8 @@ export declare function isAssistantUiStaleIndexError(error: unknown): boolean;
5
5
  export declare function isAssistantUiRecoverableRenderError(error: unknown): boolean;
6
6
  type AssistantUiStaleIndexErrorBoundaryProps = {
7
7
  resetKey: string;
8
+ /** Remount children when the recovery scope changes. */
9
+ remountOnResetKey?: boolean;
8
10
  componentName?: string;
9
11
  children: React.ReactNode;
10
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-ui-recovery.d.ts","sourceRoot":"","sources":["../../src/client/assistant-ui-recovery.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,KAAK,+BAA+B,GAChC,kCAAkC,GAClC,qCAAqC,GACrC,kCAAkC,CAAC;AAEvC,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,OAAO,GACb,+BAA+B,GAAG,IAAI,CAcxC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKpE;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3E;AAED,KAAK,uCAAuC,GAAG;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,KAAK,uCAAuC,GAAG;IAC7C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV,CAAC;AAIF,qBAAa,kCAAmC,SAAQ,KAAK,CAAC,SAAS,CACrE,uCAAuC,EACvC,uCAAuC,CACxC;IACC,KAAK,EAAE,uCAAuC,CAI5C;IAEF,OAAO,CAAC,UAAU,CAA8C;IAEhE,OAAO,CAAC,iBAAiB;IASzB,MAAM,CAAC,wBAAwB,CAC7B,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,uCAAuC,CAAC,CAIlD;IAED,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,QAwCtD;IAED,kBAAkB,CAChB,SAAS,EAAE,uCAAuC,EAClD,SAAS,EAAE,uCAAuC,QAyBnD;IAED,oBAAoB,SAInB;IAED,MAAM,6BAmBL;CACF;AAED,wBAAgB,iCAAiC,CAAC,EAChD,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,qBASA"}
1
+ {"version":3,"file":"assistant-ui-recovery.d.ts","sourceRoot":"","sources":["../../src/client/assistant-ui-recovery.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,KAAK,+BAA+B,GAChC,kCAAkC,GAClC,qCAAqC,GACrC,kCAAkC,CAAC;AAEvC,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,OAAO,GACb,+BAA+B,GAAG,IAAI,CAcxC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKpE;AAED,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3E;AAED,KAAK,uCAAuC,GAAG;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,KAAK,uCAAuC,GAAG;IAC7C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV,CAAC;AAIF,qBAAa,kCAAmC,SAAQ,KAAK,CAAC,SAAS,CACrE,uCAAuC,EACvC,uCAAuC,CACxC;IACC,KAAK,EAAE,uCAAuC,CAI5C;IAEF,OAAO,CAAC,UAAU,CAA8C;IAEhE,OAAO,CAAC,iBAAiB;IASzB,MAAM,CAAC,wBAAwB,CAC7B,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,uCAAuC,CAAC,CAIlD;IAED,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,QAwCtD;IAED,kBAAkB,CAChB,SAAS,EAAE,uCAAuC,EAClD,SAAS,EAAE,uCAAuC,QAyBnD;IAED,oBAAoB,SAInB;IAED,MAAM,6BAsBL;CACF;AAED,wBAAgB,iCAAiC,CAAC,EAChD,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,qBAUA"}
@@ -116,10 +116,13 @@ export class AssistantUiStaleIndexErrorBoundary extends React.Component {
116
116
  }
117
117
  return null;
118
118
  }
119
- return (_jsx(React.Fragment, { children: this.props.children }, `${this.props.resetKey}:${this.state.retryToken}`));
119
+ const fragmentKey = this.props.remountOnResetKey === false
120
+ ? String(this.state.retryToken)
121
+ : `${this.props.resetKey}:${this.state.retryToken}`;
122
+ return (_jsx(React.Fragment, { children: this.props.children }, fragmentKey));
120
123
  }
121
124
  }
122
125
  export function AssistantMessageListErrorBoundary({ resetKey, children, }) {
123
- return (_jsx(AssistantUiStaleIndexErrorBoundary, { resetKey: resetKey, componentName: "AssistantMessageList", children: children }));
126
+ return (_jsx(AssistantUiStaleIndexErrorBoundary, { resetKey: resetKey, remountOnResetKey: false, componentName: "AssistantMessageList", children: children }));
124
127
  }
125
128
  //# sourceMappingURL=assistant-ui-recovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistant-ui-recovery.js","sourceRoot":"","sources":["../../src/client/assistant-ui-recovery.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\n\nimport { captureError } from \"./analytics.js\";\n\ntype AssistantUiRecoverableErrorKind =\n | \"assistant-ui-stale-message-index\"\n | \"assistant-ui-duplicate-resource-key\"\n | \"assistant-ui-react-fiber-unmount\";\n\nexport function assistantUiRecoverableRenderErrorKind(\n error: unknown,\n): AssistantUiRecoverableErrorKind | null {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n if (\n /^tapClientLookup: Index \\d+ out of bounds \\(length: \\d+\\)$/.test(message)\n ) {\n return \"assistant-ui-stale-message-index\";\n }\n if (/^Duplicate key .+ in tapResources$/.test(message)) {\n return \"assistant-ui-duplicate-resource-key\";\n }\n if (/^Tried to unmount a fiber that is already unmounted\\b/.test(message)) {\n return \"assistant-ui-react-fiber-unmount\";\n }\n return null;\n}\n\nexport function isAssistantUiStaleIndexError(error: unknown): boolean {\n return (\n assistantUiRecoverableRenderErrorKind(error) ===\n \"assistant-ui-stale-message-index\"\n );\n}\n\nexport function isAssistantUiRecoverableRenderError(error: unknown): boolean {\n return assistantUiRecoverableRenderErrorKind(error) !== null;\n}\n\ntype AssistantUiStaleIndexErrorBoundaryProps = {\n resetKey: string;\n componentName?: string;\n children: React.ReactNode;\n};\n\ntype AssistantUiStaleIndexErrorBoundaryState = {\n error: Error | null;\n retryToken: number;\n recovery: {\n signature: string;\n retryCount: number;\n } | null;\n};\n\nconst MAX_ASSISTANT_UI_RECOVERABLE_RETRIES = 2;\n\nexport class AssistantUiStaleIndexErrorBoundary extends React.Component<\n AssistantUiStaleIndexErrorBoundaryProps,\n AssistantUiStaleIndexErrorBoundaryState\n> {\n state: AssistantUiStaleIndexErrorBoundaryState = {\n error: null,\n retryToken: 0,\n recovery: null,\n };\n\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n private recoverySignature(\n kind: AssistantUiRecoverableErrorKind,\n error: unknown,\n ): string {\n const message =\n error instanceof Error ? error.message : String(error ?? \"\");\n return `${this.props.resetKey}:${kind}:${message}`;\n }\n\n static getDerivedStateFromError(\n error: unknown,\n ): Partial<AssistantUiStaleIndexErrorBoundaryState> {\n return {\n error: error instanceof Error ? error : new Error(String(error ?? \"\")),\n };\n }\n\n componentDidCatch(error: unknown, info: React.ErrorInfo) {\n const recoverable = assistantUiRecoverableRenderErrorKind(error);\n if (!recoverable) return;\n const signature = this.recoverySignature(recoverable, error);\n const retryCount =\n this.state.recovery?.signature === signature\n ? this.state.recovery.retryCount + 1\n : 1;\n\n const retryBudgetExceeded =\n retryCount > MAX_ASSISTANT_UI_RECOVERABLE_RETRIES;\n if (retryBudgetExceeded) {\n captureError(error, {\n tags: {\n component: this.props.componentName ?? \"AssistantChat\",\n recoverable,\n },\n extra: {\n resetKey: this.props.resetKey,\n retryCount,\n componentStack: info.componentStack,\n },\n });\n }\n\n this.setState({\n recovery: { signature, retryCount },\n });\n if (retryBudgetExceeded) return;\n\n if (this.retryTimer) return;\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n this.setState((state) => {\n if (!state.error || !isAssistantUiRecoverableRenderError(state.error)) {\n return null;\n }\n return { error: null, retryToken: state.retryToken + 1 };\n });\n }, 0);\n }\n\n componentDidUpdate(\n prevProps: AssistantUiStaleIndexErrorBoundaryProps,\n prevState: AssistantUiStaleIndexErrorBoundaryState,\n ) {\n if (prevProps.resetKey !== this.props.resetKey) {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n if (\n this.state.error &&\n isAssistantUiRecoverableRenderError(this.state.error)\n ) {\n this.setState((state) => ({\n error: null,\n retryToken: state.retryToken + 1,\n recovery: null,\n }));\n } else if (this.state.recovery) {\n this.setState({ recovery: null });\n }\n return;\n }\n\n if (prevState.error && !this.state.error && this.state.recovery) {\n this.setState({ recovery: null });\n }\n }\n\n componentWillUnmount() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n\n render() {\n if (this.state.error) {\n if (!isAssistantUiRecoverableRenderError(this.state.error)) {\n throw this.state.error;\n }\n if (\n this.state.recovery &&\n this.state.recovery.retryCount > MAX_ASSISTANT_UI_RECOVERABLE_RETRIES\n ) {\n throw this.state.error;\n }\n return null;\n }\n\n return (\n <React.Fragment key={`${this.props.resetKey}:${this.state.retryToken}`}>\n {this.props.children}\n </React.Fragment>\n );\n }\n}\n\nexport function AssistantMessageListErrorBoundary({\n resetKey,\n children,\n}: {\n resetKey: string;\n children: React.ReactNode;\n}) {\n return (\n <AssistantUiStaleIndexErrorBoundary\n resetKey={resetKey}\n componentName=\"AssistantMessageList\"\n >\n {children}\n </AssistantUiStaleIndexErrorBoundary>\n );\n}\n"]}
1
+ {"version":3,"file":"assistant-ui-recovery.js","sourceRoot":"","sources":["../../src/client/assistant-ui-recovery.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\n\nimport { captureError } from \"./analytics.js\";\n\ntype AssistantUiRecoverableErrorKind =\n | \"assistant-ui-stale-message-index\"\n | \"assistant-ui-duplicate-resource-key\"\n | \"assistant-ui-react-fiber-unmount\";\n\nexport function assistantUiRecoverableRenderErrorKind(\n error: unknown,\n): AssistantUiRecoverableErrorKind | null {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n if (\n /^tapClientLookup: Index \\d+ out of bounds \\(length: \\d+\\)$/.test(message)\n ) {\n return \"assistant-ui-stale-message-index\";\n }\n if (/^Duplicate key .+ in tapResources$/.test(message)) {\n return \"assistant-ui-duplicate-resource-key\";\n }\n if (/^Tried to unmount a fiber that is already unmounted\\b/.test(message)) {\n return \"assistant-ui-react-fiber-unmount\";\n }\n return null;\n}\n\nexport function isAssistantUiStaleIndexError(error: unknown): boolean {\n return (\n assistantUiRecoverableRenderErrorKind(error) ===\n \"assistant-ui-stale-message-index\"\n );\n}\n\nexport function isAssistantUiRecoverableRenderError(error: unknown): boolean {\n return assistantUiRecoverableRenderErrorKind(error) !== null;\n}\n\ntype AssistantUiStaleIndexErrorBoundaryProps = {\n resetKey: string;\n /** Remount children when the recovery scope changes. */\n remountOnResetKey?: boolean;\n componentName?: string;\n children: React.ReactNode;\n};\n\ntype AssistantUiStaleIndexErrorBoundaryState = {\n error: Error | null;\n retryToken: number;\n recovery: {\n signature: string;\n retryCount: number;\n } | null;\n};\n\nconst MAX_ASSISTANT_UI_RECOVERABLE_RETRIES = 2;\n\nexport class AssistantUiStaleIndexErrorBoundary extends React.Component<\n AssistantUiStaleIndexErrorBoundaryProps,\n AssistantUiStaleIndexErrorBoundaryState\n> {\n state: AssistantUiStaleIndexErrorBoundaryState = {\n error: null,\n retryToken: 0,\n recovery: null,\n };\n\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n private recoverySignature(\n kind: AssistantUiRecoverableErrorKind,\n error: unknown,\n ): string {\n const message =\n error instanceof Error ? error.message : String(error ?? \"\");\n return `${this.props.resetKey}:${kind}:${message}`;\n }\n\n static getDerivedStateFromError(\n error: unknown,\n ): Partial<AssistantUiStaleIndexErrorBoundaryState> {\n return {\n error: error instanceof Error ? error : new Error(String(error ?? \"\")),\n };\n }\n\n componentDidCatch(error: unknown, info: React.ErrorInfo) {\n const recoverable = assistantUiRecoverableRenderErrorKind(error);\n if (!recoverable) return;\n const signature = this.recoverySignature(recoverable, error);\n const retryCount =\n this.state.recovery?.signature === signature\n ? this.state.recovery.retryCount + 1\n : 1;\n\n const retryBudgetExceeded =\n retryCount > MAX_ASSISTANT_UI_RECOVERABLE_RETRIES;\n if (retryBudgetExceeded) {\n captureError(error, {\n tags: {\n component: this.props.componentName ?? \"AssistantChat\",\n recoverable,\n },\n extra: {\n resetKey: this.props.resetKey,\n retryCount,\n componentStack: info.componentStack,\n },\n });\n }\n\n this.setState({\n recovery: { signature, retryCount },\n });\n if (retryBudgetExceeded) return;\n\n if (this.retryTimer) return;\n this.retryTimer = setTimeout(() => {\n this.retryTimer = null;\n this.setState((state) => {\n if (!state.error || !isAssistantUiRecoverableRenderError(state.error)) {\n return null;\n }\n return { error: null, retryToken: state.retryToken + 1 };\n });\n }, 0);\n }\n\n componentDidUpdate(\n prevProps: AssistantUiStaleIndexErrorBoundaryProps,\n prevState: AssistantUiStaleIndexErrorBoundaryState,\n ) {\n if (prevProps.resetKey !== this.props.resetKey) {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n this.retryTimer = null;\n }\n if (\n this.state.error &&\n isAssistantUiRecoverableRenderError(this.state.error)\n ) {\n this.setState((state) => ({\n error: null,\n retryToken: state.retryToken + 1,\n recovery: null,\n }));\n } else if (this.state.recovery) {\n this.setState({ recovery: null });\n }\n return;\n }\n\n if (prevState.error && !this.state.error && this.state.recovery) {\n this.setState({ recovery: null });\n }\n }\n\n componentWillUnmount() {\n if (this.retryTimer) {\n clearTimeout(this.retryTimer);\n }\n }\n\n render() {\n if (this.state.error) {\n if (!isAssistantUiRecoverableRenderError(this.state.error)) {\n throw this.state.error;\n }\n if (\n this.state.recovery &&\n this.state.recovery.retryCount > MAX_ASSISTANT_UI_RECOVERABLE_RETRIES\n ) {\n throw this.state.error;\n }\n return null;\n }\n\n const fragmentKey =\n this.props.remountOnResetKey === false\n ? String(this.state.retryToken)\n : `${this.props.resetKey}:${this.state.retryToken}`;\n\n return (\n <React.Fragment key={fragmentKey}>{this.props.children}</React.Fragment>\n );\n }\n}\n\nexport function AssistantMessageListErrorBoundary({\n resetKey,\n children,\n}: {\n resetKey: string;\n children: React.ReactNode;\n}) {\n return (\n <AssistantUiStaleIndexErrorBoundary\n resetKey={resetKey}\n remountOnResetKey={false}\n componentName=\"AssistantMessageList\"\n >\n {children}\n </AssistantUiStaleIndexErrorBoundary>\n );\n}\n"]}
@@ -33,6 +33,12 @@ export declare function shouldShowAssistantMessageFooter({ isLast, chatRunning,
33
33
  statusIsTerminal: boolean;
34
34
  hasUnresolvedTool?: boolean;
35
35
  }): boolean;
36
+ export declare function shouldShowAssistantWorkSummary({ isLast, isComplete, hasCollapsibleWork, hasUnresolvedTool, }: {
37
+ isLast: boolean;
38
+ isComplete: boolean;
39
+ hasCollapsibleWork: boolean;
40
+ hasUnresolvedTool: boolean;
41
+ }): boolean;
36
42
  export declare function AssistantMessage(): React.JSX.Element | null;
37
43
  export declare function RunningActivityStatus({ label }: {
38
44
  label: string;
@@ -1 +1 @@
1
- {"version":3,"file":"message-components.d.ts","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAmD,MAAM,OAAO,CAAC;AA0CxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAc7D;AAID,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,yBAAyB,GAAG,IAAI,CAyClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAYA;AAID,wBAAgB,qBAAqB,6BAgEpC;AAID,eAAO,MAAM,iBAAiB;YACpB,MAAM;aACL,OAAO;eACL,MAAM;SACJ,CAAC;AAEhB,eAAO,MAAM,qBAAqB;iBACnB,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;SAC9C,CAAC;AAIhB,wBAAgB,mBAAmB,sBA+BlC;AAwMD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,qBAoIL;AAID,wBAAgB,WAAW,6BA2I1B;AA4BD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAMV;AAoDD,wBAAgB,gBAAgB,6BAyP/B;AAID,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBAMjE;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAkB,GACnB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,qBAWzB"}
1
+ {"version":3,"file":"message-components.d.ts","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"AA0CA,OAAO,KAAmD,MAAM,OAAO,CAAC;AA0CxE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAc7D;AAID,UAAU,yBAAyB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAqBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,GACb,yBAAyB,GAAG,IAAI,CAyClC;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAYA;AAID,wBAAgB,qBAAqB,6BAgEpC;AAID,eAAO,MAAM,iBAAiB;YACpB,MAAM;aACL,OAAO;eACL,MAAM;SACJ,CAAC;AAEhB,eAAO,MAAM,qBAAqB;iBACnB,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC;SAC9C,CAAC;AAIhB,wBAAgB,mBAAmB,sBA+BlC;AAwMD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,QAAQ,GACT,GAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,qBAoIL;AAID,wBAAgB,WAAW,6BA2I1B;AA4BD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO3E;AAED,wBAAgB,gCAAgC,CAAC,EAC/C,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GAAG,OAAO,CAMV;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,MAAM,EACN,UAAU,EACV,kBAAkB,EAClB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAOV;AAoDD,wBAAgB,gBAAgB,6BA6P/B;AAID,wBAAgB,qBAAqB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBAMjE;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAkB,GACnB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,qBAWzB"}
@@ -416,6 +416,14 @@ export function shouldShowAssistantMessageFooter({ isLast, chatRunning, hasRende
416
416
  return false;
417
417
  return !chatRunning && statusIsTerminal;
418
418
  }
419
+ export function shouldShowAssistantWorkSummary({ isLast, isComplete, hasCollapsibleWork, hasUnresolvedTool, }) {
420
+ if (!hasCollapsibleWork || hasUnresolvedTool)
421
+ return false;
422
+ // Keep completed historical work wrapped while a later turn is running.
423
+ // Removing the wrapper exposes/remounts ReasoningCell and resets its
424
+ // disclosure state to the default-open value on every new submission.
425
+ return isComplete || !isLast;
426
+ }
419
427
  function ReasoningMessagePart() {
420
428
  const part = useMessagePartReasoning();
421
429
  const partRuntime = useMessagePartRuntime();
@@ -558,7 +566,12 @@ export function AssistantMessage() {
558
566
  return (_jsxs("div", { className: "group relative", style: { contentVisibility: isComplete ? "auto" : "visible" }, children: [_jsxs("div", { className: "w-full max-w-[95%] text-sm leading-relaxed text-foreground", children: [_jsx(MessagePrimitive.GroupedParts, { groupBy: groupAssistantWorkParts, children: ({ part, children }) => {
559
567
  switch (part.type) {
560
568
  case "group-work": {
561
- const showSummary = isComplete && !chatRunning && hasCollapsibleWork;
569
+ const showSummary = shouldShowAssistantWorkSummary({
570
+ isLast,
571
+ isComplete,
572
+ hasCollapsibleWork,
573
+ hasUnresolvedTool,
574
+ });
562
575
  if (!showSummary)
563
576
  return _jsx(_Fragment, { children: children });
564
577
  return (_jsx(WorkedForSummary, { durationMs: capturedDurationMs, autoCollapse: animateCollapse, children: children }));
@@ -1 +1 @@
1
- {"version":3,"file":"message-components.js","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,\n// AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,\n// RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.\n\nimport {\n useThread,\n useMessageRuntime,\n useComposer,\n MessagePrimitive,\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n useMessagePartReasoning,\n useMessagePartRuntime,\n} from \"@assistant-ui/react\";\nimport type { Attachment } from \"@assistant-ui/react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport {\n IconX,\n IconCheck,\n IconCopy,\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconRefresh,\n IconArrowBackUp,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconPencil,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\n\nimport { getActiveRun } from \"../active-run-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { isPastedTextAttachmentName } from \"../composer/pasted-text.js\";\nimport { PastedTextChip } from \"../composer/PastedTextChip.js\";\nimport { ThumbsFeedback } from \"../observability/ThumbsFeedback.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { cn } from \"../utils.js\";\nimport {\n MarkdownText,\n renderMarkdownToClipboardHtml,\n} from \"./markdown-renderer.js\";\nimport {\n ToolCallFallback,\n FilesChangedSummary,\n ChatRunningContext,\n ReasoningCell,\n WorkedForSummary,\n} from \"./tool-call-display.js\";\n\n// ─── Pending selection context key ───────────────────────────────────────────\n// Mirrored from AssistantChat to avoid a cross-import on a private constant.\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\n\n// ─── displayableUserMessageText ───────────────────────────────────────────────\n\nexport function displayableUserMessageText(text: string): string {\n return text\n .replace(/<context\\b[^>]*>[\\s\\S]*?<\\/context>\\n?/gi, \"\")\n .replace(/<context\\b[^>]*>[\\s\\S]*$/gi, \"\")\n .replace(/<\\/context>/gi, \"\")\n .trim();\n}\n\nexport function isHiddenUserMessage(message: unknown): boolean {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: {\n agentNativeHiddenUserMessage?: unknown;\n agentNativeRecoveryAction?: unknown;\n };\n }\n | undefined;\n return (\n meta?.custom?.agentNativeHiddenUserMessage === true ||\n meta?.custom?.agentNativeRecoveryAction === \"continue\" ||\n meta?.custom?.agentNativeRecoveryAction === \"retry\"\n );\n}\n\n// ─── Message timestamp helpers ────────────────────────────────────────────────\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nexport function MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\n// ─── SelectionAttachedPill ────────────────────────────────────────────────────\n\nexport function SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"agent-selection-attached-pill shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n // Dispatch clear event; AssistantChat owns the DELETE call.\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-clear-requested\"),\n );\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\n// ─── CheckpointContext / MessageActionsContext ────────────────────────────────\n\nexport const CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nexport const MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\n// ─── MessageBranchPicker ──────────────────────────────────────────────────────\n\nexport function MessageBranchPicker() {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <button\n type=\"button\"\n aria-label=\"Previous branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Previous>\n <span className=\"tabular-nums select-none\">\n <BranchPickerPrimitive.Number />\n {\"/\"}\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <button\n type=\"button\"\n aria-label=\"Next branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n}\n\n// ─── Mention rendering ────────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\n// ─── UserMessageAttachments ───────────────────────────────────────────────────\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n // Prefer the hosted upload URL when available (set by the server after\n // preUploadAttachments). This avoids re-shipping base64 in each poll\n // and lets the browser cache the image via a stable URL.\n const uploadUrl = (\n att as unknown as { metadata?: { uploadUrl?: string } }\n ).metadata?.uploadUrl;\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" &&\n \"image\" in p &&\n !!(p as { image?: string }).image,\n );\n const imageSrc = uploadUrl || imagePart?.image || null;\n if (imageSrc) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imageSrc}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── UserMessageEditComposer ──────────────────────────────────────────────────\n\nfunction UserMessageEditComposer() {\n return (\n <ComposerPrimitive.Root className=\"flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm\">\n <ComposerPrimitive.Input\n className=\"w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none\"\n rows={1}\n submitMode=\"enter\"\n />\n <div className=\"flex justify-end gap-2\">\n <ComposerPrimitive.Cancel asChild>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n Cancel\n </button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <button\n type=\"submit\"\n className=\"cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Save\n </button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n );\n}\n\n// ─── MessageActionsMenu ────────────────────────────────────────────────────────\n\nexport function MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n // Rich flavor keeps formatting in targets that read text/html (e.g. Slack);\n // null when the markdown renderer isn't ready yet, so we copy plain markdown.\n const html = renderMarkdownToClipboardHtml(text);\n void writeClipboardText(text, html ? { html } : undefined).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// ─── UserMessage ──────────────────────────────────────────────────────────────\n\nexport function UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const isEditing = useComposer((state) => state.isEditing);\n const chatRunning = React.useContext(ChatRunningContext);\n const hidden = isHiddenUserMessage(message);\n const hasDisplayableText =\n !hidden &&\n (message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false);\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n if (hidden) return null;\n\n // When in edit mode, show the inline edit composer instead of the message bubble.\n if (isEditing) {\n return (\n <div className=\"flex justify-end\">\n <div className=\"w-full max-w-[85%]\">\n <UserMessageEditComposer />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n {/* Edit hover affordance — appears on hover when not running */}\n {!chatRunning && hasDisplayableText && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Edit asChild>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n className=\"absolute -left-8 top-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/0 transition-colors duration-150 group-hover:text-muted-foreground/70 group-hover:hover:bg-accent group-hover:hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Edit>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"text-xs\">\n Edit message\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── AssistantMessage ─────────────────────────────────────────────────────────\n\nfunction assistantMessageHasRenderableContent(message: {\n content?: unknown;\n}): boolean {\n const content = message.content;\n if (typeof content === \"string\") return content.trim().length > 0;\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const type = (part as { type?: unknown }).type;\n if (type === \"text\" || type === \"reasoning\") {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" && text.trim().length > 0;\n }\n return true;\n });\n}\n\nfunction assistantMessageStatusIsTerminal(message: {\n status?: { type?: unknown };\n}): boolean {\n const statusType = message.status?.type;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nexport function assistantMessageHasUnresolvedTool(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n return content.some((part): boolean => {\n if (!part || typeof part !== \"object\") return false;\n const record = part as { type?: unknown; result?: unknown };\n return record.type === \"tool-call\" && record.result === undefined;\n });\n}\n\nexport function shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n chatRunning: boolean;\n hasRenderableContent: boolean;\n statusIsTerminal: boolean;\n hasUnresolvedTool?: boolean;\n}): boolean {\n if (!hasRenderableContent) return false;\n if (chatRunning) return false;\n if (!isLast) return true;\n if (hasUnresolvedTool) return false;\n return !chatRunning && statusIsTerminal;\n}\n\nfunction ReasoningMessagePart() {\n const part = useMessagePartReasoning();\n const partRuntime = useMessagePartRuntime();\n const messageParts = useAuiState((state) => state.message.parts);\n const isStreaming = part.status?.type === \"running\";\n const partIndex =\n partRuntime.path.messagePartSelector.type === \"index\"\n ? partRuntime.path.messagePartSelector.index\n : -1;\n const latestReasoningPartIndex = messageParts.reduce(\n (latestIndex, messagePart, index) =>\n messagePart.type === \"reasoning\" ? index : latestIndex,\n -1,\n );\n // Time thinking client-side: record the moment streaming first starts and\n // the moment it stops so the cell can show \"Thought for Xs\". Historical\n // messages that were never observed streaming in this session never get a\n // start time, so they correctly fall back to a plain \"Thought\" label.\n const startedAtRef = useRef<number | null>(null);\n const [durationMs, setDurationMs] = useState<number | null>(null);\n useEffect(() => {\n if (isStreaming) {\n startedAtRef.current ??= Date.now();\n return;\n }\n if (startedAtRef.current != null) {\n setDurationMs(Date.now() - startedAtRef.current);\n startedAtRef.current = null;\n }\n }, [isStreaming]);\n return (\n <ReasoningCell\n text={part.text}\n isStreaming={isStreaming}\n durationMs={durationMs}\n defaultOpen={partIndex === latestReasoningPartIndex}\n collapseWhenReplaced={partIndex < latestReasoningPartIndex}\n />\n );\n}\n\nfunction groupAssistantWorkParts(part: {\n type?: string;\n}): [\"group-work\"] | null {\n if (part.type === \"reasoning\" || part.type === \"tool-call\") {\n return [\"group-work\"];\n }\n return null;\n}\n\nexport function AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const hasRenderableContent = assistantMessageHasRenderableContent(msg);\n const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);\n const isComplete = shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal: assistantMessageStatusIsTerminal(msg),\n hasUnresolvedTool,\n });\n const cpCtx = React.useContext(CheckpointContext);\n\n // Capture live run duration when this message finishes streaming.\n const runStartedAtRef = useRef<number | null>(null);\n const [capturedDurationMs, setCapturedDurationMs] = useState<number | null>(\n null,\n );\n useEffect(() => {\n if (chatRunning && isLast) {\n if (runStartedAtRef.current == null) {\n runStartedAtRef.current = Date.now();\n }\n return;\n }\n if (\n !chatRunning &&\n isLast &&\n runStartedAtRef.current != null &&\n capturedDurationMs == null\n ) {\n setCapturedDurationMs(Date.now() - runStartedAtRef.current);\n runStartedAtRef.current = null;\n }\n }, [chatRunning, isLast, capturedDurationMs]);\n\n // Animate collapse only when this message just finished running in-session.\n const wasRunningRef = useRef(false);\n const [animateCollapse, setAnimateCollapse] = useState(false);\n useEffect(() => {\n if (wasRunningRef.current && !chatRunning && isComplete && isLast) {\n setAnimateCollapse(true);\n }\n wasRunningRef.current = chatRunning && isLast;\n }, [chatRunning, isComplete, isLast]);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: unknown[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find(\n (cp) => (cp as { runId?: string }).runId === runId,\n );\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n checkpointId: (checkpoint as { id?: string }).id,\n }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n // Collect parts for the files-changed summary (code-agent turns only).\n const msgContent = msg.content as ContentPart[] | undefined;\n const hasCodeAgentTools =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"tool-call\" &&\n p.structuredMeta &&\n (p.structuredMeta.toolKind === \"edit\" ||\n p.structuredMeta.toolKind === \"write\"),\n );\n const hasCollapsibleWork =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"reasoning\" ||\n (p.type === \"tool-call\" && p.activity !== true),\n );\n\n if (!hasRenderableContent) return null;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.GroupedParts groupBy={groupAssistantWorkParts}>\n {({ part, children }) => {\n switch (part.type) {\n case \"group-work\": {\n const showSummary =\n isComplete && !chatRunning && hasCollapsibleWork;\n if (!showSummary) return <>{children}</>;\n return (\n <WorkedForSummary\n durationMs={capturedDurationMs}\n autoCollapse={animateCollapse}\n >\n {children}\n </WorkedForSummary>\n );\n }\n case \"text\":\n return <MarkdownText />;\n case \"reasoning\":\n return <ReasoningMessagePart />;\n case \"tool-call\":\n return part.toolUI ?? <ToolCallFallback {...part} />;\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n {isComplete && hasCodeAgentTools && msgContent && (\n <FilesChangedSummary parts={msgContent} />\n )}\n {isLast && hasUnresolvedTool && !chatRunning && (\n <RunningActivityStatus label=\"Thinking\" />\n )}\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {/* Regenerate button — only on the last assistant message, auto-disabled while running */}\n {isLast && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Reload asChild>\n <button\n type=\"button\"\n aria-label=\"Regenerate response\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconRefresh className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Reload>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n Regenerate response\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────\n\nexport function RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nexport function ThinkingIndicator({\n label = \"Thinking\",\n}: { label?: string } = {}) {\n return (\n <div\n className=\"agent-thinking-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"message-components.js","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,\n// AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,\n// RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.\n\nimport {\n useThread,\n useMessageRuntime,\n useComposer,\n MessagePrimitive,\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n useMessagePartReasoning,\n useMessagePartRuntime,\n} from \"@assistant-ui/react\";\nimport type { Attachment } from \"@assistant-ui/react\";\nimport { useAuiState } from \"@assistant-ui/store\";\nimport {\n IconX,\n IconCheck,\n IconCopy,\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconRefresh,\n IconArrowBackUp,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconPencil,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\n\nimport { getActiveRun } from \"../active-run-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { isPastedTextAttachmentName } from \"../composer/pasted-text.js\";\nimport { PastedTextChip } from \"../composer/PastedTextChip.js\";\nimport { ThumbsFeedback } from \"../observability/ThumbsFeedback.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { cn } from \"../utils.js\";\nimport {\n MarkdownText,\n renderMarkdownToClipboardHtml,\n} from \"./markdown-renderer.js\";\nimport {\n ToolCallFallback,\n FilesChangedSummary,\n ChatRunningContext,\n ReasoningCell,\n WorkedForSummary,\n} from \"./tool-call-display.js\";\n\n// ─── Pending selection context key ───────────────────────────────────────────\n// Mirrored from AssistantChat to avoid a cross-import on a private constant.\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\n\n// ─── displayableUserMessageText ───────────────────────────────────────────────\n\nexport function displayableUserMessageText(text: string): string {\n return text\n .replace(/<context\\b[^>]*>[\\s\\S]*?<\\/context>\\n?/gi, \"\")\n .replace(/<context\\b[^>]*>[\\s\\S]*$/gi, \"\")\n .replace(/<\\/context>/gi, \"\")\n .trim();\n}\n\nexport function isHiddenUserMessage(message: unknown): boolean {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: {\n agentNativeHiddenUserMessage?: unknown;\n agentNativeRecoveryAction?: unknown;\n };\n }\n | undefined;\n return (\n meta?.custom?.agentNativeHiddenUserMessage === true ||\n meta?.custom?.agentNativeRecoveryAction === \"continue\" ||\n meta?.custom?.agentNativeRecoveryAction === \"retry\"\n );\n}\n\n// ─── Message timestamp helpers ────────────────────────────────────────────────\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nexport function MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\n// ─── SelectionAttachedPill ────────────────────────────────────────────────────\n\nexport function SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"agent-selection-attached-pill shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n // Dispatch clear event; AssistantChat owns the DELETE call.\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-clear-requested\"),\n );\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\n// ─── CheckpointContext / MessageActionsContext ────────────────────────────────\n\nexport const CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nexport const MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\n// ─── MessageBranchPicker ──────────────────────────────────────────────────────\n\nexport function MessageBranchPicker() {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <button\n type=\"button\"\n aria-label=\"Previous branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Previous>\n <span className=\"tabular-nums select-none\">\n <BranchPickerPrimitive.Number />\n {\"/\"}\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <button\n type=\"button\"\n aria-label=\"Next branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n}\n\n// ─── Mention rendering ────────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\n// ─── UserMessageAttachments ───────────────────────────────────────────────────\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n // Prefer the hosted upload URL when available (set by the server after\n // preUploadAttachments). This avoids re-shipping base64 in each poll\n // and lets the browser cache the image via a stable URL.\n const uploadUrl = (\n att as unknown as { metadata?: { uploadUrl?: string } }\n ).metadata?.uploadUrl;\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" &&\n \"image\" in p &&\n !!(p as { image?: string }).image,\n );\n const imageSrc = uploadUrl || imagePart?.image || null;\n if (imageSrc) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imageSrc}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── UserMessageEditComposer ──────────────────────────────────────────────────\n\nfunction UserMessageEditComposer() {\n return (\n <ComposerPrimitive.Root className=\"flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm\">\n <ComposerPrimitive.Input\n className=\"w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none\"\n rows={1}\n submitMode=\"enter\"\n />\n <div className=\"flex justify-end gap-2\">\n <ComposerPrimitive.Cancel asChild>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n Cancel\n </button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <button\n type=\"submit\"\n className=\"cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Save\n </button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n );\n}\n\n// ─── MessageActionsMenu ────────────────────────────────────────────────────────\n\nexport function MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n // Rich flavor keeps formatting in targets that read text/html (e.g. Slack);\n // null when the markdown renderer isn't ready yet, so we copy plain markdown.\n const html = renderMarkdownToClipboardHtml(text);\n void writeClipboardText(text, html ? { html } : undefined).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// ─── UserMessage ──────────────────────────────────────────────────────────────\n\nexport function UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const isEditing = useComposer((state) => state.isEditing);\n const chatRunning = React.useContext(ChatRunningContext);\n const hidden = isHiddenUserMessage(message);\n const hasDisplayableText =\n !hidden &&\n (message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false);\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n if (hidden) return null;\n\n // When in edit mode, show the inline edit composer instead of the message bubble.\n if (isEditing) {\n return (\n <div className=\"flex justify-end\">\n <div className=\"w-full max-w-[85%]\">\n <UserMessageEditComposer />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n {/* Edit hover affordance — appears on hover when not running */}\n {!chatRunning && hasDisplayableText && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Edit asChild>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n className=\"absolute -left-8 top-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/0 transition-colors duration-150 group-hover:text-muted-foreground/70 group-hover:hover:bg-accent group-hover:hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Edit>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"text-xs\">\n Edit message\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── AssistantMessage ─────────────────────────────────────────────────────────\n\nfunction assistantMessageHasRenderableContent(message: {\n content?: unknown;\n}): boolean {\n const content = message.content;\n if (typeof content === \"string\") return content.trim().length > 0;\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const type = (part as { type?: unknown }).type;\n if (type === \"text\" || type === \"reasoning\") {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" && text.trim().length > 0;\n }\n return true;\n });\n}\n\nfunction assistantMessageStatusIsTerminal(message: {\n status?: { type?: unknown };\n}): boolean {\n const statusType = message.status?.type;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nexport function assistantMessageHasUnresolvedTool(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n return content.some((part): boolean => {\n if (!part || typeof part !== \"object\") return false;\n const record = part as { type?: unknown; result?: unknown };\n return record.type === \"tool-call\" && record.result === undefined;\n });\n}\n\nexport function shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n chatRunning: boolean;\n hasRenderableContent: boolean;\n statusIsTerminal: boolean;\n hasUnresolvedTool?: boolean;\n}): boolean {\n if (!hasRenderableContent) return false;\n if (chatRunning) return false;\n if (!isLast) return true;\n if (hasUnresolvedTool) return false;\n return !chatRunning && statusIsTerminal;\n}\n\nexport function shouldShowAssistantWorkSummary({\n isLast,\n isComplete,\n hasCollapsibleWork,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n isComplete: boolean;\n hasCollapsibleWork: boolean;\n hasUnresolvedTool: boolean;\n}): boolean {\n if (!hasCollapsibleWork || hasUnresolvedTool) return false;\n\n // Keep completed historical work wrapped while a later turn is running.\n // Removing the wrapper exposes/remounts ReasoningCell and resets its\n // disclosure state to the default-open value on every new submission.\n return isComplete || !isLast;\n}\n\nfunction ReasoningMessagePart() {\n const part = useMessagePartReasoning();\n const partRuntime = useMessagePartRuntime();\n const messageParts = useAuiState((state) => state.message.parts);\n const isStreaming = part.status?.type === \"running\";\n const partIndex =\n partRuntime.path.messagePartSelector.type === \"index\"\n ? partRuntime.path.messagePartSelector.index\n : -1;\n const latestReasoningPartIndex = messageParts.reduce(\n (latestIndex, messagePart, index) =>\n messagePart.type === \"reasoning\" ? index : latestIndex,\n -1,\n );\n // Time thinking client-side: record the moment streaming first starts and\n // the moment it stops so the cell can show \"Thought for Xs\". Historical\n // messages that were never observed streaming in this session never get a\n // start time, so they correctly fall back to a plain \"Thought\" label.\n const startedAtRef = useRef<number | null>(null);\n const [durationMs, setDurationMs] = useState<number | null>(null);\n useEffect(() => {\n if (isStreaming) {\n startedAtRef.current ??= Date.now();\n return;\n }\n if (startedAtRef.current != null) {\n setDurationMs(Date.now() - startedAtRef.current);\n startedAtRef.current = null;\n }\n }, [isStreaming]);\n return (\n <ReasoningCell\n text={part.text}\n isStreaming={isStreaming}\n durationMs={durationMs}\n defaultOpen={partIndex === latestReasoningPartIndex}\n collapseWhenReplaced={partIndex < latestReasoningPartIndex}\n />\n );\n}\n\nfunction groupAssistantWorkParts(part: {\n type?: string;\n}): [\"group-work\"] | null {\n if (part.type === \"reasoning\" || part.type === \"tool-call\") {\n return [\"group-work\"];\n }\n return null;\n}\n\nexport function AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const hasRenderableContent = assistantMessageHasRenderableContent(msg);\n const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);\n const isComplete = shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal: assistantMessageStatusIsTerminal(msg),\n hasUnresolvedTool,\n });\n const cpCtx = React.useContext(CheckpointContext);\n\n // Capture live run duration when this message finishes streaming.\n const runStartedAtRef = useRef<number | null>(null);\n const [capturedDurationMs, setCapturedDurationMs] = useState<number | null>(\n null,\n );\n useEffect(() => {\n if (chatRunning && isLast) {\n if (runStartedAtRef.current == null) {\n runStartedAtRef.current = Date.now();\n }\n return;\n }\n if (\n !chatRunning &&\n isLast &&\n runStartedAtRef.current != null &&\n capturedDurationMs == null\n ) {\n setCapturedDurationMs(Date.now() - runStartedAtRef.current);\n runStartedAtRef.current = null;\n }\n }, [chatRunning, isLast, capturedDurationMs]);\n\n // Animate collapse only when this message just finished running in-session.\n const wasRunningRef = useRef(false);\n const [animateCollapse, setAnimateCollapse] = useState(false);\n useEffect(() => {\n if (wasRunningRef.current && !chatRunning && isComplete && isLast) {\n setAnimateCollapse(true);\n }\n wasRunningRef.current = chatRunning && isLast;\n }, [chatRunning, isComplete, isLast]);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: unknown[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find(\n (cp) => (cp as { runId?: string }).runId === runId,\n );\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n checkpointId: (checkpoint as { id?: string }).id,\n }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n // Collect parts for the files-changed summary (code-agent turns only).\n const msgContent = msg.content as ContentPart[] | undefined;\n const hasCodeAgentTools =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"tool-call\" &&\n p.structuredMeta &&\n (p.structuredMeta.toolKind === \"edit\" ||\n p.structuredMeta.toolKind === \"write\"),\n );\n const hasCollapsibleWork =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"reasoning\" ||\n (p.type === \"tool-call\" && p.activity !== true),\n );\n\n if (!hasRenderableContent) return null;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.GroupedParts groupBy={groupAssistantWorkParts}>\n {({ part, children }) => {\n switch (part.type) {\n case \"group-work\": {\n const showSummary = shouldShowAssistantWorkSummary({\n isLast,\n isComplete,\n hasCollapsibleWork,\n hasUnresolvedTool,\n });\n if (!showSummary) return <>{children}</>;\n return (\n <WorkedForSummary\n durationMs={capturedDurationMs}\n autoCollapse={animateCollapse}\n >\n {children}\n </WorkedForSummary>\n );\n }\n case \"text\":\n return <MarkdownText />;\n case \"reasoning\":\n return <ReasoningMessagePart />;\n case \"tool-call\":\n return part.toolUI ?? <ToolCallFallback {...part} />;\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n {isComplete && hasCodeAgentTools && msgContent && (\n <FilesChangedSummary parts={msgContent} />\n )}\n {isLast && hasUnresolvedTool && !chatRunning && (\n <RunningActivityStatus label=\"Thinking\" />\n )}\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {/* Regenerate button — only on the last assistant message, auto-disabled while running */}\n {isLast && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Reload asChild>\n <button\n type=\"button\"\n aria-label=\"Regenerate response\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconRefresh className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Reload>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n Regenerate response\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────\n\nexport function RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nexport function ThinkingIndicator({\n label = \"Thinking\",\n}: { label?: string } = {}) {\n return (\n <div\n className=\"agent-thinking-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n </div>\n );\n}\n"]}
@@ -91,7 +91,7 @@ export declare function ReasoningCell({ text, isStreaming, defaultOpen, autoColl
91
91
  export declare function formatWorkedDuration(ms: number): string;
92
92
  export declare function WorkedForSummary({ durationMs, autoCollapse, children, }: {
93
93
  durationMs?: number | null;
94
- /** When true, start open then animate closed (post-run collapse). */
94
+ /** When true, close the summary after a run has completed. */
95
95
  autoCollapse?: boolean;
96
96
  children: React.ReactNode;
97
97
  }): React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-call-display.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-call-display.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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"}
@@ -432,16 +432,13 @@ export function formatWorkedDuration(ms) {
432
432
  return `${hours}h ${remMinutes}m`;
433
433
  }
434
434
  export function WorkedForSummary({ durationMs, autoCollapse = false, children, }) {
435
- const [open, setOpen] = useState(autoCollapse);
436
- const didAutoCollapseRef = useRef(false);
435
+ // Start closed so a remounted completed message never flashes its work
436
+ // details open while auto-collapse settles. If the summary was already
437
+ // open when autoCollapse changes, AnimatedCollapse still animates it shut.
438
+ const [open, setOpen] = useState(false);
437
439
  useEffect(() => {
438
- if (!autoCollapse || didAutoCollapseRef.current)
439
- return;
440
- didAutoCollapseRef.current = true;
441
- const frame = requestAnimationFrame(() => {
440
+ if (autoCollapse)
442
441
  setOpen(false);
443
- });
444
- return () => cancelAnimationFrame(frame);
445
442
  }, [autoCollapse]);
446
443
  const label = durationMs != null && durationMs >= 1000
447
444
  ? `Worked for ${formatWorkedDuration(durationMs)}`