@copilotkit/vue 2.0.0-rc.20 → 2.0.0-rc.21

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 (193) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.mjs +13 -13
  3. package/dist/use-render-activity-message-BAhbpSDh.js +16200 -0
  4. package/dist/use-render-activity-message-BAhbpSDh.js.map +1 -0
  5. package/dist/use-render-activity-message-DJ6q1qHV.cjs +114 -0
  6. package/dist/use-render-activity-message-DJ6q1qHV.cjs.map +1 -0
  7. package/dist/v2/components/A2UIMessageRenderer.d.ts +14 -0
  8. package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
  9. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts +10 -3
  10. package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
  11. package/dist/v2/components/CopilotKitInspector.vue.d.ts +5 -1
  12. package/dist/v2/components/CopilotKitInspector.vue.d.ts.map +1 -1
  13. package/dist/v2/components/MCPAppsActivityRenderer.d.ts.map +1 -1
  14. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +7 -21
  15. package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
  16. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +0 -5
  17. package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
  18. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +10 -15
  19. package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
  20. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +14 -138
  21. package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -1
  22. package/dist/v2/components/a2ui/catalog.d.ts.map +1 -1
  23. package/dist/v2/components/a2ui/utils.d.ts +3 -15
  24. package/dist/v2/components/a2ui/utils.d.ts.map +1 -1
  25. package/dist/v2/components/a2ui.d.ts +6 -1
  26. package/dist/v2/components/a2ui.d.ts.map +1 -1
  27. package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
  28. package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
  29. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts +4 -8
  30. package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
  31. package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
  32. package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -1
  33. package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
  34. package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -1
  35. package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
  36. package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts.map +1 -1
  37. package/dist/v2/components/chat/CopilotChatView.vue.d.ts +1 -1
  38. package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
  39. package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
  40. package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +1 -1
  41. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +1 -1
  42. package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
  43. package/dist/v2/components/chat/CopilotThreadsDrawer.vue.d.ts.map +1 -1
  44. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts +1 -0
  45. package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
  46. package/dist/v2/components/chat/audioRecorder.d.ts +3 -4
  47. package/dist/v2/components/chat/audioRecorder.d.ts.map +1 -1
  48. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +3 -2
  49. package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
  50. package/dist/v2/components/chat/index.d.ts +6 -6
  51. package/dist/v2/components/chat/tool-call-display-context.d.ts +3 -1
  52. package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -1
  53. package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -1
  54. package/dist/v2/components/chat/types.d.ts +1 -1
  55. package/dist/v2/components/chat/types.d.ts.map +1 -1
  56. package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -1
  57. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts +1 -1
  58. package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -1
  59. package/dist/v2/hooks/use-agent-context.d.ts +2 -3
  60. package/dist/v2/hooks/use-agent-context.d.ts.map +1 -1
  61. package/dist/v2/hooks/use-agent.d.ts +4 -1
  62. package/dist/v2/hooks/use-agent.d.ts.map +1 -1
  63. package/dist/v2/hooks/use-attachments.d.ts +7 -0
  64. package/dist/v2/hooks/use-attachments.d.ts.map +1 -1
  65. package/dist/v2/hooks/use-capabilities.d.ts.map +1 -1
  66. package/dist/v2/hooks/use-component.d.ts +1 -0
  67. package/dist/v2/hooks/use-component.d.ts.map +1 -1
  68. package/dist/v2/hooks/use-configure-suggestions.d.ts +4 -9
  69. package/dist/v2/hooks/use-configure-suggestions.d.ts.map +1 -1
  70. package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
  71. package/dist/v2/hooks/use-human-in-the-loop.d.ts +2 -1
  72. package/dist/v2/hooks/use-human-in-the-loop.d.ts.map +1 -1
  73. package/dist/v2/hooks/use-interrupt.d.ts +0 -1
  74. package/dist/v2/hooks/use-interrupt.d.ts.map +1 -1
  75. package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
  76. package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
  77. package/dist/v2/hooks/use-suggestions.d.ts.map +1 -1
  78. package/dist/v2/hooks/use-threads.d.ts +0 -8
  79. package/dist/v2/hooks/use-threads.d.ts.map +1 -1
  80. package/dist/v2/index.cjs +1 -1
  81. package/dist/v2/index.mjs +1 -1
  82. package/dist/v2/lib/vue-core.d.ts +12 -11
  83. package/dist/v2/lib/vue-core.d.ts.map +1 -1
  84. package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
  85. package/dist/v2/providers/CopilotKitProvider.types.d.ts +9 -124
  86. package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
  87. package/dist/v2/providers/CopilotKitProvider.vue.d.ts +9 -10
  88. package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
  89. package/dist/v2/providers/chat-configuration-store-key.d.ts +8 -0
  90. package/dist/v2/providers/chat-configuration-store-key.d.ts.map +1 -0
  91. package/dist/v2/providers/markdown-renderer.d.ts +3 -1
  92. package/dist/v2/providers/markdown-renderer.d.ts.map +1 -1
  93. package/dist/v2/providers/use-inspector-thread-override.d.ts +5 -0
  94. package/dist/v2/providers/use-inspector-thread-override.d.ts.map +1 -1
  95. package/package.json +8 -8
  96. package/src/v2/__tests__/exports.test.ts +10 -0
  97. package/src/v2/__tests__/mocks/web-inspector.ts +6 -0
  98. package/src/v2/__tests__/utils/test-helpers.ts +34 -4
  99. package/src/v2/components/A2UIMessageRenderer.ts +98 -68
  100. package/src/v2/components/A2UISurfaceActivityRenderer.vue +68 -103
  101. package/src/v2/components/CopilotKitInspector.vue +104 -51
  102. package/src/v2/components/MCPAppsActivityRenderer.ts +75 -201
  103. package/src/v2/components/OpenGenerativeUIRenderer.ts +78 -80
  104. package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +171 -8
  105. package/src/v2/components/__tests__/CopilotKitInspector.test.ts +42 -0
  106. package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +9 -2
  107. package/src/v2/components/__tests__/OpenGenerativeUIToolRenderer.test.ts +38 -0
  108. package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +1 -6
  109. package/src/v2/components/a2ui/A2UICatalogContext.ts +27 -93
  110. package/src/v2/components/a2ui/A2UIRecoveryStates.ts +127 -327
  111. package/src/v2/components/a2ui/catalog.ts +2 -3
  112. package/src/v2/components/a2ui/utils.ts +13 -67
  113. package/src/v2/components/a2ui.ts +14 -21
  114. package/src/v2/components/chat/CopilotChat.vue +136 -324
  115. package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +22 -45
  116. package/src/v2/components/chat/CopilotChatAudioRecorder.vue +19 -246
  117. package/src/v2/components/chat/CopilotChatInput.vue +69 -407
  118. package/src/v2/components/chat/CopilotChatLightbox.vue +10 -31
  119. package/src/v2/components/chat/CopilotChatMessageView.vue +52 -112
  120. package/src/v2/components/chat/CopilotChatToolCallGroup.vue +14 -45
  121. package/src/v2/components/chat/CopilotChatToolCallItem.vue +6 -4
  122. package/src/v2/components/chat/CopilotChatToolCallsView.vue +16 -19
  123. package/src/v2/components/chat/CopilotChatView.vue +28 -23
  124. package/src/v2/components/chat/CopilotPopupViewInternal.vue +21 -97
  125. package/src/v2/components/chat/CopilotSidebarViewInternal.vue +24 -25
  126. package/src/v2/components/chat/CopilotThreadsDrawer.vue +37 -102
  127. package/src/v2/components/chat/StreamingMarkdownDefault.vue +13 -26
  128. package/src/v2/components/chat/__tests__/CopilotChat.test.ts +12 -10
  129. package/src/v2/components/chat/__tests__/CopilotChatAttachmentQueue.test.ts +28 -0
  130. package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +56 -0
  131. package/src/v2/components/chat/__tests__/CopilotPopupView.test.ts +19 -0
  132. package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +32 -8
  133. package/src/v2/components/chat/__tests__/CopilotSidebarView.test.ts +2 -1
  134. package/src/v2/components/chat/__tests__/StreamingMarkdownDefault.test.ts +54 -0
  135. package/src/v2/components/chat/audioRecorder.ts +4 -7
  136. package/src/v2/components/chat/copilotChatToolCallItemRender.ts +22 -71
  137. package/src/v2/components/chat/tool-call-display-context.ts +6 -1
  138. package/src/v2/components/chat/tool-call-group-parts.ts +13 -33
  139. package/src/v2/components/chat/types.ts +1 -1
  140. package/src/v2/components/chat/use-lightbox.ts +15 -33
  141. package/src/v2/hooks/__tests__/use-agent-error-state.test.ts +5 -3
  142. package/src/v2/hooks/__tests__/use-agent-stability.test.ts +25 -4
  143. package/src/v2/hooks/__tests__/use-agent-throttle.test.ts +5 -1
  144. package/src/v2/hooks/__tests__/use-agent.test.ts +6 -3
  145. package/src/v2/hooks/__tests__/use-component.test.ts +21 -0
  146. package/src/v2/hooks/__tests__/use-configure-suggestions.test.ts +30 -1
  147. package/src/v2/hooks/__tests__/use-default-render-tool.test.ts +10 -10
  148. package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +4 -0
  149. package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.ts +6 -1
  150. package/src/v2/hooks/__tests__/use-human-in-the-loop.test.ts +187 -12
  151. package/src/v2/hooks/__tests__/use-interrupt.test.ts +97 -0
  152. package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +2 -1
  153. package/src/v2/hooks/__tests__/use-threads.test.ts +48 -6
  154. package/src/v2/hooks/use-agent-context.ts +4 -10
  155. package/src/v2/hooks/use-agent.ts +86 -290
  156. package/src/v2/hooks/use-attachments.ts +42 -166
  157. package/src/v2/hooks/use-capabilities.ts +2 -7
  158. package/src/v2/hooks/use-component.ts +7 -4
  159. package/src/v2/hooks/use-configure-suggestions.ts +28 -218
  160. package/src/v2/hooks/use-default-render-tool.ts +34 -94
  161. package/src/v2/hooks/use-human-in-the-loop.ts +11 -80
  162. package/src/v2/hooks/use-interrupt.ts +29 -308
  163. package/src/v2/hooks/use-render-activity-message.ts +17 -20
  164. package/src/v2/hooks/use-render-custom-messages.ts +20 -63
  165. package/src/v2/hooks/use-suggestions.ts +9 -33
  166. package/src/v2/hooks/use-threads.ts +43 -273
  167. package/src/v2/lib/__tests__/vue-core-renderers.test.ts +42 -0
  168. package/src/v2/lib/vue-core.ts +67 -72
  169. package/src/v2/providers/CopilotChatConfigurationProvider.vue +48 -186
  170. package/src/v2/providers/CopilotKitProvider.types.ts +12 -127
  171. package/src/v2/providers/CopilotKitProvider.vue +188 -402
  172. package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.ts +22 -2
  173. package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +19 -1
  174. package/src/v2/providers/__tests__/CopilotKitProvider.config.test.ts +124 -0
  175. package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.ts +4 -1
  176. package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +45 -2
  177. package/src/v2/providers/chat-configuration-store-key.ts +9 -0
  178. package/src/v2/providers/markdown-renderer.ts +7 -1
  179. package/src/v2/providers/use-inspector-thread-override.ts +22 -80
  180. package/vite.config.ts +5 -1
  181. package/vitest.config.ts +12 -7
  182. package/dist/use-render-activity-message-CsWYyd6r.cjs +0 -91
  183. package/dist/use-render-activity-message-CsWYyd6r.cjs.map +0 -1
  184. package/dist/use-render-activity-message-DntKKNdd.js +0 -17418
  185. package/dist/use-render-activity-message-DntKKNdd.js.map +0 -1
  186. package/dist/v2/components/chat/normalize-auto-scroll.d.ts +0 -3
  187. package/dist/v2/components/chat/normalize-auto-scroll.d.ts.map +0 -1
  188. package/dist/v2/lib/is-mobile-viewport.d.ts +0 -2
  189. package/dist/v2/lib/is-mobile-viewport.d.ts.map +0 -1
  190. package/src/v2/components/__tests__/A2UICatalogContext.test.ts +0 -63
  191. package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +0 -175
  192. package/src/v2/components/chat/normalize-auto-scroll.ts +0 -3
  193. package/src/v2/lib/is-mobile-viewport.ts +0 -5
