@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 +0,0 @@
1
- {"version":3,"file":"use-chat-threads.spec.js","sourceRoot":"","sources":["../../src/client/use-chat-threads.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment happy-dom\n\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n useChatThreads,\n type ChatThreadScope,\n type ChatThreadSnapshot,\n type ChatThreadSummary,\n} from \"./use-chat-threads.js\";\n\nfunction jsonResponse(data: unknown) {\n return new Response(JSON.stringify(data), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\ndescribe(\"useChatThreads\", () => {\n let container: HTMLDivElement;\n let root: Root;\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n vi.stubGlobal(\"crypto\", { randomUUID: () => \"forked-thread\" });\n window.localStorage.clear();\n container = document.createElement(\"div\");\n document.body.appendChild(container);\n root = createRoot(container);\n });\n\n afterEach(() => {\n act(() => {\n root.unmount();\n });\n container.remove();\n vi.unstubAllGlobals();\n });\n\n it(\"starts fresh when no active thread is saved, even if server history exists\", async () => {\n const oldThread: ChatThreadSummary = {\n id: \"old-project-thread\",\n title: \"Animated charting tool\",\n preview: \"make the chart more playful\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [oldThread] });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"analytics-project\");\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"forked-thread\");\n expect(hook!.threads.map((thread) => thread.id)).toEqual([\n \"forked-thread\",\n \"old-project-thread\",\n ]);\n });\n\n it(\"keeps a saved active thread when it still exists on the server\", async () => {\n window.localStorage.setItem(\n \"agent-chat-active-thread:analytics-project\",\n \"old-project-thread\",\n );\n const oldThread: ChatThreadSummary = {\n id: \"old-project-thread\",\n title: \"Analytics for Academy\",\n preview: \"show weekly signups\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [oldThread] });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"analytics-project\");\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"old-project-thread\");\n expect(hook!.threads.map((thread) => thread.id)).toEqual([\n \"old-project-thread\",\n ]);\n });\n\n it(\"can ignore a saved active thread and start fresh immediately\", async () => {\n window.localStorage.setItem(\n \"agent-chat-active-thread:brain\",\n \"old-brain-thread\",\n );\n const oldThread: ChatThreadSummary = {\n id: \"old-brain-thread\",\n title: \"Using the Brain demo corpus\",\n preview: \"what should the demo cite?\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [oldThread] });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"brain\", null, {\n restoreActiveThread: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n\n expect(hook!.activeThreadId).toBe(\"forked-thread\");\n\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.threads.map((thread) => thread.id)).toEqual([\n \"forked-thread\",\n \"old-brain-thread\",\n ]);\n });\n\n it(\"keeps the active general chat visible when entering a scoped surface\", async () => {\n window.localStorage.setItem(\n \"agent-chat-active-thread:forms-app\",\n \"general-thread\",\n );\n const generalThread: ChatThreadSummary = {\n id: \"general-thread\",\n title: \"Create a form\",\n preview: \"make me a form\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const formThread: ChatThreadSummary = {\n id: \"form-thread\",\n title: \"Form edits\",\n preview: \"add another question\",\n messageCount: 2,\n createdAt: 3,\n updatedAt: 4,\n scope: { type: \"form\", id: \"form-1\", label: \"Hackathon\" },\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [generalThread, formThread] });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness({ scope }: { scope?: ChatThreadScope | null }) {\n hook = useChatThreads(\"/chat\", \"forms-app\", scope);\n return null;\n }\n\n await act(async () => {\n root.render(<Harness scope={null} />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"general-thread\");\n\n await act(async () => {\n root.render(\n <Harness scope={{ type: \"form\", id: \"form-1\", label: \"Hackathon\" }} />,\n );\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"general-thread\");\n expect(\n window.localStorage.getItem(\n \"agent-chat-active-thread:forms-app:scope:form:form-1\",\n ),\n ).toBeNull();\n expect(\n window.localStorage.getItem(\"agent-chat-active-thread:forms-app\"),\n ).toBe(\"general-thread\");\n });\n\n it(\"switches back to the general chat when leaving a scoped thread\", async () => {\n window.localStorage.setItem(\n \"agent-chat-active-thread:forms-app\",\n \"general-thread\",\n );\n window.localStorage.setItem(\n \"agent-chat-active-thread:forms-app:scope:form:form-1\",\n \"form-thread\",\n );\n const generalThread: ChatThreadSummary = {\n id: \"general-thread\",\n title: \"Create a form\",\n preview: \"make me a form\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const formThread: ChatThreadSummary = {\n id: \"form-thread\",\n title: \"Form edits\",\n preview: \"add another question\",\n messageCount: 2,\n createdAt: 3,\n updatedAt: 4,\n scope: { type: \"form\", id: \"form-1\", label: \"Hackathon\" },\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [formThread, generalThread] });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness({ scope }: { scope?: ChatThreadScope | null }) {\n hook = useChatThreads(\"/chat\", \"forms-app\", scope);\n return null;\n }\n\n await act(async () => {\n root.render(\n <Harness scope={{ type: \"form\", id: \"form-1\", label: \"Hackathon\" }} />,\n );\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"form-thread\");\n\n await act(async () => {\n root.render(<Harness scope={null} />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"general-thread\");\n });\n\n it(\"sends the current client snapshot when forking a thread\", async () => {\n const sourceThread: ChatThreadSummary = {\n id: \"source-thread\",\n title: \"Pipeline\",\n preview: \"make this slide better\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: { type: \"dashboard\", id: \"dash-1\", label: \"Pipeline\" },\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/threads/source-thread/fork\") {\n return jsonResponse({\n ...sourceThread,\n id: \"forked-thread\",\n title: \"Pipeline (fork)\",\n });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"fork-test\");\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n const snapshot: ChatThreadSnapshot = {\n threadData: JSON.stringify({ messages: [{ message: { id: \"m1\" } }] }),\n title: \"Pipeline\",\n preview: \"make this slide better\",\n messageCount: 1,\n };\n\n let forkedId: string | null = null;\n await act(async () => {\n forkedId = await hook!.forkThread(\"source-thread\", snapshot);\n });\n\n expect(forkedId).toBe(\"forked-thread\");\n const forkCall = fetchMock.mock.calls.find(\n ([url]) => url === \"/chat/threads/source-thread/fork\",\n );\n expect(forkCall).toBeDefined();\n expect(JSON.parse(forkCall![1]!.body as string)).toEqual({\n id: \"forked-thread\",\n source: { ...snapshot, scope: sourceThread.scope },\n });\n });\n\n it(\"creates a fork from the client snapshot when the fork endpoint cannot find the source\", async () => {\n const sourceThread: ChatThreadSummary = {\n id: \"source-thread\",\n title: \"Pipeline\",\n preview: \"make this slide better\",\n messageCount: 2,\n createdAt: 1,\n updatedAt: 2,\n scope: { type: \"deck\", id: \"deck-1\", label: \"Pipeline deck\" },\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/threads/source-thread/fork\") {\n return new Response(JSON.stringify({ error: \"Thread not found\" }), {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n if (url === \"/chat/threads\" && init?.method === \"POST\") {\n return jsonResponse({\n id: \"forked-thread\",\n title: \"Pipeline (fork)\",\n preview: \"\",\n messageCount: 0,\n createdAt: 3,\n updatedAt: 3,\n scope: sourceThread.scope,\n });\n }\n if (url === \"/chat/threads/forked-thread\" && init?.method === \"PUT\") {\n return jsonResponse({ ok: true });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"fork-test\");\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n const snapshot: ChatThreadSnapshot = {\n threadData: JSON.stringify({ messages: [{ message: { id: \"m1\" } }] }),\n title: \"Pipeline\",\n preview: \"make this slide better\",\n messageCount: 1,\n };\n\n let forkedId: string | null = null;\n await act(async () => {\n forkedId = await hook!.forkThread(\"source-thread\", snapshot);\n });\n\n expect(forkedId).toBe(\"forked-thread\");\n const createCall = fetchMock.mock.calls.find(\n ([url, init]) => url === \"/chat/threads\" && init?.method === \"POST\",\n );\n expect(createCall).toBeDefined();\n expect(JSON.parse(createCall![1]!.body as string)).toEqual({\n id: \"forked-thread\",\n title: \"Pipeline (fork)\",\n scope: sourceThread.scope,\n });\n const saveCall = fetchMock.mock.calls.find(\n ([url, init]) =>\n url === \"/chat/threads/forked-thread\" && init?.method === \"PUT\",\n );\n expect(saveCall).toBeDefined();\n expect(JSON.parse(saveCall![1]!.body as string)).toEqual({\n threadData: snapshot.threadData,\n title: \"Pipeline (fork)\",\n preview: snapshot.preview,\n messageCount: snapshot.messageCount,\n scope: sourceThread.scope,\n });\n });\n\n it(\"keeps generated titles when later thread saves update the preview\", async () => {\n const sourceThread: ChatThreadSummary = {\n id: \"thread-1\",\n title: \"Using the Brain demo data for this example\",\n preview: \"Using the Brain demo data for this example\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/threads/thread-1\" && init?.method === \"PUT\") {\n return jsonResponse({ ok: true });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"title-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n await act(async () => {\n await hook!.saveThreadData(\"thread-1\", {\n threadData: \"\",\n title: \"Brain Demo Setup\",\n preview: \"Using the Brain demo data for this example\",\n titleSource: \"generated\",\n });\n });\n\n await act(async () => {\n await hook!.saveThreadData(\"thread-1\", {\n threadData: JSON.stringify({ messages: [] }),\n title: \"Using the Brain demo data for this example\",\n preview: \"What should the demo answer cite?\",\n messageCount: 2,\n });\n });\n\n const saveCalls = fetchMock.mock.calls.filter(\n ([url, init]) =>\n url === \"/chat/threads/thread-1\" && init?.method === \"PUT\",\n );\n expect(JSON.parse(saveCalls[0]![1]!.body as string).title).toBe(\n \"Brain Demo Setup\",\n );\n expect(JSON.parse(saveCalls[1]![1]!.body as string).title).toBe(\n \"Brain Demo Setup\",\n );\n expect(\n hook!.threads.find((thread) => thread.id === \"thread-1\"),\n ).toMatchObject({\n title: \"Brain Demo Setup\",\n preview: \"What should the demo answer cite?\",\n messageCount: 2,\n });\n });\n\n it(\"renames a thread optimistically\", async () => {\n const sourceThread: ChatThreadSummary = {\n id: \"thread-1\",\n title: \"Old title\",\n preview: \"old preview\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/threads/thread-1/rename\" && init?.method === \"POST\") {\n return jsonResponse({ ok: true });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"rename-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n await act(async () => {\n await hook!.renameThread(\"thread-1\", \" New title \");\n });\n\n expect(JSON.parse(fetchMock.mock.calls[1]![1]!.body as string)).toEqual({\n title: \"New title\",\n });\n expect(\n hook!.threads.find((thread) => thread.id === \"thread-1\")?.title,\n ).toBe(\"New title\");\n });\n\n it(\"rolls back a failed pin update\", async () => {\n const sourceThread: ChatThreadSummary = {\n id: \"thread-1\",\n title: \"Pinned candidate\",\n preview: \"old preview\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n pinnedAt: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/threads/thread-1/pin\" && init?.method === \"POST\") {\n return new Response(JSON.stringify({ error: \"nope\" }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"pin-failure-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n let pinned = true;\n await act(async () => {\n pinned = await hook!.pinThread(\"thread-1\", true);\n });\n\n expect(pinned).toBe(false);\n expect(\n hook!.threads.find((thread) => thread.id === \"thread-1\"),\n ).toMatchObject({\n pinnedAt: null,\n updatedAt: 2,\n });\n });\n\n it(\"keeps the active thread when archive fails\", async () => {\n window.localStorage.setItem(\n \"agent-chat-active-thread:archive-failure-test\",\n \"thread-1\",\n );\n const sourceThread: ChatThreadSummary = {\n id: \"thread-1\",\n title: \"Archive candidate\",\n preview: \"old preview\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n archivedAt: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/threads/thread-1/archive\" && init?.method === \"POST\") {\n return new Response(JSON.stringify({ error: \"nope\" }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"archive-failure-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n let archived = true;\n await act(async () => {\n archived = await hook!.archiveThread(\"thread-1\");\n });\n\n expect(archived).toBe(false);\n expect(hook!.activeThreadId).toBe(\"thread-1\");\n expect(\n hook!.threads.find((thread) => thread.id === \"thread-1\"),\n ).toMatchObject({\n archivedAt: null,\n updatedAt: 2,\n });\n });\n\n it(\"keeps server pin metadata when local updatedAt is newer for another reason\", async () => {\n let serverThread: ChatThreadSummary = {\n id: \"thread-1\",\n title: \"Thread\",\n preview: \"old preview\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n pinnedAt: null,\n };\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [serverThread] });\n }\n if (url === \"/chat/threads/thread-1\" && init?.method === \"PUT\") {\n return jsonResponse({ ok: true });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"server-pin-merge-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n await act(async () => {\n await hook!.saveThreadData(\"thread-1\", {\n threadData: \"{}\",\n title: \"Thread\",\n preview: \"local send\",\n messageCount: 2,\n });\n });\n\n serverThread = {\n ...serverThread,\n pinnedAt: 123,\n updatedAt: 3,\n };\n await act(async () => {\n hook!.refreshThreads();\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(\n hook!.threads.find((thread) => thread.id === \"thread-1\"),\n ).toMatchObject({\n pinnedAt: 123,\n preview: \"local send\",\n messageCount: 2,\n });\n });\n\n it(\"does not restore an archived thread after failed archive if the user moved on\", async () => {\n window.localStorage.setItem(\n \"agent-chat-active-thread:archive-navigation-test\",\n \"thread-1\",\n );\n const threads: ChatThreadSummary[] = [\n {\n id: \"thread-1\",\n title: \"Archive candidate\",\n preview: \"old preview\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n archivedAt: null,\n },\n {\n id: \"thread-2\",\n title: \"Next thread\",\n preview: \"keep me open\",\n messageCount: 1,\n createdAt: 3,\n updatedAt: 4,\n scope: null,\n archivedAt: null,\n },\n ];\n let resolveArchive:\n | ((response: Response | PromiseLike<Response>) => void)\n | null = null;\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads });\n }\n if (url === \"/chat/threads/thread-1/archive\" && init?.method === \"POST\") {\n return new Promise<Response>((resolve) => {\n resolveArchive = resolve;\n });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"archive-navigation-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n let archivePromise: Promise<boolean>;\n await act(async () => {\n archivePromise = hook!.archiveThread(\"thread-1\");\n hook!.switchThread(\"thread-2\");\n await Promise.resolve();\n });\n await act(async () => {\n resolveArchive!(\n new Response(JSON.stringify({ error: \"nope\" }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n }),\n );\n await archivePromise!;\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(hook!.activeThreadId).toBe(\"thread-2\");\n });\n\n it(\"preserves a user rename over generated titles and later saves\", async () => {\n const sourceThread: ChatThreadSummary = {\n id: \"thread-1\",\n title: \"Old title\",\n preview: \"old preview\",\n messageCount: 1,\n createdAt: 1,\n updatedAt: 2,\n scope: null,\n };\n let resolveGenerate:\n | ((response: Response | PromiseLike<Response>) => void)\n | null = null;\n const fetchMock = vi.fn(async (url: string, init?: RequestInit) => {\n if (url === \"/chat/threads\" && !init) {\n return jsonResponse({ threads: [sourceThread] });\n }\n if (url === \"/chat/generate-title\" && init?.method === \"POST\") {\n return new Promise<Response>((resolve) => {\n resolveGenerate = resolve;\n });\n }\n if (url === \"/chat/threads/thread-1/rename\" && init?.method === \"POST\") {\n return jsonResponse({ ok: true });\n }\n if (url === \"/chat/threads/thread-1\" && init?.method === \"PUT\") {\n return jsonResponse({ ok: true });\n }\n throw new Error(`Unexpected fetch: ${url}`);\n });\n vi.stubGlobal(\"fetch\", fetchMock);\n\n let hook: ReturnType<typeof useChatThreads> | null = null;\n function Harness() {\n hook = useChatThreads(\"/chat\", \"rename-generated-test\", null, {\n autoCreate: false,\n });\n return null;\n }\n\n await act(async () => {\n root.render(<Harness />);\n });\n await act(async () => {\n await Promise.resolve();\n await Promise.resolve();\n });\n\n const generatedTitlePromise = hook!.generateTitle(\n \"thread-1\",\n \"Please summarize this chat\",\n );\n\n await act(async () => {\n await hook!.renameThread(\"thread-1\", \"User title\");\n });\n await act(async () => {\n resolveGenerate!(jsonResponse({ title: \"Generated title\" }));\n await generatedTitlePromise;\n });\n await act(async () => {\n await hook!.saveThreadData(\"thread-1\", {\n threadData: \"\",\n title: \"Generated title\",\n preview: \"Please summarize this chat\",\n titleSource: \"generated\",\n });\n });\n\n const saveCall = fetchMock.mock.calls.find(\n ([url, init]) =>\n url === \"/chat/threads/thread-1\" && init?.method === \"PUT\",\n );\n expect(JSON.parse(saveCall![1]!.body as string).title).toBe(\"User title\");\n expect(\n hook!.threads.find((thread) => thread.id === \"thread-1\")?.title,\n ).toBe(\"User title\");\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=use-db-sync.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-db-sync.spec.d.ts","sourceRoot":"","sources":["../../src/client/use-db-sync.spec.tsx"],"names":[],"mappings":""}
@@ -1,107 +0,0 @@
1
- import { jsx as _jsx } 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 { useDbSync } from "./use-db-sync.js";
7
- class QueryClientProbe {
8
- calls = [];
9
- invalidateQueries(opts) {
10
- this.calls.push(opts);
11
- }
12
- }
13
- function SyncProbe({ queryClient }) {
14
- useDbSync({
15
- queryClient,
16
- sseUrl: false,
17
- interval: 50,
18
- pauseWhenHidden: false,
19
- });
20
- return null;
21
- }
22
- async function renderWithEvent(event) {
23
- const queryClient = new QueryClientProbe();
24
- const fetchMock = vi.fn(async () => new Response(JSON.stringify({ version: event.version ?? 1, events: [event] })));
25
- vi.stubGlobal("fetch", fetchMock);
26
- const container = document.createElement("div");
27
- document.body.appendChild(container);
28
- const root = createRoot(container);
29
- await act(async () => {
30
- root.render(_jsx(SyncProbe, { queryClient: queryClient }));
31
- await Promise.resolve();
32
- await Promise.resolve();
33
- });
34
- return { container, fetchMock, queryClient, root };
35
- }
36
- describe("useDbSync", () => {
37
- let roots = [];
38
- let containers = [];
39
- beforeEach(() => {
40
- vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
41
- });
42
- afterEach(() => {
43
- for (const root of roots) {
44
- act(() => root.unmount());
45
- }
46
- for (const container of containers) {
47
- container.remove();
48
- }
49
- roots = [];
50
- containers = [];
51
- vi.unstubAllGlobals();
52
- vi.useRealTimers();
53
- });
54
- it("broadly invalidates active queries for action events", async () => {
55
- const result = await renderWithEvent({
56
- version: 1,
57
- source: "action",
58
- type: "change",
59
- key: "create-project",
60
- });
61
- roots.push(result.root);
62
- containers.push(result.container);
63
- expect(result.fetchMock).toHaveBeenCalled();
64
- expect(result.queryClient.calls).toContainEqual(undefined);
65
- expect(result.queryClient.calls).toContainEqual({ queryKey: ["action"] });
66
- });
67
- it("keeps non-action events on targeted framework invalidations", async () => {
68
- const result = await renderWithEvent({
69
- version: 1,
70
- source: "settings",
71
- type: "change",
72
- key: "*",
73
- });
74
- roots.push(result.root);
75
- containers.push(result.container);
76
- expect(result.fetchMock).toHaveBeenCalled();
77
- expect(result.queryClient.calls).not.toContainEqual(undefined);
78
- expect(result.queryClient.calls).toContainEqual({ queryKey: ["action"] });
79
- });
80
- it("backs off polling after an auth failure", async () => {
81
- vi.useFakeTimers();
82
- const queryClient = new QueryClientProbe();
83
- const fetchMock = vi.fn(async () => new Response("Unauthorized", {
84
- status: 401,
85
- statusText: "Unauthorized",
86
- }));
87
- vi.stubGlobal("fetch", fetchMock);
88
- const container = document.createElement("div");
89
- document.body.appendChild(container);
90
- const root = createRoot(container);
91
- roots.push(root);
92
- containers.push(container);
93
- await act(async () => {
94
- root.render(_jsx(SyncProbe, { queryClient: queryClient }));
95
- await Promise.resolve();
96
- await Promise.resolve();
97
- });
98
- expect(fetchMock).toHaveBeenCalledTimes(1);
99
- await act(async () => {
100
- vi.advanceTimersByTime(500);
101
- await Promise.resolve();
102
- await Promise.resolve();
103
- });
104
- expect(fetchMock).toHaveBeenCalledTimes(1);
105
- });
106
- });
107
- //# sourceMappingURL=use-db-sync.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-db-sync.spec.js","sourceRoot":"","sources":["../../src/client/use-db-sync.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment happy-dom\n\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { useDbSync } from \"./use-db-sync.js\";\n\nclass QueryClientProbe {\n calls: Array<{ queryKey?: string[] } | undefined> = [];\n\n invalidateQueries(opts?: { queryKey?: string[] }) {\n this.calls.push(opts);\n }\n}\n\nfunction SyncProbe({ queryClient }: { queryClient: QueryClientProbe }) {\n useDbSync({\n queryClient,\n sseUrl: false,\n interval: 50,\n pauseWhenHidden: false,\n });\n return null;\n}\n\nasync function renderWithEvent(event: Record<string, unknown>) {\n const queryClient = new QueryClientProbe();\n const fetchMock = vi.fn(\n async () =>\n new Response(\n JSON.stringify({ version: event.version ?? 1, events: [event] }),\n ),\n );\n vi.stubGlobal(\"fetch\", fetchMock);\n\n const container = document.createElement(\"div\");\n document.body.appendChild(container);\n const root = createRoot(container);\n\n await act(async () => {\n root.render(<SyncProbe queryClient={queryClient} />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n return { container, fetchMock, queryClient, root };\n}\n\ndescribe(\"useDbSync\", () => {\n let roots: Root[] = [];\n let containers: HTMLDivElement[] = [];\n\n beforeEach(() => {\n vi.stubGlobal(\"IS_REACT_ACT_ENVIRONMENT\", true);\n });\n\n afterEach(() => {\n for (const root of roots) {\n act(() => root.unmount());\n }\n for (const container of containers) {\n container.remove();\n }\n roots = [];\n containers = [];\n vi.unstubAllGlobals();\n vi.useRealTimers();\n });\n\n it(\"broadly invalidates active queries for action events\", async () => {\n const result = await renderWithEvent({\n version: 1,\n source: \"action\",\n type: \"change\",\n key: \"create-project\",\n });\n roots.push(result.root);\n containers.push(result.container);\n\n expect(result.fetchMock).toHaveBeenCalled();\n expect(result.queryClient.calls).toContainEqual(undefined);\n expect(result.queryClient.calls).toContainEqual({ queryKey: [\"action\"] });\n });\n\n it(\"keeps non-action events on targeted framework invalidations\", async () => {\n const result = await renderWithEvent({\n version: 1,\n source: \"settings\",\n type: \"change\",\n key: \"*\",\n });\n roots.push(result.root);\n containers.push(result.container);\n\n expect(result.fetchMock).toHaveBeenCalled();\n expect(result.queryClient.calls).not.toContainEqual(undefined);\n expect(result.queryClient.calls).toContainEqual({ queryKey: [\"action\"] });\n });\n\n it(\"backs off polling after an auth failure\", async () => {\n vi.useFakeTimers();\n const queryClient = new QueryClientProbe();\n const fetchMock = vi.fn(\n async () =>\n new Response(\"Unauthorized\", {\n status: 401,\n statusText: \"Unauthorized\",\n }),\n );\n vi.stubGlobal(\"fetch\", fetchMock);\n\n const container = document.createElement(\"div\");\n document.body.appendChild(container);\n const root = createRoot(container);\n roots.push(root);\n containers.push(container);\n\n await act(async () => {\n root.render(<SyncProbe queryClient={queryClient} />);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(fetchMock).toHaveBeenCalledTimes(1);\n\n await act(async () => {\n vi.advanceTimersByTime(500);\n await Promise.resolve();\n await Promise.resolve();\n });\n\n expect(fetchMock).toHaveBeenCalledTimes(1);\n });\n});\n"]}
@@ -1,6 +0,0 @@
1
- /**
2
- * @deprecated Use `action-discovery.ts` / `autoDiscoverActions` instead.
3
- * This file is kept for backwards compatibility.
4
- */
5
- export { autoDiscoverActions as autoDiscoverScripts, autoDiscoverActions, } from "./action-discovery.js";
6
- //# sourceMappingURL=script-discovery.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"script-discovery.d.ts","sourceRoot":"","sources":["../../src/server/script-discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,mBAAmB,IAAI,mBAAmB,EAC1C,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * @deprecated Use `action-discovery.ts` / `autoDiscoverActions` instead.
3
- * This file is kept for backwards compatibility.
4
- */
5
- export { autoDiscoverActions as autoDiscoverScripts, autoDiscoverActions, } from "./action-discovery.js";
6
- //# sourceMappingURL=script-discovery.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"script-discovery.js","sourceRoot":"","sources":["../../src/server/script-discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,mBAAmB,IAAI,mBAAmB,EAC1C,mBAAmB,GACpB,MAAM,uBAAuB,CAAC","sourcesContent":["/**\n * @deprecated Use `action-discovery.ts` / `autoDiscoverActions` instead.\n * This file is kept for backwards compatibility.\n */\nexport {\n autoDiscoverActions as autoDiscoverScripts,\n autoDiscoverActions,\n} from \"./action-discovery.js\";\n"]}