@blade-hq/agent-react 2612.0.0-beta.0 → 2612.0.0-beta.2

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 (180) hide show
  1. package/README.md +88 -258
  2. package/dist/chat/AgentLoopBlock.d.ts +14 -0
  3. package/dist/{components → chat}/AskUserQuestionBlock.d.ts +3 -7
  4. package/dist/chat/AssistantTurnBlock.d.ts +50 -0
  5. package/dist/chat/AttachmentPreviewDialog.d.ts +26 -0
  6. package/dist/chat/ChatPanel.d.ts +64 -0
  7. package/dist/chat/CompactionCard.d.ts +6 -0
  8. package/dist/chat/ConnectionBanner.d.ts +10 -0
  9. package/dist/chat/CurrentPlanPanel.d.ts +20 -0
  10. package/dist/chat/FileDeliveryCards.d.ts +26 -0
  11. package/dist/chat/FinalArtifactCards.d.ts +8 -0
  12. package/dist/chat/ImageLightbox.d.ts +11 -0
  13. package/dist/chat/LightComposer.d.ts +7 -0
  14. package/dist/chat/LiteMessageList.d.ts +82 -0
  15. package/dist/chat/MessageActions.d.ts +6 -0
  16. package/dist/chat/MessageContextPills.d.ts +6 -0
  17. package/dist/chat/MessageFileAttachmentList.d.ts +13 -0
  18. package/dist/chat/MessageList.d.ts +54 -0
  19. package/dist/chat/PostChatFollowupBlock.d.ts +11 -0
  20. package/dist/{components → chat}/RenderErrorBoundary.d.ts +0 -1
  21. package/dist/chat/ResultFeedback.d.ts +11 -0
  22. package/dist/chat/SessionReplayBar.d.ts +12 -0
  23. package/dist/chat/TextAttachmentPills.d.ts +10 -0
  24. package/dist/chat/ToolCallBlock.d.ts +48 -0
  25. package/dist/chat/ToolUiCard.d.ts +6 -0
  26. package/dist/chat/TurnNavRail.d.ts +17 -0
  27. package/dist/chat/UserMessageBubble.d.ts +20 -0
  28. package/dist/chat/WorkflowRunBlock.d.ts +13 -0
  29. package/dist/chat/ai-elements/reasoning.d.ts +32 -0
  30. package/dist/chat/ai-elements/shimmer.d.ts +15 -0
  31. package/dist/chat/assistant-turn-questions.d.ts +14 -0
  32. package/dist/chat/card/CardContext.d.ts +7 -0
  33. package/dist/chat/chat-theme.d.ts +19 -0
  34. package/dist/chat/customization.d.ts +214 -0
  35. package/dist/chat/display-utils.d.ts +48 -0
  36. package/dist/{components/PostChatFollowupBlock.d.ts → chat/followup-interaction.d.ts} +5 -17
  37. package/dist/chat/index.d.ts +100 -0
  38. package/dist/chat/lib/citations.d.ts +30 -0
  39. package/dist/chat/lib/code-language.d.ts +5 -0
  40. package/dist/chat/lib/loopback.d.ts +8 -0
  41. package/dist/chat/lib/markdown-asset-url.d.ts +5 -0
  42. package/dist/chat/lib/preview-dispatch.d.ts +24 -0
  43. package/dist/chat/lib/skill-name.d.ts +9 -0
  44. package/dist/chat/lib/skill-visibility.d.ts +8 -0
  45. package/dist/chat/lib/ui-meta.d.ts +5 -0
  46. package/dist/chat/lib/use-async-value.d.ts +8 -0
  47. package/dist/chat/markdown/ExternalAnchor.d.ts +9 -0
  48. package/dist/chat/markdown/MarkdownContent.d.ts +40 -0
  49. package/dist/chat/markdown/text.d.ts +11 -0
  50. package/dist/chat/message-list-blocks.d.ts +92 -0
  51. package/dist/chat/plan/PlanSummaryCard.d.ts +10 -0
  52. package/dist/chat/plan/extract-plan-messages.d.ts +4 -0
  53. package/dist/chat/plan/parse-plan-messages.d.ts +10 -0
  54. package/dist/chat/plan/parse-plan-tree.d.ts +16 -0
  55. package/dist/chat/plan/types.d.ts +56 -0
  56. package/dist/chat/reasoning-visibility.d.ts +2 -0
  57. package/dist/chat/runtime/actions.d.ts +22 -0
  58. package/dist/chat/runtime/background-task-dismissals.d.ts +10 -0
  59. package/dist/chat/runtime/composer-channels.d.ts +46 -0
  60. package/dist/chat/runtime/environment.d.ts +152 -0
  61. package/dist/chat/runtime/input-cache-reset.d.ts +8 -0
  62. package/dist/chat/runtime/input-services.d.ts +111 -0
  63. package/dist/chat/runtime/session-source.d.ts +49 -0
  64. package/dist/chat/runtime/use-chat-actions.d.ts +19 -0
  65. package/dist/chat/runtime/use-session-replay.d.ts +16 -0
  66. package/dist/chat/scroll-anchor.d.ts +46 -0
  67. package/dist/chat/tool-renderers/BashRenderer.d.ts +2 -0
  68. package/dist/chat/tool-renderers/FileEditRenderer.d.ts +2 -0
  69. package/dist/chat/tool-renderers/FileReadRenderer.d.ts +2 -0
  70. package/dist/chat/tool-renderers/KbSearchRenderer.d.ts +2 -0
  71. package/dist/chat/tool-renderers/SearchRenderer.d.ts +2 -0
  72. package/dist/chat/tool-renderers/SubmitResultRenderer.d.ts +2 -0
  73. package/dist/chat/tool-renderers/kb-search-result.d.ts +19 -0
  74. package/dist/chat/tool-renderers/registry.d.ts +5 -0
  75. package/dist/chat/tool-renderers/shared.d.ts +30 -0
  76. package/dist/chat/tool-renderers/write-preview-scroll.d.ts +5 -0
  77. package/dist/chat-OCLOVB3H.css +175 -0
  78. package/dist/chat.css +175 -0
  79. package/dist/chunk-6ZDOQEWK.js +49365 -0
  80. package/dist/chunk-6ZDOQEWK.js.map +1 -0
  81. package/dist/chunk-FQQJP2GJ.js +26986 -0
  82. package/dist/chunk-FQQJP2GJ.js.map +1 -0
  83. package/dist/{chunk-G3PMV62Z.js → chunk-PR4QN5HX.js} +9 -2
  84. package/dist/chunk-WCMGQJLE.js +258 -0
  85. package/dist/chunk-WCMGQJLE.js.map +1 -0
  86. package/dist/components/AgentChat.d.ts +3 -3
  87. package/dist/components/ChatView.d.ts +2 -2
  88. package/dist/components/ConnectorPanel.d.ts +1 -1
  89. package/dist/components/ContextCard.d.ts +1 -1
  90. package/dist/components/LlmChat.d.ts +1 -1
  91. package/dist/components/McpAppCard.d.ts +1 -1
  92. package/dist/components/PlanUpdateBlock.d.ts +0 -8
  93. package/dist/components/PluginConnectorList.d.ts +1 -1
  94. package/dist/components/ReplayBar.d.ts +1 -1
  95. package/dist/components/SessionPluginConfigDialog.d.ts +1 -1
  96. package/dist/components/SessionPluginConfigForm.d.ts +1 -1
  97. package/dist/components/SessionPluginIcon.d.ts +1 -1
  98. package/dist/components/SessionPluginSelector.d.ts +1 -1
  99. package/dist/components/SessionQueuePanel.d.ts +1 -1
  100. package/dist/components/ToolUiCardView.d.ts +1 -1
  101. package/dist/components/plugin-config-draft.d.ts +1 -1
  102. package/dist/components/plugin-config-schema.d.ts +1 -1
  103. package/dist/components/plugin-connector.d.ts +1 -1
  104. package/dist/components/use-session-plugin-activation.d.ts +1 -1
  105. package/dist/context.d.ts +11 -2
  106. package/dist/embed/blade-chat-element.d.ts +14 -1
  107. package/dist/embed/entry.d.ts +8 -78
  108. package/dist/hooks/use-replay.d.ts +1 -1
  109. package/dist/hooks/use-turn-navigation.d.ts +1 -1
  110. package/dist/host.d.ts +54 -0
  111. package/dist/index.d.ts +11 -69
  112. package/dist/index.js +12 -63525
  113. package/dist/index.js.map +1 -1
  114. package/dist/internal.d.ts +60 -0
  115. package/dist/internal.js +656 -0
  116. package/dist/internal.js.map +1 -0
  117. package/dist/lib/mount-renderers.d.ts +25 -0
  118. package/dist/lib/use-effect-event.d.ts +3 -0
  119. package/dist/rich-input/BackgroundTasksPill.d.ts +3 -0
  120. package/dist/rich-input/ChatInput.d.ts +59 -0
  121. package/dist/rich-input/ComposerAttachmentViewport.d.ts +3 -0
  122. package/dist/rich-input/ConnectButton.d.ts +24 -0
  123. package/dist/rich-input/FileCompletionMenu.d.ts +44 -0
  124. package/dist/rich-input/FileSizeLimitDialog.d.ts +9 -0
  125. package/dist/rich-input/ModelSelector.d.ts +10 -0
  126. package/dist/rich-input/PlanningToggle.d.ts +7 -0
  127. package/dist/rich-input/ProgressCircle.d.ts +12 -0
  128. package/dist/rich-input/ReasoningModeSelect.d.ts +9 -0
  129. package/dist/rich-input/SkillCompletionMenu.d.ts +9 -0
  130. package/dist/rich-input/SkillStatusBar.d.ts +15 -0
  131. package/dist/rich-input/extensions/file-mention.d.ts +12 -0
  132. package/dist/rich-input/extensions/kb-mention.d.ts +18 -0
  133. package/dist/rich-input/extensions/skill-mention.d.ts +48 -0
  134. package/dist/rich-input/extensions/workflow-mention.d.ts +10 -0
  135. package/dist/rich-input/index.d.ts +48 -0
  136. package/dist/rich-input/input-keyboard.d.ts +13 -0
  137. package/dist/rich-input/lib/attachment-upload.d.ts +10 -0
  138. package/dist/rich-input/lib/background-tasks-view.d.ts +31 -0
  139. package/dist/rich-input/lib/client-query.d.ts +32 -0
  140. package/dist/rich-input/lib/composer-content.d.ts +42 -0
  141. package/dist/rich-input/lib/image-input-availability.d.ts +3 -0
  142. package/dist/rich-input/lib/kb-suggestions.d.ts +37 -0
  143. package/dist/rich-input/lib/reasoning-levels.d.ts +1 -0
  144. package/dist/rich-input/lib/session-data.d.ts +20 -0
  145. package/dist/rich-input/lib/skill-suggestions.d.ts +19 -0
  146. package/dist/rich-input/lib/token-estimate.d.ts +2 -0
  147. package/dist/rich-input/lib/token-pressure.d.ts +8 -0
  148. package/dist/rich-input/lib/upload-results.d.ts +8 -0
  149. package/dist/rich-input/lib/user-home.d.ts +33 -0
  150. package/dist/rich-input/model/model-data.d.ts +6 -0
  151. package/dist/rich-input/model/resolve-model.d.ts +59 -0
  152. package/dist/rich-input/model/use-composer-model.d.ts +24 -0
  153. package/dist/rich-input/services.d.ts +22 -0
  154. package/dist/rich-input/use-dismiss-skill-suggestions-on-mode-change.d.ts +3 -0
  155. package/dist/rich-input/use-input-history.d.ts +14 -0
  156. package/dist/rich-input/voice/VoiceWaveform.d.ts +10 -0
  157. package/dist/rich-input/voice/use-tiptap-voice-input.d.ts +47 -0
  158. package/dist/rich-input/voice/use-voice-input.d.ts +2 -0
  159. package/dist/rich-input/voice/voice-input-support.d.ts +5 -0
  160. package/dist/rich-input.js +29853 -0
  161. package/dist/rich-input.js.map +1 -0
  162. package/dist/style.css +30 -64
  163. package/dist/style.full.css +210 -65
  164. package/dist/{webapi-W3IB5DO4.js → webapi-E7K2CNM7.js} +2 -2
  165. package/package.json +12 -3
  166. package/public-api.md +206 -3603
  167. package/dist/components/AgentLoopBlock.d.ts +0 -8
  168. package/dist/components/AgentTaskCard.d.ts +0 -12
  169. package/dist/components/AssistantTurnBlock.d.ts +0 -36
  170. package/dist/components/ChatSurface.d.ts +0 -199
  171. package/dist/components/ConnectionBanner.d.ts +0 -8
  172. package/dist/components/MarkdownContent.d.ts +0 -30
  173. package/dist/components/MessageList.d.ts +0 -62
  174. package/dist/components/Shimmer.d.ts +0 -7
  175. package/dist/components/ToolCallBlock.d.ts +0 -41
  176. package/dist/components/TurnNavRail.d.ts +0 -23
  177. package/dist/components/UserMessageBubble.d.ts +0 -25
  178. package/dist/components/display-utils.d.ts +0 -4
  179. /package/dist/{chunk-G3PMV62Z.js.map → chunk-PR4QN5HX.js.map} +0 -0
  180. /package/dist/{webapi-W3IB5DO4.js.map → webapi-E7K2CNM7.js.map} +0 -0
