@agent-native/dispatch 0.40.0 → 0.40.3

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 (128) hide show
  1. package/CHANGELOG.md +48 -19
  2. package/dist/actions/provider-api-register.d.ts +7 -7
  3. package/dist/components/app-open-actions.d.ts +1 -1
  4. package/dist/components/app-open-actions.d.ts.map +1 -1
  5. package/dist/components/app-open-actions.js +1 -1
  6. package/dist/components/app-open-actions.js.map +1 -1
  7. package/dist/components/app-row-settings.js +1 -1
  8. package/dist/components/app-row-settings.js.map +1 -1
  9. package/dist/components/automation-create-dialog.js +2 -2
  10. package/dist/components/automation-create-dialog.js.map +1 -1
  11. package/dist/components/automation-details-panel.js +1 -1
  12. package/dist/components/automation-details-panel.js.map +1 -1
  13. package/dist/components/chat-home-apps.js +1 -1
  14. package/dist/components/chat-home-apps.js.map +1 -1
  15. package/dist/components/create-app-popover.js +3 -3
  16. package/dist/components/create-app-popover.js.map +1 -1
  17. package/dist/components/dispatch-control-plane.d.ts.map +1 -1
  18. package/dist/components/dispatch-control-plane.js +9 -30
  19. package/dist/components/dispatch-control-plane.js.map +1 -1
  20. package/dist/components/layout/Header.js +2 -2
  21. package/dist/components/layout/Header.js.map +1 -1
  22. package/dist/components/layout/Layout.d.ts +6 -5
  23. package/dist/components/layout/Layout.d.ts.map +1 -1
  24. package/dist/components/layout/Layout.js +73 -113
  25. package/dist/components/layout/Layout.js.map +1 -1
  26. package/dist/components/layout/workspace-apps-rail.d.ts.map +1 -1
  27. package/dist/components/layout/workspace-apps-rail.js +7 -19
  28. package/dist/components/layout/workspace-apps-rail.js.map +1 -1
  29. package/dist/components/messaging-setup-panel.js +2 -1
  30. package/dist/components/messaging-setup-panel.js.map +1 -1
  31. package/dist/components/workspace-app-card.js +2 -2
  32. package/dist/components/workspace-app-card.js.map +1 -1
  33. package/dist/components/workspace-app-host.d.ts +1 -1
  34. package/dist/components/workspace-app-host.d.ts.map +1 -1
  35. package/dist/components/workspace-app-host.js +7 -74
  36. package/dist/components/workspace-app-host.js.map +1 -1
  37. package/dist/hooks/use-navigation-state.js +1 -1
  38. package/dist/hooks/use-navigation-state.js.map +1 -1
  39. package/dist/lib/workspace-apps.js +1 -1
  40. package/dist/lib/workspace-apps.js.map +1 -1
  41. package/dist/routes/pages/$appId.js +1 -1
  42. package/dist/routes/pages/$appId.js.map +1 -1
  43. package/dist/routes/pages/_index.js +1 -1
  44. package/dist/routes/pages/_index.js.map +1 -1
  45. package/dist/routes/pages/admin._index.js +1 -1
  46. package/dist/routes/pages/admin._index.js.map +1 -1
  47. package/dist/routes/pages/agent-integrations.js +1 -1
  48. package/dist/routes/pages/agent-integrations.js.map +1 -1
  49. package/dist/routes/pages/apps.d.ts.map +1 -1
  50. package/dist/routes/pages/apps.js +3 -43
  51. package/dist/routes/pages/apps.js.map +1 -1
  52. package/dist/routes/pages/browser-chat.js +1 -1
  53. package/dist/routes/pages/browser-chat.js.map +1 -1
  54. package/dist/routes/pages/chat.d.ts.map +1 -1
  55. package/dist/routes/pages/chat.js +24 -43
  56. package/dist/routes/pages/chat.js.map +1 -1
  57. package/dist/routes/pages/extensions.$id.js +1 -1
  58. package/dist/routes/pages/extensions.$id.js.map +1 -1
  59. package/dist/routes/pages/extensions._index.js +1 -1
  60. package/dist/routes/pages/extensions._index.js.map +1 -1
  61. package/dist/routes/pages/integrations.js +1 -1
  62. package/dist/routes/pages/integrations.js.map +1 -1
  63. package/dist/routes/pages/new-app.js +1 -1
  64. package/dist/routes/pages/new-app.js.map +1 -1
  65. package/dist/routes/pages/operations.js +2 -2
  66. package/dist/routes/pages/operations.js.map +1 -1
  67. package/dist/routes/pages/overview.d.ts +2 -2
  68. package/dist/routes/pages/settings-page.d.ts +10 -0
  69. package/dist/routes/pages/settings-page.d.ts.map +1 -0
  70. package/dist/routes/pages/settings-page.js +104 -0
  71. package/dist/routes/pages/settings-page.js.map +1 -0
  72. package/dist/routes/pages/settings.d.ts +4 -12
  73. package/dist/routes/pages/settings.d.ts.map +1 -1
  74. package/dist/routes/pages/settings.js +4 -88
  75. package/dist/routes/pages/settings.js.map +1 -1
  76. package/dist/routes/pages/tools.$id.js +1 -1
  77. package/dist/routes/pages/tools.$id.js.map +1 -1
  78. package/dist/routes/pages/tools._index.js +1 -1
  79. package/dist/routes/pages/tools._index.js.map +1 -1
  80. package/dist/routes/pages/vault.d.ts +1 -1
  81. package/dist/routes/pages/vault.js +1 -1
  82. package/dist/routes/pages/vault.js.map +1 -1
  83. package/dist/shared/app-roles.js.map +1 -1
  84. package/package.json +3 -3
  85. package/src/components/app-open-actions.tsx +1 -1
  86. package/src/components/app-row-settings.tsx +1 -1
  87. package/src/components/automation-create-dialog.tsx +7 -7
  88. package/src/components/automation-details-panel.tsx +1 -1
  89. package/src/components/chat-home-apps.tsx +1 -1
  90. package/src/components/create-app-popover.spec.tsx +5 -7
  91. package/src/components/create-app-popover.tsx +3 -3
  92. package/src/components/dispatch-control-plane.spec.tsx +12 -19
  93. package/src/components/dispatch-control-plane.tsx +10 -84
  94. package/src/components/layout/Header.tsx +2 -2
  95. package/src/components/layout/Layout.app-chat.spec.ts +1 -0
  96. package/src/components/layout/Layout.spec.tsx +49 -30
  97. package/src/components/layout/Layout.tsx +153 -205
  98. package/src/components/layout/workspace-apps-rail.spec.tsx +79 -0
  99. package/src/components/layout/workspace-apps-rail.tsx +6 -30
  100. package/src/components/messaging-setup-panel.tsx +1 -1
  101. package/src/components/workspace-app-card.tsx +2 -2
  102. package/src/components/workspace-app-chat-rail.spec.tsx +2 -2
  103. package/src/components/workspace-app-host.spec.tsx +19 -19
  104. package/src/components/workspace-app-host.tsx +12 -129
  105. package/src/hooks/use-navigation-state.ts +1 -1
  106. package/src/lib/workspace-apps.ts +1 -1
  107. package/src/routes/pages/$appId.tsx +1 -1
  108. package/src/routes/pages/_index.tsx +1 -1
  109. package/src/routes/pages/admin._index.tsx +1 -1
  110. package/src/routes/pages/agent-integrations.tsx +1 -1
  111. package/src/routes/pages/apps.tsx +2 -86
  112. package/src/routes/pages/automations.spec.tsx +1 -1
  113. package/src/routes/pages/browser-chat.spec.tsx +1 -1
  114. package/src/routes/pages/browser-chat.tsx +1 -1
  115. package/src/routes/pages/chat.spec.tsx +23 -46
  116. package/src/routes/pages/chat.tsx +20 -57
  117. package/src/routes/pages/extensions.$id.tsx +1 -1
  118. package/src/routes/pages/extensions._index.tsx +1 -1
  119. package/src/routes/pages/integrations.tsx +1 -1
  120. package/src/routes/pages/new-app.tsx +1 -1
  121. package/src/routes/pages/operations.tsx +2 -2
  122. package/src/routes/pages/settings-page.tsx +250 -0
  123. package/src/routes/pages/settings.spec.tsx +30 -8
  124. package/src/routes/pages/settings.tsx +4 -184
  125. package/src/routes/pages/tools.$id.tsx +1 -1
  126. package/src/routes/pages/tools._index.tsx +1 -1
  127. package/src/routes/pages/vault.tsx +1 -1
  128. package/src/shared/app-roles.ts +1 -1
