@blueking/chat-helper 0.0.12-beta.1 → 0.0.12-beta.3

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.
@@ -27,12 +27,15 @@
27
27
  CustomEventName["FlowAgentEnd"] = "flow_agent_end";
28
28
  CustomEventName["FlowAgentResult"] = "flow_agent_result";
29
29
  CustomEventName["FlowAgentStart"] = "flow_agent_start";
30
+ CustomEventName["FlowAgentUpdate"] = "flow_agent_update";
31
+ CustomEventName["FlowAgentRestart"] = "flow_agent_restart";
30
32
  CustomEventName["KnowledgeRagEnd"] = "knowledge_rag_end";
31
33
  CustomEventName["KnowledgeRagResult"] = "knowledge_rag_result";
32
34
  CustomEventName["KnowledgeRagStart"] = "knowledge_rag_start";
33
35
  CustomEventName["KnowledgeRagTextContent"] = "knowledge_rag_text_content";
34
36
  CustomEventName["ReferenceDocument"] = "reference_document";
35
37
  CustomEventName["TempMessage"] = "temp_message";
38
+ CustomEventName["ApprovalResult"] = "approval_result";
36
39
  })(CustomEventName || (CustomEventName = {}));
37
40
  export var EventType;
38
41
  (function(EventType) {
@@ -65,23 +68,48 @@ export var EventType;
65
68
  })(EventType || (EventType = {}));
66
69
  export var FlowNodeState;
67
70
  (function(FlowNodeState) {
68
- /** 失败 */ FlowNodeState["Failed"] = "failed";
69
- /** 执行中 */ FlowNodeState["Running"] = "running";
70
- /** 成功 */ FlowNodeState["Success"] = "success";
71
- /** 挂起 */ FlowNodeState["Suspended"] = "suspended";
71
+ FlowNodeState["Failed"] = "failed";
72
+ FlowNodeState["Running"] = "running";
73
+ FlowNodeState["Success"] = "success";
74
+ FlowNodeState["Suspended"] = "suspended";
72
75
  })(FlowNodeState || (FlowNodeState = {}));
73
76
  export var FlowTaskState;
74
77
  (function(FlowTaskState) {
75
- /** 执行中 */ FlowTaskState["Blocked"] = "BLOCKED";
76
- /** 执行中 */ FlowTaskState["Created"] = "CREATED";
77
- /** 失败 */ FlowTaskState["Failed"] = "FAILED";
78
- /** 成功 */ FlowTaskState["Finished"] = "FINISHED";
79
- /** 执行中 */ FlowTaskState["LoopReady"] = "LOOP_READY";
80
- /** 执行中 */ FlowTaskState["Ready"] = "READY";
81
- /** 失败 */ FlowTaskState["Revoked"] = "REVOKED";
82
- /** 失败 */ FlowTaskState["RollBackFailed"] = "ROLL_BACK_FAILED";
83
- /** 执行中 */ FlowTaskState["RollBackSuccess"] = "ROLL_BACK_SUCCESS";
84
- /** 执行中 */ FlowTaskState["RollingBack"] = "ROLLING_BACK";
85
- /** 执行中 */ FlowTaskState["Running"] = "RUNNING";
86
- /** 挂起 */ FlowTaskState["Suspended"] = "SUSPENDED";
78
+ FlowTaskState["Blocked"] = "BLOCKED";
79
+ FlowTaskState["Created"] = "CREATED";
80
+ FlowTaskState["Failed"] = "FAILED";
81
+ FlowTaskState["Finished"] = "FINISHED";
82
+ FlowTaskState["LoopReady"] = "LOOP_READY";
83
+ FlowTaskState["Ready"] = "READY";
84
+ FlowTaskState["Revoked"] = "REVOKED";
85
+ FlowTaskState["RollBackFailed"] = "ROLL_BACK_FAILED";
86
+ FlowTaskState["RollBackSuccess"] = "ROLL_BACK_SUCCESS";
87
+ FlowTaskState["RollingBack"] = "ROLLING_BACK";
88
+ FlowTaskState["Running"] = "RUNNING";
89
+ FlowTaskState["Suspended"] = "SUSPENDED";
87
90
  })(FlowTaskState || (FlowTaskState = {}));
91
+ export var RunFinishedOutcomeType;
92
+ (function(RunFinishedOutcomeType) {
93
+ RunFinishedOutcomeType["Success"] = "success";
94
+ RunFinishedOutcomeType["Interrupt"] = "interrupt";
95
+ })(RunFinishedOutcomeType || (RunFinishedOutcomeType = {}));
96
+ export var ApprovalInterruptTicketStatus;
97
+ (function(ApprovalInterruptTicketStatus) {
98
+ ApprovalInterruptTicketStatus["Abandoned"] = "abandoned";
99
+ ApprovalInterruptTicketStatus["Approved"] = "approved";
100
+ ApprovalInterruptTicketStatus["Cancelled"] = "cancelled";
101
+ ApprovalInterruptTicketStatus["Draft"] = "draft";
102
+ ApprovalInterruptTicketStatus["Expired"] = "expired";
103
+ ApprovalInterruptTicketStatus["Rejected"] = "rejected";
104
+ ApprovalInterruptTicketStatus["Pending"] = "pending";
105
+ })(ApprovalInterruptTicketStatus || (ApprovalInterruptTicketStatus = {}));
106
+ export var InterruptReason;
107
+ (function(InterruptReason) {
108
+ InterruptReason["AIDevToolApproval"] = "aidev:tool_approval";
109
+ InterruptReason["UserQuestion"] = "aidev:user_question";
110
+ })(InterruptReason || (InterruptReason = {}));
111
+ export var ResumeStatus;
112
+ (function(ResumeStatus) {
113
+ ResumeStatus["Resolved"] = "resolved";
114
+ ResumeStatus["Cancelled"] = "cancelled";
115
+ })(ResumeStatus || (ResumeStatus = {}));
@@ -45,6 +45,13 @@ export interface ISSEProtocol {
45
45
  onMessage?: (event: unknown) => void;
46
46
  onStart?: () => void;
47
47
  }
