@chat-lab/ui 0.1.0-beta.73 → 0.1.0-beta.75

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 (81) hide show
  1. package/dist/components/Chatkit/index.cjs +2 -1
  2. package/dist/components/Chatkit/index.cjs.map +1 -1
  3. package/dist/components/Chatkit/index.js +2 -1
  4. package/dist/components/Chatkit/index.js.map +1 -1
  5. package/dist/components/assistant-ui/markdown-text.cjs +5 -3
  6. package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
  7. package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
  8. package/dist/components/assistant-ui/markdown-text.js +5 -3
  9. package/dist/components/assistant-ui/markdown-text.js.map +1 -1
  10. package/dist/components/assistant-ui/thread.cjs +10 -11
  11. package/dist/components/assistant-ui/thread.cjs.map +1 -1
  12. package/dist/components/assistant-ui/thread.d.ts.map +1 -1
  13. package/dist/components/assistant-ui/thread.js +10 -11
  14. package/dist/components/assistant-ui/thread.js.map +1 -1
  15. package/dist/contexts/ChatkitContext.cjs.map +1 -1
  16. package/dist/contexts/ChatkitContext.d.ts +1 -0
  17. package/dist/contexts/ChatkitContext.d.ts.map +1 -1
  18. package/dist/contexts/ChatkitContext.js.map +1 -1
  19. package/dist/core/dist/index.cjs +5 -3
  20. package/dist/core/dist/index.cjs.map +1 -1
  21. package/dist/core/dist/index.js +5 -3
  22. package/dist/core/dist/index.js.map +1 -1
  23. package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs +1 -1
  24. package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs.map +1 -1
  25. package/dist/hooks/useClawChat/ClawProtocolAdaptor.js +1 -1
  26. package/dist/hooks/useClawChat/ClawProtocolAdaptor.js.map +1 -1
  27. package/dist/hooks/useClawChat/clawCompletion.cjs +13 -7
  28. package/dist/hooks/useClawChat/clawCompletion.cjs.map +1 -1
  29. package/dist/hooks/useClawChat/clawCompletion.d.ts.map +1 -1
  30. package/dist/hooks/useClawChat/clawCompletion.js +13 -7
  31. package/dist/hooks/useClawChat/clawCompletion.js.map +1 -1
  32. package/dist/hooks/useClawChat/clawPlugin.cjs +24 -0
  33. package/dist/hooks/useClawChat/clawPlugin.cjs.map +1 -0
  34. package/dist/hooks/useClawChat/clawPlugin.d.ts +10 -0
  35. package/dist/hooks/useClawChat/clawPlugin.d.ts.map +1 -0
  36. package/dist/hooks/useClawChat/clawPlugin.js +22 -0
  37. package/dist/hooks/useClawChat/clawPlugin.js.map +1 -0
  38. package/dist/hooks/useClawChat/index.cjs +33 -8
  39. package/dist/hooks/useClawChat/index.cjs.map +1 -1
  40. package/dist/hooks/useClawChat/index.d.ts.map +1 -1
  41. package/dist/hooks/useClawChat/index.js +35 -11
  42. package/dist/hooks/useClawChat/index.js.map +1 -1
  43. package/dist/hooks/useClawChat/types.cjs +10 -1
  44. package/dist/hooks/useClawChat/types.cjs.map +1 -1
  45. package/dist/hooks/useClawChat/types.d.ts +39 -6
  46. package/dist/hooks/useClawChat/types.d.ts.map +1 -1
  47. package/dist/hooks/useClawChat/types.js +10 -2
  48. package/dist/hooks/useClawChat/types.js.map +1 -1
  49. package/dist/index.cjs +1 -0
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.css +1 -1
  52. package/dist/index.js +1 -1
  53. package/package.json +1 -1
  54. package/dist/assets/Attachment.cjs +0 -8
  55. package/dist/assets/Attachment.cjs.map +0 -1
  56. package/dist/assets/Attachment.js +0 -6
  57. package/dist/assets/Attachment.js.map +0 -1
  58. package/dist/assets/ClearIcon.cjs +0 -8
  59. package/dist/assets/ClearIcon.cjs.map +0 -1
  60. package/dist/assets/ClearIcon.js +0 -6
  61. package/dist/assets/ClearIcon.js.map +0 -1
  62. package/dist/assets/Download.cjs +0 -10
  63. package/dist/assets/Download.cjs.map +0 -1
  64. package/dist/assets/Download.js +0 -8
  65. package/dist/assets/Download.js.map +0 -1
  66. package/dist/assets/NewSession.cjs +0 -8
  67. package/dist/assets/NewSession.cjs.map +0 -1
  68. package/dist/assets/NewSession.js +0 -6
  69. package/dist/assets/NewSession.js.map +0 -1
  70. package/dist/assets/RefreshIcon.cjs +0 -8
  71. package/dist/assets/RefreshIcon.cjs.map +0 -1
  72. package/dist/assets/RefreshIcon.js +0 -6
  73. package/dist/assets/RefreshIcon.js.map +0 -1
  74. package/dist/assets/ThumbDownIcon.cjs +0 -8
  75. package/dist/assets/ThumbDownIcon.cjs.map +0 -1
  76. package/dist/assets/ThumbDownIcon.js +0 -6
  77. package/dist/assets/ThumbDownIcon.js.map +0 -1
  78. package/dist/assets/ThumbUpIcon.cjs +0 -8
  79. package/dist/assets/ThumbUpIcon.cjs.map +0 -1
  80. package/dist/assets/ThumbUpIcon.js +0 -6
  81. package/dist/assets/ThumbUpIcon.js.map +0 -1
@@ -58,7 +58,7 @@ class ClawProtocolAdaptor extends index.BaseProtocol {
58
58
  status: index.MessageStatus.SUCCESS,
59
59
  metadata: {
60
60
  ...message.metadata,
61
- stopReason: event.payload.message.stopReason,
61
+ stopReason: event.payload?.message?.stopReason,
62
62
  },
63
63
  };
