@agent-native/core 0.30.6 → 0.31.0

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 (255) hide show
  1. package/dist/a2a/client.d.ts +2 -0
  2. package/dist/a2a/client.d.ts.map +1 -1
  3. package/dist/a2a/client.js +6 -4
  4. package/dist/a2a/client.js.map +1 -1
  5. package/dist/a2a/handlers.d.ts.map +1 -1
  6. package/dist/a2a/handlers.js +3 -0
  7. package/dist/a2a/handlers.js.map +1 -1
  8. package/dist/a2a/server.d.ts.map +1 -1
  9. package/dist/a2a/server.js.map +1 -1
  10. package/dist/a2a/task-store.js.map +1 -1
  11. package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
  12. package/dist/agent/engine/anthropic-engine.js +0 -7
  13. package/dist/agent/engine/anthropic-engine.js.map +1 -1
  14. package/dist/agent/engine/registry.d.ts.map +1 -1
  15. package/dist/agent/engine/registry.js.map +1 -1
  16. package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
  17. package/dist/agent/engine/translate-ai-sdk.js +5 -3
  18. package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
  19. package/dist/agent/production-agent.js +7 -3
  20. package/dist/agent/production-agent.js.map +1 -1
  21. package/dist/agent/run-manager.d.ts.map +1 -1
  22. package/dist/agent/run-manager.js +14 -6
  23. package/dist/agent/run-manager.js.map +1 -1
  24. package/dist/application-state/store.d.ts.map +1 -1
  25. package/dist/application-state/store.js.map +1 -1
  26. package/dist/brand-kit/brand-signals.d.ts +31 -0
  27. package/dist/brand-kit/brand-signals.d.ts.map +1 -0
  28. package/dist/brand-kit/brand-signals.js +101 -0
  29. package/dist/brand-kit/brand-signals.js.map +1 -0
  30. package/dist/brand-kit/index.d.ts +21 -0
  31. package/dist/brand-kit/index.d.ts.map +1 -0
  32. package/dist/brand-kit/index.js +34 -0
  33. package/dist/brand-kit/index.js.map +1 -0
  34. package/dist/brand-kit/types.d.ts +103 -0
  35. package/dist/brand-kit/types.d.ts.map +1 -0
  36. package/dist/brand-kit/types.js +17 -0
  37. package/dist/brand-kit/types.js.map +1 -0
  38. package/dist/cli/code-agent-executor.d.ts.map +1 -1
  39. package/dist/cli/code-agent-executor.js.map +1 -1
  40. package/dist/cli/create.d.ts.map +1 -1
  41. package/dist/cli/create.js +0 -1
  42. package/dist/cli/create.js.map +1 -1
  43. package/dist/client/AgentNative.js.map +1 -1
  44. package/dist/client/AgentPanel.d.ts.map +1 -1
  45. package/dist/client/AgentPanel.js +0 -2
  46. package/dist/client/AgentPanel.js.map +1 -1
  47. package/dist/client/AssistantChat.d.ts.map +1 -1
  48. package/dist/client/AssistantChat.js +69 -17
  49. package/dist/client/AssistantChat.js.map +1 -1
  50. package/dist/client/IframeEmbed.d.ts.map +1 -1
  51. package/dist/client/IframeEmbed.js.map +1 -1
  52. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  53. package/dist/client/MultiTabAssistantChat.js +1 -1
  54. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  55. package/dist/client/RunStuckBanner.js.map +1 -1
  56. package/dist/client/agent-chat.d.ts.map +1 -1
  57. package/dist/client/agent-chat.js.map +1 -1
  58. package/dist/client/builder-mark.d.ts.map +1 -1
  59. package/dist/client/builder-mark.js.map +1 -1
  60. package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
  61. package/dist/client/components/MissingKeyCard.js.map +1 -1
  62. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  63. package/dist/client/composer/PromptComposer.js +6 -3
  64. package/dist/client/composer/PromptComposer.js.map +1 -1
  65. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  66. package/dist/client/composer/TiptapComposer.js +5 -0
  67. package/dist/client/composer/TiptapComposer.js.map +1 -1
  68. package/dist/client/composer/VoiceButton.d.ts.map +1 -1
  69. package/dist/client/composer/VoiceButton.js +9 -0
  70. package/dist/client/composer/VoiceButton.js.map +1 -1
  71. package/dist/client/composer/extensions/FileReference.d.ts.map +1 -1
  72. package/dist/client/composer/extensions/FileReference.js.map +1 -1
  73. package/dist/client/composer/extensions/MentionReference.d.ts.map +1 -1
  74. package/dist/client/composer/extensions/MentionReference.js.map +1 -1
  75. package/dist/client/composer/extensions/SkillReference.d.ts.map +1 -1
  76. package/dist/client/composer/extensions/SkillReference.js.map +1 -1
  77. package/dist/client/conversation/AgentConversation.js +8 -6
  78. package/dist/client/conversation/AgentConversation.js.map +1 -1
  79. package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
  80. package/dist/client/conversation/use-near-bottom-autoscroll.js +133 -35
  81. package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
  82. package/dist/client/db-admin/DbAdminPage.js.map +1 -1
  83. package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
  84. package/dist/client/dev-overlay/DevOverlay.js +0 -1
  85. package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
  86. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  87. package/dist/client/extensions/EmbeddedExtension.js +19 -0
  88. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  89. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
  90. package/dist/client/extensions/ExtensionViewer.js +11 -3
  91. package/dist/client/extensions/ExtensionViewer.js.map +1 -1
  92. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  93. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  94. package/dist/client/mcp-app-host.d.ts.map +1 -1
  95. package/dist/client/mcp-app-host.js +6 -1
  96. package/dist/client/mcp-app-host.js.map +1 -1
  97. package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  98. package/dist/client/mcp-apps/McpAppRenderer.js +1 -1
  99. package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
  100. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  101. package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
  102. package/dist/client/onboarding/SetupButton.js +6 -0
  103. package/dist/client/onboarding/SetupButton.js.map +1 -1
  104. package/dist/client/progress/RunsTray.js.map +1 -1
  105. package/dist/client/resources/McpServerDetail.d.ts.map +1 -1
  106. package/dist/client/resources/McpServerDetail.js.map +1 -1
  107. package/dist/client/settings/AgentsSection.d.ts.map +1 -1
  108. package/dist/client/settings/AgentsSection.js +1 -1
  109. package/dist/client/settings/AgentsSection.js.map +1 -1
  110. package/dist/client/settings/AutomationsSection.js.map +1 -1
  111. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  112. package/dist/client/sharing/ShareButton.js +0 -4
  113. package/dist/client/sharing/ShareButton.js.map +1 -1
  114. package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
  115. package/dist/client/terminal/AgentTerminal.js +1 -1
  116. package/dist/client/terminal/AgentTerminal.js.map +1 -1
  117. package/dist/client/use-agent-chat.d.ts.map +1 -1
  118. package/dist/client/use-agent-chat.js +20 -4
  119. package/dist/client/use-agent-chat.js.map +1 -1
  120. package/dist/client/use-chat-threads.d.ts.map +1 -1
  121. package/dist/client/use-chat-threads.js +39 -25
  122. package/dist/client/use-chat-threads.js.map +1 -1
  123. package/dist/client/use-db-sync.d.ts.map +1 -1
  124. package/dist/client/use-db-sync.js +8 -0
  125. package/dist/client/use-db-sync.js.map +1 -1
  126. package/dist/client/use-dev-mode.d.ts.map +1 -1
  127. package/dist/client/use-dev-mode.js +25 -9
  128. package/dist/client/use-dev-mode.js.map +1 -1
  129. package/dist/client/useProductionAgent.d.ts.map +1 -1
  130. package/dist/client/useProductionAgent.js +6 -2
  131. package/dist/client/useProductionAgent.js.map +1 -1
  132. package/dist/collab/agent-presence.d.ts.map +1 -1
  133. package/dist/collab/agent-presence.js +1 -1
  134. package/dist/collab/agent-presence.js.map +1 -1
  135. package/dist/collab/awareness.d.ts.map +1 -1
  136. package/dist/collab/awareness.js +8 -0
  137. package/dist/collab/awareness.js.map +1 -1
  138. package/dist/collab/client-struct.js.map +1 -1
  139. package/dist/deploy/build.js +0 -5
  140. package/dist/deploy/build.js.map +1 -1
  141. package/dist/extensions/fetch-tool.d.ts.map +1 -1
  142. package/dist/extensions/fetch-tool.js +4 -1
  143. package/dist/extensions/fetch-tool.js.map +1 -1
  144. package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
  145. package/dist/file-upload/actions/upload-image.js +39 -4
  146. package/dist/file-upload/actions/upload-image.js.map +1 -1
  147. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  148. package/dist/integrations/adapters/slack.js.map +1 -1
  149. package/dist/integrations/google-docs-poller.d.ts.map +1 -1
  150. package/dist/integrations/google-docs-poller.js +14 -1
  151. package/dist/integrations/google-docs-poller.js.map +1 -1
  152. package/dist/integrations/plugin.d.ts.map +1 -1
  153. package/dist/integrations/plugin.js.map +1 -1
  154. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  155. package/dist/integrations/webhook-handler.js +10 -1
  156. package/dist/integrations/webhook-handler.js.map +1 -1
  157. package/dist/jobs/scheduler.d.ts.map +1 -1
  158. package/dist/jobs/scheduler.js.map +1 -1
  159. package/dist/mcp/build-server.d.ts.map +1 -1
  160. package/dist/mcp/build-server.js +20 -8
  161. package/dist/mcp/build-server.js.map +1 -1
  162. package/dist/mcp/connect-store.d.ts.map +1 -1
  163. package/dist/mcp/connect-store.js +1 -1
  164. package/dist/mcp/connect-store.js.map +1 -1
  165. package/dist/notifications/channels.d.ts.map +1 -1
  166. package/dist/notifications/channels.js +3 -2
  167. package/dist/notifications/channels.js.map +1 -1
  168. package/dist/oauth-tokens/store.js.map +1 -1
  169. package/dist/observability/evals.d.ts.map +1 -1
  170. package/dist/observability/evals.js +7 -7
  171. package/dist/observability/evals.js.map +1 -1
  172. package/dist/observability/traces.d.ts.map +1 -1
  173. package/dist/observability/traces.js +15 -5
  174. package/dist/observability/traces.js.map +1 -1
  175. package/dist/org/handlers.d.ts.map +1 -1
  176. package/dist/org/handlers.js +3 -2
  177. package/dist/org/handlers.js.map +1 -1
  178. package/dist/resources/handlers.d.ts +5 -5
  179. package/dist/resources/handlers.d.ts.map +1 -1
  180. package/dist/resources/handlers.js.map +1 -1
  181. package/dist/scripts/db/schema.js.map +1 -1
  182. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  183. package/dist/server/agent-chat-plugin.js +0 -6
  184. package/dist/server/agent-chat-plugin.js.map +1 -1
  185. package/dist/server/auth.d.ts.map +1 -1
  186. package/dist/server/auth.js.map +1 -1
  187. package/dist/server/better-auth-instance.d.ts.map +1 -1
  188. package/dist/server/better-auth-instance.js +0 -3
  189. package/dist/server/better-auth-instance.js.map +1 -1
  190. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  191. package/dist/server/core-routes-plugin.js +1 -2
  192. package/dist/server/core-routes-plugin.js.map +1 -1
  193. package/dist/server/create-server.d.ts.map +1 -1
  194. package/dist/server/create-server.js +0 -23
  195. package/dist/server/create-server.js.map +1 -1
  196. package/dist/server/google-oauth.d.ts.map +1 -1
  197. package/dist/server/google-oauth.js +0 -3
  198. package/dist/server/google-oauth.js.map +1 -1
  199. package/dist/server/poll.d.ts.map +1 -1
  200. package/dist/server/poll.js +49 -18
  201. package/dist/server/poll.js.map +1 -1
  202. package/dist/settings/store.js.map +1 -1
  203. package/dist/sharing/access.d.ts.map +1 -1
  204. package/dist/sharing/access.js +25 -4
  205. package/dist/sharing/access.js.map +1 -1
  206. package/dist/triggers/dispatcher.d.ts.map +1 -1
  207. package/dist/triggers/dispatcher.js.map +1 -1
  208. package/dist/vite/client.d.ts.map +1 -1
  209. package/dist/vite/client.js +2 -0
  210. package/dist/vite/client.js.map +1 -1
  211. package/package.json +3 -2
  212. package/dist/client/conversation/AgentConversation.spec.d.ts +0 -2
  213. package/dist/client/conversation/AgentConversation.spec.d.ts.map +0 -1
  214. package/dist/client/conversation/AgentConversation.spec.js +0 -69
  215. package/dist/client/conversation/AgentConversation.spec.js.map +0 -1
  216. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts +0 -2
  217. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts.map +0 -1
  218. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js +0 -110
  219. package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js.map +0 -1
  220. package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts +0 -2
  221. package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts.map +0 -1
  222. package/dist/client/extensions/AgentNativeExtensionFrame.spec.js +0 -68
  223. package/dist/client/extensions/AgentNativeExtensionFrame.spec.js.map +0 -1
  224. package/dist/client/extensions/ExtensionViewer.spec.d.ts +0 -2
  225. package/dist/client/extensions/ExtensionViewer.spec.d.ts.map +0 -1
  226. package/dist/client/extensions/ExtensionViewer.spec.js +0 -94
  227. package/dist/client/extensions/ExtensionViewer.spec.js.map +0 -1
  228. package/dist/client/guided-questions.flow.spec.d.ts +0 -2
  229. package/dist/client/guided-questions.flow.spec.d.ts.map +0 -1
  230. package/dist/client/guided-questions.flow.spec.js +0 -147
  231. package/dist/client/guided-questions.flow.spec.js.map +0 -1
  232. package/dist/client/settings/useBuilderStatus.spec.d.ts +0 -2
  233. package/dist/client/settings/useBuilderStatus.spec.d.ts.map +0 -1
  234. package/dist/client/settings/useBuilderStatus.spec.js +0 -487
  235. package/dist/client/settings/useBuilderStatus.spec.js.map +0 -1
  236. package/dist/client/sharing/ShareButton.spec.d.ts +0 -2
  237. package/dist/client/sharing/ShareButton.spec.d.ts.map +0 -1
  238. package/dist/client/sharing/ShareButton.spec.js +0 -196
  239. package/dist/client/sharing/ShareButton.spec.js.map +0 -1
  240. package/dist/client/use-chat-models.spec.d.ts +0 -2
  241. package/dist/client/use-chat-models.spec.d.ts.map +0 -1
  242. package/dist/client/use-chat-models.spec.js +0 -39
  243. package/dist/client/use-chat-models.spec.js.map +0 -1
  244. package/dist/client/use-chat-threads.spec.d.ts +0 -2
  245. package/dist/client/use-chat-threads.spec.d.ts.map +0 -1
  246. package/dist/client/use-chat-threads.spec.js +0 -760
  247. package/dist/client/use-chat-threads.spec.js.map +0 -1
  248. package/dist/client/use-db-sync.spec.d.ts +0 -2
  249. package/dist/client/use-db-sync.spec.d.ts.map +0 -1
  250. package/dist/client/use-db-sync.spec.js +0 -107
  251. package/dist/client/use-db-sync.spec.js.map +0 -1
  252. package/dist/server/script-discovery.d.ts +0 -6
  253. package/dist/server/script-discovery.d.ts.map +0 -1
  254. package/dist/server/script-discovery.js +0 -6
  255. package/dist/server/script-discovery.js.map +0 -1