@@ -3,16 +3,18 @@ import {
3
3
  navigateWithAgentChatViewTransition,
4
4
  useChatModels,
5
5
  } from "@agent-native/core/client/agent-chat";
6
- import { PromptBar, PromptComposer } from "@agent-native/core/client/composer";
7
6
  import { useActionQuery } from "@agent-native/core/client/hooks";
8
7
  import { useT } from "@agent-native/core/client/i18n";
9
8
  import { useOrgRole } from "@agent-native/core/client/org";
9
+ import {
10
+ PromptBar,
11
+ PromptComposer,
12
+ } from "@agent-native/toolkit/app/chat/composer/index";
10
13
  import { IconChevronDown, IconClockHour4, IconPlus } from "@tabler/icons-react";
11
14
  import type { ReactNode } from "react";
12
15
  import { useState } from "react";
13
16
  import { Link, useNavigate } from "react-router";
14
17
 
15
- import type { ConnectedAppSummary } from "../lib/other-apps";
16
18
  import { cn } from "../lib/utils";
17
19
  import {
18
20
  orderWorkspaceApps,
@@ -31,11 +33,6 @@ import {
31
33
  } from "./app-list-row";
32
34
  import { CreateAppPopover } from "./create-app-popover";
33
35
  import { useSetPageTitle } from "./layout/HeaderActions";
34
- import {
35
- filterOtherAppEntries,
36
- mergeOtherAppEntries,
37
- OtherAppsSection,
38
- } from "./other-apps-section";
39
36
  import { Button } from "./ui/button";
40
37
  import {
41
38
  Collapsible,
@@ -48,7 +45,6 @@ import {
48
45
  WorkspaceAppSearch,
49
46
  WorkspaceAppSearchEmpty,
50
47
  } from "./workspace-app-search";
51
- import type { CuratedWorkspaceTemplatesResult } from "./workspace-template-card";
52
48
 
53
49
  function SectionHeader({
54
50
  title,
@@ -163,25 +159,9 @@ function CommandPanel() {
163
159
  function AppsPanel({
164
160
  apps,
165
161
  isLoading,
166
- connectedApps,
167
- connectedAppsError,
168
- connectedAppsLoading,
169
- onRetryConnectedApps,
170
- curatedTemplates,
171
- curatedTemplatesError,
172
- curatedTemplatesLoading,
173
- onRetryCuratedTemplates,
174
162
  }: {
175
163
  apps: WorkspaceAppSummary[];
176
164
  isLoading: boolean;
177
- connectedApps: ConnectedAppSummary[];
178
- connectedAppsError?: Error | null;
179
- connectedAppsLoading: boolean;
180
- onRetryConnectedApps: () => void;
181
- curatedTemplates?: CuratedWorkspaceTemplatesResult;
182
- curatedTemplatesError?: Error | null;
183
- curatedTemplatesLoading: boolean;
184
- onRetryCuratedTemplates: () => void;
185
165
  }) {
186
166
  const t = useT();
187
167
  const [showPending, setShowPending] = useState(false);
@@ -200,20 +180,8 @@ function AppsPanel({
200
180
  const filteredPendingApps = orderedPendingApps.filter((app) =>
201
181
  workspaceAppMatchesQuery(app, searchQuery),
202
182
  );
203
- const otherAppEntries = filterOtherAppEntries(
204
- mergeOtherAppEntries({
205
- templates: curatedTemplates,
206
- connectedApps,
207
- workspaceApps: apps,
208
- }),
209
- searchQuery,
210
- );
211
183
  const hasSearchResults =
212
- filteredActiveApps.length > 0 ||
213
- filteredPendingApps.length > 0 ||
214
- otherAppEntries.length > 0;
215
- const otherAppsLoading = curatedTemplatesLoading || connectedAppsLoading;
216
- const otherAppsError = curatedTemplatesError || connectedAppsError;
184
+ filteredActiveApps.length > 0 || filteredPendingApps.length > 0;
217
185
  const showSkeletons =
218
186
  isLoading && activeApps.length === 0 && pendingApps.length === 0;
219
187
 
@@ -229,9 +197,7 @@ function AppsPanel({
229
197
  </Link>
230
198
  </Button>
231
199
  {!showSkeletons &&
232
- (visibleApps.length > 0 ||
233
- otherAppEntries.length > 0 ||
234
- Boolean(searchQuery.trim())) ? (
200
+ (visibleApps.length > 0 || Boolean(searchQuery.trim())) ? (
235
201
  <WorkspaceAppSearch
236
202
  className="w-[220px]"
237
203
  query={searchQuery}
@@ -263,10 +229,7 @@ function AppsPanel({
263
229
  ) : null}
264
230
  {showSkeletons ? (
265
231
  <OverviewAppsSkeleton />
266
- ) : searchQuery.trim() &&
267
- !hasSearchResults &&
268
- !otherAppsLoading &&
269
- !otherAppsError ? (
232
+ ) : searchQuery.trim() && !hasSearchResults ? (
270
233
  <WorkspaceAppSearchEmpty
271
234
  query={searchQuery}
272
235
  onClear={() => setSearchQuery("")}
@@ -284,32 +247,14 @@ function AppsPanel({
284
247
  />
285
248
  ))}
286
249
  {filteredActiveApps.length === 0 &&
287
- !searchQuery.trim() &&
288
- otherAppEntries.length === 0 &&
289
- !curatedTemplatesLoading &&
290
- !connectedAppsLoading &&
291
- !curatedTemplatesError &&
292
- !connectedAppsError ? (
250
+ pendingApps.length === 0 &&
251
+ !searchQuery.trim() ? (
293
252
  <p className="px-4 py-3 text-sm text-muted-foreground">
294
253
  {t("dispatch.pages.noApps", {
295
254
  defaultValue: "No apps yet.",
296
255
  })}
297
256
  </p>
298
257
  ) : null}
299
- <OtherAppsSection
300
- templates={curatedTemplates}
301
- connectedApps={connectedApps}
302
- workspaceApps={apps}
303
- templatesLoading={curatedTemplatesLoading}
304
- connectedAppsLoading={connectedAppsLoading}
305
- templatesError={curatedTemplatesError}
306
- connectedAppsError={connectedAppsError}
307
- query={searchQuery}
308
- onRetryTemplates={onRetryCuratedTemplates}
309
- onRetryConnectedApps={onRetryConnectedApps}
310
- heading={null}
311
- embeddedInList
312
- />
313
258
  </AppList>
314
259
  </>
315
260
  )}
@@ -405,14 +350,6 @@ export function DispatchControlPlane() {
405
350
  "list-workspace-apps",
406
351
  { includeAgentCards: false, includeArchived: true },
407
352
  );
408
- const connectedAppsQuery = useActionQuery<ConnectedAppSummary[]>(
409
- "list-connected-agents",
410
- {},
411
- );
412
- const curatedTemplatesQuery = useActionQuery<CuratedWorkspaceTemplatesResult>(
413
- "list-curated-workspace-templates",
414
- {},
415
- );
416
353
  const { data: workspaceApps = [], isLoading: appsLoading } = appsQuery;
417
354
 
418
355
  return (
@@ -424,18 +361,7 @@ export function DispatchControlPlane() {
424
361
  onRetry={() => void appsQuery.refetch()}
425
362
  />
426
363
  ) : (
427
- <AppsPanel
428
- apps={workspaceApps ?? []}
429
- isLoading={appsLoading}
430
- connectedApps={connectedAppsQuery.data ?? []}
431
- connectedAppsError={connectedAppsQuery.error}
432
- connectedAppsLoading={connectedAppsQuery.isLoading}
433
- onRetryConnectedApps={() => void connectedAppsQuery.refetch()}
434
- curatedTemplates={curatedTemplatesQuery.data}
435
- curatedTemplatesError={curatedTemplatesQuery.error}
436
- curatedTemplatesLoading={curatedTemplatesQuery.isLoading}
437
- onRetryCuratedTemplates={() => void curatedTemplatesQuery.refetch()}
438
- />
364
+ <AppsPanel apps={workspaceApps ?? []} isLoading={appsLoading} />
439
365
  )}
440
366
  </div>
441
367
  );
@@ -1,5 +1,5 @@
1
- import { AgentToggleButton } from "@agent-native/core/client/agent-chat";
2
- import { RunsTray } from "@agent-native/core/client/progress";
1
+ import { AgentToggleButton } from "@agent-native/toolkit/app/chat";
2
+ import { RunsTray } from "@agent-native/toolkit/app/progress";
3
3
  import { IconLayoutSidebar } from "@tabler/icons-react";
4
4
  import { useLocation, useNavigate } from "react-router";
5
5
 
@@ -30,6 +30,7 @@ describe("Dispatch layout scrolling", () => {
30
30
  describe("Dispatch workspace app chat rail", () => {
31
31
  it("routes the open-app rail through the shared app-chat component", () => {
32
32
  expect(layoutSource).toContain("<WorkspaceAppChatRail");
33
+ expect(layoutSource).toContain("workspaceAppChatRegistration ? (");
33
34
  expect(layoutSource).toContain("data-dispatch-workspace-app-frame");
34
35
  expect(layoutSource).toContain('new Event("agent-panel:toggle")');
35
36
  expect(layoutSource).toContain('new CustomEvent("agent-panel:toggle"');
@@ -1,3 +1,4 @@
1
+ import { isSettingsPathname } from "@agent-native/toolkit/app/settings";
1
2
  // @vitest-environment happy-dom
2
3
  import React, { act } from "react";
3
4
  import { createRoot, type Root } from "react-dom/client";
@@ -12,7 +13,6 @@ import {
12
13
  dispatchNavLinkTarget,
13
14
  formatThreadAge,
14
15
  isElectronEmbeddedSearch,
15
- isSettingsShellPath,
16
16
  NavContent,
17
17
  renderChatFirstAppSurfaceTab,
18
18
  shouldAutoCollapseDispatchSidebar,
@@ -30,18 +30,27 @@ const clientState = vi.hoisted(() => ({
30
30
  .mockResolvedValue({ startUrl: "about:blank" }),
31
31
  }));
32
32
 
33
- vi.mock("@agent-native/core/client/agent-chat", () => ({
34
- AgentSidebar: ({ children }: { children: React.ReactNode }) => (
35
- <div data-agent-sidebar>{children}</div>
36
- ),
37
- ExternalAgentNudge: () => null,
38
- focusAgentChat: vi.fn(),
33
+ vi.mock("@agent-native/core/client/agent-chat", async (importOriginal) => ({
34
+ ...(await importOriginal<
35
+ typeof import("@agent-native/core/client/agent-chat")
36
+ >()),
39
37
  navigateWithAgentChatViewTransition: (
40
38
  navigate: (path: string) => void,
41
39
  path: string,
42
40
  ) => navigate(path),
43
41
  useAgentChatHomeHandoff: () => false,
44
42
  useAgentChatHomeHandoffLinks: vi.fn(),
43
+ useChatModels: () => ({
44
+ availableModels: [],
45
+ defaultModel: "auto",
46
+ selectedModel: "auto",
47
+ selectedEngine: "",
48
+ selectedEffort: "medium" as const,
49
+ isLoading: false,
50
+ onModelChange: vi.fn(),
51
+ onEffortChange: vi.fn(),
52
+ refreshEngines: vi.fn(),
53
+ }),
45
54
  useChatThreads: () => ({
46
55
  threads: clientState.threads,
47
56
  activeThreadId: "active-thread",
@@ -53,6 +62,14 @@ vi.mock("@agent-native/core/client/agent-chat", () => ({
53
62
  }),
54
63
  }));
55
64
 
65
+ vi.mock("@agent-native/toolkit/app/chat", async (importOriginal) => ({
66
+ ...(await importOriginal<typeof import("@agent-native/toolkit/app/chat")>()),
67
+ AgentSidebar: ({ children }: { children: React.ReactNode }) => (
68
+ <div data-agent-sidebar>{children}</div>
69
+ ),
70
+ focusAgentChat: vi.fn(),
71
+ }));
72
+
56
73
  vi.mock("@agent-native/core/client/api-path", () => ({
57
74
  agentNativePath: (path: string) => path,
58
75
  appBasePath: () => clientState.basePath,
@@ -62,9 +79,11 @@ vi.mock("@agent-native/core/client/api-path", () => ({
62
79
  clientState.basePath && path.startsWith("/")
63
80
  ? `${clientState.basePath}${path}`
64
81
  : path,
82
+ frameworkRoutePrefix: () => "",
65
83
  }));
66
84
 
67
- vi.mock("@agent-native/core/client/hooks", () => ({
85
+ vi.mock("@agent-native/core/client/hooks", async (importOriginal) => ({
86
+ ...(await importOriginal<typeof import("@agent-native/core/client/hooks")>()),
68
87
  useActionQuery: (action: string) => ({
69
88
  data:
70
89
  action === "list-workspace-apps" ? clientState.workspaceApps : undefined,
@@ -84,6 +103,7 @@ vi.mock("next-themes", () => ({
84
103
  }));
85
104
 
86
105
  vi.mock("@agent-native/core/client/i18n", () => ({
106
+ useFormatters: () => ({ formatNumber: (value: number) => String(value) }),
87
107
  useT: () => (key: string, values?: Record<string, unknown>) => {
88
108
  const messages: Record<string, string> = {
89
109
  "dispatch.nav.chat": "Chat",
@@ -105,23 +125,22 @@ vi.mock("@agent-native/core/client/i18n", () => ({
105
125
  },
106
126
  }));
107
127
 
108
- vi.mock("@agent-native/core/client/navigation", () => ({
128
+ vi.mock("@agent-native/toolkit/app/shared", async (importOriginal) => ({
129
+ ...(await importOriginal<
130
+ typeof import("@agent-native/toolkit/app/shared")
131
+ >()),
109
132
  openCommandMenu: vi.fn(),
110
133
  }));
111
134
 
112
- vi.mock("@agent-native/core/client/ui", async (importOriginal) => {
113
- const actual =
114
- await importOriginal<typeof import("@agent-native/core/client/ui")>();
115
- return {
116
- ...actual,
117
- AgentNativeIcon: (props: React.SVGProps<SVGSVGElement>) => (
118
- <svg data-agent-native-icon {...props} />
119
- ),
120
- FeedbackButton: () => <div>Feedback</div>,
121
- };
122
- });
135
+ vi.mock("../create-app-popover", () => ({
136
+ CreateAppPopover: () => null,
137
+ }));
138
+
139
+ vi.mock("@agent-native/toolkit/app/feedback", () => ({
140
+ FeedbackButton: () => <div>Feedback</div>,
141
+ }));
123
142
 
124
- vi.mock("@agent-native/core/client/org", () => ({
143
+ vi.mock("@agent-native/toolkit/app/org", () => ({
125
144
  InvitationBanner: () => null,
126
145
  OrgSwitcher: () => <div>Organization</div>,
127
146
  }));
@@ -206,14 +225,14 @@ describe("Dispatch workspace app sidebar", () => {
206
225
 
207
226
  describe("Dispatch Settings frame", () => {
208
227
  it("drops the Dispatch chrome on Settings", () => {
209
- expect(isSettingsShellPath("/settings")).toBe(true);
210
- expect(isSettingsShellPath("/settings/members")).toBe(true);
211
- expect(isSettingsShellPath("/settings/app")).toBe(true);
228
+ expect(isSettingsPathname("/settings")).toBe(true);
229
+ expect(isSettingsPathname("/settings/members")).toBe(true);
230
+ expect(isSettingsPathname("/settings/app")).toBe(true);
212
231
  });
213
232
 
214
233
  it("keeps the Dispatch chrome off Settings", () => {
215
- expect(isSettingsShellPath("/admin")).toBe(false);
216
- expect(isSettingsShellPath("/apps/mail/settings")).toBe(false);
234
+ expect(isSettingsPathname("/admin")).toBe(false);
235
+ expect(isSettingsPathname("/apps/mail/settings")).toBe(false);
217
236
  });
218
237
  });
219
238
 
@@ -750,10 +769,10 @@ describe("chat-first surface panel toggle stacking", () => {
750
769
  it("keeps the toggle above the mobile full-screen surface panel overlay", async () => {
751
770
  const { ChatFirstSurfacePanelToggle: RealChatFirstSurfacePanelToggle } =
752
771
  await vi.importActual<
753
- typeof import("@agent-native/core/client/agent-chat")
754
- >("@agent-native/core/client/agent-chat");
772
+ typeof import("@agent-native/toolkit/app/chat/chat-first")
773
+ >("@agent-native/toolkit/app/chat/chat-first");
755
774
  const { ChatFirstSurfacePanel } =
756
- await import("@agent-native/core/client/chat-first");
775
+ await import("@agent-native/toolkit/app/chat/chat-first");
757
776
 
758
777
  const container = document.createElement("div");
759
778
  document.body.appendChild(container);
@@ -805,7 +824,7 @@ describe("chat-first app surface tab chat rail", () => {
805
824
 
806
825
  async function renderAppTab(isMobileSurface: boolean) {
807
826
  const { defaultChatFirstCopy } =
808
- await import("@agent-native/core/client/chat-first");
827
+ await import("@agent-native/toolkit/app/chat/chat-first");
809
828
  vi.stubGlobal(
810
829
  "fetch",
811
830
  vi.fn().mockResolvedValue(new Response("{}", { status: 200 })),