48
+ /** 全局错误处理器类型 */
49
+ export type GlobalErrorHandler = (error: IRequestError) => void;
50
+ /** 错误处理器配置 */
51
+ export interface ErrorHandlerOptions {
52
+ /** 忽略的 URL 模式(字符串包含匹配或正则) */
53
+ ignoreErrors?: Array<string | RegExp>;
54
+ }
48
55
  interface IInterceptor<T> {
49
56
  fulfilled?: (value: T) => T;
50
57
  rejected?: (error: unknown) => unknown;
@@ -62,7 +69,20 @@ export declare class FetchClient {
62
69
  request: InterceptorManager<IRequestConfig>;
63
70
  response: InterceptorManager<IResponse>;
64
71
  };
72
+ /** 全局错误处理器 */
73
+ private globalErrorHandler?;
74
+ /** 忽略的错误 URL 模式 */
75
+ private ignoreErrorPatterns;
65
76
  constructor(config?: IRequestConfig);
77
+ /**
78
+ * 注册全局错误处理器
79
+ * 所有 HTTP 错误(request 和 streamRequest)都会经过此处理器
80
+ */
81
+ onError(handler: GlobalErrorHandler, options?: ErrorHandlerOptions): void;
82
+ /** 判断是否应忽略该错误 */
83
+ private shouldIgnoreError;
84
+ /** 统一错误分发 */
85
+ private dispatchError;
66
86
  applyResponseErrorInterceptors(error: unknown): unknown;
67
87
  create(config?: IRequestConfig): FetchClient;
68
88
  delete<T = unknown>(url: string, params?: Record<string, unknown>, config?: IRequestConfig): Promise<T>;
@@ -132,6 +132,35 @@ class InterceptorManager {
132
132
  }
133
133
  }