64
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClawProtocolAdaptor.cjs","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.delta || '';\n\n // 查找最后一条 text 类型的 content\n const existingTextIndex = findLastIndex(\n message.content,\n (c): c is TextMessage => c.type === 'text',\n );\n\n let newContent: ChatMessage['content'];\n if (existingTextIndex !== -1) {\n // 替换最后一条 text\n const currentTextContent = message.content[\n existingTextIndex\n ] as TextMessage;\n currentTextContent.text += deltaText;\n newContent = [...message.content];\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n\n return {\n ...message,\n status: MessageStatus.SENDING,\n content: newContent,\n };\n }\n\n // 处理 stream-done:使用 message.content\n if (isPushStreamDone(event)) {\n // const contents: TextMessage[] = event.payload?.message?.content.map(\n // (c: TextContent) => ({\n // type: 'text',\n // text: c.text,\n // }),\n // );\n\n return {\n ...message,\n // content: contents,\n status: MessageStatus.SUCCESS,\n metadata: {\n ...message.metadata,\n stopReason: event.payload.message.stopReason,\n },\n };\n }\n\n // 处理 stream-aborted\n if (isPushStreamAborted(event)) {\n return {\n ...message,\n content: event.payload?.message?.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: c.text };\n }\n return { type: 'text', text: '' };\n }),\n status: MessageStatus.ABORTED,\n metadata: {\n ...message.metadata,\n stopReason: 'aborted',\n },\n };\n }\n\n // 处理 stream-error\n if (isPushStreamError(event)) {\n return {\n ...message,\n status: MessageStatus.ERROR,\n error: {\n message: event.payload.errorMessage,\n extra: {},\n },\n };\n }\n\n // 默认返回原消息\n return message;\n }\n\n /**\n * 生成请求体\n * 将 ChatMessage 转换为 Gateway 请求格式\n */\n generateRequestBody(request: {\n dynamicParams?: Record<string, unknown>;\n defaultParams?: Record<string, unknown>;\n userMessage: ChatMessage;\n thread: Thread;\n contextMessages: ChatMessage[];\n }): Record<string, unknown> {\n const {\n userMessage,\n thread,\n contextMessages,\n dynamicParams,\n defaultParams,\n } = request;\n\n // 转换当前用户消息\n const currentMessage = {\n role: 'user',\n content: userMessage.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: (c as TextMessage).text };\n }\n return { type: 'text', text: '' };\n }) as TextContent[],\n timestamp: Date.now(),\n };\n\n return {\n // 基础参数\n sessionKey: thread.id,\n messageId: uuid(),\n\n // 消息内容\n history,\n message: currentMessage,\n\n // 扩展参数\n ...(defaultParams || {}),\n ...(dynamicParams || {}),\n };\n }\n}\n\nexport default ClawProtocolAdaptor;\n"],"names":["BaseProtocol","ProtocolEnum","isPushSteamDelta","findLastIndex","MessageStatus","isPushStreamDone","isPushStreamAborted","isPushStreamError","uuid"],"mappings":"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"}
1
+ {"version":3,"file":"ClawProtocolAdaptor.cjs","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.delta || '';\n\n // 查找最后一条 text 类型的 content\n const existingTextIndex = findLastIndex(\n message.content,\n (c): c is TextMessage => c.type === 'text',\n );\n\n let newContent: ChatMessage['content'];\n if (existingTextIndex !== -1) {\n // 替换最后一条 text\n const currentTextContent = message.content[\n existingTextIndex\n ] as TextMessage;\n currentTextContent.text += deltaText;\n newContent = [...message.content];\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n\n return {\n ...message,\n status: MessageStatus.SENDING,\n content: newContent,\n };\n }\n\n // 处理 stream-done:使用 message.content\n if (isPushStreamDone(event)) {\n // const contents: TextMessage[] = event.payload?.message?.content.map(\n // (c: TextContent) => ({\n // type: 'text',\n // text: c.text,\n // }),\n // );\n\n return {\n ...message,\n // content: contents,\n status: MessageStatus.SUCCESS,\n metadata: {\n ...message.metadata,\n stopReason: event.payload?.message?.stopReason,\n },\n };\n }\n\n // 处理 stream-aborted\n if (isPushStreamAborted(event)) {\n return {\n ...message,\n content: event.payload?.message?.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: c.text };\n }\n return { type: 'text', text: '' };\n }),\n status: MessageStatus.ABORTED,\n metadata: {\n ...message.metadata,\n stopReason: 'aborted',\n },\n };\n }\n\n // 处理 stream-error\n if (isPushStreamError(event)) {\n return {\n ...message,\n status: MessageStatus.ERROR,\n error: {\n message: event.payload.errorMessage,\n extra: {},\n },\n };\n }\n\n // 默认返回原消息\n return message;\n }\n\n /**\n * 生成请求体\n * 将 ChatMessage 转换为 Gateway 请求格式\n */\n generateRequestBody(request: {\n dynamicParams?: Record<string, unknown>;\n defaultParams?: Record<string, unknown>;\n userMessage: ChatMessage;\n thread: Thread;\n contextMessages: ChatMessage[];\n }): Record<string, unknown> {\n const {\n userMessage,\n thread,\n contextMessages,\n dynamicParams,\n defaultParams,\n } = request;\n\n // 转换当前用户消息\n const currentMessage = {\n role: 'user',\n content: userMessage.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: (c as TextMessage).text };\n }\n return { type: 'text', text: '' };\n }) as TextContent[],\n timestamp: Date.now(),\n };\n\n return {\n // 基础参数\n sessionKey: thread.id,\n messageId: uuid(),\n\n // 消息内容\n history,\n message: currentMessage,\n\n // 扩展参数\n ...(defaultParams || {}),\n ...(dynamicParams || {}),\n };\n }\n}\n\nexport default ClawProtocolAdaptor;\n"],"names":["BaseProtocol","ProtocolEnum","isPushSteamDelta","findLastIndex","MessageStatus","isPushStreamDone","isPushStreamAborted","isPushStreamError","uuid"],"mappings":"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"}
@@ -56,7 +56,7 @@ class ClawProtocolAdaptor extends BaseProtocols_default {
56
56
  status: MessageStatus.SUCCESS,
57
57
  metadata: {
58
58
  ...message.metadata,
59
- stopReason: event.payload.message.stopReason,
59
+ stopReason: event.payload?.message?.stopReason,
60
60
  },
61
61
  };
62
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ClawProtocolAdaptor.js","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.delta || '';\n\n // 查找最后一条 text 类型的 content\n const existingTextIndex = findLastIndex(\n message.content,\n (c): c is TextMessage => c.type === 'text',\n );\n\n let newContent: ChatMessage['content'];\n if (existingTextIndex !== -1) {\n // 替换最后一条 text\n const currentTextContent = message.content[\n existingTextIndex\n ] as TextMessage;\n currentTextContent.text += deltaText;\n newContent = [...message.content];\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n\n return {\n ...message,\n status: MessageStatus.SENDING,\n content: newContent,\n };\n }\n\n // 处理 stream-done:使用 message.content\n if (isPushStreamDone(event)) {\n // const contents: TextMessage[] = event.payload?.message?.content.map(\n // (c: TextContent) => ({\n // type: 'text',\n // text: c.text,\n // }),\n // );\n\n return {\n ...message,\n // content: contents,\n status: MessageStatus.SUCCESS,\n metadata: {\n ...message.metadata,\n stopReason: event.payload.message.stopReason,\n },\n };\n }\n\n // 处理 stream-aborted\n if (isPushStreamAborted(event)) {\n return {\n ...message,\n content: event.payload?.message?.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: c.text };\n }\n return { type: 'text', text: '' };\n }),\n status: MessageStatus.ABORTED,\n metadata: {\n ...message.metadata,\n stopReason: 'aborted',\n },\n };\n }\n\n // 处理 stream-error\n if (isPushStreamError(event)) {\n return {\n ...message,\n status: MessageStatus.ERROR,\n error: {\n message: event.payload.errorMessage,\n extra: {},\n },\n };\n }\n\n // 默认返回原消息\n return message;\n }\n\n /**\n * 生成请求体\n * 将 ChatMessage 转换为 Gateway 请求格式\n */\n generateRequestBody(request: {\n dynamicParams?: Record<string, unknown>;\n defaultParams?: Record<string, unknown>;\n userMessage: ChatMessage;\n thread: Thread;\n contextMessages: ChatMessage[];\n }): Record<string, unknown> {\n const {\n userMessage,\n thread,\n contextMessages,\n dynamicParams,\n defaultParams,\n } = request;\n\n // 转换当前用户消息\n const currentMessage = {\n role: 'user',\n content: userMessage.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: (c as TextMessage).text };\n }\n return { type: 'text', text: '' };\n }) as TextContent[],\n timestamp: Date.now(),\n };\n\n return {\n // 基础参数\n sessionKey: thread.id,\n messageId: uuid(),\n\n // 消息内容\n history,\n message: currentMessage,\n\n // 扩展参数\n ...(defaultParams || {}),\n ...(dynamicParams || {}),\n };\n }\n}\n\nexport default ClawProtocolAdaptor;\n"],"names":["BaseProtocol","uuid"],"mappings":"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"}
1
+ {"version":3,"file":"ClawProtocolAdaptor.js","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatMessage,\n ProtocolOptions,\n ProtocolEnum,\n TextMessage,\n ReasoningMessage,\n Thread,\n MessageStatus,\n} from '@chat-lab/core';\nimport { findLastIndex } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n PushMessageImpl,\n isPushSteamDelta,\n isPushStreamDone,\n isPushStreamAborted,\n isPushStreamError,\n TextContent,\n} from './types';\n\n/**\n * Claw Protocol Adaptor\n * 用于解析 Claw/Gateway 协议\n */\nclass ClawProtocolAdaptor extends BaseProtocol<\n PushMessageImpl,\n Record<string, unknown>\n> {\n protocol = ProtocolEnum.CUSTOM;\n\n protocolName: string;\n\n constructor(options: ProtocolOptions) {\n super(options);\n this.protocolName = options.protocolName || 'Claw';\n }\n\n /**\n * 解析流式响应块\n * 将 Claw 的 PushMessage 转换为 ChatMessage\n */\n parseChunk<Response = PushMessageImpl>(chunk: {\n message: ChatMessage;\n response: Response;\n }): ChatMessage {\n const { message, response } = chunk;\n const event = response as PushMessageImpl;\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.delta || '';\n\n // 查找最后一条 text 类型的 content\n const existingTextIndex = findLastIndex(\n message.content,\n (c): c is TextMessage => c.type === 'text',\n );\n\n let newContent: ChatMessage['content'];\n if (existingTextIndex !== -1) {\n // 替换最后一条 text\n const currentTextContent = message.content[\n existingTextIndex\n ] as TextMessage;\n currentTextContent.text += deltaText;\n newContent = [...message.content];\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n\n return {\n ...message,\n status: MessageStatus.SENDING,\n content: newContent,\n };\n }\n\n // 处理 stream-done:使用 message.content\n if (isPushStreamDone(event)) {\n // const contents: TextMessage[] = event.payload?.message?.content.map(\n // (c: TextContent) => ({\n // type: 'text',\n // text: c.text,\n // }),\n // );\n\n return {\n ...message,\n // content: contents,\n status: MessageStatus.SUCCESS,\n metadata: {\n ...message.metadata,\n stopReason: event.payload?.message?.stopReason,\n },\n };\n }\n\n // 处理 stream-aborted\n if (isPushStreamAborted(event)) {\n return {\n ...message,\n content: event.payload?.message?.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: c.text };\n }\n return { type: 'text', text: '' };\n }),\n status: MessageStatus.ABORTED,\n metadata: {\n ...message.metadata,\n stopReason: 'aborted',\n },\n };\n }\n\n // 处理 stream-error\n if (isPushStreamError(event)) {\n return {\n ...message,\n status: MessageStatus.ERROR,\n error: {\n message: event.payload.errorMessage,\n extra: {},\n },\n };\n }\n\n // 默认返回原消息\n return message;\n }\n\n /**\n * 生成请求体\n * 将 ChatMessage 转换为 Gateway 请求格式\n */\n generateRequestBody(request: {\n dynamicParams?: Record<string, unknown>;\n defaultParams?: Record<string, unknown>;\n userMessage: ChatMessage;\n thread: Thread;\n contextMessages: ChatMessage[];\n }): Record<string, unknown> {\n const {\n userMessage,\n thread,\n contextMessages,\n dynamicParams,\n defaultParams,\n } = request;\n\n // 转换当前用户消息\n const currentMessage = {\n role: 'user',\n content: userMessage.content.map((c) => {\n if (c.type === 'text') {\n return { type: 'text', text: (c as TextMessage).text };\n }\n return { type: 'text', text: '' };\n }) as TextContent[],\n timestamp: Date.now(),\n };\n\n return {\n // 基础参数\n sessionKey: thread.id,\n messageId: uuid(),\n\n // 消息内容\n history,\n message: currentMessage,\n\n // 扩展参数\n ...(defaultParams || {}),\n ...(dynamicParams || {}),\n };\n }\n}\n\nexport default ClawProtocolAdaptor;\n"],"names":["BaseProtocol","uuid"],"mappings":"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"}
@@ -7,12 +7,11 @@ var types = require('./types.cjs');
7
7
  */