@@ -1,487 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- // @vitest-environment happy-dom
3
- import { act } from "react";
4
- import { createRoot } from "react-dom/client";
5
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
- import { openMcpAppHostLink } from "../mcp-app-host.js";
7
- import { useBuilderStatus, useBuilderConnectFlow, withBuilderConnectTrackingParams, } from "./useBuilderStatus.js";
8
- vi.mock("../mcp-app-host.js", () => ({
9
- openMcpAppHostLink: vi.fn(() => false),
10
- }));
11
- function jsonResponse(data) {
12
- return new Response(JSON.stringify(data), {
13
- headers: { "Content-Type": "application/json" },
14
- });
15
- }
16
- function setUserAgent(userAgent) {
17
- Object.defineProperty(window.navigator, "userAgent", {
18
- value: userAgent,
19
- configurable: true,
20
- });
21
- }
22
- function setEmbeddedWindow(embedded) {
23
- Object.defineProperty(window, "top", {
24
- value: embedded ? {} : window,
25
- configurable: true,
26
- });
27
- }
28
- function BuilderConnectProbe({ enabled = true, popupUrl, }) {
29
- const flow = useBuilderConnectFlow({ enabled, popupUrl });
30
- return (_jsxs("div", { children: [_jsx("button", { type: "button", onClick: () => flow.start(), children: "Connect" }), _jsxs("output", { "data-testid": "status", children: [flow.configured ? "configured" : "not-configured", " ", flow.connecting ? "connecting" : "idle"] }), _jsx("output", { children: flow.error ?? "" })] }));
31
- }
32
- function BuilderStatusProbe() {
33
- const { status, loading, stale, error } = useBuilderStatus();
34
- return (_jsxs("div", { children: [_jsxs("output", { "data-testid": "builder-status", children: [loading ? "loading" : "loaded", " ", status?.configured ? "configured" : "not-configured", " ", stale ? "stale" : "fresh"] }), _jsx("output", { children: error ?? "" })] }));
35
- }
36
- function createPopupStub() {
37
- const doc = document.implementation.createHTMLDocument("popup");
38
- return {
39
- closed: false,
40
- close: vi.fn(),
41
- document: doc,
42
- location: { href: "" },
43
- opener: window,
44
- };
45
- }
46
- const signedCliAuthUrl = "https://builder.io/cli-auth?response_type=code&host=agent-native-browser&client_id=Agent%20Native%20Browser&redirect_url=https%3A%2F%2Fagent-workspace.builder.io%2Fdispatch%2F_agent-native%2Fbuilder%2Fcallback%3F_an_state%3Dsigned&preview_url=https%3A%2F%2Fagent-workspace.builder.io%2Fdispatch&framework=agent-native";
47
- const staleCliAuthUrl = signedCliAuthUrl.replace("_an_state%3Dsigned", "_an_state%3Dstale");
48
- const refreshedCliAuthUrl = signedCliAuthUrl.replace("_an_state%3Dsigned", "_an_state%3Drefreshed");
49
- const connectedBuilderStatus = {
50
- configured: true,
51
- envManaged: false,
52
- builderEnabled: true,
53
- orgName: "Builder space",
54
- cliAuthUrl: signedCliAuthUrl,
55
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
56
- appHost: "https://builder.io",
57
- apiHost: "https://api.builder.io",
58
- publicKeyConfigured: true,
59
- privateKeyConfigured: true,
60
- };
61
- function expectedConnectUrl(url) {
62
- return withBuilderConnectTrackingParams(url, {
63
- source: "builder_connect_flow",
64
- flow: "connect_llm",
65
- });
66
- }
67
- describe("useBuilderStatus", () => {
68
- let container;
69
- let root;
70
- beforeEach(() => {
71
- vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
72
- setEmbeddedWindow(false);
73
- window.history.replaceState({}, "", "http://localhost:3000/settings");
74
- container = document.createElement("div");
75
- document.body.appendChild(container);
76
- root = createRoot(container);
77
- });
78
- afterEach(() => {
79
- act(() => root.unmount());
80
- container.remove();
81
- vi.unstubAllGlobals();
82
- });
83
- it("keeps the last good Builder status when a refresh fails", async () => {
84
- vi.stubGlobal("fetch", vi
85
- .fn()
86
- .mockResolvedValueOnce(jsonResponse(connectedBuilderStatus))
87
- .mockResolvedValueOnce(new Response("Not found", { status: 404 })));
88
- await act(async () => {
89
- root.render(_jsx(BuilderStatusProbe, {}));
90
- await Promise.resolve();
91
- await Promise.resolve();
92
- });
93
- expect(container.textContent).toContain("loaded configured fresh");
94
- await act(async () => {
95
- window.dispatchEvent(new Event("focus"));
96
- await Promise.resolve();
97
- await Promise.resolve();
98
- });
99
- expect(container.textContent).toContain("loaded configured stale");
100
- expect(container.textContent).toContain("Builder status unavailable (404)");
101
- });
102
- });
103
- describe("useBuilderConnectFlow", () => {
104
- let container;
105
- let root;
106
- let openSpy;
107
- beforeEach(() => {
108
- vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
109
- setEmbeddedWindow(false);
110
- window.history.replaceState({}, "", "http://localhost:3000/settings");
111
- vi.stubGlobal("fetch", vi.fn(async () => jsonResponse({
112
- configured: false,
113
- envManaged: false,
114
- builderEnabled: true,
115
- orgName: null,
116
- cliAuthUrl: signedCliAuthUrl,
117
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
118
- appHost: "https://builder.io",
119
- apiHost: "https://api.builder.io",
120
- publicKeyConfigured: false,
121
- privateKeyConfigured: false,
122
- })));
123
- openSpy = vi.fn(() => null);
124
- vi.stubGlobal("open", openSpy);
125
- vi.mocked(openMcpAppHostLink).mockReset();
126
- vi.mocked(openMcpAppHostLink).mockReturnValue(false);
127
- container = document.createElement("div");
128
- document.body.appendChild(container);
129
- root = createRoot(container);
130
- });
131
- afterEach(() => {
132
- act(() => root.unmount());
133
- container.remove();
134
- vi.useRealTimers();
135
- vi.unstubAllGlobals();
136
- });
137
- it("opens a blank web popup and navigates to a freshly fetched cli-auth URL", async () => {
138
- setUserAgent("Mozilla/5.0 Chrome/140.0");
139
- const popup = createPopupStub();
140
- openSpy.mockReturnValue(popup);
141
- await act(async () => {
142
- root.render(_jsx(BuilderConnectProbe, {}));
143
- await Promise.resolve();
144
- await Promise.resolve();
145
- });
146
- await act(async () => {
147
- container.querySelector("button")?.click();
148
- await Promise.resolve();
149
- await Promise.resolve();
150
- });
151
- expect(openSpy).toHaveBeenCalledWith("about:blank", "_blank", "width=600,height=700");
152
- expect(popup.location.href).toBe(expectedConnectUrl(signedCliAuthUrl));
153
- expect(container.textContent).not.toContain("Popup blocked");
154
- });
155
- it("falls back to the cached signed URL when the click-time status refresh fails", async () => {
156
- setUserAgent("Mozilla/5.0 Chrome/140.0");
157
- const popup = createPopupStub();
158
- openSpy.mockReturnValue(popup);
159
- vi.mocked(fetch).mockReset();
160
- vi.mocked(fetch)
161
- .mockResolvedValueOnce(jsonResponse({
162
- configured: false,
163
- envManaged: false,
164
- builderEnabled: true,
165
- orgName: null,
166
- cliAuthUrl: signedCliAuthUrl,
167
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
168
- appHost: "https://builder.io",
169
- apiHost: "https://api.builder.io",
170
- publicKeyConfigured: false,
171
- privateKeyConfigured: false,
172
- }))
173
- .mockResolvedValueOnce(new Response("Unauthorized", { status: 401 }));
174
- await act(async () => {
175
- root.render(_jsx(BuilderConnectProbe, {}));
176
- await Promise.resolve();
177
- await Promise.resolve();
178
- });
179
- await act(async () => {
180
- container.querySelector("button")?.click();
181
- await Promise.resolve();
182
- await Promise.resolve();
183
- });
184
- expect(openSpy).toHaveBeenCalledWith("about:blank", "_blank", "width=600,height=700");
185
- expect(popup.location.href).toBe(expectedConnectUrl(signedCliAuthUrl));
186
- expect(container.textContent).not.toContain("Couldn't start Builder connect");
187
- });
188
- it("does not probe Builder status when disabled", async () => {
189
- await act(async () => {
190
- root.render(_jsx(BuilderConnectProbe, { enabled: false }));
191
- await Promise.resolve();
192
- await Promise.resolve();
193
- });
194
- expect(fetch).not.toHaveBeenCalled();
195
- await act(async () => {
196
- container.querySelector("button")?.click();
197
- await Promise.resolve();
198
- });
199
- expect(openSpy).not.toHaveBeenCalled();
200
- expect(fetch).not.toHaveBeenCalled();
201
- });
202
- it("refreshes an un-timestamped signed prop URL before navigating web popups", async () => {
203
- setUserAgent("Mozilla/5.0 Chrome/140.0");
204
- const popup = createPopupStub();
205
- openSpy.mockReturnValue(popup);
206
- let resolveInitialFetch;
207
- const initialFetch = new Promise((resolve) => {
208
- resolveInitialFetch = resolve;
209
- });
210
- vi.mocked(fetch)
211
- .mockReturnValueOnce(initialFetch)
212
- .mockResolvedValue(jsonResponse({
213
- configured: false,
214
- envManaged: false,
215
- builderEnabled: true,
216
- orgName: null,
217
- cliAuthUrl: refreshedCliAuthUrl,
218
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
219
- appHost: "https://builder.io",
220
- apiHost: "https://api.builder.io",
221
- publicKeyConfigured: false,
222
- privateKeyConfigured: false,
223
- }));
224
- await act(async () => {
225
- root.render(_jsx(BuilderConnectProbe, { popupUrl: staleCliAuthUrl }));
226
- });
227
- await act(async () => {
228
- container.querySelector("button")?.click();
229
- await Promise.resolve();
230
- await Promise.resolve();
231
- });
232
- expect(openSpy).toHaveBeenCalledWith("about:blank", "_blank", "width=600,height=700");
233
- expect(popup.location.href).toBe(expectedConnectUrl(refreshedCliAuthUrl));
234
- resolveInitialFetch(jsonResponse({ configured: false }));
235
- });
236
- it("refreshes status when a Builder preview callback posts success", async () => {
237
- setUserAgent("Mozilla/5.0 Chrome/140.0");
238
- vi.mocked(fetch)
239
- .mockResolvedValueOnce(jsonResponse({
240
- configured: false,
241
- envManaged: false,
242
- builderEnabled: true,
243
- orgName: null,
244
- cliAuthUrl: signedCliAuthUrl,
245
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
246
- appHost: "https://builder.io",
247
- apiHost: "https://api.builder.io",
248
- publicKeyConfigured: false,
249
- privateKeyConfigured: false,
250
- }))
251
- .mockResolvedValueOnce(jsonResponse({
252
- configured: true,
253
- envManaged: false,
254
- builderEnabled: true,
255
- orgName: "Builder space",
256
- cliAuthUrl: signedCliAuthUrl,
257
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
258
- appHost: "https://builder.io",
259
- apiHost: "https://api.builder.io",
260
- publicKeyConfigured: true,
261
- privateKeyConfigured: true,
262
- }));
263
- await act(async () => {
264
- root.render(_jsx(BuilderConnectProbe, {}));
265
- await Promise.resolve();
266
- });
267
- expect(container.textContent).toContain("not-configured");
268
- await act(async () => {
269
- window.dispatchEvent(new MessageEvent("message", {
270
- origin: "https://940ebc5a83164aa6a37dde445e494f3a-fluid-crack-ctnhvsyb.builderio.xyz",
271
- data: { type: "builder-connect-success" },
272
- }));
273
- await Promise.resolve();
274
- await Promise.resolve();
275
- });
276
- expect(container.textContent).toContain("configured");
277
- });
278
- it("clears the spinner when the callback succeeds but status never confirms credentials", async () => {
279
- vi.useFakeTimers();
280
- vi.setSystemTime(new Date("2026-05-14T12:00:00.000Z"));
281
- setUserAgent("Mozilla/5.0 Chrome/140.0");
282
- const popup = createPopupStub();
283
- openSpy.mockReturnValue(popup);
284
- vi.mocked(fetch).mockImplementation(async () => jsonResponse({
285
- configured: false,
286
- envManaged: false,
287
- builderEnabled: true,
288
- orgName: null,
289
- cliAuthUrl: signedCliAuthUrl,
290
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
291
- appHost: "https://builder.io",
292
- apiHost: "https://api.builder.io",
293
- publicKeyConfigured: false,
294
- privateKeyConfigured: false,
295
- }));
296
- await act(async () => {
297
- root.render(_jsx(BuilderConnectProbe, {}));
298
- await Promise.resolve();
299
- });
300
- await act(async () => {
301
- container.querySelector("button")?.click();
302
- await Promise.resolve();
303
- await Promise.resolve();
304
- });
305
- expect(container.textContent).toContain("not-configured connecting");
306
- await act(async () => {
307
- window.dispatchEvent(new MessageEvent("message", {
308
- origin: "https://agent-workspace.builder.io",
309
- data: { type: "builder-connect-success" },
310
- }));
311
- await vi.advanceTimersByTimeAsync(5000);
312
- });
313
- expect(container.textContent).toContain("not-configured idle");
314
- expect(container.textContent).toContain("couldn't confirm");
315
- });
316
- it("clears the spinner when the popup closes before status confirms credentials", async () => {
317
- vi.useFakeTimers();
318
- vi.setSystemTime(new Date("2026-05-14T12:00:00.000Z"));
319
- setUserAgent("Mozilla/5.0 Chrome/140.0");
320
- const popup = createPopupStub();
321
- openSpy.mockReturnValue(popup);
322
- vi.mocked(fetch).mockImplementation(async () => jsonResponse({
323
- configured: false,
324
- envManaged: false,
325
- builderEnabled: true,
326
- orgName: null,
327
- cliAuthUrl: signedCliAuthUrl,
328
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
329
- appHost: "https://builder.io",
330
- apiHost: "https://api.builder.io",
331
- publicKeyConfigured: false,
332
- privateKeyConfigured: false,
333
- }));
334
- await act(async () => {
335
- root.render(_jsx(BuilderConnectProbe, {}));
336
- await Promise.resolve();
337
- });
338
- await act(async () => {
339
- container.querySelector("button")?.click();
340
- await Promise.resolve();
341
- await Promise.resolve();
342
- });
343
- expect(container.textContent).toContain("not-configured connecting");
344
- popup.closed = true;
345
- await act(async () => {
346
- await vi.advanceTimersByTimeAsync(8000);
347
- });
348
- expect(container.textContent).toContain("not-configured idle");
349
- expect(container.textContent).toContain("couldn't confirm");
350
- });
351
- it("does not replace the desktop webview when Electron reports a handled popup as null", async () => {
352
- setUserAgent("Mozilla/5.0 Electron/41.2.2 AgentNativeDesktop/0.1.7");
353
- await act(async () => {
354
- root.render(_jsx(BuilderConnectProbe, {}));
355
- });
356
- await act(async () => {
357
- container.querySelector("button")?.click();
358
- });
359
- expect(openSpy).toHaveBeenCalledWith(expectedConnectUrl(signedCliAuthUrl), "_blank", "noopener,noreferrer");
360
- expect(window.location.href).toBe("http://localhost:3000/settings");
361
- expect(container.textContent).not.toContain("Popup blocked");
362
- });
363
- it("asks the MCP host to open Builder when an embedded chat sandbox blocks popups", async () => {
364
- setUserAgent("Mozilla/5.0 Chrome/140.0");
365
- setEmbeddedWindow(true);
366
- vi.mocked(openMcpAppHostLink).mockResolvedValueOnce(true);
367
- vi.mocked(fetch).mockReset();
368
- vi.mocked(fetch)
369
- .mockResolvedValueOnce(jsonResponse({
370
- configured: false,
371
- envManaged: false,
372
- builderEnabled: true,
373
- orgName: null,
374
- cliAuthUrl: signedCliAuthUrl,
375
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed",
376
- appHost: "https://builder.io",
377
- apiHost: "https://api.builder.io",
378
- publicKeyConfigured: false,
379
- privateKeyConfigured: false,
380
- }))
381
- .mockResolvedValueOnce(jsonResponse({
382
- configured: false,
383
- envManaged: false,
384
- builderEnabled: true,
385
- orgName: null,
386
- cliAuthUrl: refreshedCliAuthUrl,
387
- connectUrl: "http://localhost:3000/_agent-native/builder/connect?_an_connect=refreshed",
388
- appHost: "https://builder.io",
389
- apiHost: "https://api.builder.io",
390
- publicKeyConfigured: false,
391
- privateKeyConfigured: false,
392
- }));
393
- await act(async () => {
394
- root.render(_jsx(BuilderConnectProbe, {}));
395
- await Promise.resolve();
396
- await Promise.resolve();
397
- });
398
- await act(async () => {
399
- container.querySelector("button")?.click();
400
- await Promise.resolve();
401
- await Promise.resolve();
402
- });
403
- expect(openSpy).toHaveBeenCalledWith("about:blank", "_blank", "width=600,height=700");
404
- expect(openMcpAppHostLink).toHaveBeenCalledWith(expectedConnectUrl(refreshedCliAuthUrl));
405
- expect(container.textContent).toContain("not-configured connecting");
406
- expect(container.textContent).not.toContain("Allow popups");
407
- });
408
- it("does not abort a reconnect popup because the old credential was rejected", async () => {
409
- vi.useFakeTimers();
410
- vi.setSystemTime(new Date("2026-05-14T12:00:00.000Z"));
411
- setUserAgent("Mozilla/5.0 Chrome/140.0");
412
- const popup = createPopupStub();
413
- openSpy.mockReturnValue(popup);
414
- const signedConnectUrl = "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed";
415
- vi.mocked(fetch).mockImplementation(async () => jsonResponse({
416
- configured: false,
417
- envManaged: true,
418
- builderEnabled: true,
419
- orgName: null,
420
- connectUrl: signedConnectUrl,
421
- appHost: "https://builder.io",
422
- apiHost: "https://api.builder.io",
423
- publicKeyConfigured: false,
424
- privateKeyConfigured: false,
425
- authError: {
426
- message: "Private key does not match spaceId",
427
- at: Date.now() - 60_000,
428
- },
429
- }));
430
- await act(async () => {
431
- root.render(_jsx(BuilderConnectProbe, {}));
432
- await Promise.resolve();
433
- });
434
- expect(container.textContent).toContain("Private key does not match spaceId");
435
- await act(async () => {
436
- container.querySelector("button")?.click();
437
- await Promise.resolve();
438
- await Promise.resolve();
439
- });
440
- expect(openSpy).toHaveBeenCalledWith("about:blank", "_blank", "width=600,height=700");
441
- expect(popup.location.href).toBe(expectedConnectUrl(signedConnectUrl));
442
- expect(container.textContent).toContain("not-configured connecting");
443
- expect(container.textContent).not.toContain("Private key does not match spaceId");
444
- await act(async () => {
445
- await vi.advanceTimersByTimeAsync(2000);
446
- });
447
- expect(container.textContent).toContain("not-configured connecting");
448
- expect(container.textContent).not.toContain("Private key does not match spaceId");
449
- });
450
- it("ignores stale connect callback errors after starting a fresh reconnect", async () => {
451
- vi.useFakeTimers();
452
- vi.setSystemTime(new Date("2026-05-14T12:00:00.000Z"));
453
- setUserAgent("Mozilla/5.0 Chrome/140.0");
454
- const popup = createPopupStub();
455
- openSpy.mockReturnValue(popup);
456
- const signedConnectUrl = "http://localhost:3000/_agent-native/builder/connect?_an_connect=signed";
457
- vi.mocked(fetch).mockImplementation(async () => jsonResponse({
458
- configured: false,
459
- envManaged: false,
460
- builderEnabled: true,
461
- orgName: null,
462
- connectUrl: signedConnectUrl,
463
- appHost: "https://builder.io",
464
- apiHost: "https://api.builder.io",
465
- publicKeyConfigured: false,
466
- privateKeyConfigured: false,
467
- connectError: {
468
- message: "No active connect flow found",
469
- at: Date.now() - 60_000,
470
- },
471
- }));
472
- await act(async () => {
473
- root.render(_jsx(BuilderConnectProbe, {}));
474
- await Promise.resolve();
475
- });
476
- expect(container.textContent).toContain("No active connect flow found");
477
- await act(async () => {
478
- container.querySelector("button")?.click();
479
- });
480
- await act(async () => {
481
- await vi.advanceTimersByTimeAsync(2000);
482
- });
483
- expect(container.textContent).toContain("not-configured connecting");
484
- expect(container.textContent).not.toContain("No active connect flow found");
485
- });
486
- });
487
- //# sourceMappingURL=useBuilderStatus.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBuilderStatus.spec.js","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment happy-dom\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { openMcpAppHostLink } from \"../mcp-app-host.js\";\nimport {\n useBuilderStatus,\n useBuilderConnectFlow,\n withBuilderConnectTrackingParams,\n} from \"./useBuilderStatus.js\";\n\nvi.mock(\"../mcp-app-host.js\", () => ({\n openMcpAppHostLink: vi.fn(() => false),\n}));\n\nfunction jsonResponse(data: unknown): Response {\n return new Response(JSON.stringify(data), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nfunction setUserAgent(userAgent: string) {\n Object.defineProperty(window.navigator, \"userAgent\", {\n value: userAgent,\n configurable: true,\n });\n}\n\nfunction setEmbeddedWindow(embedded: boolean) {\n Object.defineProperty(window, \"top\", {\n value: embedded ? {} : window,\n configurable: true,\n });\n}\n\nfunction BuilderConnectProbe({\n enabled = true,\n popupUrl,\n}: {\n enabled?: boolean;\n popupUrl?: string;\n}) {\n const flow = useBuilderConnectFlow({ enabled, popupUrl });\n return (\n <div>\n <button type=\"button\" onClick={() => flow.start()}>\n Connect\n </button>\n <output data-testid=\"status\">\n {flow.configured ? \"configured\" : \"not-configured\"}{\" \"}\n {flow.connecting ? \"connecting\" : \"idle\"}\n </output>\n <output>{flow.error ?? \"\"}</output>\n </div>\n );\n}\n\nfunction BuilderStatusProbe() {\n const { status, loading, stale, error } = useBuilderStatus();\n return (\n <div>\n <output data-testid=\"builder-status\">\n {loading ? \"loading\" : \"loaded\"}{\" \"}\n {status?.configured ? \"configured\" : \"not-configured\"}{\" \"}\n {stale ? \"stale\" : \"fresh\"}\n </output>\n <output>{error ?? \"\"}</output>\n </div>\n );\n}\n\nfunction createPopupStub() {\n const doc = document.implementation.createHTMLDocument(\"popup\");\n return {\n closed: false,\n close: vi.fn(),\n document: doc,\n location: { href: \"\" },\n opener: window,\n } as unknown as Window;\n}\n\nconst signedCliAuthUrl =\n \"https://builder.io/cli-auth?response_type=code&host=agent-native-browser&client_id=Agent%20Native%20Browser&redirect_url=https%3A%2F%2Fagent-workspace.builder.io%2Fdispatch%2F_agent-native%2Fbuilder%2Fcallback%3F_an_state%3Dsigned&preview_url=https%3A%2F%2Fagent-workspace.builder.io%2Fdispatch&framework=agent-native\";\nconst staleCliAuthUrl = signedCliAuthUrl.replace(\n \"_an_state%3Dsigned\",\n \"_an_state%3Dstale\",\n);\nconst refreshedCliAuthUrl = signedCliAuthUrl.replace(\n \"_an_state%3Dsigned\",\n \"_an_state%3Drefreshed\",\n);\n\nconst connectedBuilderStatus = {\n configured: true,\n envManaged: false,\n builderEnabled: true,\n orgName: \"Builder space\",\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: true,\n privateKeyConfigured: true,\n};\n\nfunction expectedConnectUrl(url: string): string {\n return withBuilderConnectTrackingParams(url, {\n source: \"builder_connect_flow\",\n flow: \"connect_llm\",\n });\n}\n\ndescribe(\"useBuilderStatus\", () => {\n let container: HTMLDivElement;\n let root: Root;\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n setEmbeddedWindow(false);\n window.history.replaceState({}, \"\", \"http://localhost:3000/settings\");\n container = document.createElement(\"div\");\n document.body.appendChild(container);\n root = createRoot(container);\n });\n\n afterEach(() => {\n act(() => root.unmount());\n container.remove();\n vi.unstubAllGlobals();\n });\n\n it(\"keeps the last good Builder status when a refresh fails\", async () => {\n vi.stubGlobal(\n \"fetch\",\n vi\n .fn()\n .mockResolvedValueOnce(jsonResponse(connectedBuilderStatus))\n .mockResolvedValueOnce(new Response(\"Not found\", { status: 404 })),\n );\n\n await act(async () => {\n root.render(<BuilderStatusProbe />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"loaded configured fresh\");\n\n await act(async () => {\n window.dispatchEvent(new Event(\"focus\"));\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"loaded configured stale\");\n expect(container.textContent).toContain(\"Builder status unavailable (404)\");\n });\n});\n\ndescribe(\"useBuilderConnectFlow\", () => {\n let container: HTMLDivElement;\n let root: Root;\n let openSpy: ReturnType<typeof vi.fn>;\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n setEmbeddedWindow(false);\n window.history.replaceState({}, \"\", \"http://localhost:3000/settings\");\n vi.stubGlobal(\n \"fetch\",\n vi.fn(async () =>\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n ),\n );\n openSpy = vi.fn(() => null);\n vi.stubGlobal(\"open\", openSpy);\n vi.mocked(openMcpAppHostLink).mockReset();\n vi.mocked(openMcpAppHostLink).mockReturnValue(false);\n container = document.createElement(\"div\");\n document.body.appendChild(container);\n root = createRoot(container);\n });\n\n afterEach(() => {\n act(() => root.unmount());\n container.remove();\n vi.useRealTimers();\n vi.unstubAllGlobals();\n });\n\n it(\"opens a blank web popup and navigates to a freshly fetched cli-auth URL\", async () => {\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(openSpy).toHaveBeenCalledWith(\n \"about:blank\",\n \"_blank\",\n \"width=600,height=700\",\n );\n expect(popup.location.href).toBe(expectedConnectUrl(signedCliAuthUrl));\n expect(container.textContent).not.toContain(\"Popup blocked\");\n });\n\n it(\"falls back to the cached signed URL when the click-time status refresh fails\", async () => {\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n vi.mocked(fetch).mockReset();\n vi.mocked(fetch)\n .mockResolvedValueOnce(\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n )\n .mockResolvedValueOnce(new Response(\"Unauthorized\", { status: 401 }));\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(openSpy).toHaveBeenCalledWith(\n \"about:blank\",\n \"_blank\",\n \"width=600,height=700\",\n );\n expect(popup.location.href).toBe(expectedConnectUrl(signedCliAuthUrl));\n expect(container.textContent).not.toContain(\n \"Couldn't start Builder connect\",\n );\n });\n\n it(\"does not probe Builder status when disabled\", async () => {\n await act(async () => {\n root.render(<BuilderConnectProbe enabled={false} />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(fetch).not.toHaveBeenCalled();\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n });\n\n expect(openSpy).not.toHaveBeenCalled();\n expect(fetch).not.toHaveBeenCalled();\n });\n\n it(\"refreshes an un-timestamped signed prop URL before navigating web popups\", async () => {\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n\n let resolveInitialFetch!: (response: Response) => void;\n const initialFetch = new Promise<Response>((resolve) => {\n resolveInitialFetch = resolve;\n });\n vi.mocked(fetch)\n .mockReturnValueOnce(initialFetch)\n .mockResolvedValue(\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: refreshedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe popupUrl={staleCliAuthUrl} />);\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(openSpy).toHaveBeenCalledWith(\n \"about:blank\",\n \"_blank\",\n \"width=600,height=700\",\n );\n expect(popup.location.href).toBe(expectedConnectUrl(refreshedCliAuthUrl));\n\n resolveInitialFetch(jsonResponse({ configured: false }));\n });\n\n it(\"refreshes status when a Builder preview callback posts success\", async () => {\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n vi.mocked(fetch)\n .mockResolvedValueOnce(\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n )\n .mockResolvedValueOnce(\n jsonResponse({\n configured: true,\n envManaged: false,\n builderEnabled: true,\n orgName: \"Builder space\",\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: true,\n privateKeyConfigured: true,\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"not-configured\");\n\n await act(async () => {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n origin:\n \"https://940ebc5a83164aa6a37dde445e494f3a-fluid-crack-ctnhvsyb.builderio.xyz\",\n data: { type: \"builder-connect-success\" },\n }),\n );\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"configured\");\n });\n\n it(\"clears the spinner when the callback succeeds but status never confirms credentials\", async () => {\n vi.useFakeTimers();\n vi.setSystemTime(new Date(\"2026-05-14T12:00:00.000Z\"));\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n vi.mocked(fetch).mockImplementation(async () =>\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"not-configured connecting\");\n\n await act(async () => {\n window.dispatchEvent(\n new MessageEvent(\"message\", {\n origin: \"https://agent-workspace.builder.io\",\n data: { type: \"builder-connect-success\" },\n }),\n );\n await vi.advanceTimersByTimeAsync(5000);\n });\n\n expect(container.textContent).toContain(\"not-configured idle\");\n expect(container.textContent).toContain(\"couldn't confirm\");\n });\n\n it(\"clears the spinner when the popup closes before status confirms credentials\", async () => {\n vi.useFakeTimers();\n vi.setSystemTime(new Date(\"2026-05-14T12:00:00.000Z\"));\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n vi.mocked(fetch).mockImplementation(async () =>\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"not-configured connecting\");\n\n (popup as unknown as { closed: boolean }).closed = true;\n await act(async () => {\n await vi.advanceTimersByTimeAsync(8000);\n });\n\n expect(container.textContent).toContain(\"not-configured idle\");\n expect(container.textContent).toContain(\"couldn't confirm\");\n });\n\n it(\"does not replace the desktop webview when Electron reports a handled popup as null\", async () => {\n setUserAgent(\"Mozilla/5.0 Electron/41.2.2 AgentNativeDesktop/0.1.7\");\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n });\n\n expect(openSpy).toHaveBeenCalledWith(\n expectedConnectUrl(signedCliAuthUrl),\n \"_blank\",\n \"noopener,noreferrer\",\n );\n expect(window.location.href).toBe(\"http://localhost:3000/settings\");\n expect(container.textContent).not.toContain(\"Popup blocked\");\n });\n\n it(\"asks the MCP host to open Builder when an embedded chat sandbox blocks popups\", async () => {\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n setEmbeddedWindow(true);\n vi.mocked(openMcpAppHostLink).mockResolvedValueOnce(true);\n vi.mocked(fetch).mockReset();\n vi.mocked(fetch)\n .mockResolvedValueOnce(\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: signedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n )\n .mockResolvedValueOnce(\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n cliAuthUrl: refreshedCliAuthUrl,\n connectUrl:\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=refreshed\",\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(openSpy).toHaveBeenCalledWith(\n \"about:blank\",\n \"_blank\",\n \"width=600,height=700\",\n );\n expect(openMcpAppHostLink).toHaveBeenCalledWith(\n expectedConnectUrl(refreshedCliAuthUrl),\n );\n expect(container.textContent).toContain(\"not-configured connecting\");\n expect(container.textContent).not.toContain(\"Allow popups\");\n });\n\n it(\"does not abort a reconnect popup because the old credential was rejected\", async () => {\n vi.useFakeTimers();\n vi.setSystemTime(new Date(\"2026-05-14T12:00:00.000Z\"));\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n const signedConnectUrl =\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\";\n vi.mocked(fetch).mockImplementation(async () =>\n jsonResponse({\n configured: false,\n envManaged: true,\n builderEnabled: true,\n orgName: null,\n connectUrl: signedConnectUrl,\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n authError: {\n message: \"Private key does not match spaceId\",\n at: Date.now() - 60_000,\n },\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\n \"Private key does not match spaceId\",\n );\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(openSpy).toHaveBeenCalledWith(\n \"about:blank\",\n \"_blank\",\n \"width=600,height=700\",\n );\n expect(popup.location.href).toBe(expectedConnectUrl(signedConnectUrl));\n expect(container.textContent).toContain(\"not-configured connecting\");\n expect(container.textContent).not.toContain(\n \"Private key does not match spaceId\",\n );\n\n await act(async () => {\n await vi.advanceTimersByTimeAsync(2000);\n });\n\n expect(container.textContent).toContain(\"not-configured connecting\");\n expect(container.textContent).not.toContain(\n \"Private key does not match spaceId\",\n );\n });\n\n it(\"ignores stale connect callback errors after starting a fresh reconnect\", async () => {\n vi.useFakeTimers();\n vi.setSystemTime(new Date(\"2026-05-14T12:00:00.000Z\"));\n setUserAgent(\"Mozilla/5.0 Chrome/140.0\");\n const popup = createPopupStub();\n openSpy.mockReturnValue(popup);\n const signedConnectUrl =\n \"http://localhost:3000/_agent-native/builder/connect?_an_connect=signed\";\n vi.mocked(fetch).mockImplementation(async () =>\n jsonResponse({\n configured: false,\n envManaged: false,\n builderEnabled: true,\n orgName: null,\n connectUrl: signedConnectUrl,\n appHost: \"https://builder.io\",\n apiHost: \"https://api.builder.io\",\n publicKeyConfigured: false,\n privateKeyConfigured: false,\n connectError: {\n message: \"No active connect flow found\",\n at: Date.now() - 60_000,\n },\n }),\n );\n\n await act(async () => {\n root.render(<BuilderConnectProbe />);\n await Promise.resolve();\n });\n\n expect(container.textContent).toContain(\"No active connect flow found\");\n\n await act(async () => {\n container.querySelector(\"button\")?.click();\n });\n\n await act(async () => {\n await vi.advanceTimersByTimeAsync(2000);\n });\n\n expect(container.textContent).toContain(\"not-configured connecting\");\n expect(container.textContent).not.toContain(\"No active connect flow found\");\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ShareButton.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ShareButton.spec.d.ts","sourceRoot":"","sources":["../../../src/client/sharing/ShareButton.spec.tsx"],"names":[],"mappings":""}