134
134
  export class FetchClient {
135
+ /**
136
+ * 注册全局错误处理器
137
+ * 所有 HTTP 错误(request 和 streamRequest)都会经过此处理器
138
+ */ onError(handler, options) {
139
+ this.globalErrorHandler = handler;
140
+ if (options === null || options === void 0 ? void 0 : options.ignoreErrors) {
141
+ this.ignoreErrorPatterns = options.ignoreErrors;
142
+ }
143
+ }
144
+ /** 判断是否应忽略该错误 */ shouldIgnoreError(error) {
145
+ var _error_config, _error_config1;
146
+ // 同时匹配相对路径和完整 URL
147
+ const url = ((_error_config = error.config) === null || _error_config === void 0 ? void 0 : _error_config.url) || '';
148
+ const baseURL = ((_error_config1 = error.config) === null || _error_config1 === void 0 ? void 0 : _error_config1.baseURL) || '';
149
+ const fullURL = baseURL && !url.startsWith('http') ? baseURL + url : url;
150
+ return this.ignoreErrorPatterns.some((pattern)=>{
151
+ if (typeof pattern === 'string') {
152
+ // 字符串模式:同时检查相对路径和完整 URL
153
+ return url.includes(pattern) || fullURL.includes(pattern);
154
+ }
155
+ // 正则模式:同时检查相对路径和完整 URL
156
+ return pattern.test(url) || pattern.test(fullURL);
157
+ });
158
+ }
159
+ /** 统一错误分发 */ dispatchError(error) {
160
+ if (this.globalErrorHandler && !this.shouldIgnoreError(error)) {
161
+ this.globalErrorHandler(error);
162
+ }
163
+ }
135
164
  applyResponseErrorInterceptors(error) {
136
165
  let rejectedError = error;
137
166
  this.interceptors.response.forEach((interceptor)=>{
@@ -323,11 +352,13 @@ export class FetchClient {
323
352
  if (timeoutId) {
324
353
  clearTimeout(timeoutId);
325
354
  }
355
+ // 用户手动取消请求
326
356
  if (error instanceof Error && error.name === 'AbortError') {
327
- const requestError = createError('Request timeout', requestConfig, 'ECONNABORTED', undefined);
328
- throw _this.applyResponseErrorInterceptors(requestError);
357
+ console.warn('User canceled request', error.message);
358
+ return;
329
359
  }
330
360
  const requestError = error.isAxiosError === true ? error : createError(error.message, requestConfig, error.code, undefined);
361
+ _this.dispatchError(requestError);
331
362
  throw _this.applyResponseErrorInterceptors(requestError);
332
363
  }
333
364
  })();
@@ -340,13 +371,31 @@ export class FetchClient {
340
371
  streamRequest(config) {
341
372
  var _this = this;
342
373
  return _async_to_generator(function*() {
343
- const { url, fetchConfig, requestConfig } = _this.prepareRequest(config, true);
374
+ // 错误去重:标记是否已调用过全局错误处理器
375
+ let errorDispatched = false;
376
+ // 包装 onError 回调,统一调用全局错误处理器
377
+ const originalOnError = config.onError;
378
+ const wrappedOnError = (error)=>{
379
+ if (!errorDispatched) {
380
+ // 将 requestConfig 附加到错误对象,以便 shouldIgnoreError 能匹配 URL
381
+ const errorWithConfig = error;
382
+ if (!errorWithConfig.config) {
383
+ errorWithConfig.config = requestConfig;
384
+ }
385
+ _this.dispatchError(errorWithConfig);
386
+ errorDispatched = true;
387
+ }
388
+ originalOnError === null || originalOnError === void 0 ? void 0 : originalOnError(error);
389
+ };
390
+ const wrappedConfig = _object_spread_props(_object_spread({}, config), {
391
+ onError: wrappedOnError
392
+ });
393
+ const { url, fetchConfig, requestConfig } = _this.prepareRequest(wrappedConfig, true);
344
394
  try {
345
- var _config_onStart, _fetchResponse_body;
395
+ var _wrappedConfig_onStart, _fetchResponse_body;
346
396
  const fetchResponse = yield fetch(url, fetchConfig);
347
397
  const validateStatus = requestConfig.validateStatus || _this.defaults.validateStatus;
348
398
  if (!validateStatus(fetchResponse.status)) {
349
- var _config_onError;
350
399
  let message = `Request failed with status code ${fetchResponse.status}`;
351
400
  try {
352
401
  var _errorData_error;
@@ -358,15 +407,14 @@ export class FetchClient {
358
407
  message = `Request failed with status code ${fetchResponse.status}`;
359
408
  }
360
409
  const error = createError(message, requestConfig, `ERR_BAD_RESPONSE`, undefined);
361
- (_config_onError = config.onError) === null || _config_onError === void 0 ? void 0 : _config_onError.call(config, error);
410
+ wrappedOnError(error);
362
411
  return;
363
412
  }
364
- (_config_onStart = config.onStart) === null || _config_onStart === void 0 ? void 0 : _config_onStart.call(config);
413
+ (_wrappedConfig_onStart = wrappedConfig.onStart) === null || _wrappedConfig_onStart === void 0 ? void 0 : _wrappedConfig_onStart.call(wrappedConfig);
365
414
  const reader = (_fetchResponse_body = fetchResponse.body) === null || _fetchResponse_body === void 0 ? void 0 : _fetchResponse_body.pipeThrough(new window.TextDecoderStream()).getReader();
366
415
  if (!reader) {
367
- var _config_onError1;
368
416
  const error = new Error('IResponse body is not readable');
369
- (_config_onError1 = config.onError) === null || _config_onError1 === void 0 ? void 0 : _config_onError1.call(config, error);
417
+ wrappedOnError(error);
370
418
  return;
371
419
  }
372
420
  // 缓存跨行分片数据
@@ -383,17 +431,17 @@ export class FetchClient {
383
431
  while(true){
384
432
  const { value, done } = yield reader.read();
385
433
  if (done) {
386
- var _config_onDone;
387
- (_config_onDone = config.onDone) === null || _config_onDone === void 0 ? void 0 : _config_onDone.call(config);
434
+ var _wrappedConfig_onDone;
435
+ (_wrappedConfig_onDone = wrappedConfig.onDone) === null || _wrappedConfig_onDone === void 0 ? void 0 : _wrappedConfig_onDone.call(wrappedConfig);
388
436
  break;
389
437
  }
390
438
  const values = (temp + value.toString()).split('\n');
391
439
  values.forEach((value)=>{
392
440
  const item = value.replace('data:', '').trim();
393
441
  if (isJson(item)) {
394
- var _config_onMessage;
442
+ var _wrappedConfig_onMessage;
395
443
  const json = JSON.parse(item);
396
- (_config_onMessage = config.onMessage) === null || _config_onMessage === void 0 ? void 0 : _config_onMessage.call(config, json);
444
+ (_wrappedConfig_onMessage = wrappedConfig.onMessage) === null || _wrappedConfig_onMessage === void 0 ? void 0 : _wrappedConfig_onMessage.call(wrappedConfig, json);
397
445
  temp = '';
398
446
  } else if (item) {
399
447
  temp = item;
@@ -403,12 +451,11 @@ export class FetchClient {
403
451
  } catch (error) {
404
452
  if (error instanceof Error) {
405
453
  if (error.name === 'AbortError') {
406
- var _config_onDone1;
407
- (_config_onDone1 = config.onDone) === null || _config_onDone1 === void 0 ? void 0 : _config_onDone1.call(config);
408
- } else {
409
- var _config_onError2;
410
- (_config_onError2 = config.onError) === null || _config_onError2 === void 0 ? void 0 : _config_onError2.call(config, error);
454
+ var _wrappedConfig_onDone1;
455
+ (_wrappedConfig_onDone1 = wrappedConfig.onDone) === null || _wrappedConfig_onDone1 === void 0 ? void 0 : _wrappedConfig_onDone1.call(wrappedConfig);
456
+ return;
411
457
  }
458
+ wrappedOnError(error);
412
459
  }
413
460
  throw error;
414
461
  }
@@ -417,6 +464,8 @@ export class FetchClient {
417
464
  constructor(config = {}){
418
465
  _define_property(this, "defaults", void 0);
419
466
  _define_property(this, "interceptors", void 0);
467
+ /** 全局错误处理器 */ _define_property(this, "globalErrorHandler", void 0);
468
+ /** 忽略的错误 URL 模式 */ _define_property(this, "ignoreErrorPatterns", []);
420
469
  this.defaults = mergeConfig({
421
470
  method: 'GET',
422
471
  headers: {
@@ -8,6 +8,8 @@ export * from './transform';
8
8
  */
9
9
  export declare const useHttp: (options: IUseChatHelperOptions) => {
10
10
  reset: (newOptions: IUseChatHelperOptions) => void;
11
+ /** 注册全局错误处理器 */
12
+ onError: (handler: import("./fetch").GlobalErrorHandler, options?: import("./fetch").ErrorHandlerOptions) => void;
11
13
  agent: {
12
14
  getAgentInfo: (config?: import("./fetch").IRequestConfig) => Promise<import("..").IAgentInfo>;
13
15
  };
@@ -31,17 +33,21 @@ export declare const useHttp: (options: IUseChatHelperOptions) => {
31
33
  uploadFile: (sessionCode: string, file: File, config?: import("./fetch").IRequestConfig) => Promise<{
32
34
  download_url?: string;
33
35
  }>;
36
+ isResumeSession: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<boolean>;
34
37
  };
35
38
  message: {
36
39
  getMessages: (sessionCode: string, limit?: number, config?: import("./fetch").IRequestConfig) => Promise<import("..").IMessage[]>;
37
- plusMessage: (data: import("..").IMessage, config?: import("./fetch").IRequestConfig) => Promise<import("..").IActivityMessage | import("..").IAssistantMessage | import("..").IDeveloperMessage | import("..").IGuideMessage | import("..").IHiddenAssistantMessage | import("..").IHiddenGuideMessage | import("..").IHiddenMessage | import("..").IHiddenSystemMessage | import("..").IHiddenUserMessage | import("..").IInfoMessage | import("..").IPauseMessage | import("..").IPlaceholderMessage | import("..").IReasoningMessage | import("..").ISystemMessage | import("..").ITemplateAssistantMessage | import("..").ITemplateGuideMessage | import("..").ITemplateHiddenMessage | import("..").ITemplateSystemMessage | import("..").ITemplateUserMessage | import("..").IToolMessage | import("..").IUserMessage>;
38
- modifyMessage: (data: import("..").IMessage, config?: import("./fetch").IRequestConfig) => Promise<import("..").IActivityMessage | import("..").IAssistantMessage | import("..").IDeveloperMessage | import("..").IGuideMessage | import("..").IHiddenAssistantMessage | import("..").IHiddenGuideMessage | import("..").IHiddenMessage | import("..").IHiddenSystemMessage | import("..").IHiddenUserMessage | import("..").IInfoMessage | import("..").IPauseMessage | import("..").IPlaceholderMessage | import("..").IReasoningMessage | import("..").ISystemMessage | import("..").ITemplateAssistantMessage | import("..").ITemplateGuideMessage | import("..").ITemplateHiddenMessage | import("..").ITemplateSystemMessage | import("..").ITemplateUserMessage | import("..").IToolMessage | import("..").IUserMessage>;
40
+ plusMessage: (data: import("..").IMessage, config?: import("./fetch").IRequestConfig) => Promise<import("..").IActivityMessage | import("..").IAssistantMessage | import("..").IDeveloperMessage | import("..").IInterruptMessage | import("..").IGuideMessage | import("..").IHiddenAssistantMessage | import("..").IHiddenGuideMessage | import("..").IHiddenMessage | import("..").IHiddenSystemMessage | import("..").IHiddenUserMessage | import("..").IInfoMessage | import("..").IPauseMessage | import("..").IPlaceholderMessage | import("..").IReasoningMessage | import("..").ISystemMessage | import("..").ITemplateAssistantMessage | import("..").ITemplateGuideMessage | import("..").ITemplateHiddenMessage | import("..").ITemplateSystemMessage | import("..").ITemplateUserMessage | import("..").IToolMessage | import("..").IUserMessage>;
41
+ modifyMessage: (data: import("..").IMessage, config?: import("./fetch").IRequestConfig) => Promise<import("..").IActivityMessage | import("..").IAssistantMessage | import("..").IDeveloperMessage | import("..").IInterruptMessage | import("..").IGuideMessage | import("..").IHiddenAssistantMessage | import("..").IHiddenGuideMessage | import("..").IHiddenMessage | import("..").IHiddenSystemMessage | import("..").IHiddenUserMessage | import("..").IInfoMessage | import("..").IPauseMessage | import("..").IPlaceholderMessage | import("..").IReasoningMessage | import("..").ISystemMessage | import("..").ITemplateAssistantMessage | import("..").ITemplateGuideMessage | import("..").ITemplateHiddenMessage | import("..").ITemplateSystemMessage | import("..").ITemplateUserMessage | import("..").IToolMessage | import("..").IUserMessage>;
39
42
  deleteMessage: (id: string, config?: import("./fetch").IRequestConfig) => Promise<import("..").IMessage>;
40
43
  batchDeleteMessages: (ids: string[], config?: import("./fetch").IRequestConfig) => Promise<number>;
41
44
  shareMessages: (sessionCode: string, contentIds: string[], expiredAt?: number, config?: import("./fetch").IRequestConfig) => Promise<import("./module/message").IShareMessagesResponse>;
42
45
  stopChat: (sessionCode: string, config?: import("./fetch").IRequestConfig) => Promise<void>;
43
46
  getFlowAgentTaskInfo: (taskId: number, config?: import("./fetch").IRequestConfig) => Promise<unknown>;
44
47
  getFlowAgentTaskNodeInfo: (taskId: number, nodeId: string, config?: import("./fetch").IRequestConfig) => Promise<import("..").IFlowAgentTaskNodeInfo>;
48
+ retryFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("./fetch").IRequestConfig) => Promise<void>;
49
+ skipFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("./fetch").IRequestConfig) => Promise<void>;
50
+ userOperation: (sessionCode: string, operation: import("..").UserOperation, payload: import("..").IUserOperationPayload, config?: import("./fetch").IRequestConfig) => Promise<void>;
45
51
  };
46
52
  fetchClient: import("./fetch").FetchClient;
47
53
  };
@@ -88,6 +88,7 @@ export * from './transform/index.ts.js';
88
88
  // 创建 http 模块
89
89
  const http = useModule(fetchClient);
90
90
  return _object_spread_props(_object_spread({}, http), {
91
- reset
91
+ reset,
92
+ /** 注册全局错误处理器 */ onError: fetchClient.onError.bind(fetchClient)
92
93
  });
93
94
  };
@@ -28,17 +28,21 @@ export declare const useModule: (fetchClient: FetchClient) => {
28
28
  uploadFile: (sessionCode: string, file: File, config?: import("../fetch").IRequestConfig) => Promise<{
29
29
  download_url?: string;
30
30
  }>;
31
+ isResumeSession: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<boolean>;
31
32
  };
32
33
  message: {
33
34
  getMessages: (sessionCode: string, limit?: number, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IMessage[]>;
34
- plusMessage: (data: import("../..").IMessage, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IActivityMessage | import("../..").IAssistantMessage | import("../..").IDeveloperMessage | import("../..").IGuideMessage | import("../..").IHiddenAssistantMessage | import("../..").IHiddenGuideMessage | import("../..").IHiddenMessage | import("../..").IHiddenSystemMessage | import("../..").IHiddenUserMessage | import("../..").IInfoMessage | import("../..").IPauseMessage | import("../..").IPlaceholderMessage | import("../..").IReasoningMessage | import("../..").ISystemMessage | import("../..").ITemplateAssistantMessage | import("../..").ITemplateGuideMessage | import("../..").ITemplateHiddenMessage | import("../..").ITemplateSystemMessage | import("../..").ITemplateUserMessage | import("../..").IToolMessage | import("../..").IUserMessage>;
35
- modifyMessage: (data: import("../..").IMessage, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IActivityMessage | import("../..").IAssistantMessage | import("../..").IDeveloperMessage | import("../..").IGuideMessage | import("../..").IHiddenAssistantMessage | import("../..").IHiddenGuideMessage | import("../..").IHiddenMessage | import("../..").IHiddenSystemMessage | import("../..").IHiddenUserMessage | import("../..").IInfoMessage | import("../..").IPauseMessage | import("../..").IPlaceholderMessage | import("../..").IReasoningMessage | import("../..").ISystemMessage | import("../..").ITemplateAssistantMessage | import("../..").ITemplateGuideMessage | import("../..").ITemplateHiddenMessage | import("../..").ITemplateSystemMessage | import("../..").ITemplateUserMessage | import("../..").IToolMessage | import("../..").IUserMessage>;
35
+ plusMessage: (data: import("../..").IMessage, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IActivityMessage | import("../..").IAssistantMessage | import("../..").IDeveloperMessage | import("../..").IInterruptMessage | import("../..").IGuideMessage | import("../..").IHiddenAssistantMessage | import("../..").IHiddenGuideMessage | import("../..").IHiddenMessage | import("../..").IHiddenSystemMessage | import("../..").IHiddenUserMessage | import("../..").IInfoMessage | import("../..").IPauseMessage | import("../..").IPlaceholderMessage | import("../..").IReasoningMessage | import("../..").ISystemMessage | import("../..").ITemplateAssistantMessage | import("../..").ITemplateGuideMessage | import("../..").ITemplateHiddenMessage | import("../..").ITemplateSystemMessage | import("../..").ITemplateUserMessage | import("../..").IToolMessage | import("../..").IUserMessage>;
36
+ modifyMessage: (data: import("../..").IMessage, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IActivityMessage | import("../..").IAssistantMessage | import("../..").IDeveloperMessage | import("../..").IInterruptMessage | import("../..").IGuideMessage | import("../..").IHiddenAssistantMessage | import("../..").IHiddenGuideMessage | import("../..").IHiddenMessage | import("../..").IHiddenSystemMessage | import("../..").IHiddenUserMessage | import("../..").IInfoMessage | import("../..").IPauseMessage | import("../..").IPlaceholderMessage | import("../..").IReasoningMessage | import("../..").ISystemMessage | import("../..").ITemplateAssistantMessage | import("../..").ITemplateGuideMessage | import("../..").ITemplateHiddenMessage | import("../..").ITemplateSystemMessage | import("../..").ITemplateUserMessage | import("../..").IToolMessage | import("../..").IUserMessage>;
36
37
  deleteMessage: (id: string, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IMessage>;
37
38
  batchDeleteMessages: (ids: string[], config?: import("../fetch").IRequestConfig) => Promise<number>;
38
39
  shareMessages: (sessionCode: string, contentIds: string[], expiredAt?: number, config?: import("../fetch").IRequestConfig) => Promise<import("./message").IShareMessagesResponse>;
39
40
  stopChat: (sessionCode: string, config?: import("../fetch").IRequestConfig) => Promise<void>;
40
41
  getFlowAgentTaskInfo: (taskId: number, config?: import("../fetch").IRequestConfig) => Promise<unknown>;
41
42
  getFlowAgentTaskNodeInfo: (taskId: number, nodeId: string, config?: import("../fetch").IRequestConfig) => Promise<import("../..").IFlowAgentTaskNodeInfo>;
43
+ retryFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("../fetch").IRequestConfig) => Promise<void>;
44
+ skipFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: import("../fetch").IRequestConfig) => Promise<void>;
45
+ userOperation: (sessionCode: string, operation: import("../..").UserOperation, payload: import("../..").IUserOperationPayload, config?: import("../fetch").IRequestConfig) => Promise<void>;
42
46
  };
43
47
  fetchClient: FetchClient;
44
48
  };
@@ -1,4 +1,4 @@
1
- import type { IFlowAgentTaskNodeInfo, IMessage } from '../../message/type';
1
+ import type { IFlowAgentTaskNodeInfo, IMessage, IUserOperationPayload, UserOperation } from '../../message/type';
2
2
  import type { FetchClient, IRequestConfig } from '../fetch';
3
3
  /**
4
4
  * 分享消息接口返回数据
@@ -20,12 +20,15 @@ export interface IShareMessagesResponse {
20
20
  */
21
21
  export declare const useMessage: (fetchClient: FetchClient) => {
22
22
  getMessages: (sessionCode: string, limit?: number, config?: IRequestConfig) => Promise<IMessage[]>;
23
- plusMessage: (data: IMessage, config?: IRequestConfig) => Promise<import("../../message/type").IActivityMessage | import("../../message/type").IAssistantMessage | import("../../message/type").IDeveloperMessage | import("../../message/type").IGuideMessage | import("../../message/type").IHiddenAssistantMessage | import("../../message/type").IHiddenGuideMessage | import("../../message/type").IHiddenMessage | import("../../message/type").IHiddenSystemMessage | import("../../message/type").IHiddenUserMessage | import("../../message/type").IInfoMessage | import("../../message/type").IPauseMessage | import("../../message/type").IPlaceholderMessage | import("../../message/type").IReasoningMessage | import("../../message/type").ISystemMessage | import("../../message/type").ITemplateAssistantMessage | import("../../message/type").ITemplateGuideMessage | import("../../message/type").ITemplateHiddenMessage | import("../../message/type").ITemplateSystemMessage | import("../../message/type").ITemplateUserMessage | import("../../message/type").IToolMessage | import("../../message/type").IUserMessage>;
24
- modifyMessage: (data: IMessage, config?: IRequestConfig) => Promise<import("../../message/type").IActivityMessage | import("../../message/type").IAssistantMessage | import("../../message/type").IDeveloperMessage | import("../../message/type").IGuideMessage | import("../../message/type").IHiddenAssistantMessage | import("../../message/type").IHiddenGuideMessage | import("../../message/type").IHiddenMessage | import("../../message/type").IHiddenSystemMessage | import("../../message/type").IHiddenUserMessage | import("../../message/type").IInfoMessage | import("../../message/type").IPauseMessage | import("../../message/type").IPlaceholderMessage | import("../../message/type").IReasoningMessage | import("../../message/type").ISystemMessage | import("../../message/type").ITemplateAssistantMessage | import("../../message/type").ITemplateGuideMessage | import("../../message/type").ITemplateHiddenMessage | import("../../message/type").ITemplateSystemMessage | import("../../message/type").ITemplateUserMessage | import("../../message/type").IToolMessage | import("../../message/type").IUserMessage>;
23
+ plusMessage: (data: IMessage, config?: IRequestConfig) => Promise<import("../../message/type").IActivityMessage | import("../../message/type").IAssistantMessage | import("../../message/type").IDeveloperMessage | import("../../message/type").IInterruptMessage | import("../../message/type").IGuideMessage | import("../../message/type").IHiddenAssistantMessage | import("../../message/type").IHiddenGuideMessage | import("../../message/type").IHiddenMessage | import("../../message/type").IHiddenSystemMessage | import("../../message/type").IHiddenUserMessage | import("../../message/type").IInfoMessage | import("../../message/type").IPauseMessage | import("../../message/type").IPlaceholderMessage | import("../../message/type").IReasoningMessage | import("../../message/type").ISystemMessage | import("../../message/type").ITemplateAssistantMessage | import("../../message/type").ITemplateGuideMessage | import("../../message/type").ITemplateHiddenMessage | import("../../message/type").ITemplateSystemMessage | import("../../message/type").ITemplateUserMessage | import("../../message/type").IToolMessage | import("../../message/type").IUserMessage>;
24
+ modifyMessage: (data: IMessage, config?: IRequestConfig) => Promise<import("../../message/type").IActivityMessage | import("../../message/type").IAssistantMessage | import("../../message/type").IDeveloperMessage | import("../../message/type").IInterruptMessage | import("../../message/type").IGuideMessage | import("../../message/type").IHiddenAssistantMessage | import("../../message/type").IHiddenGuideMessage | import("../../message/type").IHiddenMessage | import("../../message/type").IHiddenSystemMessage | import("../../message/type").IHiddenUserMessage | import("../../message/type").IInfoMessage | import("../../message/type").IPauseMessage | import("../../message/type").IPlaceholderMessage | import("../../message/type").IReasoningMessage | import("../../message/type").ISystemMessage | import("../../message/type").ITemplateAssistantMessage | import("../../message/type").ITemplateGuideMessage | import("../../message/type").ITemplateHiddenMessage | import("../../message/type").ITemplateSystemMessage | import("../../message/type").ITemplateUserMessage | import("../../message/type").IToolMessage | import("../../message/type").IUserMessage>;
25
25
  deleteMessage: (id: string, config?: IRequestConfig) => Promise<IMessage>;
26
26
  batchDeleteMessages: (ids: string[], config?: IRequestConfig) => Promise<number>;
27
27
  shareMessages: (sessionCode: string, contentIds: string[], expiredAt?: number, config?: IRequestConfig) => Promise<IShareMessagesResponse>;
28
28
  stopChat: (sessionCode: string, config?: IRequestConfig) => Promise<void>;
29
29
  getFlowAgentTaskInfo: (taskId: number, config?: IRequestConfig) => Promise<unknown>;
30
30
  getFlowAgentTaskNodeInfo: (taskId: number, nodeId: string, config?: IRequestConfig) => Promise<IFlowAgentTaskNodeInfo>;
31
+ retryFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: IRequestConfig) => Promise<void>;
32
+ skipFlowAgentTaskNode: (sessionCode: string, nodeId: string, taskId: number, config?: IRequestConfig) => Promise<void>;
33
+ userOperation: (sessionCode: string, operation: UserOperation, payload: IUserOperationPayload, config?: IRequestConfig) => Promise<void>;
31
34
  };
@@ -86,6 +86,20 @@ import { transferMessage2MessageApi, transferMessageApi2Message } from '../trans
86
86
  const getFlowAgentTaskInfo = (taskId, config)=>fetchClient.get(`flow_agent/${taskId}/task_info/`, undefined, config);
87
87
  // 获取流程引擎任务节点详情
88
88
  const getFlowAgentTaskNodeInfo = (taskId, nodeId, config)=>fetchClient.get(`flow_agent/${taskId}/task_node_info/${nodeId}/`, undefined, config);
89
+ // 重试流程引擎任务节点
90
+ const retryFlowAgentTaskNode = (sessionCode, nodeId, taskId, config)=>fetchClient.post(`flow_agent/${sessionCode}/node/${nodeId}/retry/`, {
91
+ task_id: taskId
92
+ }, config);
93
+ // 跳过流程引擎任务节点
94
+ const skipFlowAgentTaskNode = (sessionCode, nodeId, taskId, config)=>fetchClient.post(`flow_agent/${sessionCode}/node/${nodeId}/skip/`, {
95
+ task_id: taskId
96
+ }, config);
97
+ // 用户操作
98
+ const userOperation = (sessionCode, operation, payload, config)=>fetchClient.post(`user_operation/`, {
99
+ session_code: sessionCode,
100
+ operation,
101
+ payload
102
+ }, config);
89
103
  return {
90
104
  getMessages,
91
105
  plusMessage,
@@ -95,6 +109,9 @@ import { transferMessage2MessageApi, transferMessageApi2Message } from '../trans
95
109
  shareMessages,
96
110
  stopChat,
97
111
  getFlowAgentTaskInfo,
98
- getFlowAgentTaskNodeInfo
112
+ getFlowAgentTaskNodeInfo,
113
+ retryFlowAgentTaskNode,
114
+ skipFlowAgentTaskNode,
115
+ userOperation
99
116
  };
100
117
  };
@@ -25,4 +25,5 @@ export declare const useSession: (fetchClient: FetchClient) => {
25
25
  uploadFile: (sessionCode: string, file: File, config?: IRequestConfig) => Promise<{
26
26
  download_url?: string;
27
27
  }>;
28
+ isResumeSession: (sessionCode: string, config?: IRequestConfig) => Promise<boolean>;
28
29
  };
@@ -75,6 +75,27 @@ function _object_spread_props(target, source) {
75
75
  return target;
76
76
  }
77
77
  import { transferSession2SessionApi, transferSessionApi2Session, transferSessionFeedback2SessionFeedbackApi, transferSessionFeedbackApi2SessionFeedback } from '../transform/session.ts.js';
78
+ import { resolveRequestValue } from '../fetch/index.ts.js';
79
+ /** 上传接口传输用文件名前缀,与原始展示名解耦 */ const UPLOAD_FILE_NAME_PREFIX = 'upload_file';
80
+ /** 从原始文件名提取 ASCII 安全扩展名,用于保留文件类型 */ const getSafeFileExtension = (fileName)=>{
81
+ const extension = fileName.split('.').pop();
82
+ if (!extension || extension === fileName) {
83
+ return '';
84
+ }
85
+ const safeExtension = extension.replace(/[^A-Za-z0-9]/g, '').slice(0, 20).toLowerCase();
86
+ return safeExtension ? `.${safeExtension}` : '';
87
+ };
88
+ /**
89
+ * 生成上传接口使用的 ASCII 安全文件名。
90
+ * 中文等非 ASCII 原名不能用于 URL path / Content-Disposition(浏览器与后端均可能编码失败),
91
+ * 原始 file.name 仍保留在 File 对象上,由 chat-x 发送消息时作为展示名使用。
92
+ */ const buildSafeUploadFileName = (file)=>{
93
+ const suffix = `${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
94
+ return `${UPLOAD_FILE_NAME_PREFIX}_${suffix}${getSafeFileExtension(file.name)}`;
95
+ };
96
+ /** Content-Disposition 仅允许 ASCII,须与 upload path 中的 file_name 一致 */ const buildUploadContentDisposition = (fileName)=>{
97
+ return `attachment; filename="${fileName}"`;
98
+ };
78
99
  /**
79
100
  * session 相关 http 接口
80
101
  * @param fetchClient - 请求客户端
@@ -104,15 +125,20 @@ import { transferSession2SessionApi, transferSessionApi2Session, transferSession
104
125
  }, config);
105
126
  // 会话重命名
106
127
  const renameSession = (sessionCode, config)=>fetchClient.post(`session/${sessionCode}/ai_rename/`, undefined, config).then((res)=>transferSessionApi2Session(res));
107
- // 上传文件到会话
128
+ // 上传文件到会话(传输名与展示名分离,见 buildSafeUploadFileName)
108
129
  const uploadFile = (sessionCode, file, config)=>{
109
- const fileName = encodeURIComponent(file.name);
130
+ const safeFileName = buildSafeUploadFileName(file);
131
+ const fileName = encodeURIComponent(safeFileName);
132
+ var _resolveRequestValue;
133
+ const headers = (_resolveRequestValue = resolveRequestValue(config === null || config === void 0 ? void 0 : config.headers)) !== null && _resolveRequestValue !== void 0 ? _resolveRequestValue : {};
110
134
  return file.arrayBuffer().then((content)=>fetchClient.post(`session/${sessionCode}/upload/${fileName}/`, content, _object_spread_props(_object_spread({}, config), {
111
- headers: {
112
- 'Content-Disposition': `attachment; filename="${file.name}"`
113
- }
135
+ headers: _object_spread_props(_object_spread({}, headers), {
136
+ 'Content-Disposition': buildUploadContentDisposition(safeFileName)
137
+ })
114
138
  })));
115
139
  };
140
+ // 轮询接口,判断是否可以继续聊天
141
+ const isResumeSession = (sessionCode, config)=>fetchClient.get(`session/${sessionCode}/is_resume/`, undefined, config);
116
142
  return {
117
143
  clearSession,
118
144
  getSessions,
@@ -124,6 +150,7 @@ import { transferSession2SessionApi, transferSessionApi2Session, transferSession
124
150
  postSessionFeedback,
125
151
  getSessionFeedbackReasons,
126
152
  renameSession,
127
- uploadFile
153
+ uploadFile,
154
+ isResumeSession
128
155
  };
129
156
  };
@@ -337,6 +337,11 @@ import { ActivityType, MessageRole, MessageType } from '../../message/type.ts.js
337
337
  });
338
338
  return result;
339
339
  }
340
+ case MessageRole.Interrupt:
341
+ {
342
+ const result = _object_spread({}, baseMessage, data);
343
+ return result;
344
+ }
340
345
  }
341
346
  };
342
347
  /**
@@ -601,5 +606,10 @@ import { ActivityType, MessageRole, MessageType } from '../../message/type.ts.js
601
606
  });
602
607
  return result;
603
608
  }
609
+ case MessageRole.Interrupt:
610
+ {
611
+ const result = _object_spread({}, baseMessage, data);
612
+ return result;
613
+ }
604
614
  }
605
615
  };