@chat-lab/ui 0.1.0-beta.71 → 0.1.0-beta.74

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 (83) hide show
  1. package/dist/components/Chatkit/index.cjs +6 -4
  2. package/dist/components/Chatkit/index.cjs.map +1 -1
  3. package/dist/components/Chatkit/index.d.ts.map +1 -1
  4. package/dist/components/Chatkit/index.js +6 -4
  5. package/dist/components/Chatkit/index.js.map +1 -1
  6. package/dist/components/Chatkit/types.d.ts +1 -0
  7. package/dist/components/Chatkit/types.d.ts.map +1 -1
  8. package/dist/components/assistant-ui/markdown-text.cjs +17 -20
  9. package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
  10. package/dist/components/assistant-ui/markdown-text.d.ts +3 -1
  11. package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
  12. package/dist/components/assistant-ui/markdown-text.js +19 -22
  13. package/dist/components/assistant-ui/markdown-text.js.map +1 -1
  14. package/dist/components/assistant-ui/thread.cjs +22 -11
  15. package/dist/components/assistant-ui/thread.cjs.map +1 -1
  16. package/dist/components/assistant-ui/thread.d.ts.map +1 -1
  17. package/dist/components/assistant-ui/thread.js +22 -11
  18. package/dist/components/assistant-ui/thread.js.map +1 -1
  19. package/dist/contexts/ChatkitContext.cjs.map +1 -1
  20. package/dist/contexts/ChatkitContext.d.ts +2 -0
  21. package/dist/contexts/ChatkitContext.d.ts.map +1 -1
  22. package/dist/contexts/ChatkitContext.js.map +1 -1
  23. package/dist/core/dist/index.cjs +10 -4
  24. package/dist/core/dist/index.cjs.map +1 -1
  25. package/dist/core/dist/index.js +10 -4
  26. package/dist/core/dist/index.js.map +1 -1
  27. package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs +11 -10
  28. package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs.map +1 -1
  29. package/dist/hooks/useClawChat/ClawProtocolAdaptor.d.ts.map +1 -1
  30. package/dist/hooks/useClawChat/ClawProtocolAdaptor.js +11 -10
  31. package/dist/hooks/useClawChat/ClawProtocolAdaptor.js.map +1 -1
  32. package/dist/hooks/useClawChat/clawCompletion.cjs +13 -7
  33. package/dist/hooks/useClawChat/clawCompletion.cjs.map +1 -1
  34. package/dist/hooks/useClawChat/clawCompletion.d.ts.map +1 -1
  35. package/dist/hooks/useClawChat/clawCompletion.js +13 -7
  36. package/dist/hooks/useClawChat/clawCompletion.js.map +1 -1
  37. package/dist/hooks/useClawChat/clawPlugin.cjs +24 -0
  38. package/dist/hooks/useClawChat/clawPlugin.cjs.map +1 -0
  39. package/dist/hooks/useClawChat/clawPlugin.d.ts +10 -0
  40. package/dist/hooks/useClawChat/clawPlugin.d.ts.map +1 -0
  41. package/dist/hooks/useClawChat/clawPlugin.js +22 -0
  42. package/dist/hooks/useClawChat/clawPlugin.js.map +1 -0
  43. package/dist/hooks/useClawChat/index.cjs +24 -8
  44. package/dist/hooks/useClawChat/index.cjs.map +1 -1
  45. package/dist/hooks/useClawChat/index.d.ts.map +1 -1
  46. package/dist/hooks/useClawChat/index.js +24 -8
  47. package/dist/hooks/useClawChat/index.js.map +1 -1
  48. package/dist/hooks/useClawChat/types.cjs +1 -1
  49. package/dist/hooks/useClawChat/types.cjs.map +1 -1
  50. package/dist/hooks/useClawChat/types.d.ts +12 -5
  51. package/dist/hooks/useClawChat/types.d.ts.map +1 -1
  52. package/dist/hooks/useClawChat/types.js +1 -1
  53. package/dist/hooks/useClawChat/types.js.map +1 -1
  54. package/dist/index.css +1 -1
  55. package/package.json +1 -1
  56. package/dist/assets/Attachment.cjs +0 -8
  57. package/dist/assets/Attachment.cjs.map +0 -1
  58. package/dist/assets/Attachment.js +0 -6
  59. package/dist/assets/Attachment.js.map +0 -1
  60. package/dist/assets/ClearIcon.cjs +0 -8
  61. package/dist/assets/ClearIcon.cjs.map +0 -1
  62. package/dist/assets/ClearIcon.js +0 -6
  63. package/dist/assets/ClearIcon.js.map +0 -1
  64. package/dist/assets/Download.cjs +0 -10
  65. package/dist/assets/Download.cjs.map +0 -1
  66. package/dist/assets/Download.js +0 -8
  67. package/dist/assets/Download.js.map +0 -1
  68. package/dist/assets/NewSession.cjs +0 -8
  69. package/dist/assets/NewSession.cjs.map +0 -1
  70. package/dist/assets/NewSession.js +0 -6
  71. package/dist/assets/NewSession.js.map +0 -1
  72. package/dist/assets/RefreshIcon.cjs +0 -8
  73. package/dist/assets/RefreshIcon.cjs.map +0 -1
  74. package/dist/assets/RefreshIcon.js +0 -6
  75. package/dist/assets/RefreshIcon.js.map +0 -1
  76. package/dist/assets/ThumbDownIcon.cjs +0 -8
  77. package/dist/assets/ThumbDownIcon.cjs.map +0 -1
  78. package/dist/assets/ThumbDownIcon.js +0 -6
  79. package/dist/assets/ThumbDownIcon.js.map +0 -1
  80. package/dist/assets/ThumbUpIcon.cjs +0 -8
  81. package/dist/assets/ThumbUpIcon.cjs.map +0 -1
  82. package/dist/assets/ThumbUpIcon.js +0 -6
  83. package/dist/assets/ThumbUpIcon.js.map +0 -1
