@athenaintel/react 0.30.0 → 0.35.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 (210) hide show
  1. package/README.md +160 -9
  2. package/dist/agent-runtime/src/athena-asset-drag.cjs +44 -0
  3. package/dist/agent-runtime/src/athena-asset-drag.cjs.map +1 -0
  4. package/dist/agent-runtime/src/athena-asset-drag.js +44 -0
  5. package/dist/agent-runtime/src/athena-asset-drag.js.map +1 -0
  6. package/dist/agent-runtime/src/composer-markdown.cjs.map +1 -1
  7. package/dist/agent-runtime/src/composer-markdown.js.map +1 -1
  8. package/dist/agent-runtime/src/config-mutations.cjs +59 -0
  9. package/dist/agent-runtime/src/config-mutations.cjs.map +1 -0
  10. package/dist/agent-runtime/src/config-mutations.js +59 -0
  11. package/dist/agent-runtime/src/config-mutations.js.map +1 -0
  12. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs +2 -3
  13. package/dist/agent-runtime/src/deep-agent-transport-recipe.cjs.map +1 -1
  14. package/dist/agent-runtime/src/deep-agent-transport-recipe.js +3 -4
  15. package/dist/agent-runtime/src/deep-agent-transport-recipe.js.map +1 -1
  16. package/dist/agent-runtime/src/edit-command.cjs.map +1 -1
  17. package/dist/agent-runtime/src/edit-command.js.map +1 -1
  18. package/dist/agent-runtime/src/generated/runconfig-contract.cjs +6 -0
  19. package/dist/agent-runtime/src/generated/runconfig-contract.cjs.map +1 -1
  20. package/dist/agent-runtime/src/generated/runconfig-contract.js +6 -0
  21. package/dist/agent-runtime/src/generated/runconfig-contract.js.map +1 -1
  22. package/dist/agent-runtime/src/messages.cjs +57 -2
  23. package/dist/agent-runtime/src/messages.cjs.map +1 -1
  24. package/dist/agent-runtime/src/messages.js +57 -2
  25. package/dist/agent-runtime/src/messages.js.map +1 -1
  26. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs +72 -3
  27. package/dist/agent-runtime/src/quota-safe-local-storage-session.cjs.map +1 -1
  28. package/dist/agent-runtime/src/quota-safe-local-storage-session.js +73 -4
  29. package/dist/agent-runtime/src/quota-safe-local-storage-session.js.map +1 -1
  30. package/dist/agent-runtime/src/statewire-transport.cjs +4 -13
  31. package/dist/agent-runtime/src/statewire-transport.cjs.map +1 -1
  32. package/dist/agent-runtime/src/statewire-transport.js +5 -14
  33. package/dist/agent-runtime/src/statewire-transport.js.map +1 -1
  34. package/dist/agent-runtime/src/tool-metadata.cjs +26 -7
  35. package/dist/agent-runtime/src/tool-metadata.cjs.map +1 -1
  36. package/dist/agent-runtime/src/tool-metadata.js +26 -7
  37. package/dist/agent-runtime/src/tool-metadata.js.map +1 -1
  38. package/dist/agent-runtime/src/use-deep-agent-config.cjs +117 -1
  39. package/dist/agent-runtime/src/use-deep-agent-config.cjs.map +1 -1
  40. package/dist/agent-runtime/src/use-deep-agent-config.js +118 -2
  41. package/dist/agent-runtime/src/use-deep-agent-config.js.map +1 -1
  42. package/dist/agent-runtime/src/use-deep-agent-thread.cjs.map +1 -1
  43. package/dist/agent-runtime/src/use-deep-agent-thread.js.map +1 -1
  44. package/dist/assets/AthenaAssetEmbed.cjs +9 -2
  45. package/dist/assets/AthenaAssetEmbed.cjs.map +1 -1
  46. package/dist/assets/AthenaAssetEmbed.d.ts +9 -0
  47. package/dist/assets/AthenaAssetEmbed.js +11 -4
  48. package/dist/assets/AthenaAssetEmbed.js.map +1 -1
  49. package/dist/assets/asset-embed-messages.cjs +6 -0
  50. package/dist/assets/asset-embed-messages.cjs.map +1 -1
  51. package/dist/assets/asset-embed-messages.d.ts +7 -0
  52. package/dist/assets/asset-embed-messages.js +6 -0
  53. package/dist/assets/asset-embed-messages.js.map +1 -1
  54. package/dist/assets/use-asset-embed.cjs +71 -71
  55. package/dist/assets/use-asset-embed.cjs.map +1 -1
  56. package/dist/assets/use-asset-embed.d.ts +20 -7
  57. package/dist/assets/use-asset-embed.js +72 -72
  58. package/dist/assets/use-asset-embed.js.map +1 -1
  59. package/dist/catalog/agent-model-options.cjs +122 -0
  60. package/dist/catalog/agent-model-options.cjs.map +1 -0
  61. package/dist/catalog/agent-model-options.d.ts +115 -0
  62. package/dist/catalog/agent-model-options.js +122 -0
  63. package/dist/catalog/agent-model-options.js.map +1 -0
  64. package/dist/catalog/chat-pickers.cjs +184 -4
  65. package/dist/catalog/chat-pickers.cjs.map +1 -1
  66. package/dist/catalog/chat-pickers.d.ts +27 -3
  67. package/dist/catalog/chat-pickers.js +187 -7
  68. package/dist/catalog/chat-pickers.js.map +1 -1
  69. package/dist/catalog/runtime-catalog.cjs +117 -3
  70. package/dist/catalog/runtime-catalog.cjs.map +1 -1
  71. package/dist/catalog/runtime-catalog.d.ts +104 -0
  72. package/dist/catalog/runtime-catalog.js +119 -5
  73. package/dist/catalog/runtime-catalog.js.map +1 -1
  74. package/dist/chat/AthenaChat.cjs +41 -26
  75. package/dist/chat/AthenaChat.cjs.map +1 -1
  76. package/dist/chat/AthenaChat.d.ts +8 -7
  77. package/dist/chat/AthenaChat.js +41 -26
  78. package/dist/chat/AthenaChat.js.map +1 -1
  79. package/dist/chat/super-grouping/SuperGroupingCard.cjs +61 -14
  80. package/dist/chat/super-grouping/SuperGroupingCard.cjs.map +1 -1
  81. package/dist/chat/super-grouping/SuperGroupingCard.d.ts +26 -12
  82. package/dist/chat/super-grouping/SuperGroupingCard.js +63 -16
  83. package/dist/chat/super-grouping/SuperGroupingCard.js.map +1 -1
  84. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs +80 -53
  85. package/dist/chat/super-grouping/SuperGroupingTranscript.cjs.map +1 -1
  86. package/dist/chat/super-grouping/SuperGroupingTranscript.d.ts +10 -10
  87. package/dist/chat/super-grouping/SuperGroupingTranscript.js +81 -54
  88. package/dist/chat/super-grouping/SuperGroupingTranscript.js.map +1 -1
  89. package/dist/chat/super-grouping/activity-timeline.cjs +19 -4
  90. package/dist/chat/super-grouping/activity-timeline.cjs.map +1 -1
  91. package/dist/chat/super-grouping/activity-timeline.d.ts +24 -5
  92. package/dist/chat/super-grouping/activity-timeline.js +19 -4
  93. package/dist/chat/super-grouping/activity-timeline.js.map +1 -1
  94. package/dist/chat/super-grouping/index.cjs +2 -0
  95. package/dist/chat/super-grouping/index.cjs.map +1 -1
  96. package/dist/chat/super-grouping/index.d.ts +7 -6
  97. package/dist/chat/super-grouping/index.js +3 -1
  98. package/dist/chat/super-grouping/toolkit-map.cjs +4 -1
  99. package/dist/chat/super-grouping/toolkit-map.cjs.map +1 -1
  100. package/dist/chat/super-grouping/toolkit-map.js +4 -1
  101. package/dist/chat/super-grouping/toolkit-map.js.map +1 -1
  102. package/dist/chat-ui/composer/tiptap-composer.cjs +40 -4
  103. package/dist/chat-ui/composer/tiptap-composer.cjs.map +1 -1
  104. package/dist/chat-ui/composer/tiptap-composer.js +40 -4
  105. package/dist/chat-ui/composer/tiptap-composer.js.map +1 -1
  106. package/dist/chat-ui/index.cjs +1 -0
  107. package/dist/chat-ui/index.cjs.map +1 -1
  108. package/dist/chat-ui/index.d.ts +1 -1
  109. package/dist/chat-ui/index.js +2 -1
  110. package/dist/chat-ui/mentions/mention-chip.cjs +29 -2
  111. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  112. package/dist/chat-ui/mentions/mention-chip.d.ts +2 -5
  113. package/dist/chat-ui/mentions/mention-chip.js +30 -3
  114. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  115. package/dist/chat-ui/mentions/mention-extension.cjs +1 -1
  116. package/dist/chat-ui/mentions/mention-extension.cjs.map +1 -1
  117. package/dist/chat-ui/mentions/mention-extension.js +1 -1
  118. package/dist/chat-ui/mentions/mention-extension.js.map +1 -1
  119. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs +33 -2
  120. package/dist/chat-ui/mentions/suggestions/data/api-client.cjs.map +1 -1
  121. package/dist/chat-ui/mentions/suggestions/data/api-client.d.ts +14 -0
  122. package/dist/chat-ui/mentions/suggestions/data/api-client.js +33 -2
  123. package/dist/chat-ui/mentions/suggestions/data/api-client.js.map +1 -1
  124. package/dist/chat-ui/mentions/use-account-workspace-id.cjs +61 -0
  125. package/dist/chat-ui/mentions/use-account-workspace-id.cjs.map +1 -0
  126. package/dist/chat-ui/mentions/use-account-workspace-id.d.ts +3 -0
  127. package/dist/chat-ui/mentions/use-account-workspace-id.js +61 -0
  128. package/dist/chat-ui/mentions/use-account-workspace-id.js.map +1 -0
  129. package/dist/chat-ui/mentions/use-member-avatar.cjs +75 -0
  130. package/dist/chat-ui/mentions/use-member-avatar.cjs.map +1 -0
  131. package/dist/chat-ui/mentions/use-member-avatar.d.ts +2 -0
  132. package/dist/chat-ui/mentions/use-member-avatar.js +75 -0
  133. package/dist/chat-ui/mentions/use-member-avatar.js.map +1 -0
  134. package/dist/collab/client.cjs +80 -19
  135. package/dist/collab/client.cjs.map +1 -1
  136. package/dist/collab/client.d.ts +22 -0
  137. package/dist/collab/client.js +80 -19
  138. package/dist/collab/client.js.map +1 -1
  139. package/dist/diagnostics/athena-diagnostics.cjs.map +1 -1
  140. package/dist/diagnostics/athena-diagnostics.d.ts +3 -1
  141. package/dist/diagnostics/athena-diagnostics.js.map +1 -1
  142. package/dist/index.cjs +5 -0
  143. package/dist/index.cjs.map +1 -1
  144. package/dist/index.d.ts +6 -3
  145. package/dist/index.js +7 -2
  146. package/dist/index.js.map +1 -1
  147. package/dist/lib/use-athena-rest-query.cjs +4 -0
  148. package/dist/lib/use-athena-rest-query.cjs.map +1 -1
  149. package/dist/lib/use-athena-rest-query.d.ts +6 -0
  150. package/dist/lib/use-athena-rest-query.js +4 -0
  151. package/dist/lib/use-athena-rest-query.js.map +1 -1
  152. package/dist/provider/AthenaProvider.cjs +57 -6
  153. package/dist/provider/AthenaProvider.cjs.map +1 -1
  154. package/dist/provider/AthenaProvider.d.ts +21 -5
  155. package/dist/provider/AthenaProvider.js +59 -8
  156. package/dist/provider/AthenaProvider.js.map +1 -1
  157. package/dist/provider/agent-selection-context.cjs +6 -0
  158. package/dist/provider/agent-selection-context.cjs.map +1 -0
  159. package/dist/provider/agent-selection-context.d.ts +14 -0
  160. package/dist/provider/agent-selection-context.js +6 -0
  161. package/dist/provider/agent-selection-context.js.map +1 -0
  162. package/dist/react/package.json.cjs +1 -1
  163. package/dist/react/package.json.js +1 -1
  164. package/dist/runtime/StatewireThreadConfigLaneSync.cjs +125 -0
  165. package/dist/runtime/StatewireThreadConfigLaneSync.cjs.map +1 -0
  166. package/dist/runtime/StatewireThreadConfigLaneSync.d.ts +54 -0
  167. package/dist/runtime/StatewireThreadConfigLaneSync.js +125 -0
  168. package/dist/runtime/StatewireThreadConfigLaneSync.js.map +1 -0
  169. package/dist/runtime/statewire-lifecycle.cjs +5 -2
  170. package/dist/runtime/statewire-lifecycle.cjs.map +1 -1
  171. package/dist/runtime/statewire-lifecycle.d.ts +5 -0
  172. package/dist/runtime/statewire-lifecycle.js +5 -2
  173. package/dist/runtime/statewire-lifecycle.js.map +1 -1
  174. package/dist/runtime/statewire-model-lane.cjs +16 -0
  175. package/dist/runtime/statewire-model-lane.cjs.map +1 -0
  176. package/dist/runtime/statewire-model-lane.d.ts +66 -0
  177. package/dist/runtime/statewire-model-lane.js +16 -0
  178. package/dist/runtime/statewire-model-lane.js.map +1 -0
  179. package/dist/runtime/statewire-run-config.cjs +16 -2
  180. package/dist/runtime/statewire-run-config.cjs.map +1 -1
  181. package/dist/runtime/statewire-run-config.d.ts +10 -0
  182. package/dist/runtime/statewire-run-config.js +16 -2
  183. package/dist/runtime/statewire-run-config.js.map +1 -1
  184. package/dist/runtime/statewire-server-lane-context.cjs +24 -0
  185. package/dist/runtime/statewire-server-lane-context.cjs.map +1 -0
  186. package/dist/runtime/statewire-server-lane-context.d.ts +30 -0
  187. package/dist/runtime/statewire-server-lane-context.js +24 -0
  188. package/dist/runtime/statewire-server-lane-context.js.map +1 -0
  189. package/dist/runtime/statewire-thread-config-lane.cjs +84 -0
  190. package/dist/runtime/statewire-thread-config-lane.cjs.map +1 -0
  191. package/dist/runtime/statewire-thread-config-lane.d.ts +94 -0
  192. package/dist/runtime/statewire-thread-config-lane.js +84 -0
  193. package/dist/runtime/statewire-thread-config-lane.js.map +1 -0
  194. package/dist/runtime/useAthenaStatewireRuntime.cjs +38 -18
  195. package/dist/runtime/useAthenaStatewireRuntime.cjs.map +1 -1
  196. package/dist/runtime/useAthenaStatewireRuntime.d.ts +8 -1
  197. package/dist/runtime/useAthenaStatewireRuntime.js +39 -19
  198. package/dist/runtime/useAthenaStatewireRuntime.js.map +1 -1
  199. package/dist/styles.css +1 -1
  200. package/dist/threads/api.cjs +2 -1
  201. package/dist/threads/api.cjs.map +1 -1
  202. package/dist/threads/api.d.ts +1 -0
  203. package/dist/threads/api.js +2 -1
  204. package/dist/threads/api.js.map +1 -1
  205. package/dist/threads/use-athena-thread-model.cjs +22 -0
  206. package/dist/threads/use-athena-thread-model.cjs.map +1 -0
  207. package/dist/threads/use-athena-thread-model.d.ts +27 -0
  208. package/dist/threads/use-athena-thread-model.js +22 -0
  209. package/dist/threads/use-athena-thread-model.js.map +1 -0
  210. package/package.json +4 -4
