@backbay/glia 0.2.0-alpha.6 → 0.2.0-alpha.8

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 (226) hide show
  1. package/dist/audio/index.js +1145 -5
  2. package/dist/audio/index.js.map +1 -1
  3. package/dist/components/index.js +3187 -10
  4. package/dist/components/index.js.map +1 -1
  5. package/dist/core.js +19714 -12
  6. package/dist/core.js.map +1 -1
  7. package/dist/emotion/index.js +1 -1
  8. package/dist/emotion/index.js.map +1 -1
  9. package/dist/hooks/index.js +941 -6
  10. package/dist/hooks/index.js.map +1 -1
  11. package/dist/index.js +31841 -183
  12. package/dist/index.js.map +1 -1
  13. package/dist/primitives/index.js +21111 -57
  14. package/dist/primitives/index.js.map +1 -1
  15. package/dist/protocol/index.js +360 -2
  16. package/dist/protocol/index.js.map +1 -1
  17. package/dist/speakeasy/index.js +2786 -38
  18. package/dist/speakeasy/index.js.map +1 -1
  19. package/dist/styles.css +1 -1
  20. package/dist/theme/index.js +1150 -3
  21. package/dist/theme/index.js.map +1 -1
  22. package/dist/vision/index.js +370 -2
  23. package/dist/vision/index.js.map +1 -1
  24. package/dist/workspace/index.js +16824 -2
  25. package/dist/workspace/index.js.map +1 -1
  26. package/package.json +16 -10
  27. package/dist/AuroraBackground-AP6ZHVFA.js +0 -6
  28. package/dist/AuroraBackground-AP6ZHVFA.js.map +0 -1
  29. package/dist/BentoGrid-CDARICNM.js +0 -6
  30. package/dist/BentoGrid-CDARICNM.js.map +0 -1
  31. package/dist/CommandPalette-JCWJKRBY.js +0 -6
  32. package/dist/CommandPalette-JCWJKRBY.js.map +0 -1
  33. package/dist/Glass-H4X4ZI4P.js +0 -7
  34. package/dist/Glass-H4X4ZI4P.js.map +0 -1
  35. package/dist/GlitchText-KLQ57PPY.js +0 -6
  36. package/dist/GlitchText-KLQ57PPY.js.map +0 -1
  37. package/dist/GlowButton-VGBPMZO7.js +0 -6
  38. package/dist/GlowButton-VGBPMZO7.js.map +0 -1
  39. package/dist/Graph3D-GO7N2EZQ.js +0 -540
  40. package/dist/Graph3D-GO7N2EZQ.js.map +0 -1
  41. package/dist/HUDProgressRing-N6C5NAEV.js +0 -6
  42. package/dist/HUDProgressRing-N6C5NAEV.js.map +0 -1
  43. package/dist/KPIStat-PBQK27ZB.js +0 -6
  44. package/dist/KPIStat-PBQK27ZB.js.map +0 -1
  45. package/dist/NeonToast-W5F7MU3U.js +0 -6
  46. package/dist/NeonToast-W5F7MU3U.js.map +0 -1
  47. package/dist/ParticleField-WK6CNHWU.js +0 -51
  48. package/dist/ParticleField-WK6CNHWU.js.map +0 -1
  49. package/dist/TextGenerateEffect-EUCEIIUJ.js +0 -6
  50. package/dist/TextGenerateEffect-EUCEIIUJ.js.map +0 -1
  51. package/dist/ThreeDCard-VH5I3SSY.js +0 -6
  52. package/dist/ThreeDCard-VH5I3SSY.js.map +0 -1
  53. package/dist/TypingAnimation-GIWOHPIX.js +0 -6
  54. package/dist/TypingAnimation-GIWOHPIX.js.map +0 -1
  55. package/dist/alert-dialog-QOSYBIIE.js +0 -19
  56. package/dist/alert-dialog-QOSYBIIE.js.map +0 -1
  57. package/dist/avatar-N5R37PCU.js +0 -10
  58. package/dist/avatar-N5R37PCU.js.map +0 -1
  59. package/dist/badge-GTVIIGPY.js +0 -8
  60. package/dist/badge-GTVIIGPY.js.map +0 -1
  61. package/dist/button-D7IMSV2D.js +0 -8
  62. package/dist/button-D7IMSV2D.js.map +0 -1
  63. package/dist/chunk-3CMPQOMY.js +0 -69
  64. package/dist/chunk-3CMPQOMY.js.map +0 -1
  65. package/dist/chunk-3OQT6IYR.js +0 -41
  66. package/dist/chunk-3OQT6IYR.js.map +0 -1
  67. package/dist/chunk-43B2WVLS.js +0 -85
  68. package/dist/chunk-43B2WVLS.js.map +0 -1
  69. package/dist/chunk-4SRFO5W3.js +0 -121
  70. package/dist/chunk-4SRFO5W3.js.map +0 -1
  71. package/dist/chunk-5IZELOOU.js +0 -362
  72. package/dist/chunk-5IZELOOU.js.map +0 -1
  73. package/dist/chunk-6DM4ACSS.js +0 -154
  74. package/dist/chunk-6DM4ACSS.js.map +0 -1
  75. package/dist/chunk-6IGT34PC.js +0 -50
  76. package/dist/chunk-6IGT34PC.js.map +0 -1
  77. package/dist/chunk-6RKBCJHN.js +0 -194
  78. package/dist/chunk-6RKBCJHN.js.map +0 -1
  79. package/dist/chunk-6RX2WGCO.js +0 -108
  80. package/dist/chunk-6RX2WGCO.js.map +0 -1
  81. package/dist/chunk-7K4WZM3U.js +0 -189
  82. package/dist/chunk-7K4WZM3U.js.map +0 -1
  83. package/dist/chunk-7MDBHJPT.js +0 -407
  84. package/dist/chunk-7MDBHJPT.js.map +0 -1
  85. package/dist/chunk-7UQD6ROV.js +0 -9
  86. package/dist/chunk-7UQD6ROV.js.map +0 -1
  87. package/dist/chunk-AFNIVLZP.js +0 -1069
  88. package/dist/chunk-AFNIVLZP.js.map +0 -1
  89. package/dist/chunk-ANWYRO6A.js +0 -407
  90. package/dist/chunk-ANWYRO6A.js.map +0 -1
  91. package/dist/chunk-DIXPOHDO.js +0 -71
  92. package/dist/chunk-DIXPOHDO.js.map +0 -1
  93. package/dist/chunk-DWYMKYPI.js +0 -3
  94. package/dist/chunk-DWYMKYPI.js.map +0 -1
  95. package/dist/chunk-E3NVDCZG.js +0 -280
  96. package/dist/chunk-E3NVDCZG.js.map +0 -1
  97. package/dist/chunk-EBM7YBKL.js +0 -399
  98. package/dist/chunk-EBM7YBKL.js.map +0 -1
  99. package/dist/chunk-EPAM7IWW.js +0 -294
  100. package/dist/chunk-EPAM7IWW.js.map +0 -1
  101. package/dist/chunk-EXQ7GYRS.js +0 -134
  102. package/dist/chunk-EXQ7GYRS.js.map +0 -1
  103. package/dist/chunk-F4QTUZ3C.js +0 -136
  104. package/dist/chunk-F4QTUZ3C.js.map +0 -1
  105. package/dist/chunk-FEW533R2.js +0 -105
  106. package/dist/chunk-FEW533R2.js.map +0 -1
  107. package/dist/chunk-FFZLJKC7.js +0 -270
  108. package/dist/chunk-FFZLJKC7.js.map +0 -1
  109. package/dist/chunk-GEAMOBF7.js +0 -8486
  110. package/dist/chunk-GEAMOBF7.js.map +0 -1
  111. package/dist/chunk-GRTRSCTD.js +0 -74
  112. package/dist/chunk-GRTRSCTD.js.map +0 -1
  113. package/dist/chunk-IKGYOGLK.js +0 -16
  114. package/dist/chunk-IKGYOGLK.js.map +0 -1
  115. package/dist/chunk-IQ7WYWVJ.js +0 -73
  116. package/dist/chunk-IQ7WYWVJ.js.map +0 -1
  117. package/dist/chunk-IXIVWQLF.js +0 -543
  118. package/dist/chunk-IXIVWQLF.js.map +0 -1
  119. package/dist/chunk-JCJU57RC.js +0 -115
  120. package/dist/chunk-JCJU57RC.js.map +0 -1
  121. package/dist/chunk-KORSTBU4.js +0 -117
  122. package/dist/chunk-KORSTBU4.js.map +0 -1
  123. package/dist/chunk-KSEZ6UM2.js +0 -235
  124. package/dist/chunk-KSEZ6UM2.js.map +0 -1
  125. package/dist/chunk-MHPF7R3O.js +0 -1376
  126. package/dist/chunk-MHPF7R3O.js.map +0 -1
  127. package/dist/chunk-MPC5IH7E.js +0 -81
  128. package/dist/chunk-MPC5IH7E.js.map +0 -1
  129. package/dist/chunk-MQIU2NYA.js +0 -114
  130. package/dist/chunk-MQIU2NYA.js.map +0 -1
  131. package/dist/chunk-NYMBJOGR.js +0 -2192
  132. package/dist/chunk-NYMBJOGR.js.map +0 -1
  133. package/dist/chunk-OBZD2M3C.js +0 -169
  134. package/dist/chunk-OBZD2M3C.js.map +0 -1
  135. package/dist/chunk-ODM2AG6G.js +0 -176
  136. package/dist/chunk-ODM2AG6G.js.map +0 -1
  137. package/dist/chunk-ONDKF5LP.js +0 -53
  138. package/dist/chunk-ONDKF5LP.js.map +0 -1
  139. package/dist/chunk-P25YCWQB.js +0 -41
  140. package/dist/chunk-P25YCWQB.js.map +0 -1
  141. package/dist/chunk-PFYVNM6H.js +0 -14
  142. package/dist/chunk-PFYVNM6H.js.map +0 -1
  143. package/dist/chunk-PWNNSGFL.js +0 -20
  144. package/dist/chunk-PWNNSGFL.js.map +0 -1
  145. package/dist/chunk-Q2PGZVOT.js +0 -36
  146. package/dist/chunk-Q2PGZVOT.js.map +0 -1
  147. package/dist/chunk-Q2XDMV7U.js +0 -76
  148. package/dist/chunk-Q2XDMV7U.js.map +0 -1
  149. package/dist/chunk-QG7FH2FI.js +0 -45
  150. package/dist/chunk-QG7FH2FI.js.map +0 -1
  151. package/dist/chunk-R7HUOK2D.js +0 -1914
  152. package/dist/chunk-R7HUOK2D.js.map +0 -1
  153. package/dist/chunk-REUYY7G5.js +0 -773
  154. package/dist/chunk-REUYY7G5.js.map +0 -1
  155. package/dist/chunk-RHC2Z2HT.js +0 -199
  156. package/dist/chunk-RHC2Z2HT.js.map +0 -1
  157. package/dist/chunk-RMCVLIFE.js +0 -23
  158. package/dist/chunk-RMCVLIFE.js.map +0 -1
  159. package/dist/chunk-ROZLTXGR.js +0 -234
  160. package/dist/chunk-ROZLTXGR.js.map +0 -1
  161. package/dist/chunk-RSS2C2O3.js +0 -17
  162. package/dist/chunk-RSS2C2O3.js.map +0 -1
  163. package/dist/chunk-SAGCG5SH.js +0 -355
  164. package/dist/chunk-SAGCG5SH.js.map +0 -1
  165. package/dist/chunk-TM6AOUSD.js +0 -40
  166. package/dist/chunk-TM6AOUSD.js.map +0 -1
  167. package/dist/chunk-TPK4BYCO.js +0 -970
  168. package/dist/chunk-TPK4BYCO.js.map +0 -1
  169. package/dist/chunk-UNQIL4K2.js +0 -34
  170. package/dist/chunk-UNQIL4K2.js.map +0 -1
  171. package/dist/chunk-UUG6L75Y.js +0 -47
  172. package/dist/chunk-UUG6L75Y.js.map +0 -1
  173. package/dist/chunk-V2SYMV4W.js +0 -114
  174. package/dist/chunk-V2SYMV4W.js.map +0 -1
  175. package/dist/chunk-V7EN5CTH.js +0 -130
  176. package/dist/chunk-V7EN5CTH.js.map +0 -1
  177. package/dist/chunk-VITKG2HL.js +0 -1125
  178. package/dist/chunk-VITKG2HL.js.map +0 -1
  179. package/dist/chunk-VYEWU5LO.js +0 -2631
  180. package/dist/chunk-VYEWU5LO.js.map +0 -1
  181. package/dist/chunk-W67QAGSH.js +0 -178
  182. package/dist/chunk-W67QAGSH.js.map +0 -1
  183. package/dist/chunk-WWBIN6KV.js +0 -1353
  184. package/dist/chunk-WWBIN6KV.js.map +0 -1
  185. package/dist/chunk-X77Z4PFB.js +0 -224
  186. package/dist/chunk-X77Z4PFB.js.map +0 -1
  187. package/dist/chunk-X7VG7OTT.js +0 -8
  188. package/dist/chunk-X7VG7OTT.js.map +0 -1
  189. package/dist/chunk-XE4K2SGI.js +0 -74
  190. package/dist/chunk-XE4K2SGI.js.map +0 -1
  191. package/dist/chunk-YIUG7IJK.js +0 -628
  192. package/dist/chunk-YIUG7IJK.js.map +0 -1
  193. package/dist/chunk-YNVN3V4Y.js +0 -13
  194. package/dist/chunk-YNVN3V4Y.js.map +0 -1
  195. package/dist/chunk-Z2S54IZX.js +0 -198
  196. package/dist/chunk-Z2S54IZX.js.map +0 -1
  197. package/dist/chunk-ZR6AH25Z.js +0 -17
  198. package/dist/chunk-ZR6AH25Z.js.map +0 -1
  199. package/dist/dialog-SPM3DTTI.js +0 -17
  200. package/dist/dialog-SPM3DTTI.js.map +0 -1
  201. package/dist/dropdown-menu-HMTWKWGK.js +0 -21
  202. package/dist/dropdown-menu-HMTWKWGK.js.map +0 -1
  203. package/dist/input-BH4P4S26.js +0 -6
  204. package/dist/input-BH4P4S26.js.map +0 -1
  205. package/dist/label-5Z4Q6VER.js +0 -8
  206. package/dist/label-5Z4Q6VER.js.map +0 -1
  207. package/dist/popover-IFOUXYLI.js +0 -18
  208. package/dist/popover-IFOUXYLI.js.map +0 -1
  209. package/dist/scroll-area-DJXNW6QX.js +0 -14
  210. package/dist/scroll-area-DJXNW6QX.js.map +0 -1
  211. package/dist/select-FZ277C3G.js +0 -22
  212. package/dist/select-FZ277C3G.js.map +0 -1
  213. package/dist/separator-BTMLN4NB.js +0 -8
  214. package/dist/separator-BTMLN4NB.js.map +0 -1
  215. package/dist/skeleton-DXIWBH4W.js +0 -6
  216. package/dist/skeleton-DXIWBH4W.js.map +0 -1
  217. package/dist/switch-4MCXIZBY.js +0 -13
  218. package/dist/switch-4MCXIZBY.js.map +0 -1
  219. package/dist/tabs-O7AW3APK.js +0 -17
  220. package/dist/tabs-O7AW3APK.js.map +0 -1
  221. package/dist/textarea-IB5WAFDO.js +0 -6
  222. package/dist/textarea-IB5WAFDO.js.map +0 -1
  223. package/dist/toggle-XVPPG6P4.js +0 -10
  224. package/dist/toggle-XVPPG6P4.js.map +0 -1
  225. package/dist/tooltip-JICZTD4F.js +0 -18
  226. package/dist/tooltip-JICZTD4F.js.map +0 -1
