netstar-ai-chat 1.0.0 → 1.0.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 (91) hide show
  1. package/dist/AgentChat/AIMessage.d.ts +454 -0
  2. package/dist/AgentChat/AI_HITL_Config.d.ts +25 -0
  3. package/dist/AgentChat/AI_SDK_AIMessage.d.ts +25 -0
  4. package/dist/AgentChat/AI_SDK_Save_AIMessage.d.ts +44 -0
  5. package/dist/AgentChat/Dify_SDK_AIMessage.d.ts +48 -0
  6. package/dist/AgentChat/LangchainMessage.d.ts +115 -0
  7. package/dist/AgentChat/Langchain_py_AIMessage.d.ts +170 -0
  8. package/dist/AgentChat/historyMessageUtils.d.ts +16 -0
  9. package/dist/AgentChat/index.vue.d.ts +86 -0
  10. package/dist/ChatPanel/ToolCallNode.vue.d.ts +2 -2
  11. package/dist/ChatPanel/ToolRenders/SaveModuleDocsRenderer.vue.d.ts +2 -2
  12. package/dist/{CodeBlockNode-CTasgSPs.cjs → CodeBlockNode-nxaZO8pn.cjs} +1 -1
  13. package/dist/{CodeBlockNode-DuMNoiwD.js → CodeBlockNode-uCRw2qdH.js} +1 -1
  14. package/dist/{_baseClone-M9Eo-ngy.js → _baseClone-2wT6lyYv.js} +61 -61
  15. package/dist/_baseClone-DP4oIZ9B.cjs +1 -0
  16. package/dist/{isEmpty-9fTBY8_5.js → _baseUniq-5ISs7FiP.js} +183 -158
  17. package/dist/_baseUniq-D0NfTM7s.cjs +1 -0
  18. package/dist/{blockDiagram-677ZJIJ3-BXsjcvEy.cjs → blockDiagram-677ZJIJ3-Cr9IXkty.cjs} +1 -1
  19. package/dist/{blockDiagram-677ZJIJ3-DUfdZ59z.js → blockDiagram-677ZJIJ3-D1rHhaps.js} +1 -1
  20. package/dist/{chunk-EX3LRPZG-D0TH5Vrj.js → chunk-EX3LRPZG-B9CLQvjn.js} +1 -1
  21. package/dist/{chunk-EX3LRPZG-DgwSD7VR.cjs → chunk-EX3LRPZG-GvqDfUn1.cjs} +1 -1
  22. package/dist/{chunk-FWX5IMBZ-c8mJHkIt.js → chunk-FWX5IMBZ-CUdXgrWK.js} +2 -2
  23. package/dist/{chunk-FWX5IMBZ-CCaqRbxb.cjs → chunk-FWX5IMBZ-Cs_GPGXa.cjs} +1 -1
  24. package/dist/{chunk-PUDLZKDR-JbFT5hiR.cjs → chunk-PUDLZKDR-BliZ2Xsv.cjs} +1 -1
  25. package/dist/{chunk-PUDLZKDR-D18W-L-L.js → chunk-PUDLZKDR-t4VFI7Z_.js} +1 -1
  26. package/dist/{chunk-RYQCIY6F-CTIaeOkt.js → chunk-RYQCIY6F-DY6YO-ra.js} +3 -3
  27. package/dist/{chunk-RYQCIY6F-Budeukwp.cjs → chunk-RYQCIY6F-DsaYljka.cjs} +1 -1
  28. package/dist/{chunk-V7JOEXUC-BYc3FcMK.js → chunk-V7JOEXUC-D6hYwcFw.js} +1 -1
  29. package/dist/{chunk-V7JOEXUC-Wa1_qMKV.cjs → chunk-V7JOEXUC-DveVaknS.cjs} +1 -1
  30. package/dist/{classDiagram-OUVF2IWQ-BPcmQYGc.js → classDiagram-OUVF2IWQ-BORBn8NL.js} +2 -2
  31. package/dist/{classDiagram-OUVF2IWQ-CMJ1dZOd.cjs → classDiagram-OUVF2IWQ-DaxjCtMD.cjs} +1 -1
  32. package/dist/{classDiagram-v2-EOCWNBFH-C_A6LIqp.js → classDiagram-v2-EOCWNBFH-CE1zoE2Y.js} +2 -2
  33. package/dist/{classDiagram-v2-EOCWNBFH-CMJ1dZOd.cjs → classDiagram-v2-EOCWNBFH-DaxjCtMD.cjs} +1 -1
  34. package/dist/dagre-CqPF1PeH.cjs +1 -0
  35. package/dist/{dagre-Cdkj1zk3.js → dagre-UOTTX-Ls.js} +549 -549
  36. package/dist/{dagre-VKFMJZFB-D-LL1taY.cjs → dagre-VKFMJZFB-BKYyO16c.cjs} +2 -2
  37. package/dist/{dagre-VKFMJZFB-BTuSjqsN.js → dagre-VKFMJZFB-DZSgt7B5.js} +14 -14
  38. package/dist/dev.d.ts +1 -0
  39. package/dist/{erDiagram-Q63AITRT-DT6IAJLm.js → erDiagram-Q63AITRT-BgTTXKyk.js} +1 -1
  40. package/dist/{erDiagram-Q63AITRT-BDhFo6C9.cjs → erDiagram-Q63AITRT-pfsYw052.cjs} +1 -1
  41. package/dist/{exports-C8Eu-cBn.cjs → exports-CUDnphqD.cjs} +2 -2
  42. package/dist/{exports-C67Wizt6.js → exports-DQNCykpa.js} +8 -8
  43. package/dist/{find-8kzfNl8Q.js → find-BnPvj2ej.js} +31 -31
  44. package/dist/find-CdmKt8F2.cjs +1 -0
  45. package/dist/{flowDiagram-23GEKE2U-BIAXSHCZ.cjs → flowDiagram-23GEKE2U-DlipvW4i.cjs} +1 -1
  46. package/dist/{flowDiagram-23GEKE2U-FteV-tpU.js → flowDiagram-23GEKE2U-Dzd1-nhI.js} +2 -2
  47. package/dist/graphlib-DGcxpOxW.cjs +1 -0
  48. package/dist/{graphlib-DjREGp7-.js → graphlib-DNYwf2Q3.js} +74 -99
  49. package/dist/index.cjs +122 -114
  50. package/dist/index.d.ts +9 -0
  51. package/dist/index.mjs +11033 -6760
  52. package/dist/{index2-QpsswhC2.js → index2-6XNXmD9D.js} +1 -1
  53. package/dist/{index2-Db29305J.cjs → index2-DVVXKht2.cjs} +1 -1
  54. package/dist/{index3-B9UVcR3x.cjs → index3-i-YcvOOM.cjs} +1 -1
  55. package/dist/{index3-CSFQ35FU.js → index3-m__wi4Tc.js} +1 -1
  56. package/dist/{index4-BjmzmXkZ.cjs → index4-ChGJejaH.cjs} +1 -1
  57. package/dist/{index4-CzKbdrmD.js → index4-a76eTE_l.js} +1 -1
  58. package/dist/{index5-CvMqoYtf.cjs → index5-C3svTHtx.cjs} +1 -1
  59. package/dist/{index5-CjNnYoXJ.js → index5-CGyUxkgz.js} +1 -1
  60. package/dist/{index6-BUkE1lni.js → index6-CDHKjY4q.js} +1 -1
  61. package/dist/{index6-DwZeyaka.cjs → index6-DnR2b9_0.cjs} +1 -1
  62. package/dist/{index7-D-76uUB1.js → index7-C7UxGaDK.js} +1 -1
  63. package/dist/index7-CR5-JEQ4.cjs +1 -0
  64. package/dist/{map-DmTyBWxT.js → map-DYVGVxPK.js} +3 -3
  65. package/dist/map-Iz5EK08G.cjs +1 -0
  66. package/dist/{mermaid.core-CbBmSLjg.js → mermaid.core-0mKBU1f3.js} +13 -13
  67. package/dist/{mermaid.core-CsEkQu6v.cjs → mermaid.core-BVdmq8G9.cjs} +2 -2
  68. package/dist/{mindmap-definition-LN4V7U3C-B29e6fR_.cjs → mindmap-definition-LN4V7U3C-BNu--kki.cjs} +1 -1
  69. package/dist/{mindmap-definition-LN4V7U3C-BUSRrZX0.js → mindmap-definition-LN4V7U3C-CQE_XUtS.js} +1 -1
  70. package/dist/netstar-ai-chat.css +1 -1
  71. package/dist/{requirementDiagram-TGXJPOKE-BxnKsGpN.cjs → requirementDiagram-TGXJPOKE-CRqEhMHO.cjs} +1 -1
  72. package/dist/{requirementDiagram-TGXJPOKE-FQoCKQHp.js → requirementDiagram-TGXJPOKE-DAJtmGPP.js} +1 -1
  73. package/dist/{stateDiagram-2N3HPSRC-DaporqgM.js → stateDiagram-2N3HPSRC-Bww_UKIU.js} +6 -6
  74. package/dist/{stateDiagram-2N3HPSRC-DrVYkEQ-.cjs → stateDiagram-2N3HPSRC-Dn8hU81H.cjs} +1 -1
  75. package/dist/{stateDiagram-v2-6OUMAXLB-DZ0YarTq.cjs → stateDiagram-v2-6OUMAXLB-BwE9fK3n.cjs} +1 -1
  76. package/dist/{stateDiagram-v2-6OUMAXLB-iNhJP0se.js → stateDiagram-v2-6OUMAXLB-C2R_9_Uv.js} +2 -2
  77. package/dist/{swimlanes-5IMT3BWC-BkAqjD-a.cjs → swimlanes-5IMT3BWC-C7NFa2wg.cjs} +1 -1
  78. package/dist/{swimlanes-5IMT3BWC-Cl0MBCBd.js → swimlanes-5IMT3BWC-WMV2md8F.js} +2 -2
  79. package/dist/{swimlanesDiagram-G3AALYLV-Bh7l_29Y.cjs → swimlanesDiagram-G3AALYLV-CsuSDnWf.cjs} +1 -1
  80. package/dist/{swimlanesDiagram-G3AALYLV-Bs_bljXb.js → swimlanesDiagram-G3AALYLV-XwNa4ZI_.js} +2 -2
  81. package/dist/types/agent.d.ts +72 -72
  82. package/dist/utils/DifySDK.d.ts +104 -0
  83. package/dist/utils/EventEmitter.d.ts +12 -0
  84. package/package.json +8 -13
  85. package/dist/_baseClone-D3YkUt7B.cjs +0 -1
  86. package/dist/dagre-RL-7--pi.cjs +0 -1
  87. package/dist/find-D49DDMOn.cjs +0 -1
  88. package/dist/graphlib-B0pkl27u.cjs +0 -1
  89. package/dist/index7-CCL1p1Eh.cjs +0 -1
  90. package/dist/isEmpty-DaIHfoaK.cjs +0 -1
  91. package/dist/map-CnWYCApZ.cjs +0 -1
