@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.
- package/dist/app/chat/AgentKitAssistantChat.js +2 -0
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/AgentPanel.d.ts.map +1 -1
- package/dist/app/chat/AgentPanel.js +12 -99
- package/dist/app/chat/AgentPanel.js.map +1 -1
- package/dist/app/chat/ConnectBuilderCard.js +2 -2
- package/dist/app/chat/ConnectBuilderCard.js.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +36 -26
- package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.js +36 -26
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +36 -26
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +36 -26
- package/dist/app/i18n/catalogs/en-US.js.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.js +36 -26
- package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.js +36 -26
- package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.js +36 -26
- package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.js +36 -26
- package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.js +36 -26
- package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.js +36 -26
- package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.js +36 -26
- package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.js +36 -26
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/onboarding/FirstRunOnboarding.d.ts.map +1 -1
- package/dist/app/onboarding/FirstRunOnboarding.js +3 -5
- package/dist/app/onboarding/FirstRunOnboarding.js.map +1 -1
- package/dist/app/onboarding/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/app/onboarding/NewWorkspaceAppFlow.js +4 -2
- package/dist/app/onboarding/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/app/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/app/onboarding/OnboardingPanel.js +3 -1
- package/dist/app/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/app/settings/BuilderConnectPopover.d.ts +1 -0
- package/dist/app/settings/BuilderConnectPopover.d.ts.map +1 -1
- package/dist/app/settings/BuilderConnectPopover.js +11 -4
- package/dist/app/settings/BuilderConnectPopover.js.map +1 -1
- package/dist/app/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/app/settings/SettingsPanel.js +16 -8
- package/dist/app/settings/SettingsPanel.js.map +1 -1
- package/dist/app/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/app/settings/VoiceTranscriptionSection.js +7 -6
- package/dist/app/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/app/settings/infra/InfrastructureSettingsPage.js +2 -2
- package/dist/app/settings/infra/InfrastructureSettingsPage.js.map +1 -1
- package/dist/app/settings/model/ModelSettingsPage.js +4 -2
- package/dist/app/settings/model/ModelSettingsPage.js.map +1 -1
- package/dist/app/settings/useBuilderStatus.d.ts +1 -0
- package/dist/app/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/app/settings/useBuilderStatus.js +43 -29
- package/dist/app/settings/useBuilderStatus.js.map +1 -1
- package/dist/app/setup-connections/SetupConnectionsPage.d.ts.map +1 -1
- package/dist/app/setup-connections/SetupConnectionsPage.js +4 -2
- package/dist/app/setup-connections/SetupConnectionsPage.js.map +1 -1
- package/dist/app/setup-connections/useBuilderConnectCardController.d.ts +1 -1
- package/dist/app/setup-connections/useBuilderConnectCardController.d.ts.map +1 -1
- package/dist/app/setup-connections/useBuilderConnectCardController.js +7 -6
- package/dist/app/setup-connections/useBuilderConnectCardController.js.map +1 -1
- package/dist/app/transcription/BuilderTranscriptionCta.d.ts.map +1 -1
- package/dist/app/transcription/BuilderTranscriptionCta.js +3 -1
- package/dist/app/transcription/BuilderTranscriptionCta.js.map +1 -1
- package/dist/composer/MessageQueueDrawer.d.ts +1 -1
- package/dist/composer/MessageQueueDrawer.d.ts.map +1 -1
- package/dist/composer/MessageQueueDrawer.js +10 -1
- package/dist/composer/MessageQueueDrawer.js.map +1 -1
- package/dist/composer/PromptComposer.d.ts +1 -1
- package/dist/composer/TiptapComposer.d.ts +1 -1
- package/dist/composer/TiptapComposer.js +4 -4
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/useRealtimeVoiceMode.js +2 -2
- package/dist/composer/useRealtimeVoiceMode.js.map +1 -1
- package/package.json +4 -4
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +30 -5
- package/src/app/chat/AgentKitAssistantChat.tsx +1 -0
- package/src/app/chat/AgentPanel.tsx +33 -112
- package/src/app/chat/ConnectBuilderCard.tsx +2 -2
- package/src/app/chat/chat/run-recovery.spec.tsx +8 -8
- package/src/app/i18n/catalogs/ar-SA.ts +46 -26
- package/src/app/i18n/catalogs/de-DE.ts +47 -26
- package/src/app/i18n/catalogs/en-US.ts +47 -26
- package/src/app/i18n/catalogs/es-ES.ts +47 -26
- package/src/app/i18n/catalogs/fr-FR.ts +48 -26
- package/src/app/i18n/catalogs/hi-IN.ts +47 -26
- package/src/app/i18n/catalogs/ja-JP.ts +47 -26
- package/src/app/i18n/catalogs/ko-KR.ts +47 -26
- package/src/app/i18n/catalogs/pt-BR.ts +48 -26
- package/src/app/i18n/catalogs/zh-CN.ts +47 -26
- package/src/app/i18n/catalogs/zh-TW.ts +47 -26
- package/src/app/integrations/BuilderIntegrationPage.spec.tsx +11 -7
- package/src/app/onboarding/FirstRunOnboarding.spec.tsx +24 -12
- package/src/app/onboarding/FirstRunOnboarding.tsx +14 -16
- package/src/app/onboarding/NewWorkspaceAppFlow.spec.ts +23 -7
- package/src/app/onboarding/NewWorkspaceAppFlow.tsx +4 -2
- package/src/app/onboarding/OnboardingPanel.tsx +4 -8
- package/src/app/settings/BuilderConnectPopover.spec.tsx +41 -1
- package/src/app/settings/BuilderConnectPopover.tsx +21 -4
- package/src/app/settings/SettingsPanel.connections.spec.tsx +2 -2
- package/src/app/settings/SettingsPanel.tsx +16 -8
- package/src/app/settings/VoiceTranscriptionSection.tsx +8 -7
- package/src/app/settings/infra/InfrastructureSettingsPage.spec.tsx +4 -4
- package/src/app/settings/infra/InfrastructureSettingsPage.tsx +5 -2
- package/src/app/settings/model/ModelSettingsPage.spec.tsx +7 -5
- package/src/app/settings/model/ModelSettingsPage.tsx +4 -2
- package/src/app/settings/useBuilderStatus.spec.tsx +82 -52
- package/src/app/settings/useBuilderStatus.ts +44 -54
- package/src/app/setup-connections/BuilderConnectCard.spec.tsx +11 -11
- package/src/app/setup-connections/SetupConnectionsPage.tsx +4 -2
- package/src/app/setup-connections/useBuilderConnectCardController.spec.tsx +19 -6
- package/src/app/setup-connections/useBuilderConnectCardController.ts +10 -9
- package/src/app/transcription/BuilderTranscriptionCta.tsx +4 -2
- package/src/composer/MessageQueueDrawer.spec.tsx +108 -0
- package/src/composer/MessageQueueDrawer.tsx +22 -2
- package/src/composer/PromptComposer.tsx +1 -1
- package/src/composer/RealtimeVoiceMode.spec.tsx +4 -4
- package/src/composer/TiptapComposer.tsx +5 -5
- 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(() =>
|
|
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
|
|
82
|
+
title: "Use Builder.io",
|
|
70
83
|
description:
|
|
71
|
-
"
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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:
|
|
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
|
|
62
|
-
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: "
|
|
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
|
-
: "
|
|
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
|
|
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
|
|
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 "
|
|
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
|
-
"
|
|
23
|
-
connectBuilder: "
|
|
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 === "
|
|
336
|
+
buttons.find((button) => button.textContent === "Use Builder.io"),
|
|
337
337
|
).toBeDefined();
|
|
338
338
|
act(() =>
|
|
339
339
|
buttons
|
|
340
|
-
.find((button) => button.textContent === "
|
|
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 "
|
|
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
|
-
"
|
|
2277
|
+
"Setting up Builder.io…",
|
|
2278
2278
|
})
|
|
2279
2279
|
: t("agentPanel.connectBuilderIo", {
|
|
2280
|
-
defaultValue: "
|
|
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
|
-
"
|
|
2315
|
+
"Setting up Builder.io…",
|
|
2316
2316
|
})
|
|
2317
2317
|
: t("agentPanel.connectBuilderIo", {
|
|
2318
|
-
defaultValue: "
|
|
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
|
-
"
|
|
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: "
|
|
1333
|
+
defaultValue: "Use Builder.io",
|
|
1334
1334
|
}),
|
|
1335
1335
|
useOpenAiKey: t("agentChat.voiceMode.useOpenAiKey", {
|
|
1336
1336
|
defaultValue: "Add your own keys",
|