@@ -1,628 +0,0 @@
1
- import { useBBContext } from './chunk-Q2XDMV7U.js';
2
- import { useState, useRef, useCallback, useEffect } from 'react';
3
-
4
- function stableStringify(value) {
5
- if (value === null || typeof value !== "object") {
6
- const encoded = JSON.stringify(value);
7
- return encoded === void 0 ? "null" : encoded;
8
- }
9
- if (Array.isArray(value)) {
10
- return `[${value.map(stableStringify).join(",")}]`;
11
- }
12
- const record = value;
13
- const keys = Object.keys(record).sort();
14
- return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(record[k])}`).join(",")}}`;
15
- }
16
- function hashString(input) {
17
- let hash = 2166136261;
18
- for (let i = 0; i < input.length; i++) {
19
- hash ^= input.charCodeAt(i);
20
- hash = hash * 16777619 >>> 0;
21
- }
22
- return hash.toString(36);
23
- }
24
- function hashData(value) {
25
- return hashString(stableStringify(value));
26
- }
27
- function normalizeStoredData(raw) {
28
- if (!raw || typeof raw !== "object") return null;
29
- const record = raw;
30
- if ("data" in record && typeof record.lastModifiedAt === "number" && typeof record.lastSyncedAt === "number" && typeof record.lastSyncedHash === "string") {
31
- return record;
32
- }
33
- if ("data" in record && typeof record.timestamp === "number" && typeof record.version === "number") {
34
- const legacy = record;
35
- const syncedHash = hashData(legacy.data);
36
- return {
37
- data: legacy.data,
38
- lastModifiedAt: legacy.timestamp,
39
- lastSyncedAt: legacy.timestamp,
40
- lastSyncedHash: syncedHash
41
- };
42
- }
43
- return null;
44
- }
45
- function getStoredData(key) {
46
- try {
47
- const raw = localStorage.getItem(key);
48
- if (!raw) return null;
49
- const parsed = JSON.parse(raw);
50
- return normalizeStoredData(parsed);
51
- } catch {
52
- return null;
53
- }
54
- }
55
- function setStoredData(key, record) {
56
- localStorage.setItem(key, JSON.stringify(record));
57
- }
58
- function useSync({
59
- key,
60
- endpoint,
61
- debounce = 2e3,
62
- initialData,
63
- fetcher,
64
- saver,
65
- onConflict,
66
- onError,
67
- onSync
68
- }) {
69
- const [data, setDataState] = useState(initialData ?? null);
70
- const [status, setStatus] = useState("synced");
71
- const [pendingChanges, setPendingChanges] = useState(0);
72
- const [lastSyncedAt, setLastSyncedAt] = useState(null);
73
- const [conflict, setConflict] = useState(null);
74
- const [isLoaded, setIsLoaded] = useState(false);
75
- const debounceTimerRef = useRef(null);
76
- const isSavingRef = useRef(false);
77
- const doFetch = useCallback(
78
- async (url) => {
79
- if (fetcher) return fetcher(url);
80
- const response = await fetch(url);
81
- if (!response.ok) throw new Error(`HTTP ${response.status}`);
82
- return response.json();
83
- },
84
- [fetcher]
85
- );
86
- const doSave = useCallback(
87
- async (url, payload) => {
88
- if (saver) return saver(url, payload);
89
- const response = await fetch(url, {
90
- method: "PUT",
91
- headers: { "Content-Type": "application/json" },
92
- body: JSON.stringify(payload)
93
- });
94
- if (!response.ok) throw new Error(`HTTP ${response.status}`);
95
- return response.json();
96
- },
97
- [saver]
98
- );
99
- useEffect(() => {
100
- const loadInitial = async () => {
101
- const stored = getStoredData(key);
102
- if (stored) {
103
- setDataState(stored.data);
104
- const storedSyncedAt = stored.lastSyncedAt > 0 ? stored.lastSyncedAt : null;
105
- setLastSyncedAt(storedSyncedAt);
106
- const hasLocalChanges = stored.lastModifiedAt > stored.lastSyncedAt;
107
- if (hasLocalChanges) {
108
- setStatus("pending");
109
- setPendingChanges((c) => Math.max(c, 1));
110
- }
111
- }
112
- try {
113
- const serverData = await doFetch(endpoint);
114
- const remoteTimestamp = Date.now();
115
- const remoteHash = hashData(serverData);
116
- if (stored) {
117
- const hasLocalChanges = stored.lastModifiedAt > stored.lastSyncedAt;
118
- const baselineHash = stored.lastSyncedHash || hashData(stored.data);
119
- const remoteChangedSinceSync = remoteHash !== baselineHash;
120
- if (hasLocalChanges && remoteChangedSinceSync) {
121
- const localConflict = {
122
- local: stored.data,
123
- remote: serverData,
124
- localTimestamp: stored.lastModifiedAt,
125
- remoteTimestamp
126
- };
127
- setConflict(localConflict);
128
- setStatus("conflict");
129
- onConflict?.(localConflict);
130
- } else if (!hasLocalChanges) {
131
- setDataState(serverData);
132
- setStoredData(key, {
133
- data: serverData,
134
- lastModifiedAt: remoteTimestamp,
135
- lastSyncedAt: remoteTimestamp,
136
- lastSyncedHash: remoteHash
137
- });
138
- setLastSyncedAt(remoteTimestamp);
139
- setPendingChanges(0);
140
- setStatus("synced");
141
- } else {
142
- setStatus("pending");
143
- }
144
- } else {
145
- setDataState(serverData);
146
- setStoredData(key, {
147
- data: serverData,
148
- lastModifiedAt: remoteTimestamp,
149
- lastSyncedAt: remoteTimestamp,
150
- lastSyncedHash: remoteHash
151
- });
152
- setLastSyncedAt(remoteTimestamp);
153
- setPendingChanges(0);
154
- setStatus("synced");
155
- }
156
- } catch (error) {
157
- setStatus("offline");
158
- if (error instanceof Error) {
159
- onError?.(error);
160
- }
161
- }
162
- setIsLoaded(true);
163
- };
164
- loadInitial();
165
- }, [key, endpoint, doFetch, onConflict, onError]);
166
- const saveToServer = useCallback(async (payload) => {
167
- const dataToSave = payload ?? data;
168
- if (isSavingRef.current || dataToSave === null) return;
169
- isSavingRef.current = true;
170
- try {
171
- setStatus("pending");
172
- const serverData = await doSave(endpoint, dataToSave);
173
- const syncedAt = Date.now();
174
- const syncedHash = hashData(serverData);
175
- setDataState(serverData);
176
- setStoredData(key, {
177
- data: serverData,
178
- lastModifiedAt: syncedAt,
179
- lastSyncedAt: syncedAt,
180
- lastSyncedHash: syncedHash
181
- });
182
- setLastSyncedAt(syncedAt);
183
- setPendingChanges(0);
184
- setStatus("synced");
185
- onSync?.(serverData);
186
- } catch (error) {
187
- setStatus("offline");
188
- if (error instanceof Error) {
189
- onError?.(error);
190
- }
191
- } finally {
192
- isSavingRef.current = false;
193
- }
194
- }, [data, endpoint, key, doSave, onSync, onError]);
195
- const setData = useCallback(
196
- (updater) => {
197
- setDataState((prev) => {
198
- const newData = typeof updater === "function" ? updater(prev) : updater;
199
- const previousStored = getStoredData(key);
200
- const now = Date.now();
201
- setStoredData(key, {
202
- data: newData,
203
- lastModifiedAt: now,
204
- lastSyncedAt: previousStored?.lastSyncedAt ?? 0,
205
- lastSyncedHash: previousStored?.lastSyncedHash ?? ""
206
- });
207
- setPendingChanges((c) => c + 1);
208
- setStatus("pending");
209
- if (debounceTimerRef.current) {
210
- clearTimeout(debounceTimerRef.current);
211
- }
212
- debounceTimerRef.current = setTimeout(() => {
213
- saveToServer();
214
- }, debounce);
215
- return newData;
216
- });
217
- },
218
- [key, debounce, saveToServer]
219
- );
220
- const forceSave = useCallback(async () => {
221
- if (debounceTimerRef.current) {
222
- clearTimeout(debounceTimerRef.current);
223
- debounceTimerRef.current = null;
224
- }
225
- await saveToServer();
226
- }, [saveToServer]);
227
- const refresh = useCallback(async () => {
228
- try {
229
- const serverData = await doFetch(endpoint);
230
- const syncedAt = Date.now();
231
- const syncedHash = hashData(serverData);
232
- setDataState(serverData);
233
- setStoredData(key, {
234
- data: serverData,
235
- lastModifiedAt: syncedAt,
236
- lastSyncedAt: syncedAt,
237
- lastSyncedHash: syncedHash
238
- });
239
- setLastSyncedAt(syncedAt);
240
- setPendingChanges(0);
241
- setConflict(null);
242
- setStatus("synced");
243
- } catch (error) {
244
- setStatus("offline");
245
- if (error instanceof Error) {
246
- onError?.(error);
247
- }
248
- }
249
- }, [endpoint, key, doFetch, onError]);
250
- const resolveConflict = useCallback(
251
- async (resolution) => {
252
- if (!conflict) return;
253
- switch (resolution) {
254
- case "keep_local":
255
- setDataState(conflict.local);
256
- setConflict(null);
257
- setStatus("pending");
258
- setPendingChanges((c) => Math.max(c, 1));
259
- await saveToServer(conflict.local);
260
- break;
261
- case "use_remote": {
262
- const remoteHash = hashData(conflict.remote);
263
- setDataState(conflict.remote);
264
- setStoredData(key, {
265
- data: conflict.remote,
266
- lastModifiedAt: conflict.remoteTimestamp,
267
- lastSyncedAt: conflict.remoteTimestamp,
268
- lastSyncedHash: remoteHash
269
- });
270
- setLastSyncedAt(conflict.remoteTimestamp);
271
- setPendingChanges(0);
272
- setConflict(null);
273
- setStatus("synced");
274
- break;
275
- }
276
- case "create_copy":
277
- setDataState(conflict.local);
278
- setConflict(null);
279
- setStatus("pending");
280
- setPendingChanges((c) => Math.max(c, 1));
281
- await saveToServer(conflict.local);
282
- break;
283
- }
284
- },
285
- [conflict, key, saveToServer]
286
- );
287
- useEffect(() => {
288
- return () => {
289
- if (debounceTimerRef.current) {
290
- clearTimeout(debounceTimerRef.current);
291
- }
292
- };
293
- }, []);
294
- return {
295
- data,
296
- setData,
297
- status,
298
- pendingChanges,
299
- lastSyncedAt,
300
- conflict,
301
- resolveConflict,
302
- forceSave,
303
- refresh,
304
- isLoaded
305
- };
306
- }
307
- function useAgentRun(options = {}) {
308
- const { onStart, onComplete, onError, onCancel } = options;
309
- const { config, addRun, updateRun, getAgent } = useBBContext();
310
- const [run, setRun] = useState(null);
311
- const [status, setStatus] = useState("idle");
312
- const [output, setOutput] = useState(null);
313
- const [error, setError] = useState(null);
314
- const [cost, setCost] = useState(null);
315
- const [latency, setLatency] = useState(null);
316
- const abortControllerRef = useRef(null);
317
- const start = useCallback(
318
- async (agentId, prompt, context) => {
319
- if (abortControllerRef.current) {
320
- abortControllerRef.current.abort();
321
- }
322
- const controller = new AbortController();
323
- abortControllerRef.current = controller;
324
- const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
325
- const startedAt = Date.now();
326
- const newRun = {
327
- id: runId,
328
- agentId,
329
- prompt,
330
- context,
331
- status: "running",
332
- startedAt
333
- };
334
- setRun(newRun);
335
- setStatus("running");
336
- setOutput(null);
337
- setError(null);
338
- setCost(null);
339
- setLatency(null);
340
- addRun(newRun);
341
- onStart?.(newRun);
342
- try {
343
- const response = await fetch(`${config.apiBaseUrl}/runs`, {
344
- method: "POST",
345
- headers: {
346
- "Content-Type": "application/json",
347
- ...config.headers
348
- },
349
- body: JSON.stringify({
350
- agentId,
351
- prompt,
352
- context
353
- }),
354
- signal: controller.signal
355
- });
356
- if (!response.ok) {
357
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
358
- }
359
- const result = await response.json();
360
- const completedAt = Date.now();
361
- const runLatency = completedAt - startedAt;
362
- const agent = getAgent(agentId);
363
- const runCost = result.cost ?? agent?.costPerRun ?? 0;
364
- const completedRun = {
365
- ...newRun,
366
- status: "completed",
367
- output: result.output,
368
- cost: runCost,
369
- tokenCount: result.tokenCount,
370
- latencyMs: runLatency,
371
- completedAt
372
- };
373
- setRun(completedRun);
374
- setStatus("completed");
375
- setOutput(result.output);
376
- setCost(runCost);
377
- setLatency(runLatency);
378
- updateRun(runId, completedRun);
379
- onComplete?.(completedRun);
380
- } catch (err) {
381
- if (err instanceof Error && err.name === "AbortError") {
382
- const cancelledRun = {
383
- ...newRun,
384
- status: "cancelled",
385
- completedAt: Date.now()
386
- };
387
- setRun(cancelledRun);
388
- setStatus("cancelled");
389
- updateRun(runId, cancelledRun);
390
- onCancel?.(cancelledRun);
391
- return;
392
- }
393
- const errorMessage = err instanceof Error ? err.message : "Unknown error";
394
- const failedRun = {
395
- ...newRun,
396
- status: "failed",
397
- error: errorMessage,
398
- completedAt: Date.now()
399
- };
400
- setRun(failedRun);
401
- setStatus("failed");
402
- setError(errorMessage);
403
- updateRun(runId, failedRun);
404
- onError?.(failedRun, err instanceof Error ? err : new Error(errorMessage));
405
- } finally {
406
- if (abortControllerRef.current === controller) {
407
- abortControllerRef.current = null;
408
- }
409
- }
410
- },
411
- [config, addRun, updateRun, getAgent, onStart, onComplete, onError, onCancel]
412
- );
413
- const cancel = useCallback(() => {
414
- if (abortControllerRef.current) {
415
- abortControllerRef.current.abort();
416
- abortControllerRef.current = null;
417
- }
418
- }, []);
419
- return {
420
- run,
421
- status,
422
- output,
423
- error,
424
- cost,
425
- latency,
426
- start,
427
- cancel,
428
- isRunning: status === "running"
429
- };
430
- }
431
- function usePlaySession({
432
- adapter,
433
- autoConnect = false,
434
- timeout = 3e4,
435
- onConnect,
436
- onDisconnect,
437
- onRpcResult,
438
- onError
439
- }) {
440
- const { config } = useBBContext();
441
- const [session, setSession] = useState(null);
442
- const [status, setStatus] = useState("disconnected");
443
- const [videoTrack, setVideoTrack] = useState(null);
444
- const [audioTrack, setAudioTrack] = useState(null);
445
- const [error, setError] = useState(null);
446
- const wsRef = useRef(null);
447
- const rpcIdRef = useRef(0);
448
- const pendingCallsRef = useRef(/* @__PURE__ */ new Map());
449
- const connect = useCallback(
450
- async (options) => {
451
- if (status === "connecting" || status === "connected") return;
452
- setStatus("connecting");
453
- setError(null);
454
- const connectTimeout = options?.timeout ?? timeout;
455
- try {
456
- const response = await fetch(`${config.apiBaseUrl}/play-sessions`, {
457
- method: "POST",
458
- headers: {
459
- "Content-Type": "application/json",
460
- ...config.headers
461
- },
462
- body: JSON.stringify({ adapter })
463
- });
464
- if (!response.ok) {
465
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
466
- }
467
- const sessionData = await response.json();
468
- const newSession = {
469
- id: sessionData.id,
470
- adapter,
471
- capabilityToken: sessionData.capabilityToken,
472
- createdAt: Date.now(),
473
- expiresAt: sessionData.expiresAt,
474
- livekitUrl: sessionData.livekitUrl,
475
- livekitToken: sessionData.livekitToken
476
- };
477
- setSession(newSession);
478
- const wsUrl = sessionData.wsUrl ?? `${config.apiBaseUrl.replace("http", "ws")}/play-sessions/${newSession.id}/ws`;
479
- const ws = new WebSocket(wsUrl);
480
- wsRef.current = ws;
481
- await new Promise((resolve, reject) => {
482
- const timeoutId = setTimeout(() => {
483
- ws.close();
484
- reject(new Error("Connection timeout"));
485
- }, connectTimeout);
486
- ws.onopen = () => {
487
- clearTimeout(timeoutId);
488
- resolve();
489
- };
490
- ws.onerror = () => {
491
- clearTimeout(timeoutId);
492
- reject(new Error("WebSocket connection failed"));
493
- };
494
- });
495
- ws.onmessage = (event) => {
496
- try {
497
- const message = JSON.parse(event.data);
498
- if ("id" in message && pendingCallsRef.current.has(message.id)) {
499
- const pending = pendingCallsRef.current.get(message.id);
500
- pendingCallsRef.current.delete(message.id);
501
- pending.resolve(message);
502
- onRpcResult?.(message);
503
- }
504
- } catch {
505
- }
506
- };
507
- ws.onclose = () => {
508
- setStatus("disconnected");
509
- setSession(null);
510
- wsRef.current = null;
511
- onDisconnect?.();
512
- };
513
- ws.onerror = () => {
514
- setError("WebSocket error");
515
- onError?.(new Error("WebSocket error"));
516
- };
517
- if (newSession.livekitUrl && newSession.livekitToken) {
518
- }
519
- setStatus("connected");
520
- onConnect?.(newSession);
521
- } catch (err) {
522
- const errorMessage = err instanceof Error ? err.message : "Connection failed";
523
- setStatus("error");
524
- setError(errorMessage);
525
- onError?.(err instanceof Error ? err : new Error(errorMessage));
526
- }
527
- },
528
- [adapter, config, status, timeout, onConnect, onDisconnect, onRpcResult, onError]
529
- );
530
- const disconnect = useCallback(async () => {
531
- if (wsRef.current) {
532
- wsRef.current.close();
533
- wsRef.current = null;
534
- }
535
- if (session) {
536
- try {
537
- await fetch(`${config.apiBaseUrl}/play-sessions/${session.id}`, {
538
- method: "DELETE",
539
- headers: config.headers
540
- });
541
- } catch {
542
- }
543
- }
544
- setSession(null);
545
- setStatus("disconnected");
546
- setVideoTrack(null);
547
- setAudioTrack(null);
548
- onDisconnect?.();
549
- }, [session, config, onDisconnect]);
550
- const call = useCallback(
551
- (method, params) => {
552
- return new Promise((resolve, reject) => {
553
- if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) {
554
- reject(new Error("Not connected"));
555
- return;
556
- }
557
- const id = ++rpcIdRef.current;
558
- const request = {
559
- jsonrpc: "2.0",
560
- id,
561
- method,
562
- params: params ?? {}
563
- };
564
- pendingCallsRef.current.set(id, {
565
- resolve,
566
- reject
567
- });
568
- wsRef.current.send(JSON.stringify(request));
569
- setTimeout(() => {
570
- if (pendingCallsRef.current.has(id)) {
571
- pendingCallsRef.current.delete(id);
572
- reject(new Error("RPC call timeout"));
573
- }
574
- }, 3e4);
575
- });
576
- },
577
- []
578
- );
579
- const observe = useCallback(
580
- async (key) => {
581
- const response = await call(`observe.${key}`);
582
- if (response.error) {
583
- throw new Error(response.error.message);
584
- }
585
- return response.result;
586
- },
587
- [call]
588
- );
589
- const act = useCallback(
590
- async (action, params) => {
591
- const response = await call(`act.${action}`, params);
592
- if (response.error) {
593
- throw new Error(response.error.message);
594
- }
595
- return response.result;
596
- },
597
- [call]
598
- );
599
- useEffect(() => {
600
- if (autoConnect) {
601
- connect();
602
- }
603
- }, [autoConnect]);
604
- useEffect(() => {
605
- return () => {
606
- if (wsRef.current) {
607
- wsRef.current.close();
608
- }
609
- };
610
- }, []);
611
- return {
612
- session,
613
- status,
614
- videoTrack,
615
- audioTrack,
616
- call,
617
- observe,
618
- act,
619
- connect,
620
- disconnect,
621
- isConnected: status === "connected",
622
- error
623
- };
624
- }
625
-
626
- export { useAgentRun, usePlaySession, useSync };
627
- //# sourceMappingURL=chunk-YIUG7IJK.js.map
628
- //# sourceMappingURL=chunk-YIUG7IJK.js.map