@agent-native/toolkit 0.198.2 → 0.198.3-nightly-20260930154911

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 (117) hide show
  1. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  2. package/dist/app/agentkit/react/components.js +13 -5
  3. package/dist/app/agentkit/react/components.js.map +1 -1
  4. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  5. package/dist/app/chat/AgentKitAssistantChat.js +20 -6
  6. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  7. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  8. package/dist/app/i18n/catalogs/ar-SA.js +211 -0
  9. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  10. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  11. package/dist/app/i18n/catalogs/de-DE.js +147 -0
  12. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  13. package/dist/app/i18n/catalogs/en-US.d.ts +147 -0
  14. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  15. package/dist/app/i18n/catalogs/en-US.js +147 -0
  16. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  17. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  18. package/dist/app/i18n/catalogs/es-ES.js +163 -0
  19. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  20. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  21. package/dist/app/i18n/catalogs/fr-FR.js +163 -0
  22. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  23. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  24. package/dist/app/i18n/catalogs/hi-IN.js +147 -0
  25. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  26. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  27. package/dist/app/i18n/catalogs/ja-JP.js +131 -0
  28. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  29. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  30. package/dist/app/i18n/catalogs/ko-KR.js +131 -0
  31. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  32. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  33. package/dist/app/i18n/catalogs/pt-BR.js +163 -0
  34. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  35. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  36. package/dist/app/i18n/catalogs/zh-CN.js +131 -0
  37. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  38. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  39. package/dist/app/i18n/catalogs/zh-TW.js +131 -0
  40. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  41. package/dist/app/observability/ObservabilityDashboard.d.ts.map +1 -1
  42. package/dist/app/observability/ObservabilityDashboard.js +101 -109
  43. package/dist/app/observability/ObservabilityDashboard.js.map +1 -1
  44. package/dist/app/observability/RunInsights.d.ts +22 -0
  45. package/dist/app/observability/RunInsights.d.ts.map +1 -0
  46. package/dist/app/observability/RunInsights.js +658 -0
  47. package/dist/app/observability/RunInsights.js.map +1 -0
  48. package/dist/composer/RealtimeVoiceMode.d.ts.map +1 -1
  49. package/dist/composer/RealtimeVoiceMode.js +1 -1
  50. package/dist/composer/RealtimeVoiceMode.js.map +1 -1
  51. package/package.json +5 -5
  52. package/src/app/agent-page/ConnectionsTab.spec.tsx +0 -3
  53. package/src/app/agentkit/react/components.spec.tsx +2 -1
  54. package/src/app/agentkit/react/components.tsx +14 -5
  55. package/src/app/agentkit/react/composer-context.spec.tsx +4 -1
  56. package/src/app/agentkit/react/suggestions.spec.tsx +51 -1
  57. package/src/app/chat/AgentKitAssistantChat.spec.tsx +57 -0
  58. package/src/app/chat/AgentKitAssistantChat.tsx +44 -8
  59. package/src/app/chat/AgentPanel.header.spec.ts +22 -22
  60. package/src/app/chat/agentkit-chat/action-widget.spec.tsx +17 -2
  61. package/src/app/chat/agentkit-chat/approval-card.spec.tsx +2 -2
  62. package/src/app/chat/agentkit-chat/connections.spec.tsx +1 -1
  63. package/src/app/chat/chat/markdown-renderer.spec.tsx +1 -1
  64. package/src/app/chat/chat/tool-call-display.spec.tsx +25 -2
  65. package/src/app/chat/chat/widgets/DataTableWidget.spec.tsx +38 -26
  66. package/src/app/chat/chat/widgets/agent-team-progress-widget.spec.tsx +7 -1
  67. package/src/app/chat/chat/widgets/builtin-connect-required-renderer.spec.tsx +24 -1
  68. package/src/app/chat/chat/widgets/record-change-widget.spec.tsx +16 -1
  69. package/src/app/chat/thinking-display.spec.tsx +1 -1
  70. package/src/app/db-admin/useAgentSync.spec.tsx +1 -1
  71. package/src/app/extensions/ExtensionViewer.spec.tsx +2 -1
  72. package/src/app/i18n/catalogs/ar-SA.ts +282 -0
  73. package/src/app/i18n/catalogs/de-DE.ts +198 -0
  74. package/src/app/i18n/catalogs/en-US.ts +187 -0
  75. package/src/app/i18n/catalogs/es-ES.ts +221 -0
  76. package/src/app/i18n/catalogs/fr-FR.ts +219 -0
  77. package/src/app/i18n/catalogs/hi-IN.ts +182 -0
  78. package/src/app/i18n/catalogs/ja-JP.ts +160 -0
  79. package/src/app/i18n/catalogs/ko-KR.ts +160 -0
  80. package/src/app/i18n/catalogs/pt-BR.ts +220 -0
  81. package/src/app/i18n/catalogs/zh-CN.ts +154 -0
  82. package/src/app/i18n/catalogs/zh-TW.ts +154 -0
  83. package/src/app/integrations/BuilderIntegrationPage.spec.tsx +3 -3
  84. package/src/app/integrations/ChannelsPage.spec.tsx +3 -3
  85. package/src/app/integrations/IntegrationsPage.spec.tsx +3 -3
  86. package/src/app/integrations/IntegrationsPanel.spec.tsx +7 -4
  87. package/src/app/observability/ObservabilityDashboard.review.spec.tsx +211 -52
  88. package/src/app/observability/ObservabilityDashboard.spec.tsx +80 -20
  89. package/src/app/observability/ObservabilityDashboard.tsx +240 -400
  90. package/src/app/observability/RunInsights.tsx +1603 -0
  91. package/src/app/observability/ThumbsFeedback.spec.tsx +29 -12
  92. package/src/app/onboarding/FirstRunOnboarding.spec.tsx +25 -5
  93. package/src/app/onboarding/first-run-startup-gate.spec.tsx +12 -7
  94. package/src/app/resources/McpConnectionSuggestion.render.spec.tsx +43 -5
  95. package/src/app/resources/McpIntegrationDialog.spec.tsx +20 -14
  96. package/src/app/resources/ResourcesPanel.spec.ts +9 -7
  97. package/src/app/review/ReviewThreadPanel.spec.tsx +2 -2
  98. package/src/app/settings/SecretsSection.spec.tsx +12 -3
  99. package/src/app/settings/SettingsTabsPage.spec.tsx +4 -1
  100. package/src/app/settings/VoiceTranscriptionSection.spec.tsx +12 -1
  101. package/src/app/settings/account/PreferencesSettings.spec.tsx +13 -1
  102. package/src/app/settings/account/ProfileSettings.spec.tsx +13 -1
  103. package/src/app/settings/account/SecuritySettings.spec.tsx +12 -1
  104. package/src/app/settings/shell/SettingsShell.spec.tsx +35 -15
  105. package/src/app/settings/shell/pages/app-group-pages.spec.tsx +7 -0
  106. package/src/app/settings/shell/pages/audit.spec.tsx +5 -2
  107. package/src/app/settings/shell/pages/resource-pages.spec.tsx +25 -16
  108. package/src/app/settings/shell/pages/sub-agents.spec.tsx +24 -15
  109. package/src/app/settings/usage/UsagePage.spec.tsx +4 -0
  110. package/src/app/setup-connections/BuilderConnectCard.spec.tsx +27 -8
  111. package/src/app/sharing/ShareButton.spec.tsx +7 -3
  112. package/src/app/sharing/ShareDialog.spec.tsx +4 -4
  113. package/src/app/sharing/useShareButtonController.spec.tsx +1 -1
  114. package/src/app/sharing/useShareDialogController.spec.tsx +2 -2
  115. package/src/app/transcription/BuilderTranscriptionCta.spec.tsx +1 -1
  116. package/src/composer/RealtimeVoiceMode.spec.tsx +1 -0
  117. package/src/composer/RealtimeVoiceMode.tsx +1 -5