@@ -0,0 +1,214 @@
1
+ import { type ComponentType, type ReactNode } from "react";
2
+ import type { ChatMessage, MessageContent, ToolCallInfo } from "@blade-hq/agent-client/internal";
3
+ import type { ContentBlock } from "@blade-hq/agent-client/internal";
4
+ import type { AskUserAnswerData, AskUserQuestionData } from "./AskUserQuestionBlock";
5
+ import type { PlanUpdateData } from "../components/PlanUpdateBlock";
6
+ import type { ChatSendExtras } from "./runtime/actions";
7
+ import type { ErrorChatMessage, UserChatMessage } from "./UserMessageBubble";
8
+ export type ChatViewClassNames = Partial<{
9
+ root: string;
10
+ viewerBanner: string;
11
+ messageListRoot: string;
12
+ messageListViewport: string;
13
+ messageListContent: string;
14
+ messageListInner: string;
15
+ emptyState: string;
16
+ userMessage: string;
17
+ errorMessage: string;
18
+ assistantTurn: string;
19
+ assistantText: string;
20
+ toolCall: string;
21
+ chatInputRoot: string;
22
+ chatInputInner: string;
23
+ /**
24
+ * 队列面板根节点。软件工厂把输入框根节点的左右内边距改成了 px-10! / px-2!,
25
+ * 面板必须跟着同一个值,否则两者相接的那条缝上会一边宽一边窄。在这里重设
26
+ * `--blade-chat-queue-gutter` 即可(面板默认值对应 px-5)。
27
+ */
28
+ queuePanelRoot: string;
29
+ skillStatusBarRoot: string;
30
+ skillStatusBarInner: string;
31
+ }>;
32
+ /** 输入框提交时的附加项(模型、推理档位、知识库等由富输入给出)。 */
33
+ export interface ChatSendOptions extends Pick<ChatSendExtras, "thinkingOverride" | "reasoningLevel" | "kbIds" | "queueWhenRunning"> {
34
+ /** 附件实际上传到的会话(首页新建会话时由输入框给出)。 */
35
+ targetSessionId?: string;
36
+ /** 本条消息用的模型;null 表示沿用会话已保存的模型。 */
37
+ model?: string | null;
38
+ }
39
+ /**
40
+ * 输入框(Composer)的 props 契约:聊天面板传给输入框的全部内容。
41
+ * 轻输入(SDK 默认)只用其中一部分;富输入(`@blade-hq/agent-react/rich-input`)用全部。
42
+ * 自定义实现只需取用其中关心的字段,其余忽略即可。
43
+ */
44
+ export interface ComposerProps {
45
+ /** 当前会话;轻输入据此接住 `AgentSession.insertText` / `attach`。 */
46
+ sessionId?: string;
47
+ onSend: (message: MessageContent, options?: ChatSendOptions) => boolean | Promise<boolean>;
48
+ onStop: () => void | Promise<void>;
49
+ isStreaming: boolean;
50
+ /** 宿主是否渲染了队列面板;没有面板时不给"运行中提交"入口。 */
51
+ queueWhileRunning?: boolean;
52
+ isCompacting?: boolean;
53
+ isStopping?: boolean;
54
+ mode?: "planning" | "executing";
55
+ onToggleMode?: () => void;
56
+ renderAttachments?: () => ReactNode;
57
+ onBeforeSend?: (content: MessageContent) => MessageContent | Promise<MessageContent>;
58
+ onCommand?: (commandId: string) => void | Promise<void>;
59
+ canCreateBoardTask?: boolean;
60
+ canShareSession?: boolean;
61
+ /** 输入框顶部的任务进度面板(与输入框共用边框)。 */
62
+ planPanel?: ReactNode;
63
+ /** 内层最大宽度的 Tailwind 类,默认 `max-w-3xl`。 */
64
+ maxWidthClassName?: string;
65
+ /** 上方紧贴着队列面板时置 true:上两角改成直角。 */
66
+ mergesWithPanelAbove?: boolean;
67
+ className?: string;
68
+ innerClassName?: string;
69
+ SkillStatusBarComponent?: ComponentType<SkillStatusBarComponentProps>;
70
+ skillStatusBarClassName?: string;
71
+ skillStatusBarInnerClassName?: string;
72
+ onResyncSkills?: () => void;
73
+ isResyncingSkills?: boolean;
74
+ onOpenSkills?: () => void;
75
+ inputLabel?: string;
76
+ placeholderText?: string;
77
+ onDoubleEscape?: (anchorRect: DOMRect | null) => void;
78
+ composerHint?: ReactNode;
79
+ statusBarAddon?: ReactNode;
80
+ slotBelowActions?: ReactNode;
81
+ initialDraft?: string;
82
+ initialDraftKey?: string;
83
+ /** 精简附加控件(精简渲染模式)。 */
84
+ lite?: boolean;
85
+ }
86
+ export interface ChatViewComponents {
87
+ EmptyState?: ComponentType;
88
+ UserMessage?: ComponentType<{
89
+ message: UserChatMessage;
90
+ className?: string;
91
+ }>;
92
+ ErrorMessage?: ComponentType<{
93
+ message: ErrorChatMessage;
94
+ className?: string;
95
+ }>;
96
+ AssistantTurn?: ComponentType<AssistantTurnComponentProps>;
97
+ ToolCall?: ComponentType<ToolCallComponentProps>;
98
+ SkillStatusBar?: ComponentType<SkillStatusBarComponentProps>;
99
+ /** 自定义输入框;不传时使用默认的 ChatInput。 */
100
+ Composer?: ComponentType<ComposerProps>;
101
+ }
102
+ /** 工具调用渲染器:返回 null 走默认渲染。 */
103
+ export type ToolCallRenderer = (info: ToolCallInfo) => ReactNode | null;
104
+ /** 用户消息渲染器:`message` 是投影层给出的用户消息。 */
105
+ export interface UserMessageRendererProps {
106
+ message: ChatMessage;
107
+ }
108
+ /** 助手正文渲染器:`compact` 为真时正文在执行过程里,字号更小。 */
109
+ export interface AssistantTextRendererProps {
110
+ message: ChatMessage;
111
+ streaming: boolean;
112
+ compact: boolean;
113
+ sessionId?: string;
114
+ }
115
+ /** 提问卡渲染器:字段与 `AskUserQuestionBlock` 的 props 一致。 */
116
+ export interface AskUserQuestionRendererProps {
117
+ data: AskUserQuestionData;
118
+ answered: boolean;
119
+ toolCallId: string;
120
+ sessionStatus: string;
121
+ answerData?: AskUserAnswerData;
122
+ onAnswer?: (answer: string, toolCallId: string, answerData: AskUserAnswerData) => void;
123
+ }
124
+ /** 计划面板渲染器:`plan` 是最近一次成功的 update_plan 解析结果。 */
125
+ export interface PlanUpdateRendererProps {
126
+ plan: PlanUpdateData;
127
+ running: boolean;
128
+ sessionId?: string;
129
+ }
130
+ /**
131
+ * 区块级渲染器:每个都返回 `ReactNode`,返回 `null` 走默认渲染。`tool` 按工具名替换工具卡的展开详情。
132
+ */
133
+ export interface ChatViewRenderers {
134
+ /** 按工具名替换展开后的详情(内置 Web 的专用工具渲染器用它)。 */
135
+ tool?: Record<string, ComponentType<ToolRendererProps>>;
136
+ /** 自定义工具调用渲染;返回 null 走默认渲染。 */
137
+ toolCall?: ToolCallRenderer;
138
+ /** 自定义用户消息渲染;返回 null 走默认渲染。 */
139
+ userMessage?: (props: UserMessageRendererProps) => ReactNode | null;
140
+ /** 自定义助手正文渲染;返回 null 走默认渲染。 */
141
+ assistantText?: (props: AssistantTextRendererProps) => ReactNode | null;
142
+ /** 自定义提问卡渲染;返回 null 走默认渲染。 */
143
+ askUserQuestion?: (props: AskUserQuestionRendererProps) => ReactNode | null;
144
+ /** 自定义计划面板渲染;返回 null 走默认渲染。 */
145
+ planUpdate?: (props: PlanUpdateRendererProps) => ReactNode | null;
146
+ }
147
+ export interface ChatViewCustomization {
148
+ classNames?: ChatViewClassNames;
149
+ components?: ChatViewComponents;
150
+ renderers?: ChatViewRenderers;
151
+ }
152
+ export interface AssistantTurnComponentProps {
153
+ turnKey: string;
154
+ sessionId: string;
155
+ messages: ChatMessage[];
156
+ isStreaming?: boolean;
157
+ /** 打字机式显示节流下思考过程自己的追平状态,跟 isStreaming 不是一回事。 */
158
+ isReasoningRevealing?: boolean;
159
+ isLastTurn?: boolean;
160
+ askAnswers?: Record<string, AskUserAnswerData>;
161
+ onAnswer?: (answer: string, toolCallId: string, answerData: AskUserAnswerData) => void;
162
+ sessionStatus?: string;
163
+ level?: 1 | 2;
164
+ forceExpanded?: boolean;
165
+ customization?: ChatViewCustomization;
166
+ }
167
+ export interface ToolCallComponentProps {
168
+ toolCall: ToolCallInfo;
169
+ onAnswer?: (answer: string, toolCallId: string, answerData: AskUserAnswerData) => void;
170
+ answered?: boolean;
171
+ answerData?: AskUserAnswerData;
172
+ sessionId?: string;
173
+ sessionStatus?: string;
174
+ level?: 1 | 2;
175
+ turnBlocks?: ContentBlock[];
176
+ reasoning?: string;
177
+ customization?: ChatViewCustomization;
178
+ }
179
+ export interface ToolRendererProps {
180
+ toolCall: ToolCallInfo;
181
+ sessionId?: string;
182
+ }
183
+ export interface SkillStatusBarComponentProps {
184
+ sessionId: string;
185
+ onResync?: () => void;
186
+ isResyncing?: boolean;
187
+ vertical?: boolean;
188
+ className?: string;
189
+ innerClassName?: string;
190
+ /** 打开技能页;只作用于「已安装 N 个技能」这一条。 */
191
+ onOpenSkills?: () => void;
192
+ }
193
+ export declare function renderOptionalComponent<TProps extends object>(Component: ComponentType<TProps> | undefined, props: TProps): ReactNode;
194
+ /** 聊天面板的定制(classNames / components / renderers),叶子组件不用逐层透传。 */
195
+ export declare const ChatCustomizationProvider: import("react").Provider<ChatViewCustomization | undefined>;
196
+ export declare function useChatCustomization(): ChatViewCustomization | undefined;
197
+ /** 聊天区的自定义区域。 */
198
+ export interface ChatViewSlots {
199
+ /** 消息列表上方的自定义区域。 */
200
+ header?: ReactNode;
201
+ /** 无消息时的空状态。 */
202
+ emptyState?: ReactNode;
203
+ /** 输入框下方的自定义区域。 */
204
+ footer?: ReactNode;
205
+ }
206
+ /** 智能体模式与纯 LLM 模式共用的外观属性。 */
207
+ export interface ChatPresentationProps {
208
+ classNames?: ChatViewClassNames;
209
+ renderers?: ChatViewRenderers;
210
+ slots?: ChatViewSlots;
211
+ placeholder?: string;
212
+ /** 配色主题,默认浅色。宿主已经在祖先元素上写了 data-theme 时不用传。 */
213
+ theme?: "light" | "dark";
214
+ }
@@ -0,0 +1,48 @@
1
+ import type { ChatMessage, ToolCallInfo } from "@blade-hq/agent-client/internal";
2
+ /** 工具调用的状态语气。用语义命名而不是颜色名——颜色由设计令牌决定,见仓库根 DESIGN.md。 */
3
+ export type ToolTone = "done" | "running" | "awaiting" | "failed";
4
+ export interface ToolSummaryTag {
5
+ key: string;
6
+ label: string;
7
+ /** file = 产出了文件,action = 执行了一个动作。决定 chip 是否带文件图标。 */
8
+ tone: "file" | "action";
9
+ }
10
+ export declare function getToolDescription(toolCall: ToolCallInfo): string | null;
11
+ /**
12
+ * 技能入口文件的所在目录就是技能名(`.agent/skills/<技能名>/SKILL.md`)。
13
+ * 只显示 "SKILL.md" 用户看不出读的是哪个技能。
14
+ *
15
+ * 改这里必须同步 packages/agent-react/src/components/display-utils.ts 的同名函数。
16
+ */
17
+ export declare function getSkillNameFromFilePath(filePath: string | null | undefined): string | null;
18
+ /** 文件的展示名:技能入口文件显示技能名,其余显示文件名。 */
19
+ export declare function formatToolFileName(filePath: string): string;
20
+ export declare function formatToolName(name: string): string;
21
+ /**
22
+ * Returns a context-aware Chinese display label for a tool call.
23
+ * All system tools now have a `description` argument — use it as primary label.
24
+ */
25
+ export declare function getToolDisplayLabel(toolCall: ToolCallInfo): string;
26
+ export declare function getToolTone(status?: ToolCallInfo["status"]): ToolTone;
27
+ export declare function getToolStatusLabel(status?: ToolCallInfo["status"]): string;
28
+ export declare function extractToolFilePath(toolCall: ToolCallInfo): string | null;
29
+ /** 从文件类工具参数中提取全部可定位的文件路径(按出现顺序去重)。 */
30
+ export declare function extractToolFilePaths(toolCall: ToolCallInfo): string[];
31
+ export declare function getToolOutputTag(toolCall: ToolCallInfo): ToolSummaryTag | null;
32
+ export declare function isSuccessfulToolCall(toolCall: ToolCallInfo): boolean;
33
+ export declare function countSuccessfulToolCalls(toolCalls: ToolCallInfo[]): number;
34
+ export declare function countPendingToolCalls(toolCalls: ToolCallInfo[]): number;
35
+ export declare function formatToolCallCount(count: number): string;
36
+ export declare function summarizeToolCalls(toolCalls: ToolCallInfo[]): ToolSummaryTag[];
37
+ export declare function hasNaturalLanguageText(message: ChatMessage): boolean;
38
+ export declare function findAnchorMessageIndex(messages: ChatMessage[]): number;
39
+ export declare function getCollapsedTurnSegments(messages: ChatMessage[]): {
40
+ anchorIndex: number;
41
+ summaryMessages: ChatMessage[];
42
+ visibleMessages: ChatMessage[];
43
+ };
44
+ export declare function getLatestPendingToolName(toolCalls: ToolCallInfo[]): string | null;
45
+ export declare function getFinishTaskTitle(toolCalls: ToolCallInfo[]): string | null;
46
+ export declare function getTextContentSegments(messages: ChatMessage[]): string[];
47
+ export declare function getLastTextSegment(messages: ChatMessage[]): string;
48
+ export declare function countMessageLines(message: ChatMessage): number;
@@ -1,4 +1,5 @@
1
- import type { FinalArtifact, PostChatFollowup, ResultFeedback as SavedResultFeedback, ResultFeedbackReason } from "@blade-hq/agent-client";
1
+ import type { FinalArtifact, ResultFeedbackReason } from "@blade-hq/agent-client/internal";
2
+ /** 跟进建议、成果与结果评分的交互事件(宿主用来做埋点;SDK 不绑定任何分析厂商)。 */
2
3
  export type FollowupInteractionEvent = {
3
4
  type: "suggestions_shown";
4
5
  sessionId?: string;
@@ -45,19 +46,6 @@ export type FollowupInteractionEvent = {
45
46
  reason: ResultFeedbackReason | null;
46
47
  updatedAt: string;
47
48
  };
48
- export declare function HistoricalResultFeedback({ feedback }: {
49
- feedback: SavedResultFeedback;
50
- }): import("react/jsx-runtime").JSX.Element;
51
- export declare function PostChatFollowupBlock({ followup, sessionId, onSuggestion, isViewer, onInteraction, savedFeedback, onFeedbackSaved, className, suggestionClassName, }: {
52
- followup: PostChatFollowup;
53
- sessionId?: string;
54
- onSuggestion?: (value: string) => void;
55
- isViewer?: boolean;
56
- onInteraction?: (event: FollowupInteractionEvent) => void;
57
- savedFeedback?: SavedResultFeedback;
58
- onFeedbackSaved?: (feedback: SavedResultFeedback) => void;
59
- /** 追加到跟进区根节点的类(`ChatViewClassNames.followup`)。 */
60
- className?: string;
61
- /** 追加到每个「下一步」建议按钮的类(`ChatViewClassNames.followupAction`)。 */
62
- suggestionClassName?: string;
63
- }): import("react/jsx-runtime").JSX.Element | null;
49
+ export declare const FollowupInteractionProvider: import("react").Provider<((event: FollowupInteractionEvent) => void) | undefined>;
50
+ /** 发出交互事件;宿主回调抛错不影响用户的点击或下载。 */
51
+ export declare function useFollowupInteraction(): (event: FollowupInteractionEvent) => void;
@@ -0,0 +1,100 @@
1
+ export { AgentLoopBlock } from "./AgentLoopBlock";
2
+ export { AskUserQuestionBlock, parseAskUserQuestion, parseAskUserQuestionError } from "./AskUserQuestionBlock";
3
+ export type { AskUserQuestionData, AskUserQuestionError, AskUserAnswerData } from "./AskUserQuestionBlock";
4
+ export { defaultTurnDisplayMode, resolveTurnDisplayMode, formatExecutionDuration, getExecutionDurationMs, AssistantTurnBlock, collectMemoryRefs, MemoryRefsHint } from "./AssistantTurnBlock";
5
+ export type { TurnDisplayMode } from "./AssistantTurnBlock";
6
+ export { AttachmentPreviewDialog } from "./AttachmentPreviewDialog";
7
+ export { nextQueuedOrder, ChatPanel } from "./ChatPanel";
8
+ export type { ChatPanelProps } from "./ChatPanel";
9
+ export { CompactionCard } from "./CompactionCard";
10
+ export { ConnectionBanner } from "./ConnectionBanner";
11
+ export { CurrentPlanPanelContent, CurrentPlanPanel } from "./CurrentPlanPanel";
12
+ export { collectDeliveredFiles, DeliveryCard, FileDeliveryCards } from "./FileDeliveryCards";
13
+ export { FinalArtifactCards } from "./FinalArtifactCards";
14
+ export { ImageLightbox } from "./ImageLightbox";
15
+ export { LightComposer } from "./LightComposer";
16
+ export { buildLiteRows, LiteMessageList } from "./LiteMessageList";
17
+ export { MessageActions } from "./MessageActions";
18
+ export { MessageContextPills } from "./MessageContextPills";
19
+ export { MessageFileAttachmentList } from "./MessageFileAttachmentList";
20
+ export { MessageList } from "./MessageList";
21
+ export type { MessageListProps } from "./MessageList";
22
+ export { PostChatFollowupBlock } from "./PostChatFollowupBlock";
23
+ export { RenderErrorBoundary } from "./RenderErrorBoundary";
24
+ export { HistoricalResultFeedback, ResultFeedback } from "./ResultFeedback";
25
+ export { SessionReplayBar } from "./SessionReplayBar";
26
+ export { TextAttachmentPills } from "./TextAttachmentPills";
27
+ export { getFilePreviewName, ToolFilePreviewAction, ToolPreviewAction, resolveAskQuestionState, ToolCallBlock } from "./ToolCallBlock";
28
+ export { ToolUiCard } from "./ToolUiCard";
29
+ export { TurnNavRail } from "./TurnNavRail";
30
+ export type { TurnNavItem } from "./TurnNavRail";
31
+ export { isUserMessage, isErrorMessage, USER_MESSAGE_MARKDOWN_CLASS, UserMessageBubble, ErrorMessageBlock } from "./UserMessageBubble";
32
+ export type { UserChatMessage, ErrorChatMessage } from "./UserMessageBubble";
33
+ export { WorkflowRunBlock } from "./WorkflowRunBlock";
34
+ export { useReasoning, Reasoning, ReasoningTrigger, ReasoningContent, ThinkingBadge } from "./ai-elements/reasoning";
35
+ export type { ReasoningProps, ReasoningTriggerProps, ReasoningContentProps, ThinkingBadgeProps } from "./ai-elements/reasoning";
36
+ export { Shimmer } from "./ai-elements/shimmer";
37
+ export type { TextShimmerProps } from "./ai-elements/shimmer";
38
+ export { collectTurnMessages, getPersistentAskUserQuestions, toolCallAnswered } from "./assistant-turn-questions";
39
+ export { CardContext, useCardContext } from "./card/CardContext";
40
+ export type { CardContextValue } from "./card/CardContext";
41
+ export { chatTone } from "./chat-theme";
42
+ export type { ChatTone } from "./chat-theme";
43
+ export { renderOptionalComponent, ChatCustomizationProvider, useChatCustomization } from "./customization";
44
+ export type { ChatViewClassNames, ChatSendOptions, ComposerProps, ChatViewComponents, ToolCallRenderer, UserMessageRendererProps, AssistantTextRendererProps, AskUserQuestionRendererProps, PlanUpdateRendererProps, ChatViewRenderers, ChatViewCustomization, AssistantTurnComponentProps, ToolCallComponentProps, ToolRendererProps, SkillStatusBarComponentProps, ChatViewSlots, ChatPresentationProps } from "./customization";
45
+ export { getToolDescription, getSkillNameFromFilePath, formatToolFileName, formatToolName, getToolDisplayLabel, getToolTone, getToolStatusLabel, extractToolFilePath, extractToolFilePaths, getToolOutputTag, isSuccessfulToolCall, countSuccessfulToolCalls, countPendingToolCalls, formatToolCallCount, summarizeToolCalls, hasNaturalLanguageText, findAnchorMessageIndex, getCollapsedTurnSegments, getLatestPendingToolName, getFinishTaskTitle, getTextContentSegments, getLastTextSegment, countMessageLines } from "./display-utils";
46
+ export type { ToolTone, ToolSummaryTag } from "./display-utils";
47
+ export { FollowupInteractionProvider, useFollowupInteraction } from "./followup-interaction";
48
+ export type { FollowupInteractionEvent } from "./followup-interaction";
49
+ export { buildCitationsFromToolCalls } from "./lib/citations";
50
+ export type { CitationEntry } from "./lib/citations";
51
+ export { SUPPORTED_LANGUAGES, normalizeCodeLanguage, getCodeLanguageFromFilename } from "./lib/code-language";
52
+ export type { SupportedCodeLanguage } from "./lib/code-language";
53
+ export { LOOPBACK_HOSTS, isLoopbackUrl, openInSessionSandboxBrowser, rewriteForSandboxBrowser } from "./lib/loopback";
54
+ export { resolveSessionMarkdownAssetUrl } from "./lib/markdown-asset-url";
55
+ export { isImageFilename, isTextFilename, dispatchPreview } from "./lib/preview-dispatch";
56
+ export type { PreviewKind, PreviewDescriptor } from "./lib/preview-dispatch";
57
+ export { isUiMeta, resolveBrowserResourceUri } from "./lib/ui-meta";
58
+ export type { UiMeta } from "./lib/ui-meta";
59
+ export { useAsyncValue } from "./lib/use-async-value";
60
+ export { ExternalAnchor } from "./markdown/ExternalAnchor";
61
+ export { resolveCollapsedContent, collapseInlineToolCalls, injectCitationRefs, MarkdownContent, normalizeAdjacentUrlFormatting } from "./markdown/MarkdownContent";
62
+ export type { MarkdownContentProps } from "./markdown/MarkdownContent";
63
+ export { findCodeRanges, stripSystemReminders } from "./markdown/text";
64
+ export { RECENT_RESIDENT_TURNS, shouldAppendPendingAssistantTurn, buildMessageListBlocks, getRenderBlockPersistentId, startIndexOfLastNCompleteTurns, findStablePrefixEnd, latestUserSpeechEntryId, buildMessageListBlockIndexes, NAV_AT_BOTTOM_EPSILON_PX, selectActiveTurnAtViewportPosition, snapshotMessageListRenderPlan } from "./message-list-blocks";
65
+ export type { AssistantTurnRenderBlock, RenderBlock, VisibleTurnRect } from "./message-list-blocks";
66
+ export { PlanSummaryCard } from "./plan/PlanSummaryCard";
67
+ export { extractLatestPlanMessages, extractPlanMessagesForTurn } from "./plan/extract-plan-messages";
68
+ export { parsePlanMessages } from "./plan/parse-plan-messages";
69
+ export { parsePlanTree, applyPlanStatusesById, parsePlanTreeResult } from "./plan/parse-plan-tree";
70
+ export type { PlanStatusMap } from "./plan/parse-plan-tree";
71
+ export type { SkillInfo, SkillCatalogItem, PlanNode, Phase, PlanData } from "./plan/types";
72
+ export { findLatestReasoningMessageIndex } from "./reasoning-visibility";
73
+ export { buildPendingAskUserAnswer, sendToSession } from "./runtime/actions";
74
+ export type { ChatSendExtras } from "./runtime/actions";
75
+ export { composerChannels, useComposerChannels } from "./runtime/composer-channels";
76
+ export type { PendingContextSignal, DraftAppendSignal, SendRequestSignal, ComposerChannelsState, ComposerChannels } from "./runtime/composer-channels";
77
+ export { ChatEnvironmentProvider, useChatEnvironment, useHighlightedCode, useChatSessionDetail, useHideTodo, useChatRenderMode, notifyChat, useComposerBridge, useChatVirtualizer } from "./runtime/environment";
78
+ export type { ChatRenderMode, ChatVirtualItem, ChatVirtualizer, ChatVirtualizerOptions, UseChatVirtualizer, ChatCodeProps, DeveloperMessageListProps, ChatEnvironment } from "./runtime/environment";
79
+ export { SessionSourceProvider, useSessionSource, useSingleSessionSource, useSessionHandle, useSessionState, useIsSessionHistoryLoading, usePlanRevealRevision, CurrentChatSessionProvider, useCurrentChatSessionId } from "./runtime/session-source";
80
+ export type { SessionSource } from "./runtime/session-source";
81
+ export { useChatActions } from "./runtime/use-chat-actions";
82
+ export { useSessionReplay } from "./runtime/use-session-replay";
83
+ export type { UseSessionReplayResult } from "./runtime/use-session-replay";
84
+ export { ENTRY_SCROLL_MARGIN_PX, calculateStickyAwareMargin, normalizeScrollEntryKey, calculateAnchoredScrollTop, calculateTrailingSpacerHeight, PIN_HANDOVER_TOLERANCE_PX, shouldHandOverToFollow, NEW_TURN_SCROLL_DURATION_MS, NEW_TURN_SCROLL_MIN_DISTANCE_PX, NEW_TURN_SCROLL_MAX_SCREENS, MANUAL_SCROLL_TOLERANCE_PX, shouldAnimateNewTurnScroll, calculateAnimatedScrollTop } from "./scroll-anchor";
85
+ export { BashRenderer } from "./tool-renderers/BashRenderer";
86
+ export { FileEditRenderer } from "./tool-renderers/FileEditRenderer";
87
+ export { FileReadRenderer } from "./tool-renderers/FileReadRenderer";
88
+ export { KbSearchRenderer } from "./tool-renderers/KbSearchRenderer";
89
+ export { SearchRenderer } from "./tool-renderers/SearchRenderer";
90
+ export { SubmitResultRenderer } from "./tool-renderers/SubmitResultRenderer";
91
+ export { parseKbSearchResult, formatKbSearchLabel } from "./tool-renderers/kb-search-result";
92
+ export type { KbSearchHit, KbSearchResult } from "./tool-renderers/kb-search-result";
93
+ export { getRenderer } from "./tool-renderers/registry";
94
+ export { getResultText, getResultImages, parseJsonValue, isPlainObject, getStringValue, getNumberValue, getBooleanValue, extractErrorMessage, getFileName, getCodeLanguage, formatBytes, CodePreview } from "./tool-renderers/shared";
95
+ export { shouldFollowWritePreview, scrollWritePreviewToLatest } from "./tool-renderers/write-preview-scroll";
96
+ export { skillDisplayName } from "./lib/skill-name";
97
+ export { type ConnectorComputerSectionProps, type InputConnection, type InputDataState, type InputKnowledgeBase, type InputModelCatalog, type InputModelOption, type InputModelPreferences, type InputSessionSkill, type InputSkillStats, type RichInputServices, parseModelReasoningLevels, RichInputServicesProvider, useRichInputServices, } from "./runtime/input-services";
98
+ export { backgroundTaskDismissals, useDismissedBackgroundTasks } from "./runtime/background-task-dismissals";
99
+ export { visibleSkillIds, visibleSkills } from "./lib/skill-visibility";
100
+ export { resetInputCaches } from "./runtime/input-cache-reset";
@@ -0,0 +1,30 @@
1
+ import type { ToolCallInfo } from "@blade-hq/agent-client/internal";
2
+ /** 一条可点击引用的完整证据:从 kb_search 工具结果的 hit 原样带过来。 */
3
+ export interface CitationEntry {
4
+ n: number;
5
+ kbName: string;
6
+ title: string;
7
+ path: string;
8
+ page: number | null;
9
+ heading: string | null;
10
+ text: string;
11
+ previewUrl: string | null;
12
+ }
13
+ /**
14
+ * 从一轮里的工具调用抽取可引用证据。规则:
15
+ * - 只认成功完成的 kb_search 调用(其余工具、失败/进行中的调用都不构成可引用证据)。
16
+ * - 汇总本轮全部 kb_search 调用的命中,不只看最后一次。后端(见
17
+ * `knowledge_base.py build_search_tool_output` 的 `start_index`、
18
+ * `EngineSkillMixin.allocate_kb_citation_range`)保证本轮内多次 kb_search
19
+ * 调用的编号连续递增、不重叠、不归零,所以回答里的每个 `[n]` 在这一轮里
20
+ * 本该全局唯一,直接汇总即可,不用再靠"只用最后一次"去猜模型引用的是哪次。
21
+ * - 但前端不信任协议 100% 不出错:万一后端真出现同一个编号在不同调用间指向
22
+ * 不同证据的异常情况,这里依然按"冲突就剔除"处理——发现冲突直接从返回的
23
+ * map 里删掉这个编号,而不是用后来者覆盖前者,避免一旦协议出岔子就退回到
24
+ * "看起来能点、点开却是错的文档"这个原始 bug。正常情况下这段防御代码不会
25
+ * 被触发。
26
+ *
27
+ * 返回的 map 只包含真的有证据支撑、且没有歧义的编号——`[n]` 是否可点全靠这个
28
+ * map 里有没有对应的 key,不额外维护一个"允许列表",避免两处状态不同步。
29
+ */
30
+ export declare function buildCitationsFromToolCalls(toolCalls: ToolCallInfo[] | null | undefined): Record<number, CitationEntry>;
@@ -0,0 +1,5 @@
1
+ /** 代码块语言名 / 文件扩展名到高亮语言的映射(高亮本身由宿主注入,见 runtime/environment)。 */
2
+ export declare const SUPPORTED_LANGUAGES: readonly ["python", "javascript", "typescript", "tsx", "jsx", "yaml", "markdown", "bash", "json", "go", "rust", "css", "html"];
3
+ export type SupportedCodeLanguage = (typeof SUPPORTED_LANGUAGES)[number];
4
+ export declare function normalizeCodeLanguage(language?: string | null): SupportedCodeLanguage | null;
5
+ export declare function getCodeLanguageFromFilename(filePath?: string | null): SupportedCodeLanguage | null;
@@ -0,0 +1,8 @@
1
+ /** 本机地址(沙盒里的服务在浏览器看来是 localhost)。 */
2
+ export declare const LOOPBACK_HOSTS: ReadonlySet<string>;
3
+ export declare function isLoopbackUrl(rawUrl: string): boolean;
4
+ export declare function rewriteForSandboxBrowser(rawUrl: string): string;
5
+ /** 在会话的沙盒浏览器里新开一个标签打开本机地址(沙盒里的服务只有沙盒浏览器访问得到)。 */
6
+ export declare function openInSessionSandboxBrowser(client: {
7
+ json: (method: "POST", path: string, body: unknown) => Promise<unknown>;
8
+ }, sessionId: string, url: string): Promise<void>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 把 Markdown 里的相对图片地址解析成会话工作区文件地址:有所在文件时相对它,聊天消息相对工作区根目录。
3
+ * `buildAuthedUrl` 给地址补上鉴权(BladeClient.buildAuthedUrl)。
4
+ */
5
+ export declare function resolveSessionMarkdownAssetUrl(rawSrc: string, sessionId: string | null | undefined, baseFilePath: string | undefined, buildAuthedUrl: (path: string) => string): string;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 按文件扩展名决定预览渲染方式(R6)。
3
+ *
4
+ * 为什么按扩展名不按 MIME:当前消息 schema 里 FileContentPart / TextAttachment
5
+ * 都只存 `name` + `uploadedPath`,没有 mime_type(见 design.md §3.6)。
6
+ * 改 schema 面太大,扩展名在实际数据里足够稳定(前端上传时就是文件名)。
7
+ *
8
+ * 动图(.gif/.webp/.apng/.avif)归为 image,因为浏览器 `<img>` 原生播放。
9
+ * video 类扩展名本期不覆盖(见 design.md §3.6 决策:"只动图,不视频")。
10
+ */
11
+ export type PreviewKind = "image" | "text" | "default";
12
+ export interface PreviewDescriptor {
13
+ kind: PreviewKind;
14
+ filename: string;
15
+ url: string;
16
+ }
17
+ /**
18
+ * 判断扩展名能不能用 `<img>` 预览(含动图)。
19
+ * 独立导出是为了让调用方可以在不走完整 dispatchPreview 的场景(如 UserMessageBubble
20
+ * 已经在 render 时把图片渲染成 <img>,不需要再走 kind 分派)直接查一次。
21
+ */
22
+ export declare function isImageFilename(filename: string): boolean;
23
+ export declare function isTextFilename(filename: string): boolean;
24
+ export declare function dispatchPreview(filename: string, url: string): PreviewDescriptor;
@@ -0,0 +1,9 @@
1
+ type SkillDisplayTarget = {
2
+ skill_id?: string | null;
3
+ display_name?: string | null;
4
+ skillId?: string | null;
5
+ displayName?: string | null;
6
+ };
7
+ /** 技能的展示名:有业务名用业务名,否则用技能 id。 */
8
+ export declare function skillDisplayName(skill: SkillDisplayTarget): string;
9
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { ChatRenderMode as RenderMode } from "../runtime/environment";
2
+ export declare function visibleSkills<T extends {
3
+ builtin?: boolean;
4
+ }>(skills: T[], mode: RenderMode): T[];
5
+ export declare function visibleSkillIds(ids: readonly string[], catalog: readonly {
6
+ skill_id: string;
7
+ builtin?: boolean;
8
+ }[] | undefined, mode: RenderMode): string[];
@@ -0,0 +1,5 @@
1
+ import { type ToolUiCard } from "@blade-hq/agent-client/internal";
2
+ export type UiMeta = ToolUiCard;
3
+ export declare const isUiMeta: (value: unknown) => value is UiMeta;
4
+ /** 工具界面给的本机地址换成当前页面的主机名(沙盒端口经同一主机访问)。 */
5
+ export declare function resolveBrowserResourceUri(value: string, browserHostname?: string): string;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 按 key 异步取一个值(聊天组件里零星的文件读取用,不引入请求缓存库)。
3
+ * key 变化或卸载时中止在途请求;过期结果不写回。
4
+ */
5
+ export declare function useAsyncValue<T>(key: string | null, load: (signal: AbortSignal) => Promise<T>): {
6
+ data: T | undefined;
7
+ error: Error | null;
8
+ };
@@ -0,0 +1,9 @@
1
+ import type { ComponentPropsWithRef } from "react";
2
+ type AnchorProps = ComponentPropsWithRef<"a">;
3
+ /** 链接一律新窗口打开并断开 opener,SDK 不接管站内跳转。
4
+ * 页内锚点(脚注引用/回链这类 `href="#fn-note"`)不能套"新窗口打开"这套
5
+ * 逻辑——新开一个标签页访问 `#片段` 只是把整篇文档重新打开一次,不是
6
+ * 滚动到页内位置,会破坏脚注的跳转体验。只有真正的外部链接才需要新窗口
7
+ * + 断开 opener。*/
8
+ export declare function ExternalAnchor({ children, href, ...props }: AnchorProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,40 @@
1
+ import { type MarkdownRendererProps } from "../../components/markdown";
2
+ import { normalizeAdjacentUrlFormatting } from "./text";
3
+ import type { CitationEntry } from "../lib/citations";
4
+ export { normalizeAdjacentUrlFormatting };
5
+ export declare function resolveCollapsedContent({ dataKeyAttribute, dataRawAttribute, children, }: {
6
+ dataKeyAttribute?: string;
7
+ dataRawAttribute?: string;
8
+ children?: unknown;
9
+ }): string;
10
+ export declare function collapseInlineToolCalls(children: string): string;
11
+ /** `[n]` 形式的引用角标,只有在 `citations` 里能查到 n 对应的证据时才替换成可交互标签
12
+ * `<blade-citation-ref data-n="n">`;查不到就原样留作纯文本——不给用户一个点了却没有
13
+ * 来源的假角标。不改代码块/行内代码里的内容(跟 collapseInlineToolCalls 共用同一套
14
+ * 代码区间检测)。故意不吃 `[1](url)`(真链接)、`[1]:`(引用定义)。
15
+ *
16
+ * `[1][2]` 这种紧邻的引用式链接语法(`[text][ref]`)本该保护,但模型引用多条证据时
17
+ * 常见的写法恰好也是 `[1][2]`(两个编号紧挨着,各自代表一条证据)——不能用"后面
18
+ * 跟 [ 就一律跳过"这种一刀切规则,否则相邻引用里靠前那个永远变不成可点角标。这里
19
+ * 改成:只有当紧跟着的下一对方括号*不是*另一个真实存在的引用编号时,才当作引用式
20
+ * 链接的链接文本部分处理、不转换当前这个——两边都是真实证据时,两个都转换。 */
21
+ export declare function injectCitationRefs(text: string, citations: Record<number, unknown> | null | undefined): string;
22
+ export type MarkdownContentProps = MarkdownRendererProps & {
23
+ /** 当提供时,markdown 中相对路径的 <img> src 会解析为 session 工作区文件 URL */
24
+ sessionId?: string;
25
+ /** 文件预览传入工作区相对路径;聊天消息不传时仍按工作区根目录解析。 */
26
+ baseFilePath?: string;
27
+ /** 本轮里真实检索到的引用证据(见 `lib/citations.ts`)。提供时,文本里能对上号的
28
+ * `[n]` 会渲染成可 hover 预览/点击跳转原文的角标;查不到证据的 `[n]` 原样是纯文本。 */
29
+ citations?: Record<number, CitationEntry> | null;
30
+ /** 历史遗留 prop:streamdown 自己的代码块内置控件开关。`components.pre`/
31
+ * `components.code` 一旦被覆盖(这里始终覆盖),streamdown 对应的默认控件
32
+ * 本来就不会渲染,这个开关从未真正生效过——迁移后继续接受但不使用,
33
+ * 避免所有既有调用点都要跟着改。 */
34
+ controls?: boolean | {
35
+ table?: boolean;
36
+ code?: boolean;
37
+ mermaid?: boolean;
38
+ };
39
+ };
40
+ export declare function MarkdownContent({ allowedTags, baseFilePath, children, citations, components, controls: _controls, mode, sessionId, ...props }: MarkdownContentProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ /** 找出文本里已经闭合的代码区间(围栏代码块 + 行内代码),跟
2
+ * `heal-incomplete.ts` 里同名逻辑的用途一样——`stripSystemReminders` 在
3
+ * markdown 解析之前对原始文本操作,不感知代码块/行内代码,用户把
4
+ * `<system-reminder>` 当字面例子写在反引号里讨论、或者代码示例里恰好
5
+ * 出现完整的标记形状,都不应该被当成真的内部提醒删掉。 */
6
+ /** 已经闭合的代码区间(围栏代码块 + 行内代码):这些范围里的文字按字面处理,不做替换。 */
7
+ export declare function findCodeRanges(text: string): Array<[number, number]>;
8
+ /** 渲染前剥掉平台内部提醒(跳过代码区间:写在反引号里讨论的标记不算)。 */
9
+ export declare function stripSystemReminders(text: string): string;
10
+ /** Keep inline formatting markers from being consumed by URL autolinking. */
11
+ export declare function normalizeAdjacentUrlFormatting(value: string): string;