@agent-native/dispatch 0.14.0 → 0.14.2

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 (36) hide show
  1. package/dist/actions/navigate.js +1 -1
  2. package/dist/actions/navigate.js.map +1 -1
  3. package/dist/actions/view-screen.js +9 -0
  4. package/dist/actions/view-screen.js.map +1 -1
  5. package/dist/components/layout/Layout.d.ts.map +1 -1
  6. package/dist/components/layout/Layout.js +75 -70
  7. package/dist/components/layout/Layout.js.map +1 -1
  8. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  9. package/dist/components/messaging-setup-panel.js +15 -2
  10. package/dist/components/messaging-setup-panel.js.map +1 -1
  11. package/dist/routes/index.d.ts.map +1 -1
  12. package/dist/routes/index.js +1 -0
  13. package/dist/routes/index.js.map +1 -1
  14. package/dist/routes/pages/operations.d.ts +5 -0
  15. package/dist/routes/pages/operations.d.ts.map +1 -0
  16. package/dist/routes/pages/operations.js +51 -0
  17. package/dist/routes/pages/operations.js.map +1 -0
  18. package/dist/routes/pages/overview.d.ts +2 -2
  19. package/dist/server/lib/dispatch-routing.js +1 -1
  20. package/dist/server/lib/dispatch-routing.js.map +1 -1
  21. package/dist/server/lib/env-config.js +1 -1
  22. package/dist/server/lib/env-config.js.map +1 -1
  23. package/package.json +2 -2
  24. package/src/actions/navigate.ts +1 -1
  25. package/src/actions/view-screen.ts +11 -0
  26. package/src/components/layout/Layout.spec.tsx +154 -0
  27. package/src/components/layout/Layout.tsx +196 -189
  28. package/src/components/messaging-setup-panel.spec.tsx +17 -1
  29. package/src/components/messaging-setup-panel.tsx +81 -1
  30. package/src/routes/index.spec.ts +23 -0
  31. package/src/routes/index.ts +1 -0
  32. package/src/routes/pages/operations.tsx +134 -0
  33. package/src/server/lib/dispatch-routing.spec.ts +2 -0
  34. package/src/server/lib/dispatch-routing.ts +1 -1
  35. package/src/server/lib/env-config.ts +1 -1
  36. package/src/styles/dispatch-css.spec.ts +11 -0