@@ -1,10 +1,17 @@
1
1
  import { defineComponent, h, inject, ref } from "vue";
2
2
  import type { WatchSource } from "vue";
3
3
  import type { Component, VNodeChild } from "vue";
4
- import { ToolCallStatus } from "@copilotkit/core";
4
+ import {
5
+ ɵgetToolCallBadge,
6
+ ɵnormalizeToolCallStatus,
7
+ ɵstringifyToolCallAttr,
8
+ ɵstringifyToolCallPayload,
9
+ } from "@copilotkit/core";
10
+ import type { ToolCallStatus } from "@copilotkit/core";
5
11
  import { useRenderTool } from "./use-render-tool";
6
12
  import { ToolCallGroupContextKey } from "../components/chat/tool-call-display-context";
7
13
  import { ToolCallRow } from "../components/chat/tool-call-group-parts";
14
+ import { useChatLabels } from "../components/chat/use-chat-labels";
8
15
 
9
16
  type DefaultRenderProps = {
10
17
  name: string;
@@ -30,24 +37,16 @@ const warnedUnknownStatuses = new Set<string>();
30
37
  function mapToolCallStatus(
31
38
  status: ToolCallStatus,
32
39
  ): DefaultRenderProps["status"] {
33
- switch (status) {
34
- case ToolCallStatus.Complete:
35
- return "complete";
36
- case ToolCallStatus.Executing:
37
- return "executing";
38
- case ToolCallStatus.InProgress:
39
- return "inProgress";
40
- default: {
41
- const key = String(status);
42
- if (!warnedUnknownStatuses.has(key)) {
43
- warnedUnknownStatuses.add(key);
44
- console.warn(
45
- `[CopilotKit] Unknown ToolCallStatus "${key}" in default tool-call renderer; falling back to "inProgress".`,
46
- );
47
- }
48
- return "inProgress";
49
- }
40
+ const normalized = ɵnormalizeToolCallStatus(status);
41
+ if (normalized !== "unknown") return normalized;
42
+ const key = String(status);
43
+ if (!warnedUnknownStatuses.has(key)) {
44
+ warnedUnknownStatuses.add(key);
45
+ console.warn(
46
+ `[CopilotKit] Unknown ToolCallStatus "${key}" in default tool-call renderer; falling back to "inProgress".`,
47
+ );
50
48
  }
49
+ return "inProgress";
51
50
  }
52
51
 
53
52
  /**
@@ -82,30 +81,6 @@ function adaptRendererProps(raw: AdaptInput): DefaultRenderProps {
82
81
  };
83
82
  }
84
83
 
85
- /**
86
- * Guarded JSON.stringify for the expanded `<pre>` blocks. A circular reference
87
- * would otherwise crash the Vue render.
88
- */
89
- function safeStringifyForPre(value: unknown): string {
90
- try {
91
- return JSON.stringify(value, null, 2);
92
- } catch (err) {
93
- console.warn(
94
- "[CopilotKit] Failed to JSON.stringify tool-call payload for default renderer; falling back to String():",
95
- err,
96
- );
97
- try {
98
- return String(value);
99
- } catch (innerErr) {
100
- console.warn(
101
- "[CopilotKit] safeStringifyForPre: value could not be stringified:",
102
- innerErr,
103
- );
104
- return "[unserializable]";
105
- }
106
- }
107
- }
108
-
109
84
  const DefaultToolCallRenderer = defineComponent({
110
85
  props: {
111
86
  name: {
@@ -127,7 +102,7 @@ const DefaultToolCallRenderer = defineComponent({
127
102
  },
128
103
  result: {
129
104
  // Typeless on purpose: the renderer body handles both string results
130
- // and structured (object) results via `safeStringifyForPre`. Declaring
105
+ // and structured (object) results via `ɵstringifyToolCallPayload`. Declaring
131
106
  // `type: String` would trip Vue's dev-mode prop-type warning on every
132
107
  // non-string result and make the defensive branch unreachable.
133
108
  type: null,
@@ -138,42 +113,31 @@ const DefaultToolCallRenderer = defineComponent({
138
113
  setup(props) {
139
114
  const isExpanded = ref(false);
140
115
  const groupContext = inject(ToolCallGroupContextKey, null);
116
+ const labels = useChatLabels();
141
117
 
142
118
  return () => {
143
119
  const group = groupContext?.value;
120
+ // A status a newer runtime could send reads "unknown".
121
+ const cardStatus = ɵnormalizeToolCallStatus(props.status);
144
122
  // Inside a group of calls, a row that fits the group instead of a card.
145
123
  if (group) {
146
124
  return h(ToolCallRow, {
147
125
  "data-testid": "copilot-tool-render",
148
126
  "data-tool-name": props.name,
149
127
  "data-tool-call-id": props.toolCallId,
150
- "data-status": props.status,
151
- "data-args": safeStringifyForAttr(props.parameters),
152
- "data-result": safeStringifyForAttr(props.result),
128
+ "data-status": cardStatus,
129
+ "data-args": ɵstringifyToolCallAttr(props.parameters),
130
+ "data-result": ɵstringifyToolCallAttr(props.result),
153
131
  name: props.name,
154
132
  parameters: props.parameters,
155
133
  result: props.result,
156
- status:
157
- props.status === "complete"
158
- ? group.failedIds.has(props.toolCallId)
159
- ? "failed"
160
- : "done"
161
- : group.active
162
- ? "running"
163
- : "stopped",
134
+ status: group.statusById.get(props.toolCallId) ?? "done",
164
135
  appearance: group.appearance,
165
136
  });
166
137
  }
167
138
 
168
- const isActive =
169
- props.status === "inProgress" || props.status === "executing";
170
- const isComplete = props.status === "complete";
171
- const statusLabel = isActive
172
- ? "Running"
173
- : isComplete
174
- ? "Done"
175
- : props.status;
176
- const tone = isActive ? "running" : isComplete ? "done" : "other";
139
+ const { tone, labelKey } = ɵgetToolCallBadge(cardStatus);
140
+ const statusLabel = labels.value[labelKey];
177
141
 
178
142
  // Markup and classes match React's DefaultToolCallRenderer; styles live
179
143
  // in @copilotkit/core (default-tool-call.css).
@@ -183,9 +147,9 @@ const DefaultToolCallRenderer = defineComponent({
183
147
  "data-testid": "copilot-tool-render",
184
148
  "data-tool-name": props.name,
185
149
  "data-tool-call-id": props.toolCallId,
186
- "data-status": props.status,
187
- "data-args": safeStringifyForAttr(props.parameters),
188
- "data-result": safeStringifyForAttr(props.result),
150
+ "data-status": cardStatus,
151
+ "data-args": ɵstringifyToolCallAttr(props.parameters),
152
+ "data-result": ɵstringifyToolCallAttr(props.result),
189
153
  class: "cpk-default-tool-call",
190
154
  },
191
155
  [
@@ -252,12 +216,12 @@ const DefaultToolCallRenderer = defineComponent({
252
216
  h(
253
217
  "div",
254
218
  { class: "cpk-default-tool-call-label" },
255
- "Arguments",
219
+ labels.value.toolCallArgumentsLabel,
256
220
  ),
257
221
  h(
258
222
  "pre",
259
223
  { class: "cpk-default-tool-call-code" },
260
- safeStringifyForPre(props.parameters ?? {}),
224
+ ɵstringifyToolCallPayload(props.parameters ?? {}),
261
225
  ),
262
226
  ]),
263
227
  props.result !== undefined
@@ -265,14 +229,12 @@ const DefaultToolCallRenderer = defineComponent({
265
229
  h(
266
230
  "div",
267
231
  { class: "cpk-default-tool-call-label" },
268
- "Result",
232
+ labels.value.toolCallResultLabel,
269
233
  ),
270
234
  h(
271
235
  "pre",
272
236
  { class: "cpk-default-tool-call-code" },
273
- typeof props.result === "string"
274
- ? props.result
275
- : safeStringifyForPre(props.result),
237
+ ɵstringifyToolCallPayload(props.result),
276
238
  ),
277
239
  ])
278
240
  : null,
@@ -285,28 +247,6 @@ const DefaultToolCallRenderer = defineComponent({
285
247
  },
286
248
  });
287
249
 
288
- function safeStringifyForAttr(value: unknown): string {
289
- if (value === undefined || value === null) return "";
290
- if (typeof value === "string") return value;
291
- try {
292
- return JSON.stringify(value);
293
- } catch (err) {
294
- console.warn(
295
- "[CopilotKit] Failed to JSON.stringify tool-call payload for data-* attribute; falling back to String():",
296
- err,
297
- );
298
- try {
299
- return String(value);
300
- } catch (innerErr) {
301
- console.warn(
302
- "[CopilotKit] safeStringifyForAttr: value could not be stringified:",
303
- innerErr,
304
- );
305
- return "";
306
- }
307
- }
308
- }
309
-
310
250
  export function useDefaultRenderTool(
311
251
  config?: {
312
252
  render?:
@@ -1,7 +1,7 @@
1
- import { onScopeDispose, ref } from "vue";
1
+ import { onScopeDispose } from "vue";
2
2
  import type { WatchSource } from "vue";
3
3
  import { h } from "vue";
4
- import { ToolCallStatus } from "@copilotkit/core";
4
+ import { ɵbuildHumanInTheLoopTool, ɵhitlRenderProps } from "@copilotkit/core";
5
5
  import { useCopilotKit } from "../providers/useCopilotKit";
6
6
  import { useFrontendTool } from "./use-frontend-tool";
7
7
  import type {
@@ -15,7 +15,8 @@ import type {
15
15
  * Registers a human-in-the-loop frontend tool.
16
16
  *
17
17
  * The tool pauses execution until `respond` is called from the rendered
18
- * component during the `executing` phase.
18
+ * component during the `executing` phase. Each call waits on its own
19
+ * `respond`, so parallel calls of one tool stay independent.
19
20
  *
20
21
  * @example
21
22
  * ```ts
@@ -31,88 +32,18 @@ export function useHumanInTheLoop<T extends Record<string, unknown>>(
31
32
  deps?: WatchSource<unknown>[],
32
33
  ) {
33
34
  const { copilotkit } = useCopilotKit();
34
- const resolvePromiseRef = ref<((result: unknown) => void) | null>(null);
35
- const rejectPromiseRef = ref<((error: unknown) => void) | null>(null);
36
- const cleanupAbortRef = ref<(() => void) | null>(null);
37
-
38
- const respond = async (result: unknown) => {
39
- if (resolvePromiseRef.value) {
40
- cleanupAbortRef.value?.();
41
- cleanupAbortRef.value = null;
42
- resolvePromiseRef.value(result);
43
- resolvePromiseRef.value = null;
44
- rejectPromiseRef.value = null;
45
- }
46
- };
47
-
48
- const handler = async (_args: T, context?: { signal?: AbortSignal }) => {
49
- const signal = context?.signal;
50
- return new Promise((resolve, reject) => {
51
- if (signal?.aborted) {
52
- reject(new Error("Human-in-the-loop interaction aborted"));
53
- return;
54
- }
55
-
56
- resolvePromiseRef.value = resolve;
57
- rejectPromiseRef.value = reject;
58
-
59
- if (signal) {
60
- const onAbort = () => {
61
- cleanupAbortRef.value = null;
62
- resolvePromiseRef.value = null;
63
- const rejectPending = rejectPromiseRef.value;
64
- rejectPromiseRef.value = null;
65
- rejectPending?.(new Error("Human-in-the-loop interaction aborted"));
66
- };
67
-
68
- signal.addEventListener("abort", onAbort, { once: true });
69
- cleanupAbortRef.value = () => {
70
- signal.removeEventListener("abort", onAbort);
71
- };
72
- }
73
- });
74
- };
35
+ const registry = () => copilotkit.value.ɵhumanInTheLoop;
75
36
 
76
37
  const RenderComponent: VueToolCallRenderer<T>["render"] = (
77
38
  props: VueToolCallRendererRenderProps<T>,
78
- ) => {
79
- const ToolComponent = tool.render;
80
- if (props.status === ToolCallStatus.InProgress) {
81
- return h(ToolComponent as Parameters<typeof h>[0], {
82
- ...props,
83
- name: tool.name,
84
- description: tool.description || "",
85
- agentId: tool.agentId,
86
- respond: undefined,
87
- });
88
- }
89
- if (props.status === ToolCallStatus.Executing) {
90
- return h(ToolComponent as Parameters<typeof h>[0], {
91
- ...props,
92
- name: tool.name,
93
- description: tool.description || "",
94
- agentId: tool.agentId,
95
- respond,
96
- });
97
- }
98
- if (props.status === ToolCallStatus.Complete) {
99
- return h(ToolComponent as Parameters<typeof h>[0], {
100
- ...props,
101
- name: tool.name,
102
- description: tool.description || "",
103
- agentId: tool.agentId,
104
- respond: undefined,
105
- });
106
- }
107
-
108
- const exhaustiveCheck: never = props;
109
- return exhaustiveCheck;
110
- };
39
+ ) =>
40
+ h(
41
+ tool.render as Parameters<typeof h>[0],
42
+ ɵhitlRenderProps<T, typeof props>(props, tool, registry()),
43
+ );
111
44
 
112
45
  const frontendTool: VueFrontendTool<T> = {
113
- ...tool,
114
- type: "human-in-the-loop",
115
- handler,
46
+ ...ɵbuildHumanInTheLoopTool<T>(tool, registry),
116
47
  render: RenderComponent,
117
48
  };
118
49