@@ -22,23 +22,22 @@ class ClawProtocolAdaptor extends index.BaseProtocol {
22
22
  parseChunk(chunk) {
23
23
  const { message, response } = chunk;
24
24
  const event = response;
25
- console.log('event response ', event);
26
25
  // 处理 stream-delta:delta 是文本全量,直接覆盖
27
26
  if (types.isPushSteamDelta(event)) {
28
- const deltaText = event.payload.data.text || '';
27
+ const deltaText = event.payload.data.delta || '';
29
28
  // 查找最后一条 text 类型的 content
30
29
  const existingTextIndex = lodashEs.findLastIndex(message.content, (c) => c.type === 'text');
31
30
  let newContent;
32
31
  if (existingTextIndex !== -1) {
33
32
  // 替换最后一条 text
33
+ const currentTextContent = message.content[existingTextIndex];
34
+ currentTextContent.text += deltaText;
34
35
  newContent = [...message.content];
35
- newContent[existingTextIndex] = { type: 'text', text: deltaText };
36
36
  }
37
37
  else {
38
38
  // 添加新的 text
39
39
  newContent = [...message.content, { type: 'text', text: deltaText }];
40
40
  }
41
- console.log('newContent', JSON.stringify(newContent, null, 2), event.payload.data.text);
42
41
  return {
43
42
  ...message,
44
43
  status: index.MessageStatus.SENDING,
@@ -47,17 +46,19 @@ class ClawProtocolAdaptor extends index.BaseProtocol {
47
46
  }
48
47
  // 处理 stream-done:使用 message.content
49
48
  if (types.isPushStreamDone(event)) {
50
- const contents = event.payload?.message?.content.map((c) => ({
51
- type: 'text',
52
- text: c.text,
53
- }));
49
+ // const contents: TextMessage[] = event.payload?.message?.content.map(
50
+ // (c: TextContent) => ({
51
+ // type: 'text',
52
+ // text: c.text,
53
+ // }),
54
+ // );
54
55
  return {
55
56
  ...message,
56
- content: contents,
57
+ // content: contents,
57
58
  status: index.MessageStatus.SUCCESS,
58
59
  metadata: {
59
60
  ...message.metadata,
60
- stopReason: event.payload.message.stopReason,
61
+ stopReason: event.payload?.message?.stopReason,
61
62
  },
62
63
  };
63
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 console.log('event response ', event);\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.text || '';\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 newContent = [...message.content];\n newContent[existingTextIndex] = { type: 'text', text: deltaText };\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n console.log(\n 'newContent',\n JSON.stringify(newContent, null, 2),\n event.payload.data.text,\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClawProtocolAdaptor.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EAIf,MAAM,EAEP,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EAMhB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,cAAM,mBAAoB,SAAQ,YAAY,CAC5C,eAAe,EACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB;IACC,QAAQ,WAAuB;IAE/B,YAAY,EAAE,MAAM,CAAC;gBAET,OAAO,EAAE,eAAe;IAKpC;;;OAGG;IACH,UAAU,CAAC,QAAQ,GAAG,eAAe,EAAE,KAAK,EAAE;QAC5C,OAAO,EAAE,WAAW,CAAC;QACrB,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,WAAW;IA2Ff;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,WAAW,EAAE,WAAW,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,WAAW,EAAE,CAAC;KAChC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAmC5B;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ClawProtocolAdaptor.d.ts","sourceRoot":"","sources":["../../../src/hooks/useClawChat/ClawProtocolAdaptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EAIf,MAAM,EAEP,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,eAAe,EAMhB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,cAAM,mBAAoB,SAAQ,YAAY,CAC5C,eAAe,EACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB;IACC,QAAQ,WAAuB;IAE/B,YAAY,EAAE,MAAM,CAAC;gBAET,OAAO,EAAE,eAAe;IAKpC;;;OAGG;IACH,UAAU,CAAC,QAAQ,GAAG,eAAe,EAAE,KAAK,EAAE;QAC5C,OAAO,EAAE,WAAW,CAAC;QACrB,QAAQ,EAAE,QAAQ,CAAC;KACpB,GAAG,WAAW;IAwFf;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxC,WAAW,EAAE,WAAW,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,WAAW,EAAE,CAAC;KAChC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAmC5B;AAED,eAAe,mBAAmB,CAAC"}
@@ -20,23 +20,22 @@ class ClawProtocolAdaptor extends BaseProtocols_default {
20
20
  parseChunk(chunk) {
21
21
  const { message, response } = chunk;
22
22
  const event = response;
23
- console.log('event response ', event);
24
23
  // 处理 stream-delta:delta 是文本全量,直接覆盖
25
24
  if (isPushSteamDelta(event)) {
26
- const deltaText = event.payload.data.text || '';
25
+ const deltaText = event.payload.data.delta || '';
27
26
  // 查找最后一条 text 类型的 content
28
27
  const existingTextIndex = findLastIndex(message.content, (c) => c.type === 'text');
29
28
  let newContent;
30
29
  if (existingTextIndex !== -1) {
31
30
  // 替换最后一条 text
31
+ const currentTextContent = message.content[existingTextIndex];
32
+ currentTextContent.text += deltaText;
32
33
  newContent = [...message.content];
33
- newContent[existingTextIndex] = { type: 'text', text: deltaText };
34
34
  }
35
35
  else {
36
36
  // 添加新的 text
37
37
  newContent = [...message.content, { type: 'text', text: deltaText }];
38
38
  }
39
- console.log('newContent', JSON.stringify(newContent, null, 2), event.payload.data.text);
40
39
  return {
41
40
  ...message,
42
41
  status: MessageStatus.SENDING,
@@ -45,17 +44,19 @@ class ClawProtocolAdaptor extends BaseProtocols_default {
45
44
  }
46
45
  // 处理 stream-done:使用 message.content
47
46
  if (isPushStreamDone(event)) {
48
- const contents = event.payload?.message?.content.map((c) => ({
49
- type: 'text',
50
- text: c.text,
51
- }));
47
+ // const contents: TextMessage[] = event.payload?.message?.content.map(
48
+ // (c: TextContent) => ({
49
+ // type: 'text',
50
+ // text: c.text,
51
+ // }),
52
+ // );
52
53
  return {
53
54
  ...message,
54
- content: contents,
55
+ // content: contents,
55
56
  status: MessageStatus.SUCCESS,
56
57
  metadata: {
57
58
  ...message.metadata,
58
- stopReason: event.payload.message.stopReason,
59
+ stopReason: event.payload?.message?.stopReason,
59
60
  },
60
61
  };
61
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 console.log('event response ', event);\n\n // 处理 stream-delta:delta 是文本全量,直接覆盖\n if (isPushSteamDelta(event)) {\n const deltaText = event.payload.data.text || '';\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 newContent = [...message.content];\n newContent[existingTextIndex] = { type: 'text', text: deltaText };\n } else {\n // 添加新的 text\n newContent = [...message.content, { type: 'text', text: deltaText }];\n }\n console.log(\n 'newContent',\n JSON.stringify(newContent, null, 2),\n event.payload.data.text,\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":";;;;;AAqBA;;;AAGG;AACH,MAAM,mBAAoB,SAAQA,qBAGjC,CAAA;AAKC,IAAA,WAAA,CAAY,OAAwB,EAAA;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC;AALjB,QAAA,IAAA,CAAA,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;QAM7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC;KACpD;AAED;;;AAGG;AACH,IAAA,UAAU,CAA6B,KAGtC,EAAA;AACC,QAAA,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QACpC,MAAM,KAAK,GAAG,QAA2B,CAAC;AAC1C,QAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;;AAGtC,QAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;YAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;;AAGhD,YAAA,MAAM,iBAAiB,GAAG,aAAa,CACrC,OAAO,CAAC,OAAO,EACf,CAAC,CAAC,KAAuB,CAAC,CAAC,IAAI,KAAK,MAAM,CAC3C,CAAC;AAEF,YAAA,IAAI,UAAkC,CAAC;AACvC,YAAA,IAAI,iBAAiB,KAAK,CAAC,CAAC,EAAE;;AAE5B,gBAAA,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAClC,gBAAA,UAAU,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;aACnE;iBAAM;;AAEL,gBAAA,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;aACtE;YACD,OAAO,CAAC,GAAG,CACT,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CACxB,CAAC;YAEF,OAAO;AACL,gBAAA,GAAG,OAAO;gBACV,MAAM,EAAE,aAAa,CAAC,OAAO;AAC7B,gBAAA,OAAO,EAAE,UAAU;aACpB,CAAC;SACH;;AAGD,QAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,MAAM,QAAQ,GAAkB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CACjE,CAAC,CAAc,MAAM;AACnB,gBAAA,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;AACb,aAAA,CAAC,CACH,CAAC;YAEF,OAAO;AACL,gBAAA,GAAG,OAAO;AACV,gBAAA,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,aAAa,CAAC,OAAO;AAC7B,gBAAA,QAAQ,EAAE;oBACR,GAAG,OAAO,CAAC,QAAQ;AACnB,oBAAA,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU;AAC7C,iBAAA;aACF,CAAC;SACH;;AAGD,QAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;YAC9B,OAAO;AACL,gBAAA,GAAG,OAAO;AACV,gBAAA,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACjD,oBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE;wBACrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;qBACvC;oBACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACpC,iBAAC,CAAC;gBACF,MAAM,EAAE,aAAa,CAAC,OAAO;AAC7B,gBAAA,QAAQ,EAAE;oBACR,GAAG,OAAO,CAAC,QAAQ;AACnB,oBAAA,UAAU,EAAE,SAAS;AACtB,iBAAA;aACF,CAAC;SACH;;AAGD,QAAA,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;YAC5B,OAAO;AACL,gBAAA,GAAG,OAAO;gBACV,MAAM,EAAE,aAAa,CAAC,KAAK;AAC3B,gBAAA,KAAK,EAAE;AACL,oBAAA,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY;AACnC,oBAAA,KAAK,EAAE,EAAE;AACV,iBAAA;aACF,CAAC;SACH;;AAGD,QAAA,OAAO,OAAO,CAAC;KAChB;AAED;;;AAGG;AACH,IAAA,mBAAmB,CAAC,OAMnB,EAAA;AACC,QAAA,MAAM,EACJ,WAAW,EACX,MAAM,EACN,eAAe,EACf,aAAa,EACb,aAAa,GACd,GAAG,OAAO,CAAC;;AAGZ,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;AACrC,gBAAA,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE;oBACrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAG,CAAiB,CAAC,IAAI,EAAE,CAAC;iBACxD;gBACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACpC,aAAC,CAAkB;AACnB,YAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,OAAO;;YAEL,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,SAAS,EAAEC,EAAI,EAAE;;YAGjB,OAAO;AACP,YAAA,OAAO,EAAE,cAAc;;AAGvB,YAAA,IAAI,aAAa,IAAI,EAAE,CAAC;AACxB,YAAA,IAAI,aAAa,IAAI,EAAE,CAAC;SACzB,CAAC;KACH;AACF;;;;"}
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,12 @@
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');
6
7
  var types = require('./types.cjs');
7
8
  var clawCompletion = require('./clawCompletion.cjs');
8
9
  var ClawProtocolAdaptor = require('./ClawProtocolAdaptor.cjs');
9
10
  var convertHistoryMessage = require('./convertHistoryMessage.cjs');
11
+ var clawPlugin = require('./clawPlugin.cjs');
10
12
 
11
13
  /**
12
14
  * useClawChat Hook
@@ -17,7 +19,8 @@ var convertHistoryMessage = require('./convertHistoryMessage.cjs');
17
19
  */
18
20
  const useClawChat = ({ onAction, onAbort, }) => {
19
21
  const controllerRef = React.useRef(null);
20
- const currentRunIdRef = React.useRef(null);
22
+ const currentRunIdRef = React.useRef([]);
23
+ const clawPluginRef = React.useRef();
21
24
  const pushMessageImplRef = React.useRef(() => { });
22
25
  /**
23
26
  * 推送消息到 Chat 组件
@@ -28,23 +31,26 @@ const useClawChat = ({ onAction, onAbort, }) => {
28
31
  const thread = controllerRef.current?.getCurrentThread();
29
32
  // 更新整个消息历史
30
33
  if (types.isPushStreamStart(msg)) {
31
- currentRunIdRef.current = msg.payload.runId;
34
+ currentRunIdRef.current = lodashEs.uniq([
35
+ ...currentRunIdRef.current,
36
+ msg.payload.runId,
37
+ ]);
32
38
  // 手动设置 sending 状态,显示小圆圈
33
39
  if (thread) {
34
40
  controllerRef.current?.setSending(thread.id, true);
35
41
  }
36
- const assistantMessage = thread?.messages.findLast((message) => message.role === 'assistant');
42
+ debugger;
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
+ debugger;
53
+ currentRunIdRef.current = lodashEs.without(currentRunIdRef.current, msg.payload.runId);
48
54
  // 手动设置 sending 状态,显示小圆圈
49
55
  if (thread) {
50
56
  controllerRef.current?.setSending(thread.id, false);
@@ -67,10 +73,19 @@ const useClawChat = ({ onAction, onAbort, }) => {
67
73
  if (!controllerRef.current) {
68
74
  const state = index.createThreadManagerStateWithDefault();
69
75
  const storeManager = new index.ThreadMessageManager(state);
76
+ const clawPlugin$1 = new clawPlugin.ClawPlugin({
77
+ onSend: async (text) => {
78
+ await onAction({
79
+ message: text,
80
+ });
81
+ },
82
+ });
83
+ clawPluginRef.current = clawPlugin$1;
70
84
  // 创建 completion 函数
71
85
  const { clawCompletion: clawCompletion$1, pushMessageImpl } = clawCompletion.createClawCompletion(onAction, () => {
72
86
  if (currentRunIdRef.current) {
73
- onAbort(currentRunIdRef.current);
87
+ debugger;
88
+ currentRunIdRef.current.forEach((runId) => onAbort(runId));
74
89
  }
75
90
  });
76
91
  pushMessageImplRef.current = pushMessageImpl;
@@ -87,7 +102,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
87
102
  },
88
103
  meta: {
89
104
  shouldSendMessage: true,
90
- shouldReceived: true,
105
+ shouldReceived: false,
91
106
  },
92
107
  // 使用自定义 completion
93
108
  completions: clawCompletion$1,
@@ -101,6 +116,7 @@ const useClawChat = ({ onAction, onAbort, }) => {
101
116
  metaData: index.createMetaData({
102
117
  clawStatus: { status: false, reason: 'uninitialized' },
103
118
  }),
119
+ plugins: [clawPlugin$1],
104
120
  });
105
121
  }
106
122
  const handleClawChatStatus = ahooks.useMemoizedFn((status) => {
@@ -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} from '@chat-lab/core';\nimport { useRef, useState } from 'react';\nimport { useMemoizedFn } from 'ahooks';\nimport { uniq, without } from 'lodash-es';\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';\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 debugger;\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 debugger;\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\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 debugger;\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","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":"AAUA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EAQT,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,iBAkIH,CAAC"}