@@ -0,0 +1,154 @@
1
+ // @vitest-environment happy-dom
2
+ import React, { act } from "react";
3
+ import { createRoot, type Root } from "react-dom/client";
4
+ import { MemoryRouter } from "react-router";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+
7
+ import { TooltipProvider } from "../ui/tooltip";
8
+ import { NavContent } from "./Layout";
9
+
10
+ const clientState = vi.hoisted(() => ({
11
+ createThread: vi.fn<() => Promise<string | null>>(),
12
+ switchThread: vi.fn(),
13
+ threads: [] as Array<Record<string, unknown>>,
14
+ }));
15
+
16
+ vi.mock("@agent-native/core/client", () => ({
17
+ AgentSidebar: ({ children }: { children: React.ReactNode }) => children,
18
+ FeedbackButton: () => <div>Feedback</div>,
19
+ appBasePath: () => "",
20
+ appPath: (path: string) => path,
21
+ focusAgentChat: vi.fn(),
22
+ navigateWithAgentChatViewTransition: (
23
+ navigate: (path: string) => void,
24
+ path: string,
25
+ ) => navigate(path),
26
+ useActionQuery: () => ({ data: undefined }),
27
+ useAgentChatHomeHandoff: () => false,
28
+ useAgentChatHomeHandoffLinks: vi.fn(),
29
+ useChatThreads: () => ({
30
+ threads: clientState.threads,
31
+ activeThreadId: "active-thread",
32
+ isLoading: false,
33
+ createThread: clientState.createThread,
34
+ switchThread: clientState.switchThread,
35
+ renameThread: vi.fn(),
36
+ refreshThreads: vi.fn(),
37
+ }),
38
+ useFormatters: () => ({
39
+ formatDate: () => "Jan 1",
40
+ }),
41
+ useT: () => (key: string, values?: Record<string, unknown>) => {
42
+ const messages: Record<string, string> = {
43
+ "dispatch.nav.chat": "Chat",
44
+ "dispatch.nav.overview": "Overview",
45
+ "dispatch.nav.apps": "Apps",
46
+ "dispatch.nav.operate": "Operate",
47
+ "dispatch.nav.advanced": "Advanced",
48
+ "dispatch.sidebar.newChat": "New chat",
49
+ "dispatch.sidebar.newDispatchChat": "New Dispatch chat",
50
+ "dispatch.sidebar.renameChat": "Rename chat",
51
+ "dispatch.sidebar.chatOptions": `Options for ${values?.title ?? ""}`,
52
+ "dispatch.sidebar.renameThread": `Rename ${values?.title ?? ""}`,
53
+ "sidebar.collapseSidebar": "Collapse sidebar",
54
+ "sidebar.expandSidebar": "Expand sidebar",
55
+ };
56
+ return messages[key] ?? String(values?.defaultValue ?? key);
57
+ },
58
+ }));
59
+
60
+ vi.mock("@agent-native/core/client/extensions", () => ({
61
+ ExtensionsSidebarSection: () => <div>Extensions</div>,
62
+ }));
63
+
64
+ vi.mock("@agent-native/core/client/org", () => ({
65
+ InvitationBanner: () => null,
66
+ OrgSwitcher: () => <div>Organization</div>,
67
+ }));
68
+
69
+ describe("Dispatch NavContent", () => {
70
+ let container: HTMLDivElement;
71
+ let root: Root;
72
+
73
+ beforeEach(() => {
74
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
75
+ vi.stubGlobal("requestAnimationFrame", (callback: FrameRequestCallback) => {
76
+ callback(0);
77
+ return 0;
78
+ });
79
+ clientState.createThread.mockResolvedValue("new-thread");
80
+ clientState.switchThread.mockReset();
81
+ clientState.threads = [
82
+ {
83
+ id: "active-thread",
84
+ title: "Current Dispatch work",
85
+ messageCount: 2,
86
+ updatedAt: Date.now(),
87
+ createdAt: Date.now(),
88
+ },
89
+ {
90
+ id: "older-thread",
91
+ title: "Earlier Dispatch work",
92
+ messageCount: 1,
93
+ updatedAt: Date.now() - 5 * 60_000,
94
+ createdAt: Date.now() - 5 * 60_000,
95
+ },
96
+ ];
97
+ container = document.createElement("div");
98
+ document.body.appendChild(container);
99
+ root = createRoot(container);
100
+ });
101
+
102
+ afterEach(() => {
103
+ act(() => root.unmount());
104
+ container.remove();
105
+ vi.unstubAllGlobals();
106
+ });
107
+
108
+ it("uses the quieter Analytics-style chat history and retains thread actions", async () => {
109
+ await act(async () => {
110
+ root.render(
111
+ <MemoryRouter initialEntries={["/chat/active-thread"]}>
112
+ <TooltipProvider>
113
+ <NavContent />
114
+ </TooltipProvider>
115
+ </MemoryRouter>,
116
+ );
117
+ });
118
+
119
+ expect(container.textContent).not.toContain("Chats");
120
+ expect(container.textContent).toContain("Current Dispatch work");
121
+ expect(container.textContent).toContain("Earlier Dispatch work");
122
+ expect(container.textContent).toContain("New chat");
123
+ expect(container.textContent).toContain("5m");
124
+ expect(
125
+ [...container.querySelectorAll("div")].some((element) =>
126
+ element.className.includes("group/item"),
127
+ ),
128
+ ).toBe(true);
129
+ expect(
130
+ container.querySelector('img[src="/agent-native-icon-light.svg"]')
131
+ ?.parentElement?.className,
132
+ ).not.toContain("border");
133
+ expect(container.textContent).not.toContain("Workspace control plane");
134
+
135
+ const threadButton = [...container.querySelectorAll("button")].find(
136
+ (button) => button.textContent === "Earlier Dispatch work",
137
+ );
138
+ expect(threadButton).toBeDefined();
139
+ await act(async () => {
140
+ threadButton?.click();
141
+ });
142
+ expect(clientState.switchThread).toHaveBeenCalledWith("older-thread");
143
+
144
+ const newChatButton = [...container.querySelectorAll("button")].find(
145
+ (button) => button.textContent?.includes("New chat"),
146
+ );
147
+ expect(newChatButton).toBeDefined();
148
+ await act(async () => {
149
+ newChatButton?.click();
150
+ });
151
+ expect(clientState.createThread).toHaveBeenCalledOnce();
152
+ expect(clientState.switchThread).toHaveBeenCalledWith("new-thread");
153
+ });
154
+ });