@agent-native/toolkit 0.200.0 → 0.200.1-nightly-20261002213029

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 (133) hide show
  1. package/dist/app/chat/AgentKitAssistantChat.js +2 -0
  2. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  3. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  4. package/dist/app/chat/AgentPanel.js +12 -99
  5. package/dist/app/chat/AgentPanel.js.map +1 -1
  6. package/dist/app/chat/ConnectBuilderCard.js +2 -2
  7. package/dist/app/chat/ConnectBuilderCard.js.map +1 -1
  8. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  9. package/dist/app/i18n/catalogs/ar-SA.js +36 -26
  10. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  11. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  12. package/dist/app/i18n/catalogs/de-DE.js +36 -26
  13. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  14. package/dist/app/i18n/catalogs/en-US.d.ts +36 -26
  15. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  16. package/dist/app/i18n/catalogs/en-US.js +36 -26
  17. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  18. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  19. package/dist/app/i18n/catalogs/es-ES.js +36 -26
  20. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  21. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  22. package/dist/app/i18n/catalogs/fr-FR.js +36 -26
  23. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  24. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  25. package/dist/app/i18n/catalogs/hi-IN.js +36 -26
  26. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  27. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  28. package/dist/app/i18n/catalogs/ja-JP.js +36 -26
  29. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  30. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  31. package/dist/app/i18n/catalogs/ko-KR.js +36 -26
  32. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  33. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  34. package/dist/app/i18n/catalogs/pt-BR.js +36 -26
  35. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  36. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  37. package/dist/app/i18n/catalogs/zh-CN.js +36 -26
  38. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  39. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  40. package/dist/app/i18n/catalogs/zh-TW.js +36 -26
  41. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  42. package/dist/app/onboarding/FirstRunOnboarding.d.ts.map +1 -1
  43. package/dist/app/onboarding/FirstRunOnboarding.js +3 -5
  44. package/dist/app/onboarding/FirstRunOnboarding.js.map +1 -1
  45. package/dist/app/onboarding/NewWorkspaceAppFlow.d.ts.map +1 -1
  46. package/dist/app/onboarding/NewWorkspaceAppFlow.js +4 -2
  47. package/dist/app/onboarding/NewWorkspaceAppFlow.js.map +1 -1
  48. package/dist/app/onboarding/OnboardingPanel.d.ts.map +1 -1
  49. package/dist/app/onboarding/OnboardingPanel.js +3 -1
  50. package/dist/app/onboarding/OnboardingPanel.js.map +1 -1
  51. package/dist/app/settings/BuilderConnectPopover.d.ts +1 -0
  52. package/dist/app/settings/BuilderConnectPopover.d.ts.map +1 -1
  53. package/dist/app/settings/BuilderConnectPopover.js +11 -4
  54. package/dist/app/settings/BuilderConnectPopover.js.map +1 -1
  55. package/dist/app/settings/SettingsPanel.d.ts.map +1 -1
  56. package/dist/app/settings/SettingsPanel.js +16 -8
  57. package/dist/app/settings/SettingsPanel.js.map +1 -1
  58. package/dist/app/settings/VoiceTranscriptionSection.d.ts.map +1 -1
  59. package/dist/app/settings/VoiceTranscriptionSection.js +7 -6
  60. package/dist/app/settings/VoiceTranscriptionSection.js.map +1 -1
  61. package/dist/app/settings/infra/InfrastructureSettingsPage.js +2 -2
  62. package/dist/app/settings/infra/InfrastructureSettingsPage.js.map +1 -1
  63. package/dist/app/settings/model/ModelSettingsPage.js +4 -2
  64. package/dist/app/settings/model/ModelSettingsPage.js.map +1 -1
  65. package/dist/app/settings/useBuilderStatus.d.ts +1 -0
  66. package/dist/app/settings/useBuilderStatus.d.ts.map +1 -1
  67. package/dist/app/settings/useBuilderStatus.js +43 -29
  68. package/dist/app/settings/useBuilderStatus.js.map +1 -1
  69. package/dist/app/setup-connections/SetupConnectionsPage.d.ts.map +1 -1
  70. package/dist/app/setup-connections/SetupConnectionsPage.js +4 -2
  71. package/dist/app/setup-connections/SetupConnectionsPage.js.map +1 -1
  72. package/dist/app/setup-connections/useBuilderConnectCardController.d.ts +1 -1
  73. package/dist/app/setup-connections/useBuilderConnectCardController.d.ts.map +1 -1
  74. package/dist/app/setup-connections/useBuilderConnectCardController.js +7 -6
  75. package/dist/app/setup-connections/useBuilderConnectCardController.js.map +1 -1
  76. package/dist/app/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
  77. package/dist/app/transcription/BuilderTranscriptionCta.js +3 -1
  78. package/dist/app/transcription/BuilderTranscriptionCta.js.map +1 -1
  79. package/dist/composer/MessageQueueDrawer.d.ts +1 -1
  80. package/dist/composer/MessageQueueDrawer.d.ts.map +1 -1
  81. package/dist/composer/MessageQueueDrawer.js +10 -1
  82. package/dist/composer/MessageQueueDrawer.js.map +1 -1
  83. package/dist/composer/PromptComposer.d.ts +1 -1
  84. package/dist/composer/TiptapComposer.d.ts +1 -1
  85. package/dist/composer/TiptapComposer.js +4 -4
  86. package/dist/composer/TiptapComposer.js.map +1 -1
  87. package/dist/composer/useRealtimeVoiceMode.js +2 -2
  88. package/dist/composer/useRealtimeVoiceMode.js.map +1 -1
  89. package/package.json +4 -4
  90. package/src/app/chat/AgentKitAssistantChat.spec.tsx +30 -5
  91. package/src/app/chat/AgentKitAssistantChat.tsx +1 -0
  92. package/src/app/chat/AgentPanel.tsx +33 -112
  93. package/src/app/chat/ConnectBuilderCard.tsx +2 -2
  94. package/src/app/chat/chat/run-recovery.spec.tsx +8 -8
  95. package/src/app/i18n/catalogs/ar-SA.ts +46 -26
  96. package/src/app/i18n/catalogs/de-DE.ts +47 -26
  97. package/src/app/i18n/catalogs/en-US.ts +47 -26
  98. package/src/app/i18n/catalogs/es-ES.ts +47 -26
  99. package/src/app/i18n/catalogs/fr-FR.ts +48 -26
  100. package/src/app/i18n/catalogs/hi-IN.ts +47 -26
  101. package/src/app/i18n/catalogs/ja-JP.ts +47 -26
  102. package/src/app/i18n/catalogs/ko-KR.ts +47 -26
  103. package/src/app/i18n/catalogs/pt-BR.ts +48 -26
  104. package/src/app/i18n/catalogs/zh-CN.ts +47 -26
  105. package/src/app/i18n/catalogs/zh-TW.ts +47 -26
  106. package/src/app/integrations/BuilderIntegrationPage.spec.tsx +11 -7
  107. package/src/app/onboarding/FirstRunOnboarding.spec.tsx +24 -12
  108. package/src/app/onboarding/FirstRunOnboarding.tsx +14 -16
  109. package/src/app/onboarding/NewWorkspaceAppFlow.spec.ts +23 -7
  110. package/src/app/onboarding/NewWorkspaceAppFlow.tsx +4 -2
  111. package/src/app/onboarding/OnboardingPanel.tsx +4 -8
  112. package/src/app/settings/BuilderConnectPopover.spec.tsx +41 -1
  113. package/src/app/settings/BuilderConnectPopover.tsx +21 -4
  114. package/src/app/settings/SettingsPanel.connections.spec.tsx +2 -2
  115. package/src/app/settings/SettingsPanel.tsx +16 -8
  116. package/src/app/settings/VoiceTranscriptionSection.tsx +8 -7
  117. package/src/app/settings/infra/InfrastructureSettingsPage.spec.tsx +4 -4
  118. package/src/app/settings/infra/InfrastructureSettingsPage.tsx +5 -2
  119. package/src/app/settings/model/ModelSettingsPage.spec.tsx +7 -5
  120. package/src/app/settings/model/ModelSettingsPage.tsx +4 -2
  121. package/src/app/settings/useBuilderStatus.spec.tsx +82 -52
  122. package/src/app/settings/useBuilderStatus.ts +44 -54
  123. package/src/app/setup-connections/BuilderConnectCard.spec.tsx +11 -11
  124. package/src/app/setup-connections/SetupConnectionsPage.tsx +4 -2
  125. package/src/app/setup-connections/useBuilderConnectCardController.spec.tsx +19 -6
  126. package/src/app/setup-connections/useBuilderConnectCardController.ts +10 -9
  127. package/src/app/transcription/BuilderTranscriptionCta.tsx +4 -2
  128. package/src/composer/MessageQueueDrawer.spec.tsx +108 -0
  129. package/src/composer/MessageQueueDrawer.tsx +22 -2
  130. package/src/composer/PromptComposer.tsx +1 -1
  131. package/src/composer/RealtimeVoiceMode.spec.tsx +4 -4
  132. package/src/composer/TiptapComposer.tsx +5 -5
  133. package/src/composer/useRealtimeVoiceMode.tsx +2 -2
