@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,8 +1,943 @@
1
- export { IntensityProvider, useIntensity, useIntensityContext } from '../chunk-4SRFO5W3.js';
2
- export { subscribeToRunEvents, useRunStream } from '../chunk-Z2S54IZX.js';
3
- export { useAgentRun, usePlaySession, useSync } from '../chunk-YIUG7IJK.js';
4
- import '../chunk-Q2XDMV7U.js';
5
- import '../chunk-OBZD2M3C.js';
6
- import '../chunk-TM6AOUSD.js';
1
+ import { createContext, useState, useRef, useCallback, useEffect, useMemo, useContext } from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/hooks/useSync.ts
5
+ function stableStringify(value) {
6
+ if (value === null || typeof value !== "object") {
7
+ const encoded = JSON.stringify(value);
8
+ return encoded === void 0 ? "null" : encoded;
9
+ }
10
+ if (Array.isArray(value)) {
11
+ return `[${value.map(stableStringify).join(",")}]`;
12
+ }
13
+ const record = value;
14
+ const keys = Object.keys(record).sort();
15
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(record[k])}`).join(",")}}`;
16
+ }
17
+ function hashString(input) {
18
+ let hash = 2166136261;
19
+ for (let i = 0; i < input.length; i++) {
20
+ hash ^= input.charCodeAt(i);
21
+ hash = hash * 16777619 >>> 0;
22
+ }
23
+ return hash.toString(36);
24
+ }
25
+ function hashData(value) {
26
+ return hashString(stableStringify(value));
27
+ }
28
+ function normalizeStoredData(raw) {
29
+ if (!raw || typeof raw !== "object") return null;
30
+ const record = raw;
31
+ if ("data" in record && typeof record.lastModifiedAt === "number" && typeof record.lastSyncedAt === "number" && typeof record.lastSyncedHash === "string") {
32
+ return record;
33
+ }
34
+ if ("data" in record && typeof record.timestamp === "number" && typeof record.version === "number") {
35
+ const legacy = record;
36
+ const syncedHash = hashData(legacy.data);
37
+ return {
38
+ data: legacy.data,
39
+ lastModifiedAt: legacy.timestamp,
40
+ lastSyncedAt: legacy.timestamp,
41
+ lastSyncedHash: syncedHash
42
+ };
43
+ }
44
+ return null;
45
+ }
46
+ function getStoredData(key) {
47
+ try {
48
+ const raw = localStorage.getItem(key);
49
+ if (!raw) return null;
50
+ const parsed = JSON.parse(raw);
51
+ return normalizeStoredData(parsed);
52
+ } catch {
53
+ return null;
54
+ }
55
+ }
56
+ function setStoredData(key, record) {
57
+ localStorage.setItem(key, JSON.stringify(record));
58
+ }
59
+ function useSync({
60
+ key,
61
+ endpoint,
62
+ debounce = 2e3,
63
+ initialData,
64
+ fetcher,
65
+ saver,
66
+ onConflict,
67
+ onError,
68
+ onSync
69
+ }) {
70
+ const [data, setDataState] = useState(initialData ?? null);
71
+ const [status, setStatus] = useState("synced");
72
+ const [pendingChanges, setPendingChanges] = useState(0);
73
+ const [lastSyncedAt, setLastSyncedAt] = useState(null);
74
+ const [conflict, setConflict] = useState(null);
75
+ const [isLoaded, setIsLoaded] = useState(false);
76
+ const debounceTimerRef = useRef(null);
77
+ const isSavingRef = useRef(false);
78
+ const doFetch = useCallback(
79
+ async (url) => {
80
+ if (fetcher) return fetcher(url);
81
+ const response = await fetch(url);
82
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
83
+ return response.json();
84
+ },
85
+ [fetcher]
86
+ );
87
+ const doSave = useCallback(
88
+ async (url, payload) => {
89
+ if (saver) return saver(url, payload);
90
+ const response = await fetch(url, {
91
+ method: "PUT",
92
+ headers: { "Content-Type": "application/json" },
93
+ body: JSON.stringify(payload)
94
+ });
95
+ if (!response.ok) throw new Error(`HTTP ${response.status}`);
96
+ return response.json();
97
+ },
98
+ [saver]
99
+ );
100
+ useEffect(() => {
101
+ const loadInitial = async () => {
102
+ const stored = getStoredData(key);
103
+ if (stored) {
104
+ setDataState(stored.data);
105
+ const storedSyncedAt = stored.lastSyncedAt > 0 ? stored.lastSyncedAt : null;
106
+ setLastSyncedAt(storedSyncedAt);
107
+ const hasLocalChanges = stored.lastModifiedAt > stored.lastSyncedAt;
108
+ if (hasLocalChanges) {
109
+ setStatus("pending");
110
+ setPendingChanges((c) => Math.max(c, 1));
111
+ }
112
+ }
113
+ try {
114
+ const serverData = await doFetch(endpoint);
115
+ const remoteTimestamp = Date.now();
116
+ const remoteHash = hashData(serverData);
117
+ if (stored) {
118
+ const hasLocalChanges = stored.lastModifiedAt > stored.lastSyncedAt;
119
+ const baselineHash = stored.lastSyncedHash || hashData(stored.data);
120
+ const remoteChangedSinceSync = remoteHash !== baselineHash;
121
+ if (hasLocalChanges && remoteChangedSinceSync) {
122
+ const localConflict = {
123
+ local: stored.data,
124
+ remote: serverData,
125
+ localTimestamp: stored.lastModifiedAt,
126
+ remoteTimestamp
127
+ };
128
+ setConflict(localConflict);
129
+ setStatus("conflict");
130
+ onConflict?.(localConflict);
131
+ } else if (!hasLocalChanges) {
132
+ setDataState(serverData);
133
+ setStoredData(key, {
134
+ data: serverData,
135
+ lastModifiedAt: remoteTimestamp,
136
+ lastSyncedAt: remoteTimestamp,
137
+ lastSyncedHash: remoteHash
138
+ });
139
+ setLastSyncedAt(remoteTimestamp);
140
+ setPendingChanges(0);
141
+ setStatus("synced");
142
+ } else {
143
+ setStatus("pending");
144
+ }
145
+ } else {
146
+ setDataState(serverData);
147
+ setStoredData(key, {
148
+ data: serverData,
149
+ lastModifiedAt: remoteTimestamp,
150
+ lastSyncedAt: remoteTimestamp,
151
+ lastSyncedHash: remoteHash
152
+ });
153
+ setLastSyncedAt(remoteTimestamp);
154
+ setPendingChanges(0);
155
+ setStatus("synced");
156
+ }
157
+ } catch (error) {
158
+ setStatus("offline");
159
+ if (error instanceof Error) {
160
+ onError?.(error);
161
+ }
162
+ }
163
+ setIsLoaded(true);
164
+ };
165
+ loadInitial();
166
+ }, [key, endpoint, doFetch, onConflict, onError]);
167
+ const saveToServer = useCallback(async (payload) => {
168
+ const dataToSave = payload ?? data;
169
+ if (isSavingRef.current || dataToSave === null) return;
170
+ isSavingRef.current = true;
171
+ try {
172
+ setStatus("pending");
173
+ const serverData = await doSave(endpoint, dataToSave);
174
+ const syncedAt = Date.now();
175
+ const syncedHash = hashData(serverData);
176
+ setDataState(serverData);
177
+ setStoredData(key, {
178
+ data: serverData,
179
+ lastModifiedAt: syncedAt,
180
+ lastSyncedAt: syncedAt,
181
+ lastSyncedHash: syncedHash
182
+ });
183
+ setLastSyncedAt(syncedAt);
184
+ setPendingChanges(0);
185
+ setStatus("synced");
186
+ onSync?.(serverData);
187
+ } catch (error) {
188
+ setStatus("offline");
189
+ if (error instanceof Error) {
190
+ onError?.(error);
191
+ }
192
+ } finally {
193
+ isSavingRef.current = false;
194
+ }
195
+ }, [data, endpoint, key, doSave, onSync, onError]);
196
+ const setData = useCallback(
197
+ (updater) => {
198
+ setDataState((prev) => {
199
+ const newData = typeof updater === "function" ? updater(prev) : updater;
200
+ const previousStored = getStoredData(key);
201
+ const now = Date.now();
202
+ setStoredData(key, {
203
+ data: newData,
204
+ lastModifiedAt: now,
205
+ lastSyncedAt: previousStored?.lastSyncedAt ?? 0,
206
+ lastSyncedHash: previousStored?.lastSyncedHash ?? ""
207
+ });
208
+ setPendingChanges((c) => c + 1);
209
+ setStatus("pending");
210
+ if (debounceTimerRef.current) {
211
+ clearTimeout(debounceTimerRef.current);
212
+ }
213
+ debounceTimerRef.current = setTimeout(() => {
214
+ saveToServer();
215
+ }, debounce);
216
+ return newData;
217
+ });
218
+ },
219
+ [key, debounce, saveToServer]
220
+ );
221
+ const forceSave = useCallback(async () => {
222
+ if (debounceTimerRef.current) {
223
+ clearTimeout(debounceTimerRef.current);
224
+ debounceTimerRef.current = null;
225
+ }
226
+ await saveToServer();
227
+ }, [saveToServer]);
228
+ const refresh = useCallback(async () => {
229
+ try {
230
+ const serverData = await doFetch(endpoint);
231
+ const syncedAt = Date.now();
232
+ const syncedHash = hashData(serverData);
233
+ setDataState(serverData);
234
+ setStoredData(key, {
235
+ data: serverData,
236
+ lastModifiedAt: syncedAt,
237
+ lastSyncedAt: syncedAt,
238
+ lastSyncedHash: syncedHash
239
+ });
240
+ setLastSyncedAt(syncedAt);
241
+ setPendingChanges(0);
242
+ setConflict(null);
243
+ setStatus("synced");
244
+ } catch (error) {
245
+ setStatus("offline");
246
+ if (error instanceof Error) {
247
+ onError?.(error);
248
+ }
249
+ }
250
+ }, [endpoint, key, doFetch, onError]);
251
+ const resolveConflict = useCallback(
252
+ async (resolution) => {
253
+ if (!conflict) return;
254
+ switch (resolution) {
255
+ case "keep_local":
256
+ setDataState(conflict.local);
257
+ setConflict(null);
258
+ setStatus("pending");
259
+ setPendingChanges((c) => Math.max(c, 1));
260
+ await saveToServer(conflict.local);
261
+ break;
262
+ case "use_remote": {
263
+ const remoteHash = hashData(conflict.remote);
264
+ setDataState(conflict.remote);
265
+ setStoredData(key, {
266
+ data: conflict.remote,
267
+ lastModifiedAt: conflict.remoteTimestamp,
268
+ lastSyncedAt: conflict.remoteTimestamp,
269
+ lastSyncedHash: remoteHash
270
+ });
271
+ setLastSyncedAt(conflict.remoteTimestamp);
272
+ setPendingChanges(0);
273
+ setConflict(null);
274
+ setStatus("synced");
275
+ break;
276
+ }
277
+ case "create_copy":
278
+ setDataState(conflict.local);
279
+ setConflict(null);
280
+ setStatus("pending");
281
+ setPendingChanges((c) => Math.max(c, 1));
282
+ await saveToServer(conflict.local);
283
+ break;
284
+ }
285
+ },
286
+ [conflict, key, saveToServer]
287
+ );
288
+ useEffect(() => {
289
+ return () => {
290
+ if (debounceTimerRef.current) {
291
+ clearTimeout(debounceTimerRef.current);
292
+ }
293
+ };
294
+ }, []);
295
+ return {
296
+ data,
297
+ setData,
298
+ status,
299
+ pendingChanges,
300
+ lastSyncedAt,
301
+ conflict,
302
+ resolveConflict,
303
+ forceSave,
304
+ refresh,
305
+ isLoaded
306
+ };
307
+ }
308
+ var BBContext = createContext(null);
309
+ function useBBContext() {
310
+ const context = useContext(BBContext);
311
+ if (!context) {
312
+ throw new Error("useBBContext must be used within a BBProvider");
313
+ }
314
+ return context;
315
+ }
316
+
317
+ // src/hooks/useAgentRun.ts
318
+ function useAgentRun(options = {}) {
319
+ const { onStart, onComplete, onError, onCancel } = options;
320
+ const { config, addRun, updateRun, getAgent } = useBBContext();
321
+ const [run, setRun] = useState(null);
322
+ const [status, setStatus] = useState("idle");
323
+ const [output, setOutput] = useState(null);
324
+ const [error, setError] = useState(null);
325
+ const [cost, setCost] = useState(null);
326
+ const [latency, setLatency] = useState(null);
327
+ const abortControllerRef = useRef(null);
328
+ const start = useCallback(
329
+ async (agentId, prompt, context) => {
330
+ if (abortControllerRef.current) {
331
+ abortControllerRef.current.abort();
332
+ }
333
+ const controller = new AbortController();
334
+ abortControllerRef.current = controller;
335
+ const runId = `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
336
+ const startedAt = Date.now();
337
+ const newRun = {
338
+ id: runId,
339
+ agentId,
340
+ prompt,
341
+ context,
342
+ status: "running",
343
+ startedAt
344
+ };
345
+ setRun(newRun);
346
+ setStatus("running");
347
+ setOutput(null);
348
+ setError(null);
349
+ setCost(null);
350
+ setLatency(null);
351
+ addRun(newRun);
352
+ onStart?.(newRun);
353
+ try {
354
+ const response = await fetch(`${config.apiBaseUrl}/runs`, {
355
+ method: "POST",
356
+ headers: {
357
+ "Content-Type": "application/json",
358
+ ...config.headers
359
+ },
360
+ body: JSON.stringify({
361
+ agentId,
362
+ prompt,
363
+ context
364
+ }),
365
+ signal: controller.signal
366
+ });
367
+ if (!response.ok) {
368
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
369
+ }
370
+ const result = await response.json();
371
+ const completedAt = Date.now();
372
+ const runLatency = completedAt - startedAt;
373
+ const agent = getAgent(agentId);
374
+ const runCost = result.cost ?? agent?.costPerRun ?? 0;
375
+ const completedRun = {
376
+ ...newRun,
377
+ status: "completed",
378
+ output: result.output,
379
+ cost: runCost,
380
+ tokenCount: result.tokenCount,
381
+ latencyMs: runLatency,
382
+ completedAt
383
+ };
384
+ setRun(completedRun);
385
+ setStatus("completed");
386
+ setOutput(result.output);
387
+ setCost(runCost);
388
+ setLatency(runLatency);
389
+ updateRun(runId, completedRun);
390
+ onComplete?.(completedRun);
391
+ } catch (err) {
392
+ if (err instanceof Error && err.name === "AbortError") {
393
+ const cancelledRun = {
394
+ ...newRun,
395
+ status: "cancelled",
396
+ completedAt: Date.now()
397
+ };
398
+ setRun(cancelledRun);
399
+ setStatus("cancelled");
400
+ updateRun(runId, cancelledRun);
401
+ onCancel?.(cancelledRun);
402
+ return;
403
+ }
404
+ const errorMessage = err instanceof Error ? err.message : "Unknown error";
405
+ const failedRun = {
406
+ ...newRun,
407
+ status: "failed",
408
+ error: errorMessage,
409
+ completedAt: Date.now()
410
+ };
411
+ setRun(failedRun);
412
+ setStatus("failed");
413
+ setError(errorMessage);
414
+ updateRun(runId, failedRun);
415
+ onError?.(failedRun, err instanceof Error ? err : new Error(errorMessage));
416
+ } finally {
417
+ if (abortControllerRef.current === controller) {
418
+ abortControllerRef.current = null;
419
+ }
420
+ }
421
+ },
422
+ [config, addRun, updateRun, getAgent, onStart, onComplete, onError, onCancel]
423
+ );
424
+ const cancel = useCallback(() => {
425
+ if (abortControllerRef.current) {
426
+ abortControllerRef.current.abort();
427
+ abortControllerRef.current = null;
428
+ }
429
+ }, []);
430
+ return {
431
+ run,
432
+ status,
433
+ output,
434
+ error,
435
+ cost,
436
+ latency,
437
+ start,
438
+ cancel,
439
+ isRunning: status === "running"
440
+ };
441
+ }
442
+ function useRunStream(runId, options = {}) {
443
+ const { pollInterval = 4e3, preferPolling = false, onEvent, onComplete, onError } = options;
444
+ const { config } = useBBContext();
445
+ const [events, setEvents] = useState([]);
446
+ const [latestEvent, setLatestEvent] = useState(null);
447
+ const [status, setStatus] = useState("idle");
448
+ const [isConnected, setIsConnected] = useState(false);
449
+ const [run, setRun] = useState(null);
450
+ const eventSourceRef = useRef(null);
451
+ const pollingIntervalRef = useRef(null);
452
+ const isActiveRef = useRef(true);
453
+ const handleEvent = useCallback(
454
+ (event) => {
455
+ if (!isActiveRef.current) return;
456
+ setEvents((prev) => [...prev, event]);
457
+ setLatestEvent(event);
458
+ onEvent?.(event);
459
+ if (event.data?.status) {
460
+ setStatus(event.data.status);
461
+ }
462
+ if (event.type === "completed" || event.type === "failed" || event.type === "cancelled") {
463
+ const finalStatus = event.type === "completed" ? "completed" : event.type === "failed" ? "failed" : "cancelled";
464
+ setStatus(finalStatus);
465
+ if (event.data?.run) {
466
+ setRun(event.data.run);
467
+ if (event.type === "completed") {
468
+ onComplete?.(event.data.run);
469
+ }
470
+ }
471
+ }
472
+ },
473
+ [onEvent, onComplete]
474
+ );
475
+ const setupEventSource = useCallback(() => {
476
+ if (!runId || preferPolling) return;
477
+ const url = `${config.apiBaseUrl}/runs/${runId}/events`;
478
+ const eventSource = new EventSource(url);
479
+ eventSource.onopen = () => {
480
+ setIsConnected(true);
481
+ handleEvent({
482
+ type: "connected",
483
+ runId,
484
+ timestamp: Date.now()
485
+ });
486
+ };
487
+ eventSource.onmessage = (e) => {
488
+ try {
489
+ const data = JSON.parse(e.data);
490
+ handleEvent({
491
+ type: data.type ?? "status",
492
+ runId,
493
+ timestamp: Date.now(),
494
+ data
495
+ });
496
+ } catch (err) {
497
+ console.error("Failed to parse event:", err);
498
+ }
499
+ };
500
+ eventSource.onerror = () => {
501
+ setIsConnected(false);
502
+ startPolling();
503
+ };
504
+ eventSourceRef.current = eventSource;
505
+ }, [runId, config.apiBaseUrl, preferPolling, handleEvent]);
506
+ const startPolling = useCallback(() => {
507
+ if (!runId || pollingIntervalRef.current) return;
508
+ const poll = async () => {
509
+ if (!isActiveRef.current || !runId) return;
510
+ try {
511
+ const response = await fetch(`${config.apiBaseUrl}/runs/${runId}`, {
512
+ headers: config.headers
513
+ });
514
+ if (!response.ok) {
515
+ throw new Error(`HTTP ${response.status}`);
516
+ }
517
+ const data = await response.json();
518
+ handleEvent({
519
+ type: "status",
520
+ runId,
521
+ timestamp: Date.now(),
522
+ data: {
523
+ status: data.status,
524
+ output: data.output,
525
+ run: data
526
+ }
527
+ });
528
+ if (data.status === "completed" || data.status === "failed" || data.status === "cancelled") {
529
+ stopPolling();
530
+ handleEvent({
531
+ type: data.status,
532
+ runId,
533
+ timestamp: Date.now(),
534
+ data: { run: data }
535
+ });
536
+ }
537
+ } catch (err) {
538
+ if (err instanceof Error) {
539
+ onError?.(err);
540
+ }
541
+ }
542
+ };
543
+ poll();
544
+ pollingIntervalRef.current = setInterval(poll, pollInterval);
545
+ }, [runId, config, pollInterval, handleEvent, onError]);
546
+ const stopPolling = useCallback(() => {
547
+ if (pollingIntervalRef.current) {
548
+ clearInterval(pollingIntervalRef.current);
549
+ pollingIntervalRef.current = null;
550
+ }
551
+ }, []);
552
+ const disconnect = useCallback(() => {
553
+ isActiveRef.current = false;
554
+ if (eventSourceRef.current) {
555
+ eventSourceRef.current.close();
556
+ eventSourceRef.current = null;
557
+ }
558
+ stopPolling();
559
+ setIsConnected(false);
560
+ }, [stopPolling]);
561
+ const reconnect = useCallback(() => {
562
+ disconnect();
563
+ isActiveRef.current = true;
564
+ setEvents([]);
565
+ setLatestEvent(null);
566
+ setStatus("idle");
567
+ if (preferPolling) {
568
+ startPolling();
569
+ } else {
570
+ setupEventSource();
571
+ }
572
+ }, [disconnect, preferPolling, startPolling, setupEventSource]);
573
+ useEffect(() => {
574
+ if (!runId) {
575
+ disconnect();
576
+ return;
577
+ }
578
+ isActiveRef.current = true;
579
+ setEvents([]);
580
+ setLatestEvent(null);
581
+ setStatus("running");
582
+ if (preferPolling) {
583
+ startPolling();
584
+ } else {
585
+ setupEventSource();
586
+ setTimeout(() => {
587
+ if (isActiveRef.current && !isConnected) {
588
+ startPolling();
589
+ }
590
+ }, 2e3);
591
+ }
592
+ return () => {
593
+ disconnect();
594
+ };
595
+ }, [runId]);
596
+ return {
597
+ events,
598
+ latestEvent,
599
+ status,
600
+ isConnected,
601
+ run,
602
+ disconnect,
603
+ reconnect
604
+ };
605
+ }
606
+ function subscribeToRunEvents(apiBaseUrl, runId, callback, options = {}) {
607
+ const url = `${apiBaseUrl}/runs/${runId}/events`;
608
+ const eventSource = new EventSource(url);
609
+ eventSource.onopen = () => {
610
+ callback({
611
+ type: "connected",
612
+ runId,
613
+ timestamp: Date.now()
614
+ });
615
+ };
616
+ eventSource.onmessage = (e) => {
617
+ try {
618
+ const data = JSON.parse(e.data);
619
+ callback({
620
+ type: data.type ?? "status",
621
+ runId,
622
+ timestamp: Date.now(),
623
+ data
624
+ });
625
+ } catch (err) {
626
+ console.error("Failed to parse event:", err);
627
+ }
628
+ };
629
+ eventSource.onerror = () => {
630
+ };
631
+ return () => eventSource.close();
632
+ }
633
+ var DEFAULT_SMOOTHING = 0.3;
634
+ var DEFAULT_UPDATE_INTERVAL = 50;
635
+ function useIntensity(options = {}) {
636
+ const {
637
+ smoothing = DEFAULT_SMOOTHING,
638
+ updateInterval = DEFAULT_UPDATE_INTERVAL,
639
+ sources = ["activeRuns"],
640
+ customIntensity: initialCustom = 0
641
+ } = options;
642
+ const { activeRuns, syncStatus } = useBBContext();
643
+ const [customIntensity, setCustomIntensity] = useState(initialCustom);
644
+ const [values, setValues] = useState({
645
+ intensity: 0,
646
+ presence: 0,
647
+ activity: 0,
648
+ breathing: 0
649
+ });
650
+ const targetRef = useRef({
651
+ intensity: 0,
652
+ presence: 0,
653
+ activity: 0,
654
+ breathing: 0
655
+ });
656
+ const animationFrameRef = useRef(null);
657
+ const lastUpdateRef = useRef(Date.now());
658
+ const calculateTarget = useCallback(() => {
659
+ let runIntensity = 0;
660
+ let syncIntensity = 0;
661
+ let custom = 0;
662
+ if (sources.includes("activeRuns")) {
663
+ runIntensity = Math.min(activeRuns.length / 3, 1);
664
+ }
665
+ if (sources.includes("pendingSync")) {
666
+ syncIntensity = syncStatus === "pending" ? 0.5 : syncStatus === "conflict" ? 0.8 : 0;
667
+ }
668
+ if (sources.includes("custom")) {
669
+ custom = customIntensity;
670
+ }
671
+ const combinedIntensity = Math.min(
672
+ Math.max(runIntensity, syncIntensity, custom),
673
+ 1
674
+ );
675
+ const presence = combinedIntensity > 0 ? Math.min(combinedIntensity + 0.3, 1) : 0;
676
+ const activity = combinedIntensity;
677
+ const breathing = combinedIntensity > 0.2 ? Math.min(combinedIntensity * 1.2, 1) : 0;
678
+ targetRef.current = {
679
+ intensity: combinedIntensity,
680
+ presence,
681
+ activity,
682
+ breathing
683
+ };
684
+ }, [activeRuns.length, syncStatus, customIntensity, sources]);
685
+ useEffect(() => {
686
+ const animate = () => {
687
+ const now = Date.now();
688
+ const delta = (now - lastUpdateRef.current) / 1e3;
689
+ lastUpdateRef.current = now;
690
+ calculateTarget();
691
+ const lerpFactor = 1 - Math.pow(1 - smoothing, delta * 60);
692
+ setValues((prev) => ({
693
+ intensity: prev.intensity + (targetRef.current.intensity - prev.intensity) * lerpFactor,
694
+ presence: prev.presence + (targetRef.current.presence - prev.presence) * lerpFactor,
695
+ activity: prev.activity + (targetRef.current.activity - prev.activity) * lerpFactor,
696
+ breathing: prev.breathing + (targetRef.current.breathing - prev.breathing) * lerpFactor
697
+ }));
698
+ animationFrameRef.current = requestAnimationFrame(animate);
699
+ };
700
+ animationFrameRef.current = requestAnimationFrame(animate);
701
+ return () => {
702
+ if (animationFrameRef.current) {
703
+ cancelAnimationFrame(animationFrameRef.current);
704
+ }
705
+ };
706
+ }, [calculateTarget, smoothing]);
707
+ const cssVars = useMemo(
708
+ () => ({
709
+ "--glia-intensity": values.intensity.toFixed(3),
710
+ "--glia-intensity-presence": values.presence.toFixed(3),
711
+ "--glia-intensity-activity": values.activity.toFixed(3),
712
+ "--glia-intensity-breathing": values.breathing.toFixed(3)
713
+ }),
714
+ [values]
715
+ );
716
+ const cssVarsString = useMemo(
717
+ () => Object.entries(cssVars).map(([key, value]) => `${key}: ${value}`).join("; "),
718
+ [cssVars]
719
+ );
720
+ return {
721
+ ...values,
722
+ setCustomIntensity,
723
+ cssVars,
724
+ cssVarsString
725
+ };
726
+ }
727
+ var IntensityContext = createContext(null);
728
+ function IntensityProvider({ children, options }) {
729
+ const intensity = useIntensity(options);
730
+ useEffect(() => {
731
+ const root = document.documentElement;
732
+ root.style.setProperty("--glia-intensity", intensity.intensity.toFixed(3));
733
+ root.style.setProperty("--glia-intensity-presence", intensity.presence.toFixed(3));
734
+ root.style.setProperty("--glia-intensity-activity", intensity.activity.toFixed(3));
735
+ root.style.setProperty("--glia-intensity-breathing", intensity.breathing.toFixed(3));
736
+ }, [intensity]);
737
+ return /* @__PURE__ */ jsx(IntensityContext.Provider, { value: intensity, children });
738
+ }
739
+ function useIntensityContext() {
740
+ const context = useContext(IntensityContext);
741
+ if (!context) {
742
+ throw new Error("useIntensityContext must be used within an IntensityProvider");
743
+ }
744
+ return context;
745
+ }
746
+ function usePlaySession({
747
+ adapter,
748
+ autoConnect = false,
749
+ timeout = 3e4,
750
+ onConnect,
751
+ onDisconnect,
752
+ onRpcResult,
753
+ onError
754
+ }) {
755
+ const { config } = useBBContext();
756
+ const [session, setSession] = useState(null);
757
+ const [status, setStatus] = useState("disconnected");
758
+ const [videoTrack, setVideoTrack] = useState(null);
759
+ const [audioTrack, setAudioTrack] = useState(null);
760
+ const [error, setError] = useState(null);
761
+ const wsRef = useRef(null);
762
+ const rpcIdRef = useRef(0);
763
+ const pendingCallsRef = useRef(/* @__PURE__ */ new Map());
764
+ const connect = useCallback(
765
+ async (options) => {
766
+ if (status === "connecting" || status === "connected") return;
767
+ setStatus("connecting");
768
+ setError(null);
769
+ const connectTimeout = options?.timeout ?? timeout;
770
+ try {
771
+ const response = await fetch(`${config.apiBaseUrl}/play-sessions`, {
772
+ method: "POST",
773
+ headers: {
774
+ "Content-Type": "application/json",
775
+ ...config.headers
776
+ },
777
+ body: JSON.stringify({ adapter })
778
+ });
779
+ if (!response.ok) {
780
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
781
+ }
782
+ const sessionData = await response.json();
783
+ const newSession = {
784
+ id: sessionData.id,
785
+ adapter,
786
+ capabilityToken: sessionData.capabilityToken,
787
+ createdAt: Date.now(),
788
+ expiresAt: sessionData.expiresAt,
789
+ livekitUrl: sessionData.livekitUrl,
790
+ livekitToken: sessionData.livekitToken
791
+ };
792
+ setSession(newSession);
793
+ const wsUrl = sessionData.wsUrl ?? `${config.apiBaseUrl.replace("http", "ws")}/play-sessions/${newSession.id}/ws`;
794
+ const ws = new WebSocket(wsUrl);
795
+ wsRef.current = ws;
796
+ await new Promise((resolve, reject) => {
797
+ const timeoutId = setTimeout(() => {
798
+ ws.close();
799
+ reject(new Error("Connection timeout"));
800
+ }, connectTimeout);
801
+ ws.onopen = () => {
802
+ clearTimeout(timeoutId);
803
+ resolve();
804
+ };
805
+ ws.onerror = () => {
806
+ clearTimeout(timeoutId);
807
+ reject(new Error("WebSocket connection failed"));
808
+ };
809
+ });
810
+ ws.onmessage = (event) => {
811
+ try {
812
+ const message = JSON.parse(event.data);
813
+ if ("id" in message && pendingCallsRef.current.has(message.id)) {
814
+ const pending = pendingCallsRef.current.get(message.id);
815
+ pendingCallsRef.current.delete(message.id);
816
+ pending.resolve(message);
817
+ onRpcResult?.(message);
818
+ }
819
+ } catch {
820
+ }
821
+ };
822
+ ws.onclose = () => {
823
+ setStatus("disconnected");
824
+ setSession(null);
825
+ wsRef.current = null;
826
+ onDisconnect?.();
827
+ };
828
+ ws.onerror = () => {
829
+ setError("WebSocket error");
830
+ onError?.(new Error("WebSocket error"));
831
+ };
832
+ if (newSession.livekitUrl && newSession.livekitToken) {
833
+ }
834
+ setStatus("connected");
835
+ onConnect?.(newSession);
836
+ } catch (err) {
837
+ const errorMessage = err instanceof Error ? err.message : "Connection failed";
838
+ setStatus("error");
839
+ setError(errorMessage);
840
+ onError?.(err instanceof Error ? err : new Error(errorMessage));
841
+ }
842
+ },
843
+ [adapter, config, status, timeout, onConnect, onDisconnect, onRpcResult, onError]
844
+ );
845
+ const disconnect = useCallback(async () => {
846
+ if (wsRef.current) {
847
+ wsRef.current.close();
848
+ wsRef.current = null;
849
+ }
850
+ if (session) {
851
+ try {
852
+ await fetch(`${config.apiBaseUrl}/play-sessions/${session.id}`, {
853
+ method: "DELETE",
854
+ headers: config.headers
855
+ });
856
+ } catch {
857
+ }
858
+ }
859
+ setSession(null);
860
+ setStatus("disconnected");
861
+ setVideoTrack(null);
862
+ setAudioTrack(null);
863
+ onDisconnect?.();
864
+ }, [session, config, onDisconnect]);
865
+ const call = useCallback(
866
+ (method, params) => {
867
+ return new Promise((resolve, reject) => {
868
+ if (!wsRef.current || wsRef.current.readyState !== WebSocket.OPEN) {
869
+ reject(new Error("Not connected"));
870
+ return;
871
+ }
872
+ const id = ++rpcIdRef.current;
873
+ const request = {
874
+ jsonrpc: "2.0",
875
+ id,
876
+ method,
877
+ params: params ?? {}
878
+ };
879
+ pendingCallsRef.current.set(id, {
880
+ resolve,
881
+ reject
882
+ });
883
+ wsRef.current.send(JSON.stringify(request));
884
+ setTimeout(() => {
885
+ if (pendingCallsRef.current.has(id)) {
886
+ pendingCallsRef.current.delete(id);
887
+ reject(new Error("RPC call timeout"));
888
+ }
889
+ }, 3e4);
890
+ });
891
+ },
892
+ []
893
+ );
894
+ const observe = useCallback(
895
+ async (key) => {
896
+ const response = await call(`observe.${key}`);
897
+ if (response.error) {
898
+ throw new Error(response.error.message);
899
+ }
900
+ return response.result;
901
+ },
902
+ [call]
903
+ );
904
+ const act = useCallback(
905
+ async (action, params) => {
906
+ const response = await call(`act.${action}`, params);
907
+ if (response.error) {
908
+ throw new Error(response.error.message);
909
+ }
910
+ return response.result;
911
+ },
912
+ [call]
913
+ );
914
+ useEffect(() => {
915
+ if (autoConnect) {
916
+ connect();
917
+ }
918
+ }, [autoConnect]);
919
+ useEffect(() => {
920
+ return () => {
921
+ if (wsRef.current) {
922
+ wsRef.current.close();
923
+ }
924
+ };
925
+ }, []);
926
+ return {
927
+ session,
928
+ status,
929
+ videoTrack,
930
+ audioTrack,
931
+ call,
932
+ observe,
933
+ act,
934
+ connect,
935
+ disconnect,
936
+ isConnected: status === "connected",
937
+ error
938
+ };
939
+ }
940
+
941
+ export { IntensityProvider, subscribeToRunEvents, useAgentRun, useIntensity, useIntensityContext, usePlaySession, useRunStream, useSync };
7
942
  //# sourceMappingURL=index.js.map
8
943
  //# sourceMappingURL=index.js.map