@@ -0,0 +1,61 @@
1
+ import { useState, useEffect } from "react";
2
+ import { withCredentialRenewal } from "../../runtime/credential-renewal.js";
3
+ import { fetchAccountIdentity } from "../../threads/api.js";
4
+ const workspaceIdRequests = /* @__PURE__ */ new Map();
5
+ function loadWorkspaceId(auth) {
6
+ if (auth.workspaceId) return Promise.resolve(auth.workspaceId);
7
+ const cacheKey = `${auth.backendUrl}|${auth.userId ?? ""}`;
8
+ const cached = workspaceIdRequests.get(cacheKey);
9
+ if (cached) return cached;
10
+ const request = withCredentialRenewal(
11
+ async ({ force } = {}) => {
12
+ var _a, _b;
13
+ return {
14
+ token: (force ? await ((_a = auth.renewAccessToken) == null ? void 0 : _a.call(auth)) : await ((_b = auth.getAccessToken) == null ? void 0 : _b.call(auth))) ?? auth.accessToken ?? null,
15
+ apiKey: auth.apiKey,
16
+ credentials: auth.credentials
17
+ };
18
+ },
19
+ (credential) => fetchAccountIdentity(auth.backendUrl, credential)
20
+ ).then((identity) => identity.workspaceId ?? void 0).catch((error) => {
21
+ if (workspaceIdRequests.get(cacheKey) === request) {
22
+ workspaceIdRequests.delete(cacheKey);
23
+ }
24
+ throw error;
25
+ });
26
+ workspaceIdRequests.set(cacheKey, request);
27
+ return request;
28
+ }
29
+ function useAccountWorkspaceId(auth) {
30
+ const cacheKey = auth ? `${auth.backendUrl}|${auth.userId ?? ""}` : void 0;
31
+ const [resolvedWorkspace, setResolvedWorkspace] = useState();
32
+ useEffect(() => {
33
+ if (!auth || !cacheKey) {
34
+ setResolvedWorkspace(void 0);
35
+ return void 0;
36
+ }
37
+ if (auth.workspaceId) {
38
+ setResolvedWorkspace({ cacheKey, workspaceId: auth.workspaceId });
39
+ return void 0;
40
+ }
41
+ let cancelled = false;
42
+ setResolvedWorkspace(void 0);
43
+ loadWorkspaceId(auth).then(
44
+ (workspaceId) => {
45
+ if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId });
46
+ },
47
+ () => {
48
+ if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId: void 0 });
49
+ }
50
+ );
51
+ return () => {
52
+ cancelled = true;
53
+ };
54
+ }, [auth, cacheKey]);
55
+ if (auth == null ? void 0 : auth.workspaceId) return auth.workspaceId;
56
+ return cacheKey && (resolvedWorkspace == null ? void 0 : resolvedWorkspace.cacheKey) === cacheKey ? resolvedWorkspace.workspaceId : void 0;
57
+ }
58
+ export {
59
+ useAccountWorkspaceId
60
+ };
61
+ //# sourceMappingURL=use-account-workspace-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-account-workspace-id.js","sources":["../../../src/chat-ui/mentions/use-account-workspace-id.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { withCredentialRenewal } from \"../../runtime/credential-renewal\";\nimport { fetchAccountIdentity } from \"../../threads/api\";\nimport type { MentionAuthContext } from \"./suggestions/data/api-client\";\n\nconst workspaceIdRequests = new Map<string, Promise<string | undefined>>();\n\nfunction loadWorkspaceId(auth: MentionAuthContext): Promise<string | undefined> {\n if (auth.workspaceId) return Promise.resolve(auth.workspaceId);\n\n const cacheKey = `${auth.backendUrl}|${auth.userId ?? \"\"}`;\n const cached = workspaceIdRequests.get(cacheKey);\n if (cached) return cached;\n\n const request = withCredentialRenewal(\n async ({ force }: { force?: boolean } = {}) => ({\n token: (force ? await auth.renewAccessToken?.() : await auth.getAccessToken?.()) ?? auth.accessToken ?? null,\n apiKey: auth.apiKey,\n credentials: auth.credentials,\n }),\n (credential) => fetchAccountIdentity(auth.backendUrl, credential),\n )\n .then((identity) => identity.workspaceId ?? undefined)\n .catch((error: unknown) => {\n if (workspaceIdRequests.get(cacheKey) === request) {\n workspaceIdRequests.delete(cacheKey);\n }\n throw error;\n });\n\n workspaceIdRequests.set(cacheKey, request);\n return request;\n}\n\nexport function useAccountWorkspaceId(auth: MentionAuthContext | null): string | undefined {\n const cacheKey = auth ? `${auth.backendUrl}|${auth.userId ?? \"\"}` : undefined;\n const [resolvedWorkspace, setResolvedWorkspace] = useState<{\n cacheKey: string;\n workspaceId: string | undefined;\n }>();\n\n useEffect(() => {\n if (!auth || !cacheKey) {\n setResolvedWorkspace(undefined);\n return undefined;\n }\n if (auth.workspaceId) {\n setResolvedWorkspace({ cacheKey, workspaceId: auth.workspaceId });\n return undefined;\n }\n\n let cancelled = false;\n setResolvedWorkspace(undefined);\n loadWorkspaceId(auth).then(\n (workspaceId) => {\n if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId });\n },\n () => {\n if (!cancelled) setResolvedWorkspace({ cacheKey, workspaceId: undefined });\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [auth, cacheKey]);\n\n if (auth?.workspaceId) return auth.workspaceId;\n return cacheKey && resolvedWorkspace?.cacheKey === cacheKey ? resolvedWorkspace.workspaceId : undefined;\n}\n\nexport function resetAccountWorkspaceIdForTests(): void {\n workspaceIdRequests.clear();\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,0CAA0B,IAAA;AAEhC,SAAS,gBAAgB,MAAuD;AAC9E,MAAI,KAAK,YAAa,QAAO,QAAQ,QAAQ,KAAK,WAAW;AAE7D,QAAM,WAAW,GAAG,KAAK,UAAU,IAAI,KAAK,UAAU,EAAE;AACxD,QAAM,SAAS,oBAAoB,IAAI,QAAQ;AAC/C,MAAI,OAAQ,QAAO;AAEnB,QAAM,UAAU;AAAA,IACd,OAAO,EAAE,MAAA,IAA+B,OAAC;;AAAO;AAAA,QAC9C,QAAQ,QAAQ,QAAM,UAAK,qBAAL,iCAA4B,QAAM,UAAK,mBAAL,mCAA4B,KAAK,eAAe;AAAA,QACxG,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,MAAA;AAAA;AAAA,IAEpB,CAAC,eAAe,qBAAqB,KAAK,YAAY,UAAU;AAAA,EAAA,EAE/D,KAAK,CAAC,aAAa,SAAS,eAAe,MAAS,EACpD,MAAM,CAAC,UAAmB;AACzB,QAAI,oBAAoB,IAAI,QAAQ,MAAM,SAAS;AACjD,0BAAoB,OAAO,QAAQ;AAAA,IACrC;AACA,UAAM;AAAA,EACR,CAAC;AAEH,sBAAoB,IAAI,UAAU,OAAO;AACzC,SAAO;AACT;AAEO,SAAS,sBAAsB,MAAqD;AACzF,QAAM,WAAW,OAAO,GAAG,KAAK,UAAU,IAAI,KAAK,UAAU,EAAE,KAAK;AACpE,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,SAAA;AAKlD,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,UAAU;AACtB,2BAAqB,MAAS;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,KAAK,aAAa;AACpB,2BAAqB,EAAE,UAAU,aAAa,KAAK,aAAa;AAChE,aAAO;AAAA,IACT;AAEA,QAAI,YAAY;AAChB,yBAAqB,MAAS;AAC9B,oBAAgB,IAAI,EAAE;AAAA,MACpB,CAAC,gBAAgB;AACf,YAAI,CAAC,UAAW,sBAAqB,EAAE,UAAU,aAAa;AAAA,MAChE;AAAA,MACA,MAAM;AACJ,YAAI,CAAC,UAAW,sBAAqB,EAAE,UAAU,aAAa,QAAW;AAAA,MAC3E;AAAA,IAAA;AAGF,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,MAAI,6BAAM,YAAa,QAAO,KAAK;AACnC,SAAO,aAAY,uDAAmB,cAAa,WAAW,kBAAkB,cAAc;AAChG;"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const apiClient = require("./suggestions/data/api-client.cjs");
5
+ const MEMBER_AVATAR_TTL_MS = 5 * 60 * 1e3;
6
+ const memberAvatarRequests = /* @__PURE__ */ new Map();
7
+ function loadMemberAvatars(auth) {
8
+ const workspaceId = auth.workspaceId;
9
+ if (!workspaceId) return Promise.resolve(/* @__PURE__ */ new Map());
10
+ const cacheKey = `${auth.backendUrl}|${workspaceId}`;
11
+ const cached = memberAvatarRequests.get(cacheKey);
12
+ if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {
13
+ return cached.request;
14
+ }
15
+ const entry = {
16
+ request: Promise.resolve(/* @__PURE__ */ new Map()),
17
+ fetchedAt: null
18
+ };
19
+ const request = apiClient.fetchGraphQL(
20
+ auth,
21
+ apiClient.WORKSPACE_MEMBERS_QUERY,
22
+ { workspaceId }
23
+ ).then((data) => {
24
+ var _a;
25
+ const avatars = /* @__PURE__ */ new Map();
26
+ for (const member of data.getUsersInWorkspace ?? []) {
27
+ const email = (_a = member.email) == null ? void 0 : _a.trim().toLowerCase();
28
+ if (email && member.avatarUrl != null) {
29
+ avatars.set(email, member.avatarUrl);
30
+ }
31
+ }
32
+ entry.fetchedAt = Date.now();
33
+ return avatars;
34
+ }).catch((error) => {
35
+ if (memberAvatarRequests.get(cacheKey) === entry) {
36
+ memberAvatarRequests.delete(cacheKey);
37
+ }
38
+ throw error;
39
+ });
40
+ entry.request = request;
41
+ memberAvatarRequests.set(cacheKey, entry);
42
+ return request;
43
+ }
44
+ function useMemberAvatarUrl(email) {
45
+ const auth = react.useContext(apiClient.MentionAuthCtx);
46
+ const normalizedEmail = email == null ? void 0 : email.trim().toLowerCase();
47
+ const cacheKey = (auth == null ? void 0 : auth.workspaceId) && `${auth.backendUrl}|${auth.workspaceId}`;
48
+ const [resolvedAvatar, setResolvedAvatar] = react.useState();
49
+ react.useEffect(() => {
50
+ if (!auth || !cacheKey || !normalizedEmail) {
51
+ setResolvedAvatar(void 0);
52
+ return;
53
+ }
54
+ let cancelled = false;
55
+ loadMemberAvatars(auth).then(
56
+ (avatars) => {
57
+ if (!cancelled) {
58
+ setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });
59
+ }
60
+ },
61
+ () => {
62
+ if (!cancelled) setResolvedAvatar({ cacheKey, url: void 0 });
63
+ }
64
+ );
65
+ return () => {
66
+ cancelled = true;
67
+ };
68
+ }, [auth, cacheKey, normalizedEmail]);
69
+ if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {
70
+ return void 0;
71
+ }
72
+ return resolvedAvatar.url;
73
+ }
74
+ exports.useMemberAvatarUrl = useMemberAvatarUrl;
75
+ //# sourceMappingURL=use-member-avatar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-member-avatar.cjs","sources":["../../../src/chat-ui/mentions/use-member-avatar.ts"],"sourcesContent":["import { useContext, useEffect, useState } from \"react\";\nimport {\n fetchGraphQL,\n MentionAuthCtx,\n WORKSPACE_MEMBERS_QUERY,\n} from \"./suggestions/data/api-client\";\nimport type { MentionAuthContext } from \"./suggestions/data/api-client\";\n\ntype WorkspaceMemberAvatar = {\n email?: string | null;\n avatarUrl?: string | null;\n};\n\ntype WorkspaceMembersResponse = {\n getUsersInWorkspace?: WorkspaceMemberAvatar[] | null;\n};\n\nconst MEMBER_AVATAR_TTL_MS = 5 * 60 * 1000;\n\ntype MemberAvatarCacheEntry = {\n request: Promise<Map<string, string>>;\n fetchedAt: number | null;\n};\n\nconst memberAvatarRequests = new Map<string, MemberAvatarCacheEntry>();\n\nfunction loadMemberAvatars(\n auth: MentionAuthContext,\n): Promise<Map<string, string>> {\n const workspaceId = auth.workspaceId;\n if (!workspaceId) return Promise.resolve(new Map());\n\n const cacheKey = `${auth.backendUrl}|${workspaceId}`;\n const cached = memberAvatarRequests.get(cacheKey);\n if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {\n return cached.request;\n }\n\n const entry: MemberAvatarCacheEntry = {\n request: Promise.resolve(new Map<string, string>()),\n fetchedAt: null,\n };\n const request = fetchGraphQL<WorkspaceMembersResponse>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId },\n )\n .then((data) => {\n const avatars = new Map<string, string>();\n for (const member of data.getUsersInWorkspace ?? []) {\n const email = member.email?.trim().toLowerCase();\n if (email && member.avatarUrl != null) {\n avatars.set(email, member.avatarUrl);\n }\n }\n entry.fetchedAt = Date.now();\n return avatars;\n })\n .catch((error: unknown) => {\n if (memberAvatarRequests.get(cacheKey) === entry) {\n memberAvatarRequests.delete(cacheKey);\n }\n throw error;\n });\n\n entry.request = request;\n memberAvatarRequests.set(cacheKey, entry);\n return request;\n}\n\nexport function useMemberAvatarUrl(\n email: string | undefined,\n): string | undefined {\n const auth = useContext(MentionAuthCtx);\n const normalizedEmail = email?.trim().toLowerCase();\n const cacheKey =\n auth?.workspaceId && `${auth.backendUrl}|${auth.workspaceId}`;\n const [resolvedAvatar, setResolvedAvatar] = useState<{\n cacheKey: string;\n url: string | undefined;\n }>();\n\n useEffect(() => {\n if (!auth || !cacheKey || !normalizedEmail) {\n setResolvedAvatar(undefined);\n return;\n }\n\n let cancelled = false;\n loadMemberAvatars(auth).then(\n (avatars) => {\n if (!cancelled) {\n setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });\n }\n },\n () => {\n if (!cancelled) setResolvedAvatar({ cacheKey, url: undefined });\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [auth, cacheKey, normalizedEmail]);\n\n if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {\n return undefined;\n }\n return resolvedAvatar.url;\n}\n\nexport function resetMemberAvatarsForTests(): void {\n memberAvatarRequests.clear();\n}\n"],"names":["fetchGraphQL","WORKSPACE_MEMBERS_QUERY","useContext","MentionAuthCtx","useState","useEffect"],"mappings":";;;;AAiBA,MAAM,uBAAuB,IAAI,KAAK;AAOtC,MAAM,2CAA2B,IAAA;AAEjC,SAAS,kBACP,MAC8B;AAC9B,QAAM,cAAc,KAAK;AACzB,MAAI,CAAC,YAAa,QAAO,QAAQ,QAAQ,oBAAI,KAAK;AAElD,QAAM,WAAW,GAAG,KAAK,UAAU,IAAI,WAAW;AAClD,QAAM,SAAS,qBAAqB,IAAI,QAAQ;AAChD,MAAI,WAAW,OAAO,cAAc,QAAQ,KAAK,IAAA,IAAQ,OAAO,YAAY,uBAAuB;AACjG,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,QAAgC;AAAA,IACpC,SAAS,QAAQ,QAAQ,oBAAI,KAAqB;AAAA,IAClD,WAAW;AAAA,EAAA;AAEb,QAAM,UAAUA,UAAAA;AAAAA,IACd;AAAA,IACAC,UAAAA;AAAAA,IACA,EAAE,YAAA;AAAA,EAAY,EAEb,KAAK,CAAC,SAAS;;AACd,UAAM,8BAAc,IAAA;AACpB,eAAW,UAAU,KAAK,uBAAuB,CAAA,GAAI;AACnD,YAAM,SAAQ,YAAO,UAAP,mBAAc,OAAO;AACnC,UAAI,SAAS,OAAO,aAAa,MAAM;AACrC,gBAAQ,IAAI,OAAO,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AACA,UAAM,YAAY,KAAK,IAAA;AACvB,WAAO;AAAA,EACT,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,QAAI,qBAAqB,IAAI,QAAQ,MAAM,OAAO;AAChD,2BAAqB,OAAO,QAAQ;AAAA,IACtC;AACA,UAAM;AAAA,EACR,CAAC;AAEH,QAAM,UAAU;AAChB,uBAAqB,IAAI,UAAU,KAAK;AACxC,SAAO;AACT;AAEO,SAAS,mBACd,OACoB;AACpB,QAAM,OAAOC,MAAAA,WAAWC,wBAAc;AACtC,QAAM,kBAAkB,+BAAO,OAAO;AACtC,QAAM,YACJ,6BAAM,gBAAe,GAAG,KAAK,UAAU,IAAI,KAAK,WAAW;AAC7D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,eAAA;AAK5CC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB;AAC1C,wBAAkB,MAAS;AAC3B;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,sBAAkB,IAAI,EAAE;AAAA,MACtB,CAAC,YAAY;AACX,YAAI,CAAC,WAAW;AACd,4BAAkB,EAAE,UAAU,KAAK,QAAQ,IAAI,eAAe,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,MAAM;AACJ,YAAI,CAAC,UAAW,mBAAkB,EAAE,UAAU,KAAK,QAAW;AAAA,MAChE;AAAA,IAAA;AAGF,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,eAAe,CAAC;AAEpC,MAAI,CAAC,YAAY,CAAC,kBAAkB,eAAe,aAAa,UAAU;AACxE,WAAO;AAAA,EACT;AACA,SAAO,eAAe;AACxB;;"}
@@ -0,0 +1,2 @@
1
+ export declare function useMemberAvatarUrl(email: string | undefined): string | undefined;
2
+ export declare function resetMemberAvatarsForTests(): void;
@@ -0,0 +1,75 @@
1
+ import { useContext, useState, useEffect } from "react";
2
+ import { MentionAuthCtx, fetchGraphQL, WORKSPACE_MEMBERS_QUERY } from "./suggestions/data/api-client.js";
3
+ const MEMBER_AVATAR_TTL_MS = 5 * 60 * 1e3;
4
+ const memberAvatarRequests = /* @__PURE__ */ new Map();
5
+ function loadMemberAvatars(auth) {
6
+ const workspaceId = auth.workspaceId;
7
+ if (!workspaceId) return Promise.resolve(/* @__PURE__ */ new Map());
8
+ const cacheKey = `${auth.backendUrl}|${workspaceId}`;
9
+ const cached = memberAvatarRequests.get(cacheKey);
10
+ if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {
11
+ return cached.request;
12
+ }
13
+ const entry = {
14
+ request: Promise.resolve(/* @__PURE__ */ new Map()),
15
+ fetchedAt: null
16
+ };
17
+ const request = fetchGraphQL(
18
+ auth,
19
+ WORKSPACE_MEMBERS_QUERY,
20
+ { workspaceId }
21
+ ).then((data) => {
22
+ var _a;
23
+ const avatars = /* @__PURE__ */ new Map();
24
+ for (const member of data.getUsersInWorkspace ?? []) {
25
+ const email = (_a = member.email) == null ? void 0 : _a.trim().toLowerCase();
26
+ if (email && member.avatarUrl != null) {
27
+ avatars.set(email, member.avatarUrl);
28
+ }
29
+ }
30
+ entry.fetchedAt = Date.now();
31
+ return avatars;
32
+ }).catch((error) => {
33
+ if (memberAvatarRequests.get(cacheKey) === entry) {
34
+ memberAvatarRequests.delete(cacheKey);
35
+ }
36
+ throw error;
37
+ });
38
+ entry.request = request;
39
+ memberAvatarRequests.set(cacheKey, entry);
40
+ return request;
41
+ }
42
+ function useMemberAvatarUrl(email) {
43
+ const auth = useContext(MentionAuthCtx);
44
+ const normalizedEmail = email == null ? void 0 : email.trim().toLowerCase();
45
+ const cacheKey = (auth == null ? void 0 : auth.workspaceId) && `${auth.backendUrl}|${auth.workspaceId}`;
46
+ const [resolvedAvatar, setResolvedAvatar] = useState();
47
+ useEffect(() => {
48
+ if (!auth || !cacheKey || !normalizedEmail) {
49
+ setResolvedAvatar(void 0);
50
+ return;
51
+ }
52
+ let cancelled = false;
53
+ loadMemberAvatars(auth).then(
54
+ (avatars) => {
55
+ if (!cancelled) {
56
+ setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });
57
+ }
58
+ },
59
+ () => {
60
+ if (!cancelled) setResolvedAvatar({ cacheKey, url: void 0 });
61
+ }
62
+ );
63
+ return () => {
64
+ cancelled = true;
65
+ };
66
+ }, [auth, cacheKey, normalizedEmail]);
67
+ if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {
68
+ return void 0;
69
+ }
70
+ return resolvedAvatar.url;
71
+ }
72
+ export {
73
+ useMemberAvatarUrl
74
+ };
75
+ //# sourceMappingURL=use-member-avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-member-avatar.js","sources":["../../../src/chat-ui/mentions/use-member-avatar.ts"],"sourcesContent":["import { useContext, useEffect, useState } from \"react\";\nimport {\n fetchGraphQL,\n MentionAuthCtx,\n WORKSPACE_MEMBERS_QUERY,\n} from \"./suggestions/data/api-client\";\nimport type { MentionAuthContext } from \"./suggestions/data/api-client\";\n\ntype WorkspaceMemberAvatar = {\n email?: string | null;\n avatarUrl?: string | null;\n};\n\ntype WorkspaceMembersResponse = {\n getUsersInWorkspace?: WorkspaceMemberAvatar[] | null;\n};\n\nconst MEMBER_AVATAR_TTL_MS = 5 * 60 * 1000;\n\ntype MemberAvatarCacheEntry = {\n request: Promise<Map<string, string>>;\n fetchedAt: number | null;\n};\n\nconst memberAvatarRequests = new Map<string, MemberAvatarCacheEntry>();\n\nfunction loadMemberAvatars(\n auth: MentionAuthContext,\n): Promise<Map<string, string>> {\n const workspaceId = auth.workspaceId;\n if (!workspaceId) return Promise.resolve(new Map());\n\n const cacheKey = `${auth.backendUrl}|${workspaceId}`;\n const cached = memberAvatarRequests.get(cacheKey);\n if (cached && (cached.fetchedAt === null || Date.now() - cached.fetchedAt < MEMBER_AVATAR_TTL_MS)) {\n return cached.request;\n }\n\n const entry: MemberAvatarCacheEntry = {\n request: Promise.resolve(new Map<string, string>()),\n fetchedAt: null,\n };\n const request = fetchGraphQL<WorkspaceMembersResponse>(\n auth,\n WORKSPACE_MEMBERS_QUERY,\n { workspaceId },\n )\n .then((data) => {\n const avatars = new Map<string, string>();\n for (const member of data.getUsersInWorkspace ?? []) {\n const email = member.email?.trim().toLowerCase();\n if (email && member.avatarUrl != null) {\n avatars.set(email, member.avatarUrl);\n }\n }\n entry.fetchedAt = Date.now();\n return avatars;\n })\n .catch((error: unknown) => {\n if (memberAvatarRequests.get(cacheKey) === entry) {\n memberAvatarRequests.delete(cacheKey);\n }\n throw error;\n });\n\n entry.request = request;\n memberAvatarRequests.set(cacheKey, entry);\n return request;\n}\n\nexport function useMemberAvatarUrl(\n email: string | undefined,\n): string | undefined {\n const auth = useContext(MentionAuthCtx);\n const normalizedEmail = email?.trim().toLowerCase();\n const cacheKey =\n auth?.workspaceId && `${auth.backendUrl}|${auth.workspaceId}`;\n const [resolvedAvatar, setResolvedAvatar] = useState<{\n cacheKey: string;\n url: string | undefined;\n }>();\n\n useEffect(() => {\n if (!auth || !cacheKey || !normalizedEmail) {\n setResolvedAvatar(undefined);\n return;\n }\n\n let cancelled = false;\n loadMemberAvatars(auth).then(\n (avatars) => {\n if (!cancelled) {\n setResolvedAvatar({ cacheKey, url: avatars.get(normalizedEmail) });\n }\n },\n () => {\n if (!cancelled) setResolvedAvatar({ cacheKey, url: undefined });\n },\n );\n\n return () => {\n cancelled = true;\n };\n }, [auth, cacheKey, normalizedEmail]);\n\n if (!cacheKey || !resolvedAvatar || resolvedAvatar.cacheKey !== cacheKey) {\n return undefined;\n }\n return resolvedAvatar.url;\n}\n\nexport function resetMemberAvatarsForTests(): void {\n memberAvatarRequests.clear();\n}\n"],"names":[],"mappings":";;AAiBA,MAAM,uBAAuB,IAAI,KAAK;AAOtC,MAAM,2CAA2B,IAAA;AAEjC,SAAS,kBACP,MAC8B;AAC9B,QAAM,cAAc,KAAK;AACzB,MAAI,CAAC,YAAa,QAAO,QAAQ,QAAQ,oBAAI,KAAK;AAElD,QAAM,WAAW,GAAG,KAAK,UAAU,IAAI,WAAW;AAClD,QAAM,SAAS,qBAAqB,IAAI,QAAQ;AAChD,MAAI,WAAW,OAAO,cAAc,QAAQ,KAAK,IAAA,IAAQ,OAAO,YAAY,uBAAuB;AACjG,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,QAAgC;AAAA,IACpC,SAAS,QAAQ,QAAQ,oBAAI,KAAqB;AAAA,IAClD,WAAW;AAAA,EAAA;AAEb,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,EAAE,YAAA;AAAA,EAAY,EAEb,KAAK,CAAC,SAAS;;AACd,UAAM,8BAAc,IAAA;AACpB,eAAW,UAAU,KAAK,uBAAuB,CAAA,GAAI;AACnD,YAAM,SAAQ,YAAO,UAAP,mBAAc,OAAO;AACnC,UAAI,SAAS,OAAO,aAAa,MAAM;AACrC,gBAAQ,IAAI,OAAO,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AACA,UAAM,YAAY,KAAK,IAAA;AACvB,WAAO;AAAA,EACT,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,QAAI,qBAAqB,IAAI,QAAQ,MAAM,OAAO;AAChD,2BAAqB,OAAO,QAAQ;AAAA,IACtC;AACA,UAAM;AAAA,EACR,CAAC;AAEH,QAAM,UAAU;AAChB,uBAAqB,IAAI,UAAU,KAAK;AACxC,SAAO;AACT;AAEO,SAAS,mBACd,OACoB;AACpB,QAAM,OAAO,WAAW,cAAc;AACtC,QAAM,kBAAkB,+BAAO,OAAO;AACtC,QAAM,YACJ,6BAAM,gBAAe,GAAG,KAAK,UAAU,IAAI,KAAK,WAAW;AAC7D,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAA;AAK5C,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iBAAiB;AAC1C,wBAAkB,MAAS;AAC3B;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,sBAAkB,IAAI,EAAE;AAAA,MACtB,CAAC,YAAY;AACX,YAAI,CAAC,WAAW;AACd,4BAAkB,EAAE,UAAU,KAAK,QAAQ,IAAI,eAAe,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,MAAM;AACJ,YAAI,CAAC,UAAW,mBAAkB,EAAE,UAAU,KAAK,QAAW;AAAA,MAChE;AAAA,IAAA;AAGF,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,eAAe,CAAC;AAEpC,MAAI,CAAC,YAAY,CAAC,kBAAkB,eAAe,aAAa,UAAU;AACxE,WAAO;AAAA,EACT;AACA,SAAO,eAAe;AACxB;"}
@@ -50,7 +50,8 @@ function connectGenericDoc(args) {
50
50
  let openingPastThreshold = null;
51
51
  let mintRetries = 0;
52
52
  let destroyed = false;
53
- let status = "connecting";
53
+ let connectionEnabled = args.connectionEnabled ?? true;
54
+ let status = connectionEnabled ? "connecting" : "disconnected";
54
55
  let synced = false;
55
56
  let accessType = null;
56
57
  let error = null;
@@ -86,11 +87,10 @@ function connectGenericDoc(args) {
86
87
  };
87
88
  const refreshLocalChangesSynced = () => {
88
89
  const next = carriedUpdates.length === 0 && ((provider == null ? void 0 : provider.unconfirmedUpdates.length) ?? 0) === 0;
89
- if (next !== localChangesSynced) {
90
- localChangesSynced = next;
91
- notify();
92
- }
90
+ const changed = next !== localChangesSynced;
91
+ localChangesSynced = next;
93
92
  transportChanged();
93
+ if (changed) notify();
94
94
  };
95
95
  doc.on("update", (update, origin) => {
96
96
  if (!prepared || provider !== null || destroyed || origin instanceof websocket.WebsocketProvider) return;
@@ -140,9 +140,10 @@ function connectGenericDoc(args) {
140
140
  notify();
141
141
  }
142
142
  if (provider) {
143
- carriedUpdates = [...carriedUpdates, ...provider.unconfirmedUpdates];
144
- provider.destroy();
143
+ const previous = provider;
145
144
  provider = null;
145
+ carriedUpdates = [...carriedUpdates, ...previous.unconfirmedUpdates];
146
+ previous.destroy();
146
147
  }
147
148
  };
148
149
  const scheduleRefresh = (grant) => {
@@ -162,17 +163,17 @@ function connectGenericDoc(args) {
162
163
  }, delay);
163
164
  };
164
165
  const onBrowserOnline = () => {
165
- if (destroyed || status === "closed" || status === "error" || provider !== null || held) return;
166
+ if (destroyed || !connectionEnabled || status === "closed" || status === "error" || provider !== null || held) return;
166
167
  mintRetries = 0;
167
168
  clearRetryTimer();
168
169
  void connect();
169
170
  };
170
171
  if (typeof window !== "undefined") window.addEventListener("online", onBrowserOnline);
171
172
  const armOfflineTakeover = () => {
172
- if (offlineTimer !== null || !(localCopy == null ? void 0 : localCopy.beforeConnect)) return;
173
+ if (!connectionEnabled || offlineTimer !== null || !(localCopy == null ? void 0 : localCopy.beforeConnect)) return;
173
174
  offlineTimer = setTimeout(() => {
174
175
  offlineTimer = null;
175
- if (destroyed || status === "connected" || provider === null) return;
176
+ if (destroyed || !connectionEnabled || status === "connected" || provider === null) return;
176
177
  if (provider.wsconnecting && !hasUnsyncedLocalEdits()) {
177
178
  openingPastThreshold = provider;
178
179
  armOfflineTakeover();
@@ -184,10 +185,10 @@ function connectGenericDoc(args) {
184
185
  };
185
186
  const hasUnsyncedLocalEdits = () => carriedUpdates.length > 0 || ((provider == null ? void 0 : provider.unconfirmedUpdates.length) ?? 0) > 0;
186
187
  const connect = async (opts) => {
187
- if (destroyed) return;
188
- await preparing;
189
- if (destroyed) return;
188
+ if (destroyed || !connectionEnabled) return;
190
189
  const seq = ++connectSeq;
190
+ await preparing;
191
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
191
192
  const scheduledRefresh = (opts == null ? void 0 : opts.scheduledRefresh) === true && status === "connected";
192
193
  if (!scheduledRefresh) {
193
194
  teardownProvider();
@@ -195,6 +196,7 @@ function connectGenericDoc(args) {
195
196
  clearRefreshTimer();
196
197
  }
197
198
  clearRetryTimer();
199
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
198
200
  let grant;
199
201
  if ((opts == null ? void 0 : opts.grant) && opts.grant.expires_at_ms - Date.now() > tokenRefresh.MIN_REFRESH_DELAY_MS) {
200
202
  grant = opts.grant;
@@ -202,7 +204,7 @@ function connectGenericDoc(args) {
202
204
  try {
203
205
  grant = await mint2({ assetId: args.assetId, access });
204
206
  } catch (err) {
205
- if (destroyed || seq !== connectSeq) return;
207
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
206
208
  if (scheduledRefresh) {
207
209
  refreshTimer = setTimeout(() => {
208
210
  void connect({ scheduledRefresh: true });
@@ -218,7 +220,7 @@ function connectGenericDoc(args) {
218
220
  return;
219
221
  }
220
222
  }
221
- if (destroyed || seq !== connectSeq) return;
223
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
222
224
  mintRetries = 0;
223
225
  accessType = grant.access_type;
224
226
  const beforeConnect = localCopy == null ? void 0 : localCopy.beforeConnect;
@@ -234,12 +236,12 @@ function connectGenericDoc(args) {
234
236
  hasUnsyncedEdits: hasUnsyncedLocalEdits()
235
237
  });
236
238
  } catch {
237
- if (destroyed || seq !== connectSeq) return;
239
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
238
240
  if (status !== "disconnected") setStatus("disconnected");
239
241
  scheduleRetry();
240
242
  return;
241
243
  }
242
- if (destroyed || seq !== connectSeq) return;
244
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
243
245
  if (decision === "hold") {
244
246
  held = true;
245
247
  heldGrant = grant;
@@ -251,6 +253,7 @@ function connectGenericDoc(args) {
251
253
  if (scheduledRefresh) {
252
254
  teardownProvider();
253
255
  }
256
+ if (destroyed || !connectionEnabled || seq !== connectSeq) return;
254
257
  const nextProvider = new websocket.WebsocketProvider(grant.ws_url, `${grant.org}/${grant.doc_id}`, doc, {
255
258
  params: {
256
259
  yauth: grant.token,
@@ -372,6 +375,41 @@ function connectGenericDoc(args) {
372
375
  };
373
376
  listeners.add(listener);
374
377
  });
378
+ const waitForAcknowledged = (timeoutMs = 15e3) => new Promise((resolve, reject) => {
379
+ let finished = false;
380
+ let checkQueued = false;
381
+ let timer = null;
382
+ const finish = (failure) => {
383
+ if (finished) return;
384
+ finished = true;
385
+ if (timer !== null) clearTimeout(timer);
386
+ listeners.delete(check);
387
+ if (failure) reject(failure);
388
+ else resolve();
389
+ };
390
+ const check = () => {
391
+ if (finished || checkQueued) return;
392
+ checkQueued = true;
393
+ queueMicrotask(() => {
394
+ checkQueued = false;
395
+ if (finished) return;
396
+ if (destroyed) {
397
+ finish(new Error("Handle destroyed before local changes were acknowledged"));
398
+ } else if (!connectionEnabled) {
399
+ finish(new Error("Connection disabled before local changes were acknowledged"));
400
+ } else if (status === "closed" || status === "error") {
401
+ finish(error ?? new Error(`Connection ${status} before local changes were acknowledged`));
402
+ } else if (prepared && status === "connected" && synced && localChangesSynced) {
403
+ finish();
404
+ }
405
+ });
406
+ };
407
+ timer = setTimeout(() => {
408
+ finish(new Error(`Timed out after ${timeoutMs}ms waiting for local changes to be acknowledged`));
409
+ }, timeoutMs);
410
+ listeners.add(check);
411
+ check();
412
+ });
375
413
  return {
376
414
  doc,
377
415
  get status() {
@@ -392,6 +430,9 @@ function connectGenericDoc(args) {
392
430
  get prepared() {
393
431
  return prepared;
394
432
  },
433
+ get connectionEnabled() {
434
+ return connectionEnabled;
435
+ },
395
436
  get held() {
396
437
  return held;
397
438
  },
@@ -399,6 +440,7 @@ function connectGenericDoc(args) {
399
440
  return version;
400
441
  },
401
442
  waitForSync,
443
+ waitForAcknowledged,
402
444
  getPresence: () => {
403
445
  if (!provider) return [];
404
446
  const entries = [];
@@ -412,11 +454,30 @@ function connectGenericDoc(args) {
412
454
  provider == null ? void 0 : provider.awareness.setLocalState(state);
413
455
  },
414
456
  refreshNow: () => {
415
- if (held) return Promise.resolve();
457
+ if (!connectionEnabled || held) return Promise.resolve();
416
458
  return provider ? connect({ scheduledRefresh: true }) : connect();
417
459
  },
460
+ setConnectionEnabled: (enabled) => {
461
+ var _a, _b;
462
+ if (destroyed || enabled === connectionEnabled) return;
463
+ connectionEnabled = enabled;
464
+ if (!enabled) {
465
+ connectSeq += 1;
466
+ clearRetryTimer();
467
+ clearOfflineTimer();
468
+ teardownProvider();
469
+ setStatus("disconnected");
470
+ (_a = localCopy == null ? void 0 : localCopy.connectionPolicyChanged) == null ? void 0 : _a.call(localCopy, false);
471
+ return;
472
+ }
473
+ (_b = localCopy == null ? void 0 : localCopy.connectionPolicyChanged) == null ? void 0 : _b.call(localCopy, true);
474
+ held = false;
475
+ heldGrant = null;
476
+ setStatus("connecting");
477
+ void connect();
478
+ },
418
479
  resume: () => {
419
- if (!held || destroyed) return;
480
+ if (!held || destroyed || !connectionEnabled) return;
420
481
  held = false;
421
482
  const grant = heldGrant;
422
483
  heldGrant = null;