@@ -27,7 +27,7 @@ vi.mock("@agent-native/core/client/labs/use-lab", () => ({
27
27
  vi.mock("@agent-native/core/client/feature-flags/use-feature-flag", () => ({
28
28
  useFeatureFlags: () => ({}),
29
29
  }));
30
- vi.mock("../../AgentSidebar.js", () => ({
30
+ vi.mock("../../chat/AgentSidebar.js", () => ({
31
31
  AgentToggleButton: () => <button type="button">agent</button>,
32
32
  }));
33
33
 
@@ -40,6 +40,9 @@ vi.mock("@agent-native/core/client/application-state", () => ({
40
40
  deleteClientAppState: appState.remove,
41
41
  }));
42
42
 
43
+ import { AgentNativeI18nProvider } from "@agent-native/core/client/i18n";
44
+
45
+ import { createToolkitI18nCatalog } from "../../i18n.js";
43
46
  import { useSettingsPageHeader, useSettingsShell } from "./context.js";
44
47
  import { CORE_SETTINGS_PAGES } from "./core-pages.js";
45
48
  import {
@@ -53,6 +56,19 @@ import {
53
56
  } from "./return-path.js";
54
57
  import { SettingsShell, type SettingsShellProps } from "./SettingsShell.js";
55
58
 
59
+ const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
60
+
61
+ function renderWithToolkitI18n(children: React.ReactNode) {
62
+ return (
63
+ <AgentNativeI18nProvider
64
+ catalog={toolkitI18nCatalog}
65
+ persistPreference={false}
66
+ >
67
+ {children}
68
+ </AgentNativeI18nProvider>
69
+ );
70
+ }
71
+
56
72
  function StubPage({ pageId, sub }: SettingsPageProps) {
57
73
  return (
58
74
  <div data-testid="page">
@@ -113,7 +129,9 @@ describe("SettingsShell", () => {
113
129
 
114
130
  async function render(props: SettingsShellProps = {}) {
115
131
  await act(async () => {
116
- root.render(<SettingsShell appName="Clips" {...props} />);
132
+ root.render(
133
+ renderWithToolkitI18n(<SettingsShell appName="Clips" {...props} />),
134
+ );
117
135
  });
118
136
  await flush();
119
137
  }
@@ -183,7 +201,7 @@ describe("SettingsShell", () => {
183
201
  pages: ["org", "members", "usage"],
184
202
  },
185
203
  ]);
186
- expect(container.textContent).toContain("Back to app");
204
+ expect(container.textContent).toContain("Back to Clips");
187
205
  });
188
206
 
189
207
  it("shows Notifications and What's new when the app passes them", async () => {
@@ -294,7 +312,7 @@ describe("SettingsShell", () => {
294
312
  },
295
313
  );
296
314
  await act(async () => {
297
- root.render(<RouterProvider router={router} />);
315
+ root.render(renderWithToolkitI18n(<RouterProvider router={router} />));
298
316
  });
299
317
  await waitFor(() => location === "/settings/api-keys");
300
318
  expect(container.querySelector('[data-testid="page"]')?.textContent).toBe(
@@ -349,7 +367,7 @@ describe("SettingsShell", () => {
349
367
  { initialEntries: [`/settings?section=${section}`] },
350
368
  );
351
369
  await act(async () => {
352
- root.render(<RouterProvider router={router} />);
370
+ root.render(renderWithToolkitI18n(<RouterProvider router={router} />));
353
371
  });
354
372
  await waitFor(
355
373
  () =>
@@ -495,7 +513,7 @@ describe("SettingsShell", () => {
495
513
  labs: [{ key: "clips.meetings", displayName: "Meetings lab" }],
496
514
  });
497
515
  expect(search("recordings")[0]).toBe("RecordingsClips › General");
498
- expect(search("meetings lab")[0]).toBe("Meetings labLabs");
516
+ expect(search("meetings lab")[0]).toBe("Meetings labClips › Labs");
499
517
  search("playback speed");
500
518
  press("Enter");
501
519
  await flush();
@@ -590,12 +608,14 @@ describe("SettingsShell", () => {
590
608
 
591
609
  await act(async () => {
592
610
  root.render(
593
- <SettingsShell
594
- appName="Clips"
595
- extraTabs={tabs}
596
- value="drafting"
597
- onValueChange={onValueChange}
598
- />,
611
+ renderWithToolkitI18n(
612
+ <SettingsShell
613
+ appName="Clips"
614
+ extraTabs={tabs}
615
+ value="drafting"
616
+ onValueChange={onValueChange}
617
+ />,
618
+ ),
599
619
  );
600
620
  });
601
621
  await flush();
@@ -616,7 +636,7 @@ describe("SettingsShell", () => {
616
636
  rememberSettingsReturnPath("/library", "?view=grid");
617
637
  await render();
618
638
  const back = [...rail().querySelectorAll("a")].find((link) =>
619
- link.textContent?.includes("Back to app"),
639
+ link.textContent?.includes("Back to Clips"),
620
640
  );
621
641
  expect(back?.getAttribute("href")).toBe("/library?view=grid");
622
642
  });
@@ -692,7 +712,7 @@ describe("SettingsShell", () => {
692
712
  { initialEntries: ["/settings"] },
693
713
  );
694
714
  await act(async () => {
695
- root.render(<RouterProvider router={router} />);
715
+ root.render(renderWithToolkitI18n(<RouterProvider router={router} />));
696
716
  });
697
717
  await flush();
698
718
  clickPage("model");
@@ -729,7 +749,7 @@ describe("SettingsShell", () => {
729
749
  { initialEntries: ["/settings/infra"] },
730
750
  );
731
751
  await act(async () => {
732
- root.render(<RouterProvider router={router} />);
752
+ root.render(renderWithToolkitI18n(<RouterProvider router={router} />));
733
753
  });
734
754
  await waitFor(() => location === "/settings/profile", 400);
735
755
  clickPage("org");
@@ -38,6 +38,13 @@ const labsActions = vi.hoisted(() => ({
38
38
  }));
39
39
  vi.mock("@agent-native/core/client/hooks", () => ({
40
40
  useChangeVersions: () => 0,
41
+ useDemoModeStatus: () => ({
42
+ enabled: false,
43
+ forced: false,
44
+ isLoading: false,
45
+ }),
46
+ }));
47
+ vi.mock("@agent-native/core/client/use-action", () => ({
41
48
  useActionQuery: () => ({
42
49
  data: labsActions.query.data,
43
50
  isLoading: labsActions.query.data === undefined && !labsActions.isError,
@@ -14,8 +14,6 @@ const queriedActions = vi.hoisted(() => [] as Array<[string, unknown]>);
14
14
 
15
15
  vi.mock("@agent-native/core/client/hooks", () => ({
16
16
  callAction: callActionMock,
17
- defaultActionQueryRetry: () => false,
18
- defaultActionQueryRetryDelay: () => 0,
19
17
  useActionQuery: (name: string, params: unknown, options?: any) => {
20
18
  queriedActions.push([name, params]);
21
19
  if (name === "list-audit-events") {
@@ -30,6 +28,11 @@ vi.mock("@agent-native/core/client/hooks", () => ({
30
28
  },
31
29
  }));
32
30
 
31
+ vi.mock("@agent-native/core/client/use-action", () => ({
32
+ defaultActionQueryRetry: () => false,
33
+ defaultActionQueryRetryDelay: () => 0,
34
+ }));
35
+
33
36
  vi.mock("@agent-native/core/client/i18n", () => ({
34
37
  useT:
35
38
  () =>
@@ -1,5 +1,6 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
+ import { AgentNativeI18nProvider } from "@agent-native/core/client/i18n";
3
4
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4
5
  import React, { act, type ComponentType } from "react";
5
6
  import { createRoot, type Root } from "react-dom/client";
@@ -9,7 +10,7 @@ const orgState = vi.hoisted(() => ({
9
10
  value: { orgId: "org-1", orgName: "Acme", role: "member" as string },
10
11
  }));
11
12
 
12
- vi.mock("@agent-native/core/client/org", () => ({
13
+ vi.mock("@agent-native/core/client/org/hooks", () => ({
13
14
  useOrg: () => ({ data: orgState.value, isLoading: false }),
14
15
  }));
15
16
  vi.mock("../../../org/workspace-app-links.js", () => ({
@@ -26,12 +27,15 @@ vi.mock("@agent-native/core/client/api-path", () => ({
26
27
  import type { TreeNode } from "@agent-native/core/client/resources/use-resources";
27
28
  import { TooltipProvider } from "@agent-native/toolkit/ui/tooltip";
28
29
 
30
+ import { createToolkitI18nCatalog } from "../../../i18n.js";
29
31
  import { SettingsShellProvider, type SettingsPageHeader } from "../context.js";
30
32
  import FilesSettingsPage from "./files.js";
31
33
  import InstructionsSettingsPage from "./instructions.js";
32
34
  import MemorySettingsPage from "./memory.js";
33
35
  import SkillsSettingsPage from "./skills.js";
34
36
 
37
+ const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
38
+
35
39
  function leaf(
36
40
  path: string,
37
41
  owner: string,
@@ -109,21 +113,26 @@ async function renderPage(Page: ComponentType) {
109
113
  header = null;
110
114
  await act(async () => {
111
115
  root.render(
112
- <QueryClientProvider client={queryClient}>
113
- <TooltipProvider>
114
- <SettingsShellProvider
115
- value={{
116
- route: { page: "skills", sub: null },
117
- navigate: () => {},
118
- setHeader: (next) => {
119
- header = next;
120
- },
121
- }}
122
- >
123
- <Page />
124
- </SettingsShellProvider>
125
- </TooltipProvider>
126
- </QueryClientProvider>,
116
+ <AgentNativeI18nProvider
117
+ catalog={toolkitI18nCatalog}
118
+ persistPreference={false}
119
+ >
120
+ <QueryClientProvider client={queryClient}>
121
+ <TooltipProvider>
122
+ <SettingsShellProvider
123
+ value={{
124
+ route: { page: "skills", sub: null },
125
+ navigate: () => {},
126
+ setHeader: (next) => {
127
+ header = next;
128
+ },
129
+ }}
130
+ >
131
+ <Page />
132
+ </SettingsShellProvider>
133
+ </TooltipProvider>
134
+ </QueryClientProvider>
135
+ </AgentNativeI18nProvider>,
127
136
  );
128
137
  });
129
138
  for (let attempt = 0; attempt < 50; attempt += 1) {
@@ -1,5 +1,6 @@
1
1
  // @vitest-environment happy-dom
2
2
 
3
+ import { AgentNativeI18nProvider } from "@agent-native/core/client/i18n";
3
4
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4
5
  import React, { act } from "react";
5
6
  import { createRoot, type Root } from "react-dom/client";
@@ -34,10 +35,13 @@ vi.mock("@agent-native/core/client/api-path", () => ({
34
35
 
35
36
  import { TooltipProvider } from "@agent-native/toolkit/ui/tooltip";
36
37
 
38
+ import { createToolkitI18nCatalog } from "../../../i18n.js";
37
39
  import type { RemoteAgentInfo } from "../../AgentsSection.js";
38
40
  import { SettingsShellProvider, type SettingsPageHeader } from "../context.js";
39
41
  import SubAgentsSettingsPage, { groupSubAgents } from "./sub-agents.js";
40
42
 
43
+ const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
44
+
41
45
  // Seeded first-party apps and a connected external agent. `mail` also keeps
42
46
  // its pre-migration `agents/` row, which must not list it twice.
43
47
  const resources = [
@@ -123,21 +127,26 @@ async function renderPage() {
123
127
  header = null;
124
128
  await act(async () => {
125
129
  root.render(
126
- <QueryClientProvider client={queryClient}>
127
- <TooltipProvider>
128
- <SettingsShellProvider
129
- value={{
130
- route: { page: "sub-agents", sub: null },
131
- navigate: () => {},
132
- setHeader: (next) => {
133
- header = next;
134
- },
135
- }}
136
- >
137
- <SubAgentsSettingsPage />
138
- </SettingsShellProvider>
139
- </TooltipProvider>
140
- </QueryClientProvider>,
130
+ <AgentNativeI18nProvider
131
+ catalog={toolkitI18nCatalog}
132
+ persistPreference={false}
133
+ >
134
+ <QueryClientProvider client={queryClient}>
135
+ <TooltipProvider>
136
+ <SettingsShellProvider
137
+ value={{
138
+ route: { page: "sub-agents", sub: null },
139
+ navigate: () => {},
140
+ setHeader: (next) => {
141
+ header = next;
142
+ },
143
+ }}
144
+ >
145
+ <SubAgentsSettingsPage />
146
+ </SettingsShellProvider>
147
+ </TooltipProvider>
148
+ </QueryClientProvider>
149
+ </AgentNativeI18nProvider>,
141
150
  );
142
151
  });
143
152
  await settle();
@@ -54,6 +54,10 @@ vi.mock("@agent-native/core/client/hooks", () => ({
54
54
  }),
55
55
  }));
56
56
 
57
+ vi.mock("@agent-native/core/client/use-action", () => ({
58
+ useActionQuery: () => ({ data: null, isError: false, isLoading: false }),
59
+ }));
60
+
57
61
  vi.mock("@agent-native/core/client/i18n", () => ({
58
62
  useT:
59
63
  () =>
@@ -1,12 +1,16 @@
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 { BuilderConnectCard } from "./BuilderConnectCard.js";
8
10
  import type { BuilderConnectCardViewModel } from "./useBuilderConnectCardController.js";
9
11
 
12
+ const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
13
+
10
14
  const mocks = vi.hoisted(() => ({
11
15
  useBuilderConnectCardController: vi.fn(),
12
16
  semanticActionProps: undefined as Record<string, unknown> | undefined,
@@ -80,6 +84,17 @@ describe("BuilderConnectCard", () => {
80
84
  root = createRoot(container);
81
85
  });
82
86
 
87
+ function renderWithToolkitI18n(children: React.ReactNode) {
88
+ root.render(
89
+ <AgentNativeI18nProvider
90
+ catalog={toolkitI18nCatalog}
91
+ persistPreference={false}
92
+ >
93
+ {children}
94
+ </AgentNativeI18nProvider>,
95
+ );
96
+ }
97
+
83
98
  afterEach(() => {
84
99
  act(() => root.unmount());
85
100
  container.remove();
@@ -88,7 +103,9 @@ describe("BuilderConnectCard", () => {
88
103
  });
89
104
 
90
105
  it("keeps the default view and action on the shared controller", () => {
91
- act(() => root.render(<BuilderConnectCard trackingSource="settings" />));
106
+ act(() =>
107
+ renderWithToolkitI18n(<BuilderConnectCard trackingSource="settings" />),
108
+ );
92
109
 
93
110
  expect(mocks.useBuilderConnectCardController).toHaveBeenCalledOnce();
94
111
  expect(mocks.useBuilderConnectCardController).toHaveBeenCalledWith(
@@ -121,7 +138,9 @@ describe("BuilderConnectCard", () => {
121
138
  );
122
139
 
123
140
  act(() =>
124
- root.render(<BuilderConnectCard className="host-card" render={render} />),
141
+ renderWithToolkitI18n(
142
+ <BuilderConnectCard className="host-card" render={render} />,
143
+ ),
125
144
  );
126
145
 
127
146
  expect(mocks.useBuilderConnectCardController).toHaveBeenCalledOnce();
@@ -140,7 +159,7 @@ describe("BuilderConnectCard", () => {
140
159
  disabled: true,
141
160
  };
142
161
 
143
- act(() => root.render(<BuilderConnectCard />));
162
+ act(() => renderWithToolkitI18n(<BuilderConnectCard />));
144
163
 
145
164
  expect(container.querySelector("[data-semantic-action]")).not.toBeNull();
146
165
  expect(mocks.semanticActionProps).toMatchObject({
@@ -183,7 +202,7 @@ describe("BuilderConnectCard", () => {
183
202
  mocks.useBuilderConnectCardController.mockReturnValue(viewModel);
184
203
 
185
204
  act(() =>
186
- root.render(
205
+ renderWithToolkitI18n(
187
206
  <BuilderConnectCard showManage trackingSource="settings_connections" />,
188
207
  ),
189
208
  );
@@ -229,7 +248,7 @@ describe("BuilderConnectCard", () => {
229
248
  };
230
249
  mocks.useBuilderConnectCardController.mockReturnValue(viewModel);
231
250
 
232
- act(() => root.render(<BuilderConnectCard showManage />));
251
+ act(() => renderWithToolkitI18n(<BuilderConnectCard showManage />));
233
252
  act(() => {
234
253
  (
235
254
  container.querySelector(
@@ -281,7 +300,7 @@ describe("BuilderConnectCard", () => {
281
300
  mocks.useBuilderConnectCardController.mockReturnValue(viewModel);
282
301
 
283
302
  act(() => {
284
- root.render(
303
+ renderWithToolkitI18n(
285
304
  <BuilderConnectCard showManage trackingSource="settings_connections" />,
286
305
  );
287
306
  });
@@ -343,7 +362,7 @@ describe("BuilderConnectCard", () => {
343
362
  ...(scope ? { scope } : {}),
344
363
  };
345
364
  mocks.useBuilderConnectCardController.mockReturnValue(viewModel);
346
- act(() => root.render(<BuilderConnectCard showManage />));
365
+ act(() => renderWithToolkitI18n(<BuilderConnectCard showManage />));
347
366
  }
348
367
 
349
368
  function openMenu() {
@@ -519,7 +538,7 @@ describe("BuilderConnectCard", () => {
519
538
  vi.spyOn(console, "error").mockImplementation(() => {});
520
539
 
521
540
  act(() =>
522
- root.render(
541
+ renderWithToolkitI18n(
523
542
  <BuilderConnectCard
524
543
  render={() => {
525
544
  throw new Error("broken company card");
@@ -6,8 +6,11 @@ import React, { act } from "react";
6
6
  import { createRoot, type Root } from "react-dom/client";
7
7
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
8
 
9
+ import { createToolkitI18nCatalog } from "../i18n.js";
9
10
  import { ShareButton } from "./ShareButton.js";
10
11
 
12
+ const toolkitI18nCatalog = createToolkitI18nCatalog({ messages: {} });
13
+
11
14
  const shareMutate = vi.hoisted(() => vi.fn());
12
15
  const otherMutate = vi.hoisted(() => vi.fn());
13
16
  const refetchShares = vi.hoisted(() => vi.fn(async () => undefined));
@@ -46,7 +49,7 @@ const sharesData = vi.hoisted(() => ({
46
49
  },
47
50
  }));
48
51
 
49
- vi.mock("../use-action.js", () => ({
52
+ vi.mock("@agent-native/core/client/use-action", () => ({
50
53
  useActionQuery: () => ({
51
54
  data: sharesData.current,
52
55
  isError: sharesError.current,
@@ -57,7 +60,7 @@ vi.mock("../use-action.js", () => ({
57
60
  }),
58
61
  }));
59
62
 
60
- vi.mock("../components/ui/popover.js", () => {
63
+ vi.mock("@agent-native/toolkit/ui/popover", () => {
61
64
  const PopoverOpenContext = React.createContext(true);
62
65
  const isOuterSharePopover = (node: React.ReactNode): boolean =>
63
66
  React.Children.toArray(node).some((child) => {
@@ -129,7 +132,7 @@ vi.mock("../components/ui/popover.js", () => {
129
132
  };
130
133
  });
131
134
 
132
- vi.mock("../components/ui/sheet.js", () => ({
135
+ vi.mock("@agent-native/toolkit/ui/sheet", () => ({
133
136
  Sheet: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
134
137
  SheetTrigger: ({ children }: { children: React.ReactNode }) => (
135
138
  <>{children}</>
@@ -1211,6 +1214,7 @@ describe("ShareButton", () => {
1211
1214
  await act(async () => {
1212
1215
  root.render(
1213
1216
  <AgentNativeI18nProvider
1217
+ catalog={toolkitI18nCatalog}
1214
1218
  initialLocale="de-DE"
1215
1219
  initialPreference="de-DE"
1216
1220
  persistPreference={false}
@@ -19,11 +19,11 @@ const sharesQuery = {
19
19
  refetch: vi.fn(),
20
20
  };
21
21
 
22
- vi.mock("../use-action.js", () => ({
22
+ vi.mock("@agent-native/core/client/use-action", () => ({
23
23
  useActionQuery: () => sharesQuery,
24
- useActionMutation: () => ({ mutate: vi.fn() }),
24
+ useActionMutation: () => ({ mutate: vi.fn(), isPending: false }),
25
25
  }));
26
- vi.mock("../i18n.js", () => ({
26
+ vi.mock("@agent-native/core/client/i18n", () => ({
27
27
  useT: () => (key: string, values?: Record<string, string>) =>
28
28
  values?.title ?? values?.type ?? key,
29
29
  }));
@@ -85,7 +85,7 @@ async function renderDialog(
85
85
  }
86
86
 
87
87
  describe("ShareDialog primitive normalization", () => {
88
- const source = readFileSync(resolve("src/client/sharing/ShareDialog.tsx"), {
88
+ const source = readFileSync(resolve("src/app/sharing/ShareDialog.tsx"), {
89
89
  encoding: "utf8",
90
90
  });
91
91
 
@@ -21,7 +21,7 @@ const mocks = vi.hoisted(() => ({
21
21
  unshare: { mutate: vi.fn() },
22
22
  }));
23
23
 
24
- vi.mock("../use-action.js", () => ({
24
+ vi.mock("@agent-native/core/client/use-action", () => ({
25
25
  useActionQuery: vi.fn(() => mocks.query),
26
26
  useActionMutation: vi.fn((name: string) => {
27
27
  if (name === "set-resource-visibility") return mocks.setVisibility;
@@ -24,7 +24,7 @@ const mocks = vi.hoisted(() => ({
24
24
  writeClipboardText: vi.fn(),
25
25
  }));
26
26
 
27
- vi.mock("../../../../core/src/client/use-action.ts", () => ({
27
+ vi.mock("@agent-native/core/client/use-action", () => ({
28
28
  useActionQuery: vi.fn(() => mocks.query),
29
29
  useActionMutation: vi.fn((name: string) => {
30
30
  if (name === "share-resource") return mocks.share;
@@ -32,7 +32,7 @@ vi.mock("../../../../core/src/client/use-action.ts", () => ({
32
32
  return mocks.visibility;
33
33
  }),
34
34
  }));
35
- vi.mock("../../../../core/src/client/i18n.tsx", () => ({
35
+ vi.mock("@agent-native/core/client/i18n", () => ({
36
36
  useT: () => (key: string, values?: Record<string, string>) => {
37
37
  if (values?.title) return `${key}:${values.title}`;
38
38
  if (values?.type) return `${key}:${values.type}`;
@@ -12,7 +12,7 @@ const mocks = vi.hoisted(() => ({
12
12
  vi.mock("../settings/useBuilderStatus.js", () => ({
13
13
  useBuilderConnectFlow: mocks.useBuilderConnectFlow,
14
14
  }));
15
- vi.mock("../i18n.js", () => ({
15
+ vi.mock("@agent-native/core/client/i18n", () => ({
16
16
  useT: () => (key: string) => key,
17
17
  }));
18
18
 
@@ -197,6 +197,7 @@ describe("RealtimeVoiceMode", () => {
197
197
  document.querySelectorAll<HTMLButtonElement>("button"),
198
198
  ).find((button) => button.textContent?.includes("Start voice chat"));
199
199
  expect(startVoiceMode?.disabled).toBe(true);
200
+ expect(document.querySelector(".animate-spin")).toBeNull();
200
201
  act(() => startVoiceMode?.click());
201
202
  expect(onStartVoiceMode).not.toHaveBeenCalled();
202
203
 
@@ -350,11 +350,7 @@ export function RealtimeVoiceModeEntry({
350
350
  disabled={providerStatusPending}
351
351
  onClick={() => choose("realtime", onStartVoiceMode)}
352
352
  >
353
- {providerStatusPending ? (
354
- <IconLoader2 className="animate-spin" />
355
- ) : (
356
- <IconMicrophone />
357
- )}
353
+ <IconMicrophone />
358
354
  {copy.startVoiceMode}
359
355
  </Button>
360
356
  <Button