@agent-native/dispatch 0.13.13 → 0.14.1

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 (74) hide show
  1. package/dist/actions/delete-destination.d.ts +12 -12
  2. package/dist/actions/navigate.js +1 -1
  3. package/dist/actions/navigate.js.map +1 -1
  4. package/dist/actions/provider-api-audit.d.ts +7 -0
  5. package/dist/actions/provider-api-audit.d.ts.map +1 -0
  6. package/dist/actions/provider-api-audit.js +74 -0
  7. package/dist/actions/provider-api-audit.js.map +1 -0
  8. package/dist/actions/provider-api-catalog.d.ts +1 -1
  9. package/dist/actions/provider-api-request.js +10 -0
  10. package/dist/actions/provider-api-request.js.map +1 -1
  11. package/dist/actions/send-platform-message.d.ts +1 -0
  12. package/dist/actions/send-platform-message.js +43 -22
  13. package/dist/actions/send-platform-message.js.map +1 -1
  14. package/dist/actions/view-screen.js +9 -0
  15. package/dist/actions/view-screen.js.map +1 -1
  16. package/dist/components/layout/Layout.d.ts.map +1 -1
  17. package/dist/components/layout/Layout.js +75 -70
  18. package/dist/components/layout/Layout.js.map +1 -1
  19. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  20. package/dist/components/messaging-setup-panel.js +203 -127
  21. package/dist/components/messaging-setup-panel.js.map +1 -1
  22. package/dist/routes/index.d.ts.map +1 -1
  23. package/dist/routes/index.js +1 -0
  24. package/dist/routes/index.js.map +1 -1
  25. package/dist/routes/pages/messaging.js +1 -1
  26. package/dist/routes/pages/messaging.js.map +1 -1
  27. package/dist/routes/pages/operations.d.ts +5 -0
  28. package/dist/routes/pages/operations.d.ts.map +1 -0
  29. package/dist/routes/pages/operations.js +51 -0
  30. package/dist/routes/pages/operations.js.map +1 -0
  31. package/dist/routes/pages/overview.d.ts +2 -2
  32. package/dist/server/lib/dispatch-integrations.d.ts +7 -1
  33. package/dist/server/lib/dispatch-integrations.d.ts.map +1 -1
  34. package/dist/server/lib/dispatch-integrations.js +178 -8
  35. package/dist/server/lib/dispatch-integrations.js.map +1 -1
  36. package/dist/server/lib/dispatch-routing.d.ts +6 -0
  37. package/dist/server/lib/dispatch-routing.d.ts.map +1 -0
  38. package/dist/server/lib/dispatch-routing.js +30 -0
  39. package/dist/server/lib/dispatch-routing.js.map +1 -0
  40. package/dist/server/lib/env-config.d.ts.map +1 -1
  41. package/dist/server/lib/env-config.js +50 -0
  42. package/dist/server/lib/env-config.js.map +1 -1
  43. package/dist/server/lib/onboarding-steps.d.ts.map +1 -1
  44. package/dist/server/lib/onboarding-steps.js +25 -0
  45. package/dist/server/lib/onboarding-steps.js.map +1 -1
  46. package/dist/server/lib/provider-api.d.ts +2 -2
  47. package/dist/server/lib/provider-api.d.ts.map +1 -1
  48. package/dist/server/plugins/integrations.d.ts.map +1 -1
  49. package/dist/server/plugins/integrations.js +5 -2
  50. package/dist/server/plugins/integrations.js.map +1 -1
  51. package/package.json +2 -2
  52. package/src/actions/navigate.ts +1 -1
  53. package/src/actions/provider-api-audit.spec.ts +52 -0
  54. package/src/actions/provider-api-audit.ts +88 -0
  55. package/src/actions/provider-api-request.ts +10 -0
  56. package/src/actions/send-platform-message.spec.ts +108 -0
  57. package/src/actions/send-platform-message.ts +73 -25
  58. package/src/actions/view-screen.ts +11 -0
  59. package/src/components/layout/Layout.spec.tsx +154 -0
  60. package/src/components/layout/Layout.tsx +196 -189
  61. package/src/components/messaging-setup-panel.spec.tsx +191 -0
  62. package/src/components/messaging-setup-panel.tsx +472 -193
  63. package/src/routes/index.spec.ts +23 -0
  64. package/src/routes/index.ts +1 -0
  65. package/src/routes/pages/messaging.tsx +1 -1
  66. package/src/routes/pages/operations.tsx +134 -0
  67. package/src/server/lib/dispatch-integrations.spec.ts +113 -0
  68. package/src/server/lib/dispatch-integrations.ts +239 -6
  69. package/src/server/lib/dispatch-routing.spec.ts +44 -0
  70. package/src/server/lib/dispatch-routing.ts +42 -0
  71. package/src/server/lib/env-config.ts +50 -0
  72. package/src/server/lib/onboarding-steps.ts +32 -0
  73. package/src/server/plugins/integrations.ts +5 -2
  74. 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
+ });