8
8
  const createClawCompletion = (onAction, onAbort) => {
9
9
  const onChunkRef = {
10
- current: (chunk) => {
11
- console.log('error', chunk);
12
- },
10
+ current: {},
13
11
  };
14
12
  const pushMessageImpl = (msg) => {
15
- onChunkRef.current({
13
+ const runId = msg.payload.runId;
14
+ onChunkRef.current[runId]?.({
16
15
  response: msg,
17
16
  stop: () => { },
18
17
  });
@@ -25,15 +24,20 @@ const createClawCompletion = (onAction, onAbort) => {
25
24
  ? params.requestOptions.meta?.shouldReceived
26
25
  : true;
27
26
  const { onChunk, requestOptions } = params;
27
+ const runId = requestOptions.meta?.runId;
28
28
  const onChunkImpl = (chunk) => {
29
- console.log('chunk impl', JSON.stringify(chunk, null, 2));
30
29
  if (types.isPushStreamDone(chunk.response)) {
31
30
  resolve();
31
+ if (onChunkRef.current[runId]) {
32
+ delete onChunkRef.current[runId];
33
+ }
32
34
  }
33
35
  // ChunkCallbackData<PushMessageImpl>
34
36
  onChunk(chunk);
35
37
  };
36
- onChunkRef.current = onChunkImpl;
38
+ if (runId) {
39
+ onChunkRef.current[runId] = onChunkImpl;
40
+ }
37
41
  const data = requestOptions.data;
38
42
  if (shouldSendMessage) {
39
43
  onAction({
@@ -47,8 +51,10 @@ const createClawCompletion = (onAction, onAbort) => {
47
51
  });
48
52
  if (!shouldReceivedMessage) {
49
53
  resolve();
54
+ if (onChunkRef.current[runId]) {
55
+ delete onChunkRef.current[runId];
56
+ }
50
57
  }
51
- console.log('send message', data);
52
58
  });
53
59
  return { pushMessageImpl, clawCompletion };
54
60
  };
@@ -1 +1 @@
1
- {"version":3,"file":"clawCompletion.cjs","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: (chunk: ChunkCallbackData<PushMessageImpl>) => void;\n } = {\n current: (chunk: ChunkCallbackData<PushMessageImpl>) => {\n console.log('error', chunk);\n },\n };\n\n const pushMessageImpl = (msg: PushMessageImpl) => {\n onChunkRef.current({\n response: msg,\n stop: () => {},\n });\n };\n const clawCompletion = async (params: CompletionsParams) => new Promise<void>((resolve, reject) => {\n const shouldSendMessage = typeof params.requestOptions.meta?.shouldSendMessage === 'boolean'\n ? params.requestOptions.meta?.shouldSendMessage\n : true;\n const shouldReceivedMessage = typeof params.requestOptions.meta?.shouldReceived === 'boolean'\n ? params.requestOptions.meta?.shouldReceived\n : true;\n const { onChunk, requestOptions } = params;\n const onChunkImpl = (chunk: ChunkCallbackData<PushMessageImpl>) => {\n console.log('chunk impl', JSON.stringify(chunk, null, 2));\n if (isPushStreamDone(chunk.response)) {\n resolve();\n }\n // ChunkCallbackData<PushMessageImpl>\n onChunk(chunk as any);\n };\n onChunkRef.current = onChunkImpl;\n\n const data = requestOptions.data as unknown as {\n message: {\n role: 'user';\n content: [\n {\n type: 'text';\n text: '1';\n },\n ];\n timestamp: 1772279195163;\n };\n };\n if (shouldSendMessage) {\n onAction({\n type: 'send',\n message: data?.message?.content?.map((c) => c.text).join('\\n'),\n thinking: 'none',\n });\n }\n params.abortController?.signal.addEventListener('abort', () => {\n onAbort();\n });\n if (!shouldReceivedMessage) {\n resolve();\n }\n console.log('send message', data);\n });\n\n return { pushMessageImpl, clawCompletion };\n};\n\nexport type ClawCompletion = ReturnType<typeof createClawCompletion>;\n"],"names":["isPushStreamDone"],"mappings":";;;;AAIA;;AAEG;MACU,oBAAoB,GAAG,CAClC,QASU,EACV,OAAmB,KACjB;AACF,IAAA,MAAM,UAAU,GAEZ;AACF,QAAA,OAAO,EAAE,CAAC,KAAyC,KAAI;AACrD,YAAA,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAC7B;KACF,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,GAAoB,KAAI;QAC/C,UAAU,CAAC,OAAO,CAAC;AACjB,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,GAAG;AACf,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,OAAO,MAAyB,KAAK,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;QAChG,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS;AAC1F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB;cAC7C,IAAI,CAAC;QACT,MAAM,qBAAqB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS;AAC3F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc;cAC1C,IAAI,CAAC;AACT,QAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC3C,QAAA,MAAM,WAAW,GAAG,CAAC,KAAyC,KAAI;AAChE,YAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,IAAIA,sBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,CAAC;aACX;;YAED,OAAO,CAAC,KAAY,CAAC,CAAC;AACxB,SAAC,CAAC;AACF,QAAA,UAAU,CAAC,OAAO,GAAG,WAAW,CAAC;AAEjC,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAWzB,CAAC;QACJ,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC;AACP,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC,CAAC;SACJ;QACD,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5D,YAAA,OAAO,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AACpC,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C;;;;"}
1
+ {"version":3,"file":"clawCompletion.cjs","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: Record<\n string,\n (chunk: ChunkCallbackData<PushMessageImpl>) => void\n >;\n } = {\n current: {},\n };\n\n const pushMessageImpl = (msg: PushMessageImpl) => {\n const runId = msg.payload.runId as string;\n onChunkRef.current[runId]?.({\n response: msg,\n stop: () => {},\n });\n };\n const clawCompletion = async (params: CompletionsParams) => new Promise<void>((resolve, reject) => {\n const shouldSendMessage = typeof params.requestOptions.meta?.shouldSendMessage === 'boolean'\n ? params.requestOptions.meta?.shouldSendMessage\n : true;\n const shouldReceivedMessage = typeof params.requestOptions.meta?.shouldReceived === 'boolean'\n ? params.requestOptions.meta?.shouldReceived\n : true;\n const { onChunk, requestOptions } = params;\n const runId = requestOptions.meta?.runId as string;\n const onChunkImpl = (chunk: ChunkCallbackData<PushMessageImpl>) => {\n if (isPushStreamDone(chunk.response)) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n // ChunkCallbackData<PushMessageImpl>\n onChunk(chunk as any);\n };\n if (runId) {\n onChunkRef.current[runId] = onChunkImpl;\n }\n\n const data = requestOptions.data as unknown as {\n message: {\n role: 'user';\n content: [\n {\n type: 'text';\n text: '1';\n },\n ];\n timestamp: 1772279195163;\n };\n };\n if (shouldSendMessage) {\n onAction({\n type: 'send',\n message: data?.message?.content?.map((c) => c.text).join('\\n'),\n thinking: 'none',\n });\n }\n params.abortController?.signal.addEventListener('abort', () => {\n onAbort();\n });\n if (!shouldReceivedMessage) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n });\n\n return { pushMessageImpl, clawCompletion };\n};\n\nexport type ClawCompletion = ReturnType<typeof createClawCompletion>;\n"],"names":["isPushStreamDone"],"mappings":";;;;AAIA;;AAEG;MACU,oBAAoB,GAAG,CAClC,QASU,EACV,OAAmB,KACjB;AACF,IAAA,MAAM,UAAU,GAKZ;AACF,QAAA,OAAO,EAAE,EAAE;KACZ,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,GAAoB,KAAI;AAC/C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAe,CAAC;AAC1C,QAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,GAAG;AACf,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,OAAO,MAAyB,KAAK,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;QAChG,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS;AAC1F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB;cAC7C,IAAI,CAAC;QACT,MAAM,qBAAqB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS;AAC3F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc;cAC1C,IAAI,CAAC;AACT,QAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC3C,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAe,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,CAAC,KAAyC,KAAI;AAChE,YAAA,IAAIA,sBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,oBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAClC;aACF;;YAED,OAAO,CAAC,KAAY,CAAC,CAAC;AACxB,SAAC,CAAC;QACF,IAAI,KAAK,EAAE;AACT,YAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;SACzC;AAED,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAWzB,CAAC;QACJ,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC;AACP,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC,CAAC;SACJ;QACD,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5D,YAAA,OAAO,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAClC;SACF;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"clawCompletion.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,KAAK,IAAI,EACV,SAAS,MAAM,IAAI;2BAUW,eAAe;6BAMP,iBAAiB;CA+CxD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"clawCompletion.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAoB,MAAM,SAAS,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ,KAAK,IAAI,EACV,SAAS,MAAM,IAAI;2BAWW,eAAe;6BAOP,iBAAiB;CAsDxD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
@@ -5,12 +5,11 @@ import { isPushStreamDone } from './types.js';
5
5
  */
6
6
  const createClawCompletion = (onAction, onAbort) => {
7
7
  const onChunkRef = {
8
- current: (chunk) => {
9
- console.log('error', chunk);
10
- },
8
+ current: {},
11
9
  };
12
10
  const pushMessageImpl = (msg) => {
13
- onChunkRef.current({
11
+ const runId = msg.payload.runId;
12
+ onChunkRef.current[runId]?.({
14
13
  response: msg,
15
14
  stop: () => { },
16
15
  });
@@ -23,15 +22,20 @@ const createClawCompletion = (onAction, onAbort) => {
23
22
  ? params.requestOptions.meta?.shouldReceived
24
23
  : true;
25
24
  const { onChunk, requestOptions } = params;
25
+ const runId = requestOptions.meta?.runId;
26
26
  const onChunkImpl = (chunk) => {
27
- console.log('chunk impl', JSON.stringify(chunk, null, 2));
28
27
  if (isPushStreamDone(chunk.response)) {
29
28
  resolve();
29
+ if (onChunkRef.current[runId]) {
30
+ delete onChunkRef.current[runId];
31
+ }
30
32
  }
31
33
  // ChunkCallbackData<PushMessageImpl>
32
34
  onChunk(chunk);
33
35
  };
34
- onChunkRef.current = onChunkImpl;
36
+ if (runId) {
37
+ onChunkRef.current[runId] = onChunkImpl;
38
+ }
35
39
  const data = requestOptions.data;
36
40
  if (shouldSendMessage) {
37
41
  onAction({
@@ -45,8 +49,10 @@ const createClawCompletion = (onAction, onAbort) => {
45
49
  });
46
50
  if (!shouldReceivedMessage) {
47
51
  resolve();
52
+ if (onChunkRef.current[runId]) {
53
+ delete onChunkRef.current[runId];
54
+ }
48
55
  }
49
- console.log('send message', data);
50
56
  });
51
57
  return { pushMessageImpl, clawCompletion };
52
58
  };
@@ -1 +1 @@
1
- {"version":3,"file":"clawCompletion.js","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: (chunk: ChunkCallbackData<PushMessageImpl>) => void;\n } = {\n current: (chunk: ChunkCallbackData<PushMessageImpl>) => {\n console.log('error', chunk);\n },\n };\n\n const pushMessageImpl = (msg: PushMessageImpl) => {\n onChunkRef.current({\n response: msg,\n stop: () => {},\n });\n };\n const clawCompletion = async (params: CompletionsParams) => new Promise<void>((resolve, reject) => {\n const shouldSendMessage = typeof params.requestOptions.meta?.shouldSendMessage === 'boolean'\n ? params.requestOptions.meta?.shouldSendMessage\n : true;\n const shouldReceivedMessage = typeof params.requestOptions.meta?.shouldReceived === 'boolean'\n ? params.requestOptions.meta?.shouldReceived\n : true;\n const { onChunk, requestOptions } = params;\n const onChunkImpl = (chunk: ChunkCallbackData<PushMessageImpl>) => {\n console.log('chunk impl', JSON.stringify(chunk, null, 2));\n if (isPushStreamDone(chunk.response)) {\n resolve();\n }\n // ChunkCallbackData<PushMessageImpl>\n onChunk(chunk as any);\n };\n onChunkRef.current = onChunkImpl;\n\n const data = requestOptions.data as unknown as {\n message: {\n role: 'user';\n content: [\n {\n type: 'text';\n text: '1';\n },\n ];\n timestamp: 1772279195163;\n };\n };\n if (shouldSendMessage) {\n onAction({\n type: 'send',\n message: data?.message?.content?.map((c) => c.text).join('\\n'),\n thinking: 'none',\n });\n }\n params.abortController?.signal.addEventListener('abort', () => {\n onAbort();\n });\n if (!shouldReceivedMessage) {\n resolve();\n }\n console.log('send message', data);\n });\n\n return { pushMessageImpl, clawCompletion };\n};\n\nexport type ClawCompletion = ReturnType<typeof createClawCompletion>;\n"],"names":[],"mappings":";;AAIA;;AAEG;MACU,oBAAoB,GAAG,CAClC,QASU,EACV,OAAmB,KACjB;AACF,IAAA,MAAM,UAAU,GAEZ;AACF,QAAA,OAAO,EAAE,CAAC,KAAyC,KAAI;AACrD,YAAA,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAC7B;KACF,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,GAAoB,KAAI;QAC/C,UAAU,CAAC,OAAO,CAAC;AACjB,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,GAAG;AACf,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,OAAO,MAAyB,KAAK,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;QAChG,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS;AAC1F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB;cAC7C,IAAI,CAAC;QACT,MAAM,qBAAqB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS;AAC3F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc;cAC1C,IAAI,CAAC;AACT,QAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC3C,QAAA,MAAM,WAAW,GAAG,CAAC,KAAyC,KAAI;AAChE,YAAA,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,YAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,CAAC;aACX;;YAED,OAAO,CAAC,KAAY,CAAC,CAAC;AACxB,SAAC,CAAC;AACF,QAAA,UAAU,CAAC,OAAO,GAAG,WAAW,CAAC;AAEjC,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAWzB,CAAC;QACJ,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC;AACP,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC,CAAC;SACJ;QACD,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5D,YAAA,OAAO,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;SACX;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AACpC,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C;;;;"}
1
+ {"version":3,"file":"clawCompletion.js","sources":["../../../src/hooks/useClawChat/clawCompletion.ts"],"sourcesContent":["import { CompletionsParams } from '@chat-lab/core';\nimport { ChunkCallbackData } from '@chat-lab/core/src/types/ChatCompletion';\nimport { PushMessageImpl, isPushStreamDone } from './types';\n\n/**\n * 创建 Claw Completion\n */\nexport const createClawCompletion = (\n onAction: (action: {\n type: 'send';\n message: string;\n thinking?: 'none' | 'low' | 'medium' | 'high';\n attachments?: Array<{\n type: 'image';\n mimeType: string;\n content: string; // base64 or uri\n }>;\n }) => void,\n onAbort: () => void,\n) => {\n const onChunkRef: {\n current: Record<\n string,\n (chunk: ChunkCallbackData<PushMessageImpl>) => void\n >;\n } = {\n current: {},\n };\n\n const pushMessageImpl = (msg: PushMessageImpl) => {\n const runId = msg.payload.runId as string;\n onChunkRef.current[runId]?.({\n response: msg,\n stop: () => {},\n });\n };\n const clawCompletion = async (params: CompletionsParams) => new Promise<void>((resolve, reject) => {\n const shouldSendMessage = typeof params.requestOptions.meta?.shouldSendMessage === 'boolean'\n ? params.requestOptions.meta?.shouldSendMessage\n : true;\n const shouldReceivedMessage = typeof params.requestOptions.meta?.shouldReceived === 'boolean'\n ? params.requestOptions.meta?.shouldReceived\n : true;\n const { onChunk, requestOptions } = params;\n const runId = requestOptions.meta?.runId as string;\n const onChunkImpl = (chunk: ChunkCallbackData<PushMessageImpl>) => {\n if (isPushStreamDone(chunk.response)) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n // ChunkCallbackData<PushMessageImpl>\n onChunk(chunk as any);\n };\n if (runId) {\n onChunkRef.current[runId] = onChunkImpl;\n }\n\n const data = requestOptions.data as unknown as {\n message: {\n role: 'user';\n content: [\n {\n type: 'text';\n text: '1';\n },\n ];\n timestamp: 1772279195163;\n };\n };\n if (shouldSendMessage) {\n onAction({\n type: 'send',\n message: data?.message?.content?.map((c) => c.text).join('\\n'),\n thinking: 'none',\n });\n }\n params.abortController?.signal.addEventListener('abort', () => {\n onAbort();\n });\n if (!shouldReceivedMessage) {\n resolve();\n if (onChunkRef.current[runId]) {\n delete onChunkRef.current[runId];\n }\n }\n });\n\n return { pushMessageImpl, clawCompletion };\n};\n\nexport type ClawCompletion = ReturnType<typeof createClawCompletion>;\n"],"names":[],"mappings":";;AAIA;;AAEG;MACU,oBAAoB,GAAG,CAClC,QASU,EACV,OAAmB,KACjB;AACF,IAAA,MAAM,UAAU,GAKZ;AACF,QAAA,OAAO,EAAE,EAAE;KACZ,CAAC;AAEF,IAAA,MAAM,eAAe,GAAG,CAAC,GAAoB,KAAI;AAC/C,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAe,CAAC;AAC1C,QAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;AAC1B,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,IAAI,EAAE,MAAK,GAAG;AACf,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACF,IAAA,MAAM,cAAc,GAAG,OAAO,MAAyB,KAAK,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;QAChG,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS;AAC1F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB;cAC7C,IAAI,CAAC;QACT,MAAM,qBAAqB,GAAG,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,KAAK,SAAS;AAC3F,cAAE,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc;cAC1C,IAAI,CAAC;AACT,QAAA,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAC3C,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,KAAe,CAAC;AACnD,QAAA,MAAM,WAAW,GAAG,CAAC,KAAyC,KAAI;AAChE,YAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;AACpC,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,oBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAClC;aACF;;YAED,OAAO,CAAC,KAAY,CAAC,CAAC;AACxB,SAAC,CAAC;QACF,IAAI,KAAK,EAAE;AACT,YAAA,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC;SACzC;AAED,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAWzB,CAAC;QACJ,IAAI,iBAAiB,EAAE;AACrB,YAAA,QAAQ,CAAC;AACP,gBAAA,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9D,gBAAA,QAAQ,EAAE,MAAM;AACjB,aAAA,CAAC,CAAC;SACJ;QACD,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAK;AAC5D,YAAA,OAAO,EAAE,CAAC;AACZ,SAAC,CAAC,CAAC;QACH,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,OAAO,EAAE,CAAC;AACV,YAAA,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;aAClC;SACF;AACH,KAAC,CAAC,CAAC;AAEH,IAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;AAC7C;;;;"}
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var index = require('../../core/dist/index.cjs');
4
+
5
+ const pluginName = 'ClawPlugin';
6
+ class ClawPlugin extends index.ChatkitPlugin {
7
+ constructor(options) {
8
+ super({ pluginName });
9
+ this.options = options;
10
+ }
11
+ apply(compiler) {
12
+ compiler.hooks.message.beforeSend.tap(pluginName, async (ctx) => {
13
+ this.options.onSend(ctx.userMessage.content[0].text);
14
+ return {
15
+ ...ctx,
16
+ shouldSend: false,
17
+ shouldAddUserMessage: true,
18
+ };
19
+ });
20
+ }
21
+ }
22
+
23
+ exports.ClawPlugin = ClawPlugin;
24
+ //# sourceMappingURL=clawPlugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawPlugin.cjs","sources":["../../../src/hooks/useClawChat/clawPlugin.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatkitPlugin,\n Compiler,\n AdkProtocol,\n} from '@chat-lab/core';\n\nexport type ClawPluginOptions = {\n onSend: (text: string) => void;\n};\n\nconst pluginName = 'ClawPlugin';\n\nexport class ClawPlugin extends ChatkitPlugin {\n private options: ClawPluginOptions;\n\n constructor(options: ClawPluginOptions) {\n super({ pluginName });\n this.options = options;\n }\n\n public apply(compiler: Compiler) {\n compiler.hooks.message.beforeSend.tap(pluginName, async (ctx: any) => {\n this.options.onSend(ctx.userMessage.content[0].text);\n return {\n ...ctx,\n shouldSend: false,\n shouldAddUserMessage: true,\n };\n });\n }\n}\n"],"names":["ChatkitPlugin"],"mappings":";;;;AAWA,MAAM,UAAU,GAAG,YAAY,CAAC;AAE1B,MAAO,UAAW,SAAQA,mBAAa,CAAA;AAG3C,IAAA,WAAA,CAAY,OAA0B,EAAA;AACpC,QAAA,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;AAEM,IAAA,KAAK,CAAC,QAAkB,EAAA;AAC7B,QAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,GAAQ,KAAI;AACnE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO;AACL,gBAAA,GAAG,GAAG;AACN,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,oBAAoB,EAAE,IAAI;aAC3B,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AACF;;;;"}
@@ -0,0 +1,10 @@
1
+ import { ChatkitPlugin, Compiler } from '@chat-lab/core';
2
+ export type ClawPluginOptions = {
3
+ onSend: (text: string) => void;
4
+ };
5
+ export declare class ClawPlugin extends ChatkitPlugin {
6
+ private options;
7
+ constructor(options: ClawPluginOptions);
8
+ apply(compiler: Compiler): void;
9
+ }
10
+ //# sourceMappingURL=clawPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawPlugin.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/clawPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,QAAQ,EAET,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAIF,qBAAa,UAAW,SAAQ,aAAa;IAC3C,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,iBAAiB;IAK/B,KAAK,CAAC,QAAQ,EAAE,QAAQ;CAUhC"}
@@ -0,0 +1,22 @@
1
+ import { ChatkitPlugin } from '../../core/dist/index.js';
2
+
3
+ const pluginName = 'ClawPlugin';
4
+ class ClawPlugin extends ChatkitPlugin {
5
+ constructor(options) {
6
+ super({ pluginName });
7
+ this.options = options;
8
+ }
9
+ apply(compiler) {
10
+ compiler.hooks.message.beforeSend.tap(pluginName, async (ctx) => {
11
+ this.options.onSend(ctx.userMessage.content[0].text);
12
+ return {
13
+ ...ctx,
14
+ shouldSend: false,
15
+ shouldAddUserMessage: true,
16
+ };
17
+ });
18
+ }
19
+ }
20
+
21
+ export { ClawPlugin };
22
+ //# sourceMappingURL=clawPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawPlugin.js","sources":["../../../src/hooks/useClawChat/clawPlugin.ts"],"sourcesContent":["import {\n BaseProtocol,\n ChatkitPlugin,\n Compiler,\n AdkProtocol,\n} from '@chat-lab/core';\n\nexport type ClawPluginOptions = {\n onSend: (text: string) => void;\n};\n\nconst pluginName = 'ClawPlugin';\n\nexport class ClawPlugin extends ChatkitPlugin {\n private options: ClawPluginOptions;\n\n constructor(options: ClawPluginOptions) {\n super({ pluginName });\n this.options = options;\n }\n\n public apply(compiler: Compiler) {\n compiler.hooks.message.beforeSend.tap(pluginName, async (ctx: any) => {\n this.options.onSend(ctx.userMessage.content[0].text);\n return {\n ...ctx,\n shouldSend: false,\n shouldAddUserMessage: true,\n };\n });\n }\n}\n"],"names":[],"mappings":";;AAWA,MAAM,UAAU,GAAG,YAAY,CAAC;AAE1B,MAAO,UAAW,SAAQ,aAAa,CAAA;AAG3C,IAAA,WAAA,CAAY,OAA0B,EAAA;AACpC,QAAA,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;AAEM,IAAA,KAAK,CAAC,QAAkB,EAAA;AAC7B,QAAA,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,GAAQ,KAAI;AACnE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,OAAO;AACL,gBAAA,GAAG,GAAG;AACN,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,oBAAoB,EAAE,IAAI;aAC3B,CAAC;AACJ,SAAC,CAAC,CAAC;KACJ;AACF;;;;"}
@@ -3,10 +3,13 @@
3
3
  var index = require('../../core/dist/index.cjs');
4
4
  var React = require('react');
5
5
  var ahooks = require('ahooks');
6
+ var lodashEs = require('lodash-es');
7
+ var uuid = require('uuid');
6
8
  var types = require('./types.cjs');
7
9
  var clawCompletion = require('./clawCompletion.cjs');
8
10
  var ClawProtocolAdaptor = require('./ClawProtocolAdaptor.cjs');
9
11
  var convertHistoryMessage = require('./convertHistoryMessage.cjs');
12
+ var clawPlugin = require('./clawPlugin.cjs');
10
13
 
11
14
  /**
12
15
  * useClawChat Hook
@@ -17,7 +20,8 @@ var convertHistoryMessage = require('./convertHistoryMessage.cjs');
17
20
  */
18
21
  const useClawChat = ({ onAction, onAbort, }) => {
19
22
  const controllerRef = React.useRef(null);
20
- const currentRunIdRef = React.useRef(null);
23
+ const currentRunIdRef = React.useRef([]);
24
+ const clawPluginRef = React.useRef();
21
25
  const pushMessageImplRef = React.useRef(() => { });
22
26
  /**
23
27
  * 推送消息到 Chat 组件
@@ -28,29 +32,40 @@ const useClawChat = ({ onAction, onAbort, }) => {
28
32
  const thread = controllerRef.current?.getCurrentThread();
29
33
  // 更新整个消息历史
30
34
  if (types.isPushStreamStart(msg)) {
31
- currentRunIdRef.current = msg.payload.runId;
35
+ currentRunIdRef.current = lodashEs.uniq([
36
+ ...currentRunIdRef.current,
37
+ msg.payload.runId,
38
+ ]);
32
39
  // 手动设置 sending 状态,显示小圆圈
33
40
  if (thread) {
34
41
  controllerRef.current?.setSending(thread.id, true);
35
42
  }
36
- const assistantMessage = thread?.messages.findLast((message) => message.role === 'assistant');
37
43
  controllerRef.current?.triggerCompletion({
38
- assistantMessage,
39
44
  extraRequestOptions: {
40
- meta: { shouldSendMessage: false },
45
+ meta: { shouldSendMessage: false, runId: msg.payload.runId },
41
46
  },
42
47
  });
43
48
  }
44
49
  if (types.isPushStreamAborted(msg)
45
50
  || types.isPushStreamDone(msg)
46
51
  || types.isPushStreamError(msg)) {
47
- currentRunIdRef.current = null;
52
+ currentRunIdRef.current = lodashEs.without(currentRunIdRef.current, msg.payload.runId);
48
53
  // 手动设置 sending 状态,显示小圆圈
49
54
  if (thread) {
50
55
  controllerRef.current?.setSending(thread.id, false);
51
56
  controllerRef.current?.setLoading(thread.id, false);
52
57
  }
53
58
  }
59
+ if (types.isPushGatewayEvent(msg)) {
60
+ controllerRef.current?.addMessage(thread?.id, {
61
+ id: uuid.v4(),
62
+ content: msg.payload.message.content,
63
+ role: 'assistant',
64
+ threadId: thread?.id,
65
+ metadata: {},
66
+ status: index.MessageStatus.SUCCESS,
67
+ });
68
+ }
54
69
  pushMessageImplRef.current(msg);
55
70
  });
56
71
  const pushHistory = ahooks.useMemoizedFn((msg) => {
@@ -67,10 +82,18 @@ const useClawChat = ({ onAction, onAbort, }) => {
67
82
  if (!controllerRef.current) {
68
83
  const state = index.createThreadManagerStateWithDefault();
69
84
  const storeManager = new index.ThreadMessageManager(state);
85
+ const clawPlugin$1 = new clawPlugin.ClawPlugin({
86
+ onSend: async (text) => {
87
+ await onAction({
88
+ message: text,
89
+ });
90
+ },
91
+ });
92
+ clawPluginRef.current = clawPlugin$1;
70
93
  // 创建 completion 函数
71
94
  const { clawCompletion: clawCompletion$1, pushMessageImpl } = clawCompletion.createClawCompletion(onAction, () => {
72
95
  if (currentRunIdRef.current) {
73
- onAbort(currentRunIdRef.current);
96
+ currentRunIdRef.current.forEach((runId) => onAbort(runId));
74
97
  }
75
98
  });
76
99
  pushMessageImplRef.current = pushMessageImpl;
@@ -87,7 +110,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
87
110
  },
88
111
  meta: {
89
112
  shouldSendMessage: true,
90
- shouldReceived: true,
113
+ shouldReceived: false,
91
114
  },
92
115
  // 使用自定义 completion
93
116
  completions: clawCompletion$1,
@@ -101,6 +124,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
101
124
  metaData: index.createMetaData({
102
125
  clawStatus: { status: false, reason: 'uninitialized' },
103
126
  }),
127
+ plugins: [clawPlugin$1],
104
128
  });
105
129
  }
106
130
  const handleClawChatStatus = ahooks.useMemoizedFn((status) => {
@@ -116,6 +140,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
116
140
  };
117
141
  };
118
142
 
143
+ exports.isPushGatewayEvent = types.isPushGatewayEvent;
119
144
  exports.isPushSteamDelta = types.isPushSteamDelta;
120
145
  exports.isPushStreamAborted = types.isPushStreamAborted;
121
146
  exports.isPushStreamDone = types.isPushStreamDone;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/hooks/useClawChat/index.ts"],"sourcesContent":["import {\n ChatController,\n createThreadManagerStateWithDefault,\n ThreadMessageManager,\n ProtocolEnum,\n createMetaData,\n} from '@chat-lab/core';\nimport { useRef, useState } from 'react';\nimport { useMemoizedFn } from 'ahooks';\nimport {\n UseClawChatReturn,\n OnAction,\n ClawChatStatus,\n PushMessageImpl,\n PushHistory,\n isPushStreamStart,\n isPushStreamDone,\n isPushStreamError,\n isPushStreamAborted,\n} from './types';\nimport { createClawCompletion } from './clawCompletion';\nimport ClawProtocolAdaptor from './ClawProtocolAdaptor';\nimport convertHistoryMessage from './convertHistoryMessage';\n\nexport * from './types';\nexport { default as ClawProtocolAdaptor } from './ClawProtocolAdaptor';\nexport * from './ClawProtocolAdaptor';\n\n/**\n * useClawChat Hook\n * 用于与 ClawClient 进行双向通信\n *\n * @param onAction - 处理来自 Chat 组件的用户操作\n * @returns {UseClawChatReturn} - 包含 controller、pushMessage 和 setClawChatStatus\n */\n\nexport const useClawChat = ({\n onAction,\n onAbort,\n}: {\n onAction: OnAction;\n onAbort: (runId: string) => void;\n}): UseClawChatReturn => {\n const controllerRef = useRef<ChatController | null>(null);\n const currentRunIdRef = useRef<string | null>(null);\n\n const pushMessageImplRef = useRef<(msg: PushMessageImpl) => void>(() => {});\n /**\n * 推送消息到 Chat 组件\n * 由 ClawClient 调用\n */\n const pushMessage = useMemoizedFn((msg: PushMessageImpl) => {\n // 获取当前线程\n const thread = controllerRef.current?.getCurrentThread();\n // 更新整个消息历史\n if (isPushStreamStart(msg)) {\n currentRunIdRef.current = msg.payload.runId;\n // 手动设置 sending 状态,显示小圆圈\n if (thread) {\n controllerRef.current?.setSending(thread.id, true);\n }\n const assistantMessage = thread?.messages.findLast(\n (message) => message.role === 'assistant',\n );\n controllerRef.current?.triggerCompletion({\n assistantMessage,\n extraRequestOptions: {\n meta: { shouldSendMessage: false },\n },\n });\n }\n if (\n isPushStreamAborted(msg)\n || isPushStreamDone(msg)\n || isPushStreamError(msg)\n ) {\n currentRunIdRef.current = null;\n // 手动设置 sending 状态,显示小圆圈\n if (thread) {\n controllerRef.current?.setSending(thread.id, false);\n controllerRef.current?.setLoading(thread.id, false);\n }\n }\n\n pushMessageImplRef.current(msg);\n });\n\n const pushHistory = useMemoizedFn((msg: PushHistory) => {\n // 更新整个消息历史\n // pushMessageImplRef.current(msg);\n const thread = controllerRef.current?.getCurrentThread();\n if (thread) {\n controllerRef.current?.updateThread(thread.id, {\n messages: convertHistoryMessage(msg),\n });\n }\n });\n\n // 初始化 ChatController\n if (!controllerRef.current) {\n const state = createThreadManagerStateWithDefault();\n const storeManager = new ThreadMessageManager(state);\n\n // 创建 completion 函数\n const { clawCompletion, pushMessageImpl } = createClawCompletion(\n onAction,\n () => {\n if (currentRunIdRef.current) {\n onAbort(currentRunIdRef.current);\n }\n },\n );\n pushMessageImplRef.current = pushMessageImpl;\n\n // 创建 Claw Protocol Adaptor\n const clawProtocolAdaptor = new ClawProtocolAdaptor({\n protocol: ProtocolEnum.CUSTOM,\n protocolName: 'Claw',\n } as any);\n\n controllerRef.current = new ChatController({\n requestOptions: {\n api: 'default',\n headers: {\n Authorization: 'Bearer ',\n },\n meta: {\n shouldSendMessage: true,\n shouldReceived: true,\n },\n // 使用自定义 completion\n completions: clawCompletion,\n },\n protocolOptions: {\n protocol: ProtocolEnum.CUSTOM,\n protocolName: 'Claw',\n protocolAdaptor: clawProtocolAdaptor,\n } as any,\n storeManager,\n metaData: createMetaData({\n clawStatus: { status: false, reason: 'uninitialized' },\n }),\n });\n }\n\n const handleClawChatStatus = useMemoizedFn((status: ClawChatStatus) => {\n if (controllerRef.current) {\n controllerRef.current.metaData.clawStatus = status;\n }\n });\n\n return {\n controllerRef,\n pushMessage,\n pushHistory,\n setClawChatStatus: handleClawChatStatus,\n };\n};\n"],"names":["useRef","useMemoizedFn","isPushStreamStart","isPushStreamAborted","isPushStreamDone","isPushStreamError","createThreadManagerStateWithDefault","ThreadMessageManager","clawCompletion","createClawCompletion","ProtocolEnum","ChatController","createMetaData"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/hooks/useClawChat/index.ts"],"sourcesContent":["import {\n ChatController,\n createThreadManagerStateWithDefault,\n ThreadMessageManager,\n ProtocolEnum,\n createMetaData,\n MessageStatus,\n} from '@chat-lab/core';\nimport { useRef, useState } from 'react';\nimport { useMemoizedFn } from 'ahooks';\nimport { uniq, without } from 'lodash-es';\nimport { v4 as uuid } from 'uuid';\nimport {\n UseClawChatReturn,\n OnAction,\n ClawChatStatus,\n PushMessageImpl,\n PushHistory,\n isPushStreamStart,\n isPushStreamDone,\n isPushStreamError,\n isPushStreamAborted,\n isPushGatewayEvent,\n} from './types';\nimport { createClawCompletion } from './clawCompletion';\nimport ClawProtocolAdaptor from './ClawProtocolAdaptor';\nimport convertHistoryMessage from './convertHistoryMessage';\nimport { ClawPlugin } from './clawPlugin';\n\nexport * from './types';\nexport { default as ClawProtocolAdaptor } from './ClawProtocolAdaptor';\nexport * from './ClawProtocolAdaptor';\n\n/**\n * useClawChat Hook\n * 用于与 ClawClient 进行双向通信\n *\n * @param onAction - 处理来自 Chat 组件的用户操作\n * @returns {UseClawChatReturn} - 包含 controller、pushMessage 和 setClawChatStatus\n */\n\nexport const useClawChat = ({\n onAction,\n onAbort,\n}: {\n onAction: OnAction;\n onAbort: (runId: string) => void;\n}): UseClawChatReturn => {\n const controllerRef = useRef<ChatController | null>(null);\n const currentRunIdRef = useRef<string[]>([]);\n\n const clawPluginRef = useRef<ClawPlugin>();\n\n const pushMessageImplRef = useRef<(msg: PushMessageImpl) => void>(() => {});\n /**\n * 推送消息到 Chat 组件\n * 由 ClawClient 调用\n */\n const pushMessage = useMemoizedFn((msg: PushMessageImpl) => {\n // 获取当前线程\n const thread = controllerRef.current?.getCurrentThread();\n // 更新整个消息历史\n if (isPushStreamStart(msg)) {\n currentRunIdRef.current = uniq([\n ...currentRunIdRef.current,\n msg.payload.runId,\n ]);\n // 手动设置 sending 状态,显示小圆圈\n if (thread) {\n controllerRef.current?.setSending(thread.id, true);\n }\n controllerRef.current?.triggerCompletion({\n extraRequestOptions: {\n meta: { shouldSendMessage: false, runId: msg.payload.runId },\n },\n });\n }\n if (\n isPushStreamAborted(msg)\n || isPushStreamDone(msg)\n || isPushStreamError(msg)\n ) {\n currentRunIdRef.current = without(\n currentRunIdRef.current,\n msg.payload.runId,\n );\n // 手动设置 sending 状态,显示小圆圈\n if (thread) {\n controllerRef.current?.setSending(thread.id, false);\n controllerRef.current?.setLoading(thread.id, false);\n }\n }\n if (isPushGatewayEvent(msg)) {\n controllerRef.current?.addMessage(thread?.id, {\n id: uuid(),\n content: msg.payload.message.content,\n role: 'assistant',\n threadId: thread?.id,\n metadata: {},\n status: MessageStatus.SUCCESS,\n });\n }\n\n pushMessageImplRef.current(msg);\n });\n\n const pushHistory = useMemoizedFn((msg: PushHistory) => {\n // 更新整个消息历史\n // pushMessageImplRef.current(msg);\n const thread = controllerRef.current?.getCurrentThread();\n if (thread) {\n controllerRef.current?.updateThread(thread.id, {\n messages: convertHistoryMessage(msg),\n });\n }\n });\n\n // 初始化 ChatController\n if (!controllerRef.current) {\n const state = createThreadManagerStateWithDefault();\n const storeManager = new ThreadMessageManager(state);\n const clawPlugin = new ClawPlugin({\n onSend: async (text) => {\n await onAction({\n message: text,\n });\n },\n });\n clawPluginRef.current = clawPlugin;\n // 创建 completion 函数\n const { clawCompletion, pushMessageImpl } = createClawCompletion(\n onAction,\n () => {\n if (currentRunIdRef.current) {\n currentRunIdRef.current.forEach((runId) => onAbort(runId));\n }\n },\n );\n pushMessageImplRef.current = pushMessageImpl;\n\n // 创建 Claw Protocol Adaptor\n const clawProtocolAdaptor = new ClawProtocolAdaptor({\n protocol: ProtocolEnum.CUSTOM,\n protocolName: 'Claw',\n } as any);\n\n controllerRef.current = new ChatController({\n requestOptions: {\n api: 'default',\n headers: {\n Authorization: 'Bearer ',\n },\n meta: {\n shouldSendMessage: true,\n shouldReceived: false,\n },\n // 使用自定义 completion\n completions: clawCompletion,\n },\n protocolOptions: {\n protocol: ProtocolEnum.CUSTOM,\n protocolName: 'Claw',\n protocolAdaptor: clawProtocolAdaptor,\n } as any,\n storeManager,\n metaData: createMetaData({\n clawStatus: { status: false, reason: 'uninitialized' },\n }),\n plugins: [clawPlugin],\n });\n }\n\n const handleClawChatStatus = useMemoizedFn((status: ClawChatStatus) => {\n if (controllerRef.current) {\n controllerRef.current.metaData.clawStatus = status;\n }\n });\n\n return {\n controllerRef,\n pushMessage,\n pushHistory,\n setClawChatStatus: handleClawChatStatus,\n };\n};\n"],"names":["useRef","useMemoizedFn","isPushStreamStart","uniq","isPushStreamAborted","isPushStreamDone","isPushStreamError","without","isPushGatewayEvent","uuid","MessageStatus","createThreadManagerStateWithDefault","ThreadMessageManager","clawPlugin","ClawPlugin","clawCompletion","createClawCompletion","ProtocolEnum","ChatController","createMetaData"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/index.ts"],"names":[],"mappings":"AASA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EAQT,MAAM,SAAS,CAAC;AAKjB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,cAAc,uBAAuB,CAAC;AAEtC;;;;;;GAMG;AAEH,eAAO,MAAM,WAAW,GAAI,wBAGzB;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,KAAG,iBAmHH,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EAST,MAAM,SAAS,CAAC;AAMjB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACvE,cAAc,uBAAuB,CAAC;AAEtC;;;;;;GAMG;AAEH,eAAO,MAAM,WAAW,GAAI,wBAGzB;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,KAAG,iBAyIH,CAAC"}
@@ -1,11 +1,14 @@
1
- import { createThreadManagerStateWithDefault, ProtocolEnum, ChatController, createMetaData, ThreadMessageManager } from '../../core/dist/index.js';
1
+ import { MessageStatus, createThreadManagerStateWithDefault, ProtocolEnum, ChatController, createMetaData, ThreadMessageManager } from '../../core/dist/index.js';
2
2
  import { useRef } from 'react';
3
3
  import { useMemoizedFn } from 'ahooks';
4
- import { isPushStreamStart, isPushStreamAborted, isPushStreamDone, isPushStreamError } from './types.js';
4
+ import { uniq, without } from 'lodash-es';
5
+ import { v4 } from 'uuid';
6
+ import { isPushStreamStart, isPushStreamAborted, isPushStreamDone, isPushStreamError, isPushGatewayEvent } from './types.js';
5
7
  export { isPushSteamDelta } from './types.js';
6
8
  import { createClawCompletion } from './clawCompletion.js';
7
9
  import ClawProtocolAdaptor from './ClawProtocolAdaptor.js';
8
10
  import convertHistoryMessage from './convertHistoryMessage.js';
11
+ import { ClawPlugin } from './clawPlugin.js';
9
12
 
10
13
  /**
11
14
  * useClawChat Hook
@@ -16,7 +19,8 @@ import convertHistoryMessage from './convertHistoryMessage.js';
16
19
  */
17
20
  const useClawChat = ({ onAction, onAbort, }) => {
18
21
  const controllerRef = useRef(null);
19
- const currentRunIdRef = useRef(null);
22
+ const currentRunIdRef = useRef([]);
23
+ const clawPluginRef = useRef();
20
24
  const pushMessageImplRef = useRef(() => { });
21
25
  /**
22
26
  * 推送消息到 Chat 组件
@@ -27,29 +31,40 @@ const useClawChat = ({ onAction, onAbort, }) => {
27
31
  const thread = controllerRef.current?.getCurrentThread();
28
32
  // 更新整个消息历史
29
33
  if (isPushStreamStart(msg)) {
30
- currentRunIdRef.current = msg.payload.runId;
34
+ currentRunIdRef.current = uniq([
35
+ ...currentRunIdRef.current,
36
+ msg.payload.runId,
37
+ ]);
31
38
  // 手动设置 sending 状态,显示小圆圈
32
39
  if (thread) {
33
40
  controllerRef.current?.setSending(thread.id, true);
34
41
  }
35
- const assistantMessage = thread?.messages.findLast((message) => message.role === 'assistant');
36
42
  controllerRef.current?.triggerCompletion({
37
- assistantMessage,
38
43
  extraRequestOptions: {
39
- meta: { shouldSendMessage: false },
44
+ meta: { shouldSendMessage: false, runId: msg.payload.runId },
40
45
  },
41
46
  });
42
47
  }
43
48
  if (isPushStreamAborted(msg)
44
49
  || isPushStreamDone(msg)
45
50
  || isPushStreamError(msg)) {
46
- currentRunIdRef.current = null;
51
+ currentRunIdRef.current = without(currentRunIdRef.current, msg.payload.runId);
47
52
  // 手动设置 sending 状态,显示小圆圈
48
53
  if (thread) {
49
54
  controllerRef.current?.setSending(thread.id, false);
50
55
  controllerRef.current?.setLoading(thread.id, false);
51
56
  }
52
57
  }
58
+ if (isPushGatewayEvent(msg)) {
59
+ controllerRef.current?.addMessage(thread?.id, {
60
+ id: v4(),
61
+ content: msg.payload.message.content,
62
+ role: 'assistant',
63
+ threadId: thread?.id,
64
+ metadata: {},
65
+ status: MessageStatus.SUCCESS,
66
+ });
67
+ }
53
68
  pushMessageImplRef.current(msg);
54
69
  });
55
70
  const pushHistory = useMemoizedFn((msg) => {
@@ -66,10 +81,18 @@ const useClawChat = ({ onAction, onAbort, }) => {
66
81
  if (!controllerRef.current) {
67
82
  const state = createThreadManagerStateWithDefault();
68
83
  const storeManager = new ThreadMessageManager(state);
84
+ const clawPlugin = new ClawPlugin({
85
+ onSend: async (text) => {
86
+ await onAction({
87
+ message: text,
88
+ });
89
+ },
90
+ });
91
+ clawPluginRef.current = clawPlugin;
69
92
  // 创建 completion 函数
70
93
  const { clawCompletion, pushMessageImpl } = createClawCompletion(onAction, () => {
71
94
  if (currentRunIdRef.current) {
72
- onAbort(currentRunIdRef.current);
95
+ currentRunIdRef.current.forEach((runId) => onAbort(runId));
73
96
  }
74
97
  });
75
98
  pushMessageImplRef.current = pushMessageImpl;
@@ -86,7 +109,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
86
109
  },
87
110
  meta: {
88
111
  shouldSendMessage: true,
89
- shouldReceived: true,
112
+ shouldReceived: false,
90
113
  },
91
114
  // 使用自定义 completion
92
115
  completions: clawCompletion,
@@ -100,6 +123,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
100
123
  metaData: createMetaData({
101
124
  clawStatus: { status: false, reason: 'uninitialized' },
102
125
  }),
126
+ plugins: [clawPlugin],
103
127
  });
104
128
  }
105
129
  const handleClawChatStatus = useMemoizedFn((status) => {
@@ -115,5 +139,5 @@ const useClawChat = ({ onAction, onAbort, }) => {
115
139
  };
116
140
  };
117
141
 
118
- export { ClawProtocolAdaptor, isPushStreamAborted, isPushStreamDone, isPushStreamError, isPushStreamStart, useClawChat };
142
+ export { ClawProtocolAdaptor, isPushGatewayEvent, isPushStreamAborted, isPushStreamDone, isPushStreamError, isPushStreamStart, useClawChat };
119
143
  //# sourceMappingURL=index.js.map