@@ -1,9 +1,11 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
+ import { AgentNativeI18nProvider } from "@agent-native/core/client/i18n";
3
4
  import React, { act } from "react";
4
5
  import { createRoot, type Root } from "react-dom/client";
5
6
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
7
 
8
+ import { createToolkitI18nCatalog } from "../i18n.js";
7
9
  import {
8
10
  useBuilderConnectCardController,
9
11
  type BuilderConnectCardControllerOptions,
@@ -19,6 +21,8 @@ vi.mock("../settings/useBuilderStatus.js", () => ({
19
21
  useBuilderConnectFlow: mocks.useBuilderConnectFlow,
20
22
  }));
21
23
 
24
+ const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
25
+
22
26
  describe("useBuilderConnectCardController", () => {
23
27
  let container: HTMLDivElement;
24
28
  let root: Root;
@@ -57,7 +61,16 @@ describe("useBuilderConnectCardController", () => {
57
61
  }
58
62
 
59
63
  function render(options?: BuilderConnectCardControllerOptions) {
60
- act(() => root.render(<Harness options={options} />));
64
+ act(() =>
65
+ root.render(
66
+ <AgentNativeI18nProvider
67
+ catalog={toolkitI18nCatalog}
68
+ persistPreference={false}
69
+ >
70
+ <Harness options={options} />
71
+ </AgentNativeI18nProvider>,
72
+ ),
73
+ );
61
74
  expect(viewModel).toBeDefined();
62
75
  return viewModel as BuilderConnectCardViewModel;
63
76
  }
@@ -66,16 +79,16 @@ describe("useBuilderConnectCardController", () => {
66
79
  const result = render();
67
80
 
68
81
  expect(result).toMatchObject({
69
- title: "Builder connect",
82
+ title: "Use Builder.io",
70
83
  description:
71
- "Connect Builder.io for managed model access, browser automation, and workspace identity. Free tier available.",
84
+ "Model access, browser automation, file storage, and workspace identity. Free tier available.",
72
85
  status: { kind: "ready", label: "Ready to connect" },
73
86
  configured: false,
74
87
  pending: false,
75
88
  error: null,
76
89
  orgName: null,
77
90
  action: {
78
- label: "Connect Builder.io",
91
+ label: "Use Builder.io",
79
92
  pending: false,
80
93
  disabled: false,
81
94
  },
@@ -166,7 +179,7 @@ describe("useBuilderConnectCardController", () => {
166
179
  configured: false,
167
180
  status: { kind: "ready" },
168
181
  scope: "personal",
169
- action: { label: "Connect Builder.io" },
182
+ action: { label: "Use Builder.io" },
170
183
  });
171
184
 
172
185
  act(() => result.action?.onPress(true));
@@ -231,7 +244,7 @@ describe("useBuilderConnectCardController", () => {
231
244
 
232
245
  expect(render({ scope: "personal" })).toMatchObject({
233
246
  configured: false,
234
- action: { label: "Connect Builder.io" },
247
+ action: { label: "Use Builder.io" },
235
248
  });
236
249
  });
237
250
  });
@@ -1,3 +1,4 @@
1
+ import { useT } from "@agent-native/core/client/i18n";
1
2
  import { useCallback } from "react";
2
3
 
3
4
  import {
@@ -6,9 +7,6 @@ import {
6
7
  type BuilderConnectionScope,
7
8
  } from "../settings/useBuilderStatus.js";
8
9
 
9
- const DEFAULT_TITLE = "Builder connect";
10
- const DEFAULT_DESCRIPTION =
11
- "Connect Builder.io for managed model access, browser automation, and workspace identity. Free tier available.";
12
10
  const DEFAULT_TRACKING_SOURCE = "setup_connections_page";
13
11
 
14
12
  export interface BuilderConnectCardControllerOptions {
@@ -30,7 +28,7 @@ export type BuilderConnectCardStatus =
30
28
  | { kind: "connected"; label: string };
31
29
 
32
30
  export interface BuilderConnectCardAction {
33
- label: "Connect Builder.io";
31
+ label: string;
34
32
  pending: boolean;
35
33
  disabled: boolean;
36
34
  onPress: (provisionAccount?: boolean) => void;
@@ -58,12 +56,13 @@ function isScopeConnected(
58
56
  }
59
57
 
60
58
  export function useBuilderConnectCardController({
61
- title = DEFAULT_TITLE,
62
- description = DEFAULT_DESCRIPTION,
59
+ title,
60
+ description,
63
61
  trackingSource = DEFAULT_TRACKING_SOURCE,
64
62
  onConnected,
65
63
  scope,
66
64
  }: BuilderConnectCardControllerOptions = {}): BuilderConnectCardViewModel {
65
+ const t = useT();
67
66
  const handleConnected = useCallback(
68
67
  ({ orgName }: { orgName: string | null }) => onConnected?.(orgName),
69
68
  [onConnected],
@@ -91,8 +90,10 @@ export function useBuilderConnectCardController({
91
90
  : { kind: "ready", label: "Ready to connect" };
92
91
 
93
92
  return {
94
- title,
95
- description,
93
+ title: title ?? t("agentChat.setup.connectBuilder"),
94
+ description:
95
+ description ??
96
+ t("agentChat.settingsShell.integrations.builderDescription"),
96
97
  status,
97
98
  configured,
98
99
  pending: flow.connecting,
@@ -103,7 +104,7 @@ export function useBuilderConnectCardController({
103
104
  configured || !canConnect
104
105
  ? null
105
106
  : {
106
- label: "Connect Builder.io",
107
+ label: t("agentChat.setup.connectBuilder"),
107
108
  pending: flow.connecting,
108
109
  disabled: flow.connecting,
109
110
  onPress: handlePress,
@@ -31,7 +31,7 @@ export function BuilderTranscriptionCta() {
31
31
  ? "Waiting for Builder.io…"
32
32
  : statusUnavailable
33
33
  ? "Builder status unavailable. Try again."
34
- : "Connect Builder.io for higher-quality transcription — free credits, no API key needed."}
34
+ : t("agentChat.transcription.builderCtaDescription")}
35
35
  </span>
36
36
  {flow.error && (
37
37
  <span className="text-destructive text-[10px]">{flow.error}</span>
@@ -56,7 +56,9 @@ export function BuilderTranscriptionCta() {
56
56
  disabled={flow.connecting}
57
57
  className="ml-auto shrink-0 inline-flex items-center gap-1 rounded bg-foreground px-2 py-1 text-[10px] font-semibold text-background transition-opacity hover:opacity-90 disabled:cursor-wait disabled:opacity-60"
58
58
  >
59
- {statusUnavailable || flow.error ? "Retry" : "Connect"}
59
+ {statusUnavailable || flow.error
60
+ ? "Retry"
61
+ : t("agentChat.setup.connectBuilder")}
60
62
  </button>
61
63
  </DeferredBuilderConnectPopover>
62
64
  )}
@@ -121,6 +121,114 @@ describe("MessageQueueDrawer", () => {
121
121
  expect(onMoveToTop).toHaveBeenCalledWith(items[0]);
122
122
  });
123
123
 
124
+ it("keeps only the last queue-row action menu open", async () => {
125
+ const multipleItems = [
126
+ ...items,
127
+ { id: "third", text: "Write the follow-up" },
128
+ ];
129
+
130
+ act(() => {
131
+ root.render(
132
+ <MessageQueueDrawer
133
+ items={multipleItems}
134
+ labels={labels}
135
+ onRemove={() => undefined}
136
+ getItemActions={(item) => [
137
+ {
138
+ id: "move-to-top",
139
+ label: `Move ${item.id} to top`,
140
+ onSelect: () => undefined,
141
+ },
142
+ ]}
143
+ />,
144
+ );
145
+ });
146
+
147
+ const moreButtons = Array.from(
148
+ container.querySelectorAll<HTMLButtonElement>(
149
+ 'button[aria-label="More actions"]',
150
+ ),
151
+ );
152
+
153
+ await act(async () => {
154
+ for (const button of moreButtons) {
155
+ button.dispatchEvent(
156
+ new PointerEvent("pointerdown", {
157
+ bubbles: true,
158
+ button: 0,
159
+ pointerType: "mouse",
160
+ }),
161
+ );
162
+ }
163
+ await Promise.resolve();
164
+ });
165
+
166
+ const openMenus = document.querySelectorAll('[role="menu"]');
167
+ expect(openMenus).toHaveLength(1);
168
+ expect(openMenus[0]?.textContent).toContain("Move third to top");
169
+ });
170
+
171
+ it("does not reopen a queue-row menu after its row or actions disappear", async () => {
172
+ const getItemActions = (item: MessageQueueItem) => [
173
+ {
174
+ id: "move-to-top",
175
+ label: `Move ${item.id} to top`,
176
+ onSelect: () => undefined,
177
+ },
178
+ ];
179
+
180
+ const renderQueue = (
181
+ queueItems: readonly MessageQueueItem[] = items,
182
+ actions: typeof getItemActions | (() => []) = getItemActions,
183
+ ) => {
184
+ act(() => {
185
+ root.render(
186
+ <MessageQueueDrawer
187
+ items={queueItems}
188
+ labels={labels}
189
+ onRemove={() => undefined}
190
+ getItemActions={actions}
191
+ />,
192
+ );
193
+ });
194
+ };
195
+ const openFirstMenu = async () => {
196
+ const button = container.querySelector<HTMLButtonElement>(
197
+ 'button[aria-label="More actions"]',
198
+ );
199
+ await act(async () => {
200
+ button?.dispatchEvent(
201
+ new PointerEvent("pointerdown", {
202
+ bubbles: true,
203
+ button: 0,
204
+ pointerType: "mouse",
205
+ }),
206
+ );
207
+ await Promise.resolve();
208
+ });
209
+ expect(document.querySelector('[role="menu"]')).not.toBeNull();
210
+ };
211
+
212
+ renderQueue();
213
+ await openFirstMenu();
214
+ renderQueue(items.slice(0, 1));
215
+ expect(document.querySelector('[role="menu"]')).toBeNull();
216
+ renderQueue();
217
+ expect(document.querySelector('[role="menu"]')).toBeNull();
218
+
219
+ await openFirstMenu();
220
+ renderQueue(items.slice(1));
221
+ expect(document.querySelector('[role="menu"]')).toBeNull();
222
+ renderQueue();
223
+ expect(document.querySelector('[role="menu"]')).toBeNull();
224
+
225
+ await openFirstMenu();
226
+ renderQueue(items, () => []);
227
+ expect(document.querySelector('[role="menu"]')).toBeNull();
228
+ renderQueue();
229
+ expect(document.querySelector('[role="menu"]')).toBeNull();
230
+ });
231
+
124
232
  it("collapses the recessed queue into the composer workflow", () => {
125
233
  act(() => {
126
234
  root.render(
@@ -1,5 +1,5 @@
1
1
  import { IconCornerDownRight, IconDots, IconTrash } from "@tabler/icons-react";
2
- import type { CSSProperties, ReactNode } from "react";
2
+ import { useEffect, useState, type CSSProperties, type ReactNode } from "react";
3
3
 
4
4
  import { Button } from "../ui/button.js";
5
5
  import {
@@ -82,6 +82,19 @@ export function MessageQueueDrawer({
82
82
  }: MessageQueueDrawerProps) {
83
83
  const recessed = variant === "recessed";
84
84
  const empty = items.length === 0;
85
+ const [openActionsItemId, setOpenActionsItemId] = useState<string | null>(
86
+ null,
87
+ );
88
+ useEffect(() => {
89
+ const hasOpenActionsItem =
90
+ items.length > 1 &&
91
+ items.some(
92
+ (item) =>
93
+ item.id === openActionsItemId &&
94
+ (getItemActions?.(item).length ?? 0) > 0,
95
+ );
96
+ if (!hasOpenActionsItem) setOpenActionsItemId(null);
97
+ }, [items, getItemActions, openActionsItemId]);
85
98
  if (empty && !recessed) return null;
86
99
 
87
100
  const recessedStyle = recessed
@@ -186,7 +199,14 @@ export function MessageQueueDrawer({
186
199
  <TooltipContent>{labels.remove}</TooltipContent>
187
200
  </Tooltip>
188
201
  {items.length > 1 && actions.length > 0 ? (
189
- <DropdownMenu>
202
+ <DropdownMenu
203
+ open={openActionsItemId === item.id}
204
+ onOpenChange={(open) =>
205
+ setOpenActionsItemId((current) =>
206
+ open ? item.id : current === item.id ? null : current,
207
+ )
208
+ }
209
+ >
190
210
  <Tooltip>
191
211
  <TooltipTrigger asChild>
192
212
  <DropdownMenuTrigger asChild>
@@ -253,7 +253,7 @@ export interface PromptComposerProps {
253
253
  ) => void;
254
254
  /**
255
255
  * Override the Builder.io connect action in the model picker. When provided,
256
- * clicking "Connect Builder.io" calls this instead of opening a browser popup.
256
+ * clicking "Use Builder.io" calls this instead of opening a browser popup.
257
257
  * Used by the Electron desktop app to route through the native IPC handler.
258
258
  */
259
259
  onConnectProvider?: () => void;
@@ -19,8 +19,8 @@ const copy: RealtimeVoiceModeCopy = {
19
19
  "Voice mode keeps listening while the agent navigates and takes actions.",
20
20
  setupTitle: "Set up voice mode",
21
21
  setupDescription:
22
- "Connect Builder.io to use managed voice with free credits, or add your own keys.",
23
- connectBuilder: "Connect Builder.io",
22
+ "Use Builder.io for managed voice with free credits, or add your own keys.",
23
+ connectBuilder: "Use Builder.io",
24
24
  useOpenAiKey: "Add your own keys",
25
25
  startWithOpenAiKey: "Start with OpenAI key",
26
26
  startVoiceMode: "Start voice chat",
@@ -333,11 +333,11 @@ describe("RealtimeVoiceMode", () => {
333
333
  document.querySelectorAll<HTMLButtonElement>("button"),
334
334
  );
335
335
  expect(
336
- buttons.find((button) => button.textContent === "Connect Builder.io"),
336
+ buttons.find((button) => button.textContent === "Use Builder.io"),
337
337
  ).toBeDefined();
338
338
  act(() =>
339
339
  buttons
340
- .find((button) => button.textContent === "Connect Builder.io")
340
+ .find((button) => button.textContent === "Use Builder.io")
341
341
  ?.click(),
342
342
  );
343
343
  // No consent popover is wired here, so the click signs in instead of
@@ -1101,7 +1101,7 @@ export interface TiptapComposerProps {
1101
1101
  providerConnectStatusEnabled?: boolean;
1102
1102
  /**
1103
1103
  * Override the Builder.io connect action in the model picker. When provided,
1104
- * clicking "Connect Builder.io" calls this instead of opening a browser popup.
1104
+ * clicking "Use Builder.io" calls this instead of opening a browser popup.
1105
1105
  * Used by the Electron desktop app to route through the native IPC handler.
1106
1106
  */
1107
1107
  onConnectProvider?: () => void;
@@ -2274,10 +2274,10 @@ function ModelSelector({
2274
2274
  {builderFlow.connecting
2275
2275
  ? t("agentPanel.connectingBuilder", {
2276
2276
  defaultValue:
2277
- "Connecting Builder.io…",
2277
+ "Setting up Builder.io…",
2278
2278
  })
2279
2279
  : t("agentPanel.connectBuilderIo", {
2280
- defaultValue: "Connect Builder.io",
2280
+ defaultValue: "Use Builder.io",
2281
2281
  })}
2282
2282
  </span>
2283
2283
  <span className="block text-[11px] text-muted-foreground">
@@ -2312,10 +2312,10 @@ function ModelSelector({
2312
2312
  {builderFlow.connecting
2313
2313
  ? t("agentPanel.connectingBuilder", {
2314
2314
  defaultValue:
2315
- "Connecting Builder.io…",
2315
+ "Setting up Builder.io…",
2316
2316
  })
2317
2317
  : t("agentPanel.connectBuilderIo", {
2318
- defaultValue: "Connect Builder.io",
2318
+ defaultValue: "Use Builder.io",
2319
2319
  })}
2320
2320
  </span>
2321
2321
  <span className="block text-[11px] text-muted-foreground">
@@ -1327,10 +1327,10 @@ function voiceCopy(t: ComposerTranslate): RealtimeVoiceModeCopy {
1327
1327
  }),
1328
1328
  setupDescription: t("agentChat.voiceMode.setupDescription", {
1329
1329
  defaultValue:
1330
- "Connect Builder.io to use managed voice with free credits, or add your own keys.",
1330
+ "Use Builder.io for managed voice with free credits, or add your own keys.",
1331
1331
  }),
1332
1332
  connectBuilder: t("agentChat.voiceMode.connectBuilder", {
1333
- defaultValue: "Connect Builder.io",
1333
+ defaultValue: "Use Builder.io",
1334
1334
  }),
1335
1335
  useOpenAiKey: t("agentChat.voiceMode.useOpenAiKey", {
1336
1336
  defaultValue: "Add your own keys",