@@ -0,0 +1,454 @@
1
+ export type DecisionType = import('./LangchainMessage').DecisionType;
2
+ export type InterruptEvent = import('./LangchainMessage').InterruptEvent;
3
+ export type ResumeDecision = import('./LangchainMessage').ResumeDecision;
4
+ export type CreateAgentDecision = import('./LangchainMessage').CreateAgentDecision;
5
+ export type AnyResumeDecision = import('./LangchainMessage').AnyResumeDecision;
6
+ /** 消息发送者角色 */
7
+ export type ChatRole = 'ai' | 'user';
8
+ /** 工具调用生命周期状态 */
9
+ export type ToolCallStatus = 'error' | 'running' | 'success' | 'waiting';
10
+ /**
11
+ * Agent 层抛出的原始工具调用事件。
12
+ * - `running`:工具已被调用,入参已知,等待执行结果。
13
+ * - `success`:工具执行成功,output 为返回值。
14
+ * - `error` :工具执行失败,error 为错误描述。
15
+ */
16
+ export interface ToolCallEvent {
17
+ /** 审批配置(status === 'waiting' 时存在,来自中断事件) */
18
+ approvalConfig?: {
19
+ /** 允许的决策类型 */
20
+ allowedDecisions: import('./LangchainMessage').DecisionType[];
21
+ /** 操作描述 */
22
+ description: string;
23
+ /** 中断事件 ID */
24
+ interruptId: string;
25
+ };
26
+ /** 工具执行耗时(毫秒),status 变为终态后才有值 */
27
+ durationMs?: number;
28
+ /** 错误信息(status === 'error' 时存在) */
29
+ error?: string;
30
+ /** 调用入参(任意结构,由具体工具定义) */
31
+ input?: unknown;
32
+ /** 调用输出(status === 'success' 时存在) */
33
+ output?: unknown;
34
+ /** 当前状态 */
35
+ status: ToolCallStatus;
36
+ /** 所处轮次序号(0-based),多步 Agent 循环时有值 */
37
+ stepNumber?: number;
38
+ /** 事件触发时的 Unix 时间戳(毫秒) */
39
+ timestamp: number;
40
+ /** 友好展示标题(优先于 toolName 展示,可选) */
41
+ title?: string;
42
+ /** 本次工具调用的唯一 ID(由模型分配) */
43
+ toolCallId: string;
44
+ /** 工具名称(程序标识符) */
45
+ toolName: string;
46
+ }
47
+ /**
48
+ * 连续文本段,指向宿主消息 `content` 的字符区间 `[start, end)`.
49
+ * `end === -1` 表示延伸到 `content` 末尾(流式尚未结束时使用)。
50
+ */
51
+ export interface TextSegment {
52
+ /** 结束字符索引(不包含,-1 表示到消息末尾) */
53
+ end: number;
54
+ /** 起始字符索引(包含) */
55
+ start: number;
56
+ type: 'text';
57
+ }
58
+ /** 工具调用占位段,关联一次具体的工具调用 */
59
+ export interface ToolSegment {
60
+ toolCallId: string;
61
+ type: 'tool';
62
+ }
63
+ /** 消息内容段(文本段 | 工具调用段) */
64
+ export type ContentSegment = TextSegment | ToolSegment;
65
+ /**
66
+ * 工具调用时间线中的单条记录。
67
+ * 由原始 ToolCallEvent 整合而来,包含截断后的预览字符串,
68
+ * 可直接供 ChatPanel 渲染工具调用节点。
69
+ */
70
+ export interface ToolTimelineItem {
71
+ /**
72
+ * 审批配置(status === 'waiting' 时存在)。
73
+ * 当工具调用需要人工审批时,存储审批相关的配置信息。
74
+ */
75
+ approvalConfig?: {
76
+ /** 允许的决策类型 */
77
+ allowedDecisions: import('./LangchainMessage').DecisionType[];
78
+ /** 入参对象 */
79
+ args: Record<string, unknown>;
80
+ /** 操作描述 */
81
+ description: string;
82
+ /** 编辑内容(edit 审批时使用) */
83
+ editContent: string;
84
+ /** 中断事件 ID */
85
+ interruptId: string;
86
+ };
87
+ /** 工具执行耗时(毫秒) */
88
+ durationMs?: number;
89
+ /** 原始错误(供特定工具自定义渲染使用) */
90
+ error?: string;
91
+ /** 原始入参(供特定工具自定义渲染使用) */
92
+ input?: unknown;
93
+ /** 入参预览文本(已截断) */
94
+ inputPreview?: string;
95
+ /** 原始输出(供特定工具自定义渲染使用) */
96
+ output?: unknown;
97
+ /**
98
+ * 结果预览文本(已截断)。
99
+ * status === 'error' 时为错误信息,success 时为输出内容。
100
+ */
101
+ resultPreview?: string;
102
+ /** 调用发起时间(ms since epoch) */
103
+ startedAt: number;
104
+ status: ToolCallStatus;
105
+ /** 所处步骤序号(0-based) */
106
+ stepNumber?: number;
107
+ /** 友好展示标题 */
108
+ title?: string;
109
+ toolCallId: string;
110
+ toolName: string;
111
+ }
112
+ /**
113
+ * ChatPanel 内部维护的消息结构。
114
+ * - 用户消息仅含 role / key / content。
115
+ * - AI 消息在流式输出时 loading 为 true,content 逐字追加;
116
+ * 如有工具调用,toolTimeline 和 segments 同步更新。
117
+ */
118
+ export interface ChatMessage {
119
+ /**
120
+ * 消息正文(纯文本或 Markdown 字符串)。
121
+ * AI 消息在流式输出时逐字追加;工具调用不计入此字段。
122
+ */
123
+ content: string;
124
+ /** 消息唯一标识(渲染 key) */
125
+ key: string;
126
+ /** 消息是否正在加载(流式输出尚未结束) */
127
+ loading?: boolean;
128
+ /** 消息角色 */
129
+ role: ChatRole;
130
+ /**
131
+ * 内容段列表,描述文本与工具调用的交叉顺序。
132
+ * 无工具调用时为空,全部内容退化为单一文本段。
133
+ */
134
+ segments?: ContentSegment[];
135
+ /** 工具调用时间线(AI 消息专用,用于渲染工具调用节点) */
136
+ toolTimeline?: ToolTimelineItem[];
137
+ }
138
+ /** 已将字符范围解析为实际文本的渲染段 */
139
+ export interface ResolvedTextSegment {
140
+ /** 已切片的文本内容,可直接传给 StreamMarkdown */
141
+ text: string;
142
+ type: 'text';
143
+ }
144
+ /** 已解析的工具调用渲染段 */
145
+ export interface ResolvedToolSegment {
146
+ toolCallId: string;
147
+ type: 'tool';
148
+ }
149
+ /** 可直接供模板 v-for 消费的渲染段联合类型 */
150
+ export type ResolvedSegment = ResolvedTextSegment | ResolvedToolSegment;
151
+ /**
152
+ * 历史会话摘要条目,用于侧边栏列表展示。
153
+ * 与具体后端(Dify / 自研)无关,由 Agent 层负责适配。
154
+ */
155
+ export interface ConversationSummary {
156
+ /** 会话创建时间(ms since epoch,可选) */
157
+ createdAt?: number;
158
+ /** 会话唯一 ID */
159
+ id: string;
160
+ /** 会话标题(可能由用户命名或由模型自动生成) */
161
+ title: string;
162
+ /** 会话最后更新时间(ms since epoch,可选) */
163
+ updatedAt?: number;
164
+ }
165
+ /** 历史会话列表响应 */
166
+ export interface ConversationListResult {
167
+ /** 是否还有更多分页数据 */
168
+ hasMore: boolean;
169
+ /** 本页会话摘要列表 */
170
+ items: ConversationSummary[];
171
+ /**
172
+ * 用于加载下一页的游标(通常为末条记录 ID)。
173
+ * `hasMore === false` 时可忽略。
174
+ */
175
+ nextCursor?: string;
176
+ }
177
+ /**
178
+ * 单条原始消息记录(后端返回的最小结构)。
179
+ * 与具体后端无关,由 Agent 层负责适配。
180
+ */
181
+ export interface HistoryMessageRecord {
182
+ /** AI 回复文本(Markdown) */
183
+ answer: string;
184
+ /** 所属会话 ID */
185
+ conversationId: string;
186
+ /** 消息创建时间(ms since epoch,可选) */
187
+ createdAt?: number;
188
+ /** 原始消息 ID */
189
+ id: string;
190
+ /** 用户问题文本 */
191
+ query: string;
192
+ }
193
+ /** 单条历史对话详情响应 */
194
+ export interface ConversationDetailResult {
195
+ /** 会话 ID */
196
+ conversationId: string;
197
+ /** 是否还有更多历史消息(分页加载时使用) */
198
+ hasMore: boolean;
199
+ /** 用于加载更多的游标(通常为首条记录 ID) */
200
+ nextCursor?: string;
201
+ /** 原始消息记录列表(按时间升序) */
202
+ records: HistoryMessageRecord[];
203
+ /** 对话标题 */
204
+ title: string;
205
+ }
206
+ /**
207
+ * 将单条 `HistoryMessageRecord` 转换为 ChatPanel 所需的一对消息(用户 + AI)。
208
+ *
209
+ * 转换规则:
210
+ * - `record.query` → `ChatMessage { role: 'user', content: query }`
211
+ * - `record.answer` → `ChatMessage { role: 'ai', content: answer }`
212
+ *
213
+ * @param record 单条原始历史消息
214
+ * @param keyPrefix 生成唯一 key 的前缀(通常传 record.id)
215
+ */
216
+ export type HistoryRecordConverter = (record: HistoryMessageRecord, keyPrefix: string) => [userMsg: ChatMessage, aiMsg: ChatMessage];
217
+ /**
218
+ * 将完整 `ConversationDetailResult` 转换为可直接传入 ChatPanel
219
+ * `initialMessages` prop 的 `ChatMessage[]` 数组(按时间升序)。
220
+ */
221
+ export type ConversationDetailConverter = (detail: ConversationDetailResult) => ChatMessage[];
222
+ /**
223
+ * `replyChange` 事件处理器。
224
+ * @param delta 本次新增的文本片段(流式增量)
225
+ * @param allReply 截至目前累积的完整回复内容
226
+ */
227
+ export type ReplyChangeHandler = (delta: string, allReply: string) => void;
228
+ /** `stop` 事件处理器(Agent 主动停止或被中止时触发) */
229
+ export type StopHandler = () => void;
230
+ /** `toolCall` 事件处理器 */
231
+ export type ToolCallHandler = (event: ToolCallEvent) => void;
232
+ /** `interrupt` 事件处理器(工具调用需要审批时触发) */
233
+ export type InterruptHandler = (event: import('./LangchainMessage').InterruptEvent) => void;
234
+ /** Agent 可透传给上层的事件名 */
235
+ export type AgentEventName = 'interrupt' | 'replyChange' | 'stop' | 'toolCall';
236
+ /** Agent 事件透传载荷 */
237
+ export type AgentEventPayload = {
238
+ agentKey: string;
239
+ args: [];
240
+ event: 'stop';
241
+ } | {
242
+ agentKey: string;
243
+ args: [event: import('./LangchainMessage').InterruptEvent];
244
+ event: 'interrupt';
245
+ } | {
246
+ agentKey: string;
247
+ args: [event: ToolCallEvent];
248
+ event: 'toolCall';
249
+ } | {
250
+ agentKey: string;
251
+ args: [reply: string, allReply: string];
252
+ event: 'replyChange';
253
+ };
254
+ /** Agent 事件透传回调 */
255
+ export type AgentEventCallback = (payload: AgentEventPayload) => void;
256
+ /**
257
+ * Agent 运行时接口。
258
+ *
259
+ * ChatPanel 通过此接口与具体 AI Agent 完全解耦:
260
+ * 任何实现了该接口的对象均可作为 Agent 传入 ChatPanel。
261
+ *
262
+ * 典型实现:`ToolLoopAgentWapper`(见 wrapAgent.ts)
263
+ */
264
+ export interface AgentRuntime {
265
+ /**
266
+ * 向 Agent 提交用户问题并等待本轮回复完成。
267
+ * 流式文本内容通过 `replyChange` 事件推送,
268
+ * 工具调用事件通过 `toolCall` 事件推送。
269
+ * Promise resolve 表示本轮通信结束(成功或被中止)。
270
+ */
271
+ ask(query: string): Promise<unknown>;
272
+ /**
273
+ * 获取指定会话的历史消息详情,并直接返回可渲染的消息列表。
274
+ *
275
+ * 实现方负责将后端原始数据(结构因各后端而异)适配为 `ChatMessage[]`,
276
+ * 每条历史问答通常展开为 `[userMsg, aiMsg]` 两条记录,按时间升序排列。
277
+ *
278
+ * @param conversationId 目标会话 ID
279
+ * @param cursor 分页游标;首次加载时传 `undefined`,
280
+ * 后续翻页传上一次响应附带的游标值。
281
+ * @returns 可直接传入 ChatPanel `initialMessages` prop 的消息数组
282
+ */
283
+ getConversationDetail(conversationId: string, cursor?: string): Promise<ChatMessage[]>;
284
+ /**
285
+ * 获取历史会话列表(分页)。
286
+ *
287
+ * @param cursor 分页游标;首次加载时传 `undefined`,
288
+ * 后续翻页传上一次响应的 `nextCursor`。
289
+ * @returns 会话摘要列表及分页信息
290
+ */
291
+ listConversations(cursor?: string): Promise<ConversationListResult>;
292
+ /** 移除事件监听器 */
293
+ off(event: 'replyChange', handler: ReplyChangeHandler): void;
294
+ off(event: 'stop', handler: StopHandler): void;
295
+ off(event: 'toolCall', handler: ToolCallHandler): void;
296
+ /** 注册事件监听器 */
297
+ on(event: 'replyChange', handler: ReplyChangeHandler): void;
298
+ on(event: 'stop', handler: StopHandler): void;
299
+ on(event: 'toolCall', handler: ToolCallHandler): void;
300
+ /** 清空 Agent 内部的会话历史(不影响 ChatPanel 的消息列表) */
301
+ reset(): void;
302
+ /** 中止当前正在进行的请求,并触发 `stop` 事件 */
303
+ stop(): void;
304
+ /**
305
+ * 是否支持历史会话(可选)。
306
+ * 实现方根据后端配置判断,例如检查 historyEndpoint 是否已设置。
307
+ * 未实现时默认视为不支持历史功能。
308
+ */
309
+ supportsHistory?(): boolean;
310
+ }
311
+ /**
312
+ * 携带初始上下文注入能力的扩展 Agent 接口(可选实现)。
313
+ * 用于在正式对话前向 Agent 注入系统级背景信息,
314
+ * 如用户画像、会话元数据等。
315
+ */
316
+ export interface ExtendedAgentRuntime extends AgentRuntime {
317
+ /** 追加一条初始用户上下文(不计入对话历史展示) */
318
+ addInitialUserContext(context: string): void;
319
+ /** 清除全部初始用户上下文 */
320
+ clearInitialUserContexts(): void;
321
+ /** 移除中断事件监听器 */
322
+ offInterrupt(handler: InterruptHandler): void;
323
+ /** 注册中断事件监听器 */
324
+ onInterrupt(handler: InterruptHandler): void;
325
+ /**
326
+ * 对中断工具调用做出决策后,恢复 SSE 流。
327
+ * 调用方统一传递 ResumeDecision[],内部按 resumeMode 转换为对应后端格式。
328
+ */
329
+ resume(decisions: import('./LangchainMessage').ResumeDecision[]): Promise<void>;
330
+ /** 覆盖全部初始用户上下文 */
331
+ setInitialUserContexts(contexts: string[]): void;
332
+ }
333
+ /**
334
+ * 传入 ChatPanel `agents` prop 的单个配置项。
335
+ * 支持多 Agent 切换时,每个 Agent 对应一条记录。
336
+ */
337
+ export interface AgentOption {
338
+ /** Agent 运行时实例 */
339
+ agent: AgentRuntime;
340
+ /** 用于唯一标识此 Agent,也作为下拉选项的 value */
341
+ key: string;
342
+ /** 下拉选择器中展示的友好名称 */
343
+ label: string;
344
+ /**
345
+ * 工具名称 → 自定义渲染组件(可选)。
346
+ *
347
+ * 当指定的工具名出现时,ChatPanel 会使用此处配置的组件替换默认
348
+ * `ToolCallNode`,实现工具级别的自定义 UI。
349
+ * 未配置的工具名仍回退到默认 `ToolCallNode`。
350
+ *
351
+ * 组件须满足 `ToolRendererProps` props 与 `ToolRendererEmits` emits 约定。
352
+ */
353
+ toolRenderers?: ToolRendererMap;
354
+ }
355
+ /**
356
+ * 将任意 payload 序列化为截断后的预览字符串。
357
+ * - `string` → 直接使用
358
+ * - `object / array` → JSON.stringify
359
+ * - 其他 → String()
360
+ * - 超出 `maxLength` 时截断并追加 "…"
361
+ */
362
+ export type PayloadPreviewFormatter = (payload: unknown, maxLength?: number) => string;
363
+ /**
364
+ * 自定义工具渲染组件的 props 约定。
365
+ *
366
+ * 与 `ToolCallNode` 保持完全一致,以便消费方可以直接以相同 prop 接口
367
+ * 替换默认渲染组件,也可以将 `ToolCallNode` 作为基础组件复用。
368
+ */
369
+ export interface ToolRendererProps {
370
+ /** 当前节点是否已展开详情 */
371
+ expanded: boolean;
372
+ /** 审批操作是否正在处理中(应据此禁用按钮) */
373
+ resolving?: boolean;
374
+ /** 工具在本轮对话中的步骤序号(0-based,可选) */
375
+ stepNumber?: number;
376
+ /** 工具调用时间线条目,包含状态、入参、输出等完整上下文 */
377
+ tool: ToolTimelineItem;
378
+ }
379
+ /**
380
+ * 自定义工具渲染组件的 emits 约定。
381
+ *
382
+ * 组件内部无需关心决策如何提交,只需 emit 对应事件,
383
+ * ChatPanel 会统一处理并调用 Agent 的 resume 方法。
384
+ */
385
+ export interface ToolRendererEmits {
386
+ /** 批准工具操作;actionName 为工具名称或空字符串(由 ChatPanel 自动推断) */
387
+ approve: (actionName: string) => void;
388
+ /** 提交修改后批准;editedContent 为修改后的内容 */
389
+ edit: (actionName: string, editedContent: string) => void;
390
+ /** 拒绝工具操作 */
391
+ reject: (actionName: string) => void;
392
+ /** 切换展开/折叠详情面板 */
393
+ toggle: () => void;
394
+ }
395
+ /**
396
+ * 工具名称 → 自定义渲染组件的映射表。
397
+ *
398
+ * key 为 `ToolTimelineItem.toolName`,value 为 Vue 组件定义。
399
+ * 组件应满足 `ToolRendererProps` & `ToolRendererEmits` 约定。
400
+ *
401
+ * @example
402
+ * ```ts
403
+ * const toolRenderers: ToolRendererMap = {
404
+ * search_web: SearchWebToolRenderer,
405
+ * run_code: CodeExecutionRenderer,
406
+ * };
407
+ * ```
408
+ */
409
+ export type ToolRendererMap = Record<string, import('vue').Component>;
410
+ /**
411
+ * 将 Unix 时间戳(毫秒)格式化为本地时间字符串,
412
+ * 用于工具调用时间线的时间展示。
413
+ */
414
+ export type TimestampFormatter = (timestamp: number) => string;
415
+ /**
416
+ * 将耗时(毫秒)格式化为可读字符串。
417
+ * 例:120 → "120ms",1500 → "1.5s",12000 → "12s"
418
+ */
419
+ export type DurationFormatter = (durationMs: number) => string;
420
+ /**
421
+ * 将 `ChatMessage` 的 `segments` 解析为可直接用于模板渲染的段列表。
422
+ * - 若消息没有 `segments`(无工具调用),退化为单一 `ResolvedTextSegment`。
423
+ * - `TextSegment` 的字符范围会被切片为实际文本。
424
+ */
425
+ export type SegmentResolver = (message: ChatMessage) => ResolvedSegment[];
426
+ /**
427
+ * 将单条 `HistoryMessageRecord` 转换为一对 `ChatMessage`(用户 + AI)。
428
+ *
429
+ * 转换规则:
430
+ * - `record.query` → `{ role: 'user', content: query }`
431
+ * - `record.answer` → `{ role: 'ai', content: answer }`
432
+ *
433
+ * @example
434
+ * ```ts
435
+ * const [userMsg, aiMsg] = convertHistoryRecord(record, record.id);
436
+ * ```
437
+ */
438
+ export declare const convertHistoryRecord: HistoryRecordConverter;
439
+ /**
440
+ * 将完整 `ConversationDetailResult` 转换为 `ChatMessage[]`,
441
+ * 可直接传入 ChatPanel 的 `initialMessages` prop。
442
+ *
443
+ * 每条 `HistoryMessageRecord` 展开为 `[userMsg, aiMsg]`,
444
+ * 最终数组按原始记录顺序(时间升序)排列。
445
+ *
446
+ * @example
447
+ * ```ts
448
+ * const detail = await agent.getConversationDetail(conversationId);
449
+ * const messages = convertConversationDetail(detail);
450
+ * // 传入 ChatPanel
451
+ * // <ChatPanel :initial-messages="messages" ... />
452
+ * ```
453
+ */
454
+ export declare const convertConversationDetail: ConversationDetailConverter;
@@ -0,0 +1,25 @@
1
+ export type SupportDecisionType = 'approve' | 'edit' | 'reject';
2
+ export interface DecisionOptions {
3
+ actionName: SupportDecisionType;
4
+ showName?: string;
5
+ tooltip?: string;
6
+ }
7
+ export interface AI_HITL_UIConfig {
8
+ children?: AI_HITL_UIConfig[];
9
+ component: string;
10
+ props?: Record<string, any>;
11
+ }
12
+ export interface AI_HITL_Config {
13
+ allowReplyOnChatInput: boolean;
14
+ contentUIConfig: {
15
+ html?: string;
16
+ serverPage?: {
17
+ code: string;
18
+ pageParams?: Record<string, any>;
19
+ };
20
+ type: 'html' | 'serverPage' | 'ui';
21
+ uiConfig?: AI_HITL_UIConfig[];
22
+ };
23
+ decisions: DecisionOptions[];
24
+ onlySubmitReplyMessage: boolean;
25
+ }
@@ -0,0 +1,25 @@
1
+ import { ChatMessage, ConversationListResult, ExtendedAgentRuntime } from './AIMessage';
2
+ import { default as EventEmitter } from '../utils/EventEmitter';
3
+
4
+ interface AI_SDK_AIMessageOptions {
5
+ agent: any;
6
+ initialUserContexts?: string[];
7
+ }
8
+ export declare class AI_SDK_AIMessage extends EventEmitter implements ExtendedAgentRuntime {
9
+ agent: any;
10
+ private abortController;
11
+ private history;
12
+ private initialUserMessages;
13
+ constructor({ agent, initialUserContexts }: AI_SDK_AIMessageOptions);
14
+ addInitialUserContext(context: string): void;
15
+ ask(query: string): Promise<void>;
16
+ clearInitialUserContexts(): void;
17
+ getConversationDetail(_conversationId: string, _cursor?: string): Promise<ChatMessage[]>;
18
+ listConversations(_cursor?: string): Promise<ConversationListResult>;
19
+ reset(): void;
20
+ setInitialUserContexts(contexts: string[]): void;
21
+ stop(): void;
22
+ supportsHistory(): boolean;
23
+ private toInitialUserMessage;
24
+ }
25
+ export {};
@@ -0,0 +1,44 @@
1
+ import { ChatMessage, ConversationListResult, ExtendedAgentRuntime } from './AIMessage';
2
+ import { default as EventEmitter } from '../utils/EventEmitter';
3
+ type Agent = any;
4
+ interface AI_SDK_AIMessageOptions {
5
+ agent: any;
6
+ /** 历史接口鉴权维度:app */
7
+ app?: string;
8
+ /**
9
+ * OpenAI 兼容历史接口基地址。
10
+ * 例如:`http://localhost:8000/openai/v1/chat`
11
+ */
12
+ historyEndpoint?: string;
13
+ /** 会话列表查询数量 */
14
+ historyLimit?: number;
15
+ initialUserContexts?: string[];
16
+ /** 透传给后端的会话元数据,将通过 x-meta 请求头传递 */
17
+ meta?: Record<string, unknown>;
18
+ /** 历史接口鉴权维度:user */
19
+ user?: string;
20
+ }
21
+ export declare class AI_SDK_Save_AIMessage extends EventEmitter implements ExtendedAgentRuntime {
22
+ agent: Agent;
23
+ private abortController;
24
+ private readonly app;
25
+ private conversationId;
26
+ private history;
27
+ private readonly historyEndpoint;
28
+ private readonly historyLimit;
29
+ private initialUserMessages;
30
+ private readonly meta;
31
+ private readonly user;
32
+ constructor({ agent, initialUserContexts, historyEndpoint, user, app, meta, historyLimit, }: AI_SDK_AIMessageOptions);
33
+ addInitialUserContext(context: string): void;
34
+ ask(query: string): Promise<void>;
35
+ clearInitialUserContexts(): void;
36
+ getConversationDetail(conversationId: string, _cursor?: string): Promise<ChatMessage[]>;
37
+ listConversations(_cursor?: string): Promise<ConversationListResult>;
38
+ reset(): void;
39
+ setInitialUserContexts(contexts: string[]): void;
40
+ stop(): void;
41
+ supportsHistory(): boolean;
42
+ private toInitialUserMessage;
43
+ }
44
+ export {};
@@ -0,0 +1,48 @@
1
+ import { ChatMessage, ConversationListResult, ExtendedAgentRuntime } from './AIMessage';
2
+ import { default as DifySDK } from '../utils/DifySDK';
3
+
4
+ export interface Dify_SDK_AIMessageOptions {
5
+ /** Dify 服务地址(默认:http://prd.duolaapp.zijinshe.com) */
6
+ apiBaseUrl?: string;
7
+ /** Dify 应用 API Key(必填) */
8
+ apiKey: string;
9
+ /**
10
+ * 传递给 Dify 应用的静态 inputs 字段(对应 Dify 应用中定义的变量)。
11
+ * 每次请求都会合并此对象。
12
+ */
13
+ inputs?: Record<string, any>;
14
+ /** Dify 用户标识(默认:duola_test) */
15
+ user?: string;
16
+ }
17
+ /**
18
+ * 基于 DifySDK 实现的 AgentRuntime。
19
+ *
20
+ * 继承 DifySDK 的流式请求、会话管理和 EventEmitter 能力,
21
+ * 同时满足 ChatPanel 的 ExtendedAgentRuntime 接口规范。
22
+ *
23
+ * 事件:
24
+ * - `replyChange(delta, allReply)` — 文本流增量(由 DifySDK 内部触发)
25
+ * - `stop()` — 请求结束或被中止(由 DifySDK 内部触发)
26
+ * - `toolCall` — Dify 原生不支持工具调用,此事件不会触发
27
+ */
28
+ export declare class Dify_SDK_AIMessage extends DifySDK implements ExtendedAgentRuntime {
29
+ /** 传递给 Dify 的静态 inputs 字段 */
30
+ private extraInputs;
31
+ /** 初始用户上下文列表(新会话时拼接到首条消息) */
32
+ private initialContexts;
33
+ constructor({ apiKey, apiBaseUrl, user, inputs, }: Dify_SDK_AIMessageOptions);
34
+ addInitialUserContext(context: string): void;
35
+ /**
36
+ * 向 Dify 发起流式对话请求。
37
+ *
38
+ * - 新会话(conversation_id 为空)时,将初始上下文拼接到 query 前。
39
+ * - 流式文本通过继承自 DifySDK 的 `replyChange` 事件推送。
40
+ * - 请求结束或中止时触发 `stop` 事件。
41
+ */
42
+ ask(query: string): Promise<unknown>;
43
+ clearInitialUserContexts(): void;
44
+ getConversationDetail(conversationId: string, _cursor?: string): Promise<ChatMessage[]>;
45
+ listConversations(cursor?: string): Promise<ConversationListResult>;
46
+ setInitialUserContexts(contexts: string[]): void;
47
+ supportsHistory(): boolean;
48
+ }