doover-js 0.11.0 → 0.13.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 (389) hide show
  1. package/README.md +106 -0
  2. package/dist/apis/_args.js +5 -5
  3. package/dist/apis/agents-api.d.ts +4 -4
  4. package/dist/apis/agents-api.js +2 -2
  5. package/dist/apis/aggregates-api.d.ts +4 -4
  6. package/dist/apis/aggregates-api.js +5 -5
  7. package/dist/apis/alarms-api.d.ts +2 -2
  8. package/dist/apis/alarms-api.js +3 -3
  9. package/dist/apis/channels-api.d.ts +3 -3
  10. package/dist/apis/channels-api.js +6 -6
  11. package/dist/apis/connections-api.d.ts +2 -2
  12. package/dist/apis/connections-api.js +6 -6
  13. package/dist/apis/messages-api.d.ts +4 -4
  14. package/dist/apis/messages-api.js +11 -11
  15. package/dist/apis/notifications-api.d.ts +2 -2
  16. package/dist/apis/notifications-api.js +4 -4
  17. package/dist/apis/organisations-api.d.ts +2 -2
  18. package/dist/apis/permissions-api.d.ts +2 -2
  19. package/dist/apis/permissions-api.js +3 -3
  20. package/dist/apis/processors-api.d.ts +2 -2
  21. package/dist/apis/turn-api.d.ts +2 -2
  22. package/dist/apis/users-api.d.ts +2 -2
  23. package/dist/auth/auth-store.d.ts +1 -1
  24. package/dist/auth/build-auth.d.ts +3 -3
  25. package/dist/auth/build-auth.js +8 -8
  26. package/dist/auth/cookie-auth.d.ts +1 -1
  27. package/dist/auth/cookie-auth.js +2 -2
  28. package/dist/auth/doover-auth.d.ts +2 -2
  29. package/dist/auth/doover-token-auth.d.ts +3 -3
  30. package/dist/auth/doover-token-auth.js +13 -13
  31. package/dist/auth/index.d.ts +10 -0
  32. package/dist/auth/index.js +15 -0
  33. package/dist/client/data-client.d.ts +17 -14
  34. package/dist/client/doover-client.d.ts +9 -7
  35. package/dist/client/doover-client.js +44 -42
  36. package/dist/client/errors.d.ts +2 -2
  37. package/dist/client/errors.js +4 -4
  38. package/dist/client/index.d.ts +6 -0
  39. package/dist/client/index.js +12 -0
  40. package/dist/client/local-agent-client.d.ts +3 -3
  41. package/dist/client/local-agent-client.js +19 -19
  42. package/dist/client/multiplex-client.d.ts +5 -5
  43. package/dist/client/multiplex-client.js +25 -25
  44. package/dist/client/multiplex-gateway.d.ts +3 -3
  45. package/dist/client/multiplex-merge.d.ts +1 -1
  46. package/dist/client/network-status.d.ts +17 -0
  47. package/dist/client/network-status.js +70 -0
  48. package/dist/client/offline-cache.d.ts +9 -4
  49. package/dist/client/offline-cache.js +34 -22
  50. package/dist/client/provenance.d.ts +1 -1
  51. package/dist/client/request-options.d.ts +1 -1
  52. package/dist/client/singleton.d.ts +2 -2
  53. package/dist/client/singleton.js +2 -2
  54. package/dist/client/status-tracker.d.ts +1 -1
  55. package/dist/esm/apis/_args.d.ts +16 -0
  56. package/dist/esm/apis/_args.js +27 -0
  57. package/dist/esm/apis/agents-api.d.ts +196 -0
  58. package/dist/esm/apis/agents-api.js +327 -0
  59. package/dist/esm/apis/aggregates-api.d.ts +67 -0
  60. package/dist/esm/apis/aggregates-api.js +64 -0
  61. package/dist/esm/apis/alarms-api.d.ts +48 -0
  62. package/dist/esm/apis/alarms-api.js +75 -0
  63. package/dist/esm/apis/channels-api.d.ts +83 -0
  64. package/dist/esm/apis/channels-api.js +65 -0
  65. package/dist/esm/apis/connections-api.d.ts +45 -0
  66. package/dist/esm/apis/connections-api.js +44 -0
  67. package/dist/esm/apis/messages-api.d.ts +128 -0
  68. package/dist/esm/apis/messages-api.js +179 -0
  69. package/dist/esm/apis/notifications-api.d.ts +94 -0
  70. package/dist/esm/apis/notifications-api.js +153 -0
  71. package/dist/esm/apis/organisations-api.d.ts +26 -0
  72. package/dist/esm/apis/organisations-api.js +41 -0
  73. package/dist/esm/apis/permissions-api.d.ts +17 -0
  74. package/dist/esm/apis/permissions-api.js +23 -0
  75. package/dist/esm/apis/processors-api.d.ts +56 -0
  76. package/dist/esm/apis/processors-api.js +97 -0
  77. package/dist/esm/apis/turn-api.d.ts +7 -0
  78. package/dist/esm/apis/turn-api.js +8 -0
  79. package/dist/esm/apis/users-api.d.ts +8 -0
  80. package/dist/esm/apis/users-api.js +9 -0
  81. package/dist/esm/auth/auth-profile.d.ts +45 -0
  82. package/dist/esm/auth/auth-profile.js +68 -0
  83. package/dist/esm/auth/auth-store.d.ts +14 -0
  84. package/dist/esm/auth/build-auth.d.ts +38 -0
  85. package/dist/esm/auth/build-auth.js +92 -0
  86. package/dist/esm/auth/cookie-auth.d.ts +91 -0
  87. package/dist/esm/auth/cookie-auth.js +196 -0
  88. package/dist/esm/auth/doover-auth.d.ts +52 -0
  89. package/dist/esm/auth/doover-auth.js +28 -0
  90. package/dist/esm/auth/doover-token-auth.d.ts +39 -0
  91. package/dist/esm/auth/doover-token-auth.js +217 -0
  92. package/dist/esm/auth/errors.d.ts +3 -0
  93. package/dist/esm/auth/errors.js +6 -0
  94. package/dist/esm/auth/index.d.ts +10 -0
  95. package/dist/esm/auth/index.js +6 -0
  96. package/dist/esm/auth/jwt.d.ts +6 -0
  97. package/dist/esm/auth/jwt.js +26 -0
  98. package/dist/esm/client/capabilities.d.ts +10 -0
  99. package/dist/esm/client/capabilities.js +42 -0
  100. package/dist/esm/client/data-client.d.ts +107 -0
  101. package/dist/esm/client/doover-client.d.ts +48 -0
  102. package/dist/esm/client/doover-client.js +96 -0
  103. package/dist/esm/client/errors.d.ts +32 -0
  104. package/dist/esm/client/errors.js +64 -0
  105. package/dist/esm/client/index.d.ts +6 -0
  106. package/dist/esm/client/index.js +3 -0
  107. package/dist/esm/client/local-agent-client.d.ts +65 -0
  108. package/dist/esm/client/local-agent-client.js +225 -0
  109. package/dist/esm/client/multiplex-client.d.ts +165 -0
  110. package/dist/esm/client/multiplex-client.js +842 -0
  111. package/dist/esm/client/multiplex-gateway.d.ts +49 -0
  112. package/dist/esm/client/multiplex-gateway.js +110 -0
  113. package/dist/esm/client/multiplex-merge.d.ts +12 -0
  114. package/dist/esm/client/multiplex-merge.js +38 -0
  115. package/dist/esm/client/network-status.d.ts +17 -0
  116. package/dist/esm/client/network-status.js +66 -0
  117. package/dist/esm/client/offline-cache.d.ts +167 -0
  118. package/dist/esm/client/offline-cache.js +769 -0
  119. package/dist/esm/client/provenance.d.ts +60 -0
  120. package/dist/esm/client/provenance.js +108 -0
  121. package/dist/esm/client/request-options.d.ts +23 -0
  122. package/dist/esm/client/request-options.js +23 -0
  123. package/dist/esm/client/singleton.d.ts +26 -0
  124. package/dist/esm/client/singleton.js +54 -0
  125. package/dist/esm/client/stats.d.ts +79 -0
  126. package/dist/esm/client/stats.js +155 -0
  127. package/dist/esm/client/status-tracker.d.ts +24 -0
  128. package/dist/esm/client/status-tracker.js +86 -0
  129. package/dist/esm/gateway/gateway-client.d.ts +86 -0
  130. package/dist/esm/gateway/gateway-client.js +463 -0
  131. package/dist/esm/gateway/index.d.ts +3 -0
  132. package/dist/esm/gateway/index.js +1 -0
  133. package/dist/esm/gateway/types.d.ts +142 -0
  134. package/dist/esm/http/errors.d.ts +19 -0
  135. package/dist/esm/http/errors.js +22 -0
  136. package/dist/esm/http/index.d.ts +3 -0
  137. package/dist/esm/http/index.js +2 -0
  138. package/dist/esm/http/rest-client.d.ts +64 -0
  139. package/dist/esm/http/rest-client.js +181 -0
  140. package/dist/esm/index.d.ts +64 -0
  141. package/dist/esm/index.js +38 -0
  142. package/dist/esm/node/config-manager.d.ts +34 -0
  143. package/dist/esm/node/config-manager.js +140 -0
  144. package/dist/esm/node/index.d.ts +1 -0
  145. package/dist/esm/node/index.js +1 -0
  146. package/dist/esm/package.json +1 -0
  147. package/dist/esm/react/context.d.ts +23 -0
  148. package/dist/esm/react/context.js +28 -0
  149. package/dist/esm/react/index.d.ts +38 -0
  150. package/dist/esm/react/index.js +21 -0
  151. package/dist/esm/react/messageRangeStore.d.ts +93 -0
  152. package/dist/esm/react/messageRangeStore.js +140 -0
  153. package/dist/esm/react/sharedQueryClient.d.ts +21 -0
  154. package/dist/esm/react/sharedQueryClient.js +35 -0
  155. package/dist/esm/react/useAgentChannel.d.ts +8 -0
  156. package/dist/esm/react/useAgentChannel.js +9 -0
  157. package/dist/esm/react/useAgentConnections.d.ts +8 -0
  158. package/dist/esm/react/useAgentConnections.js +20 -0
  159. package/dist/esm/react/useAgentTokenState.d.ts +70 -0
  160. package/dist/esm/react/useAgentTokenState.js +127 -0
  161. package/dist/esm/react/useChannelAggregate.d.ts +64 -0
  162. package/dist/esm/react/useChannelAggregate.js +77 -0
  163. package/dist/esm/react/useChannelMessage.d.ts +45 -0
  164. package/dist/esm/react/useChannelMessage.js +79 -0
  165. package/dist/esm/react/useChannelMessages.d.ts +83 -0
  166. package/dist/esm/react/useChannelMessages.js +214 -0
  167. package/dist/esm/react/useChannelSubscription.d.ts +27 -0
  168. package/dist/esm/react/useChannelSubscription.js +30 -0
  169. package/dist/esm/react/useClientStatus.d.ts +10 -0
  170. package/dist/esm/react/useClientStatus.js +19 -0
  171. package/dist/esm/react/useConnectionState.d.ts +26 -0
  172. package/dist/esm/react/useConnectionState.js +45 -0
  173. package/dist/esm/react/useDeviceMap.d.ts +109 -0
  174. package/dist/esm/react/useDeviceMap.js +59 -0
  175. package/dist/esm/react/useInvocationLogs.d.ts +23 -0
  176. package/dist/esm/react/useInvocationLogs.js +37 -0
  177. package/dist/esm/react/useMultiAgentAggregates.d.ts +38 -0
  178. package/dist/esm/react/useMultiAgentAggregates.js +104 -0
  179. package/dist/esm/react/useMultiAgentChannelMessages.d.ts +79 -0
  180. package/dist/esm/react/useMultiAgentChannelMessages.js +169 -0
  181. package/dist/esm/react/useOfflineStatus.d.ts +8 -0
  182. package/dist/esm/react/useOfflineStatus.js +37 -0
  183. package/dist/esm/react/useSendMessage.d.ts +16 -0
  184. package/dist/esm/react/useSendMessage.js +26 -0
  185. package/dist/esm/react/useSendRpc.d.ts +68 -0
  186. package/dist/esm/react/useSendRpc.js +164 -0
  187. package/dist/esm/react/useTurnCredentials.d.ts +12 -0
  188. package/dist/esm/react/useTurnCredentials.js +22 -0
  189. package/dist/esm/react/useUpdateAggregate.d.ts +27 -0
  190. package/dist/esm/react/useUpdateAggregate.js +39 -0
  191. package/dist/esm/react/useUpdateMessage.d.ts +38 -0
  192. package/dist/esm/react/useUpdateMessage.js +36 -0
  193. package/dist/esm/refine/index.d.ts +72 -0
  194. package/dist/esm/refine/index.js +215 -0
  195. package/dist/esm/rpc/errors.d.ts +10 -0
  196. package/dist/esm/rpc/errors.js +19 -0
  197. package/dist/esm/rpc/index.d.ts +3 -0
  198. package/dist/esm/rpc/index.js +2 -0
  199. package/dist/esm/rpc/rpc-dispatcher.d.ts +41 -0
  200. package/dist/esm/rpc/rpc-dispatcher.js +141 -0
  201. package/dist/esm/types/audit.d.ts +53 -0
  202. package/dist/esm/types/audit.js +11 -0
  203. package/dist/esm/types/batch.d.ts +85 -0
  204. package/dist/esm/types/batch.js +42 -0
  205. package/dist/esm/types/common.d.ts +250 -0
  206. package/dist/esm/types/connection.d.ts +72 -0
  207. package/dist/esm/types/connection.js +7 -0
  208. package/dist/esm/types/index.d.ts +9 -0
  209. package/dist/esm/types/openapi.d.ts +195 -0
  210. package/dist/esm/types/provenance.d.ts +45 -0
  211. package/dist/esm/types/viewer.d.ts +122 -0
  212. package/dist/esm/utils/snowflake.d.ts +21 -0
  213. package/dist/esm/utils/snowflake.js +33 -0
  214. package/dist/esm/viewer/doover-data-provider.d.ts +90 -0
  215. package/dist/esm/viewer/doover-data-provider.js +189 -0
  216. package/dist/esm/viewer/path-parsing.d.ts +5 -0
  217. package/dist/esm/viewer/path-parsing.js +35 -0
  218. package/dist/gateway/gateway-client.d.ts +5 -5
  219. package/dist/gateway/gateway-client.js +5 -5
  220. package/dist/gateway/index.d.ts +3 -0
  221. package/dist/gateway/index.js +5 -0
  222. package/dist/gateway/types.d.ts +1 -1
  223. package/dist/http/index.d.ts +3 -0
  224. package/dist/http/index.js +9 -0
  225. package/dist/http/rest-client.d.ts +5 -3
  226. package/dist/http/rest-client.js +2 -2
  227. package/dist/index.d.ts +64 -62
  228. package/dist/index.js +92 -89
  229. package/dist/node/config-manager.d.ts +2 -2
  230. package/dist/node/config-manager.js +5 -5
  231. package/dist/node/index.d.ts +1 -1
  232. package/dist/node/index.js +2 -2
  233. package/dist/react/context.d.ts +1 -1
  234. package/dist/react/index.d.ts +38 -38
  235. package/dist/react/index.js +59 -59
  236. package/dist/react/messageRangeStore.d.ts +1 -1
  237. package/dist/react/useAgentChannel.d.ts +3 -3
  238. package/dist/react/useAgentChannel.js +2 -2
  239. package/dist/react/useAgentConnections.d.ts +1 -1
  240. package/dist/react/useAgentConnections.js +2 -2
  241. package/dist/react/useAgentTokenState.d.ts +3 -3
  242. package/dist/react/useAgentTokenState.js +8 -8
  243. package/dist/react/useChannelAggregate.d.ts +3 -3
  244. package/dist/react/useChannelAggregate.js +8 -8
  245. package/dist/react/useChannelMessage.d.ts +2 -2
  246. package/dist/react/useChannelMessage.js +4 -4
  247. package/dist/react/useChannelMessages.d.ts +3 -3
  248. package/dist/react/useChannelMessages.js +10 -10
  249. package/dist/react/useChannelSubscription.d.ts +2 -2
  250. package/dist/react/useChannelSubscription.js +2 -2
  251. package/dist/react/useClientStatus.d.ts +1 -1
  252. package/dist/react/useClientStatus.js +2 -2
  253. package/dist/react/useConnectionState.js +2 -2
  254. package/dist/react/useDeviceMap.js +2 -2
  255. package/dist/react/useInvocationLogs.d.ts +1 -1
  256. package/dist/react/useInvocationLogs.js +2 -2
  257. package/dist/react/useMultiAgentAggregates.d.ts +1 -1
  258. package/dist/react/useMultiAgentAggregates.js +5 -5
  259. package/dist/react/useMultiAgentChannelMessages.d.ts +1 -1
  260. package/dist/react/useMultiAgentChannelMessages.js +2 -2
  261. package/dist/react/useOfflineStatus.d.ts +2 -2
  262. package/dist/react/useOfflineStatus.js +31 -17
  263. package/dist/react/useSendMessage.d.ts +2 -2
  264. package/dist/react/useSendMessage.js +2 -2
  265. package/dist/react/useSendRpc.d.ts +2 -2
  266. package/dist/react/useSendRpc.js +2 -2
  267. package/dist/react/useTurnCredentials.d.ts +2 -2
  268. package/dist/react/useTurnCredentials.js +2 -2
  269. package/dist/react/useUpdateAggregate.d.ts +3 -3
  270. package/dist/react/useUpdateAggregate.js +4 -4
  271. package/dist/react/useUpdateMessage.d.ts +2 -2
  272. package/dist/react/useUpdateMessage.js +2 -2
  273. package/dist/refine/index.d.ts +1 -1
  274. package/dist/rpc/errors.d.ts +1 -1
  275. package/dist/rpc/index.d.ts +3 -0
  276. package/dist/rpc/index.js +7 -0
  277. package/dist/rpc/rpc-dispatcher.d.ts +4 -4
  278. package/dist/rpc/rpc-dispatcher.js +2 -2
  279. package/dist/types/common.d.ts +1 -1
  280. package/dist/types/index.d.ts +9 -0
  281. package/dist/types/index.js +2 -0
  282. package/dist/types/openapi.d.ts +1 -1
  283. package/dist/types/viewer.d.ts +2 -2
  284. package/dist/viewer/doover-data-provider.d.ts +10 -10
  285. package/dist/viewer/doover-data-provider.js +25 -25
  286. package/dist/viewer/path-parsing.d.ts +1 -1
  287. package/package.json +795 -8
  288. package/dist/test/api-args.test.js +0 -48
  289. package/dist/test/api-overloads.test.d.ts +0 -9
  290. package/dist/test/api-overloads.test.js +0 -330
  291. package/dist/test/apis.test.js +0 -408
  292. package/dist/test/auth.test.js +0 -708
  293. package/dist/test/batch-apis.test.js +0 -183
  294. package/dist/test/capabilities.test.js +0 -27
  295. package/dist/test/config-manager.test.js +0 -160
  296. package/dist/test/data-client-errors.test.js +0 -24
  297. package/dist/test/data-client-shape.test.js +0 -28
  298. package/dist/test/doover-client-dataclient.test.d.ts +0 -1
  299. package/dist/test/doover-client-dataclient.test.js +0 -58
  300. package/dist/test/doover-client-provenance.test.d.ts +0 -1
  301. package/dist/test/doover-client-provenance.test.js +0 -32
  302. package/dist/test/doover-client.test.d.ts +0 -1
  303. package/dist/test/doover-client.test.js +0 -42
  304. package/dist/test/doover-data-provider.test.d.ts +0 -1
  305. package/dist/test/doover-data-provider.test.js +0 -657
  306. package/dist/test/exports.test.d.ts +0 -1
  307. package/dist/test/exports.test.js +0 -80
  308. package/dist/test/gateway-client.test.d.ts +0 -1
  309. package/dist/test/gateway-client.test.js +0 -474
  310. package/dist/test/gateway-provenance.test.d.ts +0 -1
  311. package/dist/test/gateway-provenance.test.js +0 -29
  312. package/dist/test/gateway-subscriptions.test.d.ts +0 -1
  313. package/dist/test/gateway-subscriptions.test.js +0 -95
  314. package/dist/test/helpers.d.ts +0 -32
  315. package/dist/test/helpers.js +0 -115
  316. package/dist/test/local-agent-client.test.d.ts +0 -1
  317. package/dist/test/local-agent-client.test.js +0 -202
  318. package/dist/test/message-range-store.test.d.ts +0 -1
  319. package/dist/test/message-range-store.test.js +0 -183
  320. package/dist/test/multiplex-capabilities.test.d.ts +0 -1
  321. package/dist/test/multiplex-capabilities.test.js +0 -37
  322. package/dist/test/multiplex-conflicts.test.d.ts +0 -1
  323. package/dist/test/multiplex-conflicts.test.js +0 -35
  324. package/dist/test/multiplex-gateway.test.d.ts +0 -1
  325. package/dist/test/multiplex-gateway.test.js +0 -103
  326. package/dist/test/multiplex-merge.test.d.ts +0 -1
  327. package/dist/test/multiplex-merge.test.js +0 -19
  328. package/dist/test/multiplex-noncore.test.d.ts +0 -1
  329. package/dist/test/multiplex-noncore.test.js +0 -82
  330. package/dist/test/multiplex-passthrough.test.d.ts +0 -1
  331. package/dist/test/multiplex-passthrough.test.js +0 -35
  332. package/dist/test/multiplex-reads.test.d.ts +0 -1
  333. package/dist/test/multiplex-reads.test.js +0 -87
  334. package/dist/test/multiplex-registry.test.d.ts +0 -1
  335. package/dist/test/multiplex-registry.test.js +0 -81
  336. package/dist/test/multiplex-routing.test.d.ts +0 -1
  337. package/dist/test/multiplex-routing.test.js +0 -45
  338. package/dist/test/multiplex-status.test.d.ts +0 -1
  339. package/dist/test/multiplex-status.test.js +0 -63
  340. package/dist/test/multiplex-writes.test.d.ts +0 -1
  341. package/dist/test/multiplex-writes.test.js +0 -93
  342. package/dist/test/offline-cache.test.d.ts +0 -1
  343. package/dist/test/offline-cache.test.js +0 -289
  344. package/dist/test/provenance-regression.test.d.ts +0 -1
  345. package/dist/test/provenance-regression.test.js +0 -45
  346. package/dist/test/provenance-stamper.test.d.ts +0 -1
  347. package/dist/test/provenance-stamper.test.js +0 -41
  348. package/dist/test/provenance-type.test.d.ts +0 -1
  349. package/dist/test/provenance-type.test.js +0 -15
  350. package/dist/test/react-channel-messages-forward.test.d.ts +0 -1
  351. package/dist/test/react-channel-messages-forward.test.js +0 -139
  352. package/dist/test/react-channel-messages-range.test.d.ts +0 -1
  353. package/dist/test/react-channel-messages-range.test.js +0 -109
  354. package/dist/test/react-client-status.test.d.ts +0 -1
  355. package/dist/test/react-client-status.test.js +0 -35
  356. package/dist/test/react-dataclient.test.d.ts +0 -1
  357. package/dist/test/react-dataclient.test.js +0 -28
  358. package/dist/test/react-exports.test.d.ts +0 -1
  359. package/dist/test/react-exports.test.js +0 -46
  360. package/dist/test/react-multiagent-messages.test.d.ts +0 -1
  361. package/dist/test/react-multiagent-messages.test.js +0 -113
  362. package/dist/test/react-sources-option.test.d.ts +0 -1
  363. package/dist/test/react-sources-option.test.js +0 -41
  364. package/dist/test/react.test.d.ts +0 -1
  365. package/dist/test/react.test.js +0 -482
  366. package/dist/test/refine.test.d.ts +0 -1
  367. package/dist/test/refine.test.js +0 -71
  368. package/dist/test/rest-client.test.d.ts +0 -1
  369. package/dist/test/rest-client.test.js +0 -197
  370. package/dist/test/rpc-dispatcher.test.d.ts +0 -1
  371. package/dist/test/rpc-dispatcher.test.js +0 -251
  372. package/dist/test/singleton.test.d.ts +0 -1
  373. package/dist/test/singleton.test.js +0 -62
  374. package/dist/test/stats-rpc.test.d.ts +0 -1
  375. package/dist/test/stats-rpc.test.js +0 -69
  376. package/dist/test/status-tracker.test.d.ts +0 -1
  377. package/dist/test/status-tracker.test.js +0 -85
  378. package/dist/test/users-api.test.d.ts +0 -1
  379. package/dist/test/users-api.test.js +0 -19
  380. package/dist/test/utils.test.d.ts +0 -1
  381. package/dist/test/utils.test.js +0 -64
  382. /package/dist/{test/api-args.test.d.ts → esm/auth/auth-store.js} +0 -0
  383. /package/dist/{test/apis.test.d.ts → esm/client/data-client.js} +0 -0
  384. /package/dist/{test/auth.test.d.ts → esm/gateway/types.js} +0 -0
  385. /package/dist/{test/batch-apis.test.d.ts → esm/types/common.js} +0 -0
  386. /package/dist/{test/capabilities.test.d.ts → esm/types/index.js} +0 -0
  387. /package/dist/{test/config-manager.test.d.ts → esm/types/openapi.js} +0 -0
  388. /package/dist/{test/data-client-errors.test.d.ts → esm/types/provenance.js} +0 -0
  389. /package/dist/{test/data-client-shape.test.d.ts → esm/types/viewer.js} +0 -0
@@ -0,0 +1,60 @@
1
+ import type { SourceProvenance } from "../types/provenance.js";
2
+ /** A stamped value: adds `__source` to plain objects and their array elements.
3
+ * For object values, also adds `__source` to any known nested-object props
4
+ * (aggregate, message) and stamps elements of array-valued props. */
5
+ type StampedElement<T> = T extends Record<string, unknown> ? T & {
6
+ __source?: SourceProvenance;
7
+ } : T;
8
+ type StampedProp<V> = V extends (infer E)[] ? StampedElement<E>[] : V extends Record<string, unknown> ? V & {
9
+ __source?: SourceProvenance;
10
+ } : V;
11
+ type Stamped<T> = T extends (infer E)[] ? StampedElement<E>[] : T extends Record<string, unknown> ? {
12
+ [K in keyof T]: StampedProp<T[K]>;
13
+ } & {
14
+ __source?: SourceProvenance;
15
+ } : T;
16
+ /** Map a subclient type so that async methods return Stamped results. */
17
+ export type WrappedSubclient<T> = {
18
+ [K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<Stamped<R>> : T[K];
19
+ };
20
+ export interface ClientIdentity {
21
+ id: string;
22
+ kind: string;
23
+ label?: string;
24
+ meta?: Record<string, unknown>;
25
+ }
26
+ interface RestContext {
27
+ /** e.g. "messages.listMessages" */
28
+ method: string;
29
+ /** caller inputs (agentId, channelName, params, body summary) */
30
+ request: Record<string, unknown>;
31
+ startedAt: number;
32
+ durationMs: number;
33
+ status?: number;
34
+ }
35
+ interface GatewayContext {
36
+ event: string;
37
+ sessionId?: string;
38
+ }
39
+ export declare class ProvenanceStamper {
40
+ private readonly identity;
41
+ constructor(identity: ClientIdentity);
42
+ stampRest<T>(value: T, ctx: RestContext): Stamped<T>;
43
+ stampGatewayEvent<T>(value: T, ctx: GatewayContext): Stamped<T>;
44
+ /** Build the full provenance envelope from a `via`. */
45
+ private prov;
46
+ /**
47
+ * Arrays → stamp each plain-object element. Plain objects → set `__source`,
48
+ * then shallow-stamp array-valued props' elements and known nested-object
49
+ * props (`aggregate`, `message`). Everything else (Blob, primitives,
50
+ * undefined, FormData, class instances) → returned unchanged.
51
+ */
52
+ private stampGraph;
53
+ }
54
+ /**
55
+ * Returns a Proxy over `api` whose methods, when they return a Promise, stamp
56
+ * the resolved value with `via.method = "<subclientName>.<methodName>"`.
57
+ * Synchronous returns (e.g. `createMultipartPayload`) pass through untouched.
58
+ */
59
+ export declare function wrapSubclient<T extends object>(api: T, subclientName: string, stamper: ProvenanceStamper): WrappedSubclient<T>;
60
+ export {};
@@ -0,0 +1,108 @@
1
+ /** Property names whose (object) value should also be stamped, for the known
2
+ * gateway envelopes ({ ..., aggregate }, { ..., message }). */
3
+ const NESTED_OBJECT_PROPS = ["aggregate", "message"];
4
+ function isPlainObject(v) {
5
+ if (typeof v !== "object" || v === null)
6
+ return false;
7
+ if (Array.isArray(v))
8
+ return false;
9
+ if (typeof Blob !== "undefined" && v instanceof Blob)
10
+ return false;
11
+ const proto = Object.getPrototypeOf(v);
12
+ return proto === Object.prototype || proto === null;
13
+ }
14
+ export class ProvenanceStamper {
15
+ constructor(identity) {
16
+ this.identity = identity;
17
+ }
18
+ stampRest(value, ctx) {
19
+ const via = {
20
+ transport: "rest",
21
+ method: ctx.method,
22
+ request: ctx.request,
23
+ startedAt: ctx.startedAt,
24
+ durationMs: ctx.durationMs,
25
+ ...(ctx.status !== undefined ? { status: ctx.status } : {}),
26
+ };
27
+ return this.stampGraph(value, via);
28
+ }
29
+ stampGatewayEvent(value, ctx) {
30
+ const via = {
31
+ transport: "gateway",
32
+ event: ctx.event,
33
+ ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
34
+ receivedAt: Date.now(),
35
+ };
36
+ return this.stampGraph(value, via);
37
+ }
38
+ /** Build the full provenance envelope from a `via`. */
39
+ prov(via) {
40
+ return { client: this.identity, retrievedAt: Date.now(), via };
41
+ }
42
+ /**
43
+ * Arrays → stamp each plain-object element. Plain objects → set `__source`,
44
+ * then shallow-stamp array-valued props' elements and known nested-object
45
+ * props (`aggregate`, `message`). Everything else (Blob, primitives,
46
+ * undefined, FormData, class instances) → returned unchanged.
47
+ */
48
+ stampGraph(value, via) {
49
+ const prov = this.prov(via);
50
+ if (Array.isArray(value)) {
51
+ return value.map((el) => (isPlainObject(el) ? { ...el, __source: prov } : el));
52
+ }
53
+ if (!isPlainObject(value))
54
+ return value;
55
+ const out = { ...value, __source: prov };
56
+ for (const [k, v] of Object.entries(out)) {
57
+ if (k === "__source")
58
+ continue;
59
+ if (Array.isArray(v)) {
60
+ out[k] = v.map((el) => (isPlainObject(el) ? { ...el, __source: prov } : el));
61
+ }
62
+ else if (NESTED_OBJECT_PROPS.includes(k) && isPlainObject(v)) {
63
+ out[k] = { ...v, __source: prov };
64
+ }
65
+ }
66
+ return out;
67
+ }
68
+ }
69
+ /**
70
+ * Returns a Proxy over `api` whose methods, when they return a Promise, stamp
71
+ * the resolved value with `via.method = "<subclientName>.<methodName>"`.
72
+ * Synchronous returns (e.g. `createMultipartPayload`) pass through untouched.
73
+ */
74
+ export function wrapSubclient(api, subclientName, stamper) {
75
+ return new Proxy(api, {
76
+ get(target, prop, receiver) {
77
+ const value = Reflect.get(target, prop, receiver);
78
+ if (typeof value !== "function" || typeof prop !== "string")
79
+ return value;
80
+ const methodName = `${subclientName}.${prop}`;
81
+ return function (...args) {
82
+ const startedAt = Date.now();
83
+ const out = value.apply(target, args);
84
+ if (out instanceof Promise) {
85
+ return out.then((result) => stamper.stampRest(result, {
86
+ method: methodName,
87
+ request: { args: summariseArgs(args) },
88
+ startedAt,
89
+ durationMs: Date.now() - startedAt,
90
+ }));
91
+ }
92
+ return out;
93
+ };
94
+ },
95
+ });
96
+ }
97
+ /** Keep `via.request` small: drop FormData/Blob bodies, cap string length. */
98
+ function summariseArgs(args) {
99
+ return args.map((a) => {
100
+ if (typeof FormData !== "undefined" && a instanceof FormData)
101
+ return "[FormData]";
102
+ if (typeof Blob !== "undefined" && a instanceof Blob)
103
+ return "[Blob]";
104
+ if (typeof a === "string" && a.length > 200)
105
+ return `${a.slice(0, 200)}…`;
106
+ return a;
107
+ });
108
+ }
@@ -0,0 +1,23 @@
1
+ import type { OfflineReadCacheOptions } from "./offline-cache.js";
2
+ export declare const REQUEST_OPTIONS_SYMBOL: unique symbol;
3
+ export interface DooverRequestOptions {
4
+ /**
5
+ * Restrict a call to these source ids on a `MultiplexClient`.
6
+ */
7
+ sources?: string[];
8
+ /**
9
+ * Offline cache behavior for this specific call. `false` opts out even when
10
+ * a stored channel policy would otherwise match.
11
+ */
12
+ cache?: OfflineReadCacheOptions | false;
13
+ [REQUEST_OPTIONS_SYMBOL]?: true;
14
+ }
15
+ export declare function requestOptions<T extends Omit<DooverRequestOptions, typeof REQUEST_OPTIONS_SYMBOL>>(options: T): T & {
16
+ [REQUEST_OPTIONS_SYMBOL]: true;
17
+ };
18
+ export declare function isDooverRequestOptions(value: unknown): value is DooverRequestOptions;
19
+ export declare function splitRequestOptions(args: unknown[]): {
20
+ args: unknown[];
21
+ request?: DooverRequestOptions;
22
+ };
23
+ export declare function delegateRequestOptions(request?: DooverRequestOptions): DooverRequestOptions | undefined;
@@ -0,0 +1,23 @@
1
+ export const REQUEST_OPTIONS_SYMBOL = Symbol.for("doover.requestOptions");
2
+ export function requestOptions(options) {
3
+ return { ...options, [REQUEST_OPTIONS_SYMBOL]: true };
4
+ }
5
+ export function isDooverRequestOptions(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value))
7
+ return false;
8
+ const candidate = value;
9
+ return (candidate[REQUEST_OPTIONS_SYMBOL] === true ||
10
+ Array.isArray(candidate.sources) ||
11
+ "cache" in candidate);
12
+ }
13
+ export function splitRequestOptions(args) {
14
+ const last = args[args.length - 1];
15
+ if (!isDooverRequestOptions(last))
16
+ return { args };
17
+ return { args: args.slice(0, -1), request: last };
18
+ }
19
+ export function delegateRequestOptions(request) {
20
+ if (!request?.sources)
21
+ return undefined;
22
+ return requestOptions({ sources: request.sources });
23
+ }
@@ -0,0 +1,26 @@
1
+ import type { DooverClientConfig } from "../http/rest-client.js";
2
+ import { DooverClient } from "./doover-client.js";
3
+ /**
4
+ * Get the process-wide `DooverClient` instance, creating it on first call.
5
+ *
6
+ * Uses `globalThis.__doover_js_client__` to survive module-level duplicates
7
+ * — if this module is loaded more than once (HMR, federation boundaries,
8
+ * multiple bundles) each load still returns the same instance and therefore
9
+ * the same WebSocket + REST configuration.
10
+ *
11
+ * The first caller's `config` wins. Subsequent calls ignore the `config`
12
+ * arg and return the existing instance — log a warning if they differ so
13
+ * drift is visible in dev tools.
14
+ */
15
+ export declare function getDooverClient(config: DooverClientConfig): DooverClient;
16
+ /**
17
+ * Returns the current singleton if one has been initialised, otherwise
18
+ * `null`. Useful for callers that want to read the client opportunistically
19
+ * without forcing construction.
20
+ */
21
+ export declare function peekDooverClient(): DooverClient | null;
22
+ /**
23
+ * Clear the singleton. Primarily for tests — not recommended in production
24
+ * code since any active subscriptions reference the old instance.
25
+ */
26
+ export declare function resetDooverClient(): void;
@@ -0,0 +1,54 @@
1
+ import { DooverClient } from "./doover-client.js";
2
+ const GLOBAL_KEY = "__doover_js_client__";
3
+ function globalBag() {
4
+ return globalThis;
5
+ }
6
+ /**
7
+ * Get the process-wide `DooverClient` instance, creating it on first call.
8
+ *
9
+ * Uses `globalThis.__doover_js_client__` to survive module-level duplicates
10
+ * — if this module is loaded more than once (HMR, federation boundaries,
11
+ * multiple bundles) each load still returns the same instance and therefore
12
+ * the same WebSocket + REST configuration.
13
+ *
14
+ * The first caller's `config` wins. Subsequent calls ignore the `config`
15
+ * arg and return the existing instance — log a warning if they differ so
16
+ * drift is visible in dev tools.
17
+ */
18
+ export function getDooverClient(config) {
19
+ const bag = globalBag();
20
+ const existing = bag[GLOBAL_KEY];
21
+ if (existing) {
22
+ if (configsDiffer(existing, config)) {
23
+ // eslint-disable-next-line no-console
24
+ console.warn("[doover-js] getDooverClient called with a config that differs " +
25
+ "from the already-initialised singleton. The existing client is " +
26
+ "being reused; the new config is ignored.");
27
+ }
28
+ return existing;
29
+ }
30
+ const client = new DooverClient(config);
31
+ bag[GLOBAL_KEY] = client;
32
+ return client;
33
+ }
34
+ /**
35
+ * Returns the current singleton if one has been initialised, otherwise
36
+ * `null`. Useful for callers that want to read the client opportunistically
37
+ * without forcing construction.
38
+ */
39
+ export function peekDooverClient() {
40
+ return globalBag()[GLOBAL_KEY] ?? null;
41
+ }
42
+ /**
43
+ * Clear the singleton. Primarily for tests — not recommended in production
44
+ * code since any active subscriptions reference the old instance.
45
+ */
46
+ export function resetDooverClient() {
47
+ delete globalBag()[GLOBAL_KEY];
48
+ }
49
+ function configsDiffer(existing, next) {
50
+ const a = existing.rest.config;
51
+ return (a.dataRestUrl !== next.dataRestUrl ||
52
+ a.dataWssUrl !== next.dataWssUrl ||
53
+ a.controlApiUrl !== next.controlApiUrl);
54
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Opt-in instrumentation for `DooverClient`. When enabled, counts REST
3
+ * requests and gateway messages and keeps running latency stats. Disabled
4
+ * by default — the record methods short-circuit so production apps pay
5
+ * nothing unless a debug UI turns it on.
6
+ */
7
+ export interface RestStatsSnapshot {
8
+ enabled: boolean;
9
+ /** Total requests started since stats were enabled (or last reset). */
10
+ totalRequests: number;
11
+ /** Requests currently in flight. */
12
+ pendingRequests: number;
13
+ /** Requests that resolved successfully. */
14
+ completedRequests: number;
15
+ /** Requests that threw / rejected. */
16
+ failedRequests: number;
17
+ /** Mean latency of settled requests, ms. Null until at least one lands. */
18
+ averageLatencyMs: number | null;
19
+ /** Latency of the most recently settled request, ms. */
20
+ lastLatencyMs: number | null;
21
+ }
22
+ export interface GatewayStatsSnapshot {
23
+ enabled: boolean;
24
+ /** Frames we've sent on the gateway socket. */
25
+ messagesSent: number;
26
+ /** Frames we've received on the gateway socket. */
27
+ messagesReceived: number;
28
+ }
29
+ export interface RpcStatsSnapshot {
30
+ enabled: boolean;
31
+ totalRpcs: number;
32
+ pendingRpcs: number;
33
+ completedRpcs: number;
34
+ failedRpcs: number;
35
+ timedOutRpcs: number;
36
+ abortedRpcs: number;
37
+ averageLatencyMs: number | null;
38
+ lastLatencyMs: number | null;
39
+ peakPendingRpcs: number;
40
+ }
41
+ export interface DooverStatsSnapshot {
42
+ rest: RestStatsSnapshot;
43
+ gateway: GatewayStatsSnapshot;
44
+ rpc: RpcStatsSnapshot;
45
+ }
46
+ export declare class DooverStatsCollector {
47
+ private enabled;
48
+ private rTotal;
49
+ private rPending;
50
+ private rCompleted;
51
+ private rFailed;
52
+ private rLatencySum;
53
+ private rLastLatency;
54
+ private gSent;
55
+ private gReceived;
56
+ private rpTotal;
57
+ private rpPending;
58
+ private rpCompleted;
59
+ private rpFailed;
60
+ private rpTimedOut;
61
+ private rpAborted;
62
+ private rpLatencySum;
63
+ private rpLastLatency;
64
+ private rpPeakPending;
65
+ setEnabled(enabled: boolean): void;
66
+ isEnabled(): boolean;
67
+ reset(): void;
68
+ /**
69
+ * Record the start of a REST request. Returns the start timestamp the
70
+ * caller must hand back to `recordRestEnd`, or `null` if stats are off.
71
+ */
72
+ recordRestStart(): number | null;
73
+ recordRestEnd(startedAt: number | null, succeeded: boolean): void;
74
+ recordGatewaySent(): void;
75
+ recordGatewayReceived(): void;
76
+ recordRpcStart(): number | null;
77
+ recordRpcEnd(startedAt: number | null, outcome: "success" | "error" | "timeout" | "abort"): void;
78
+ snapshot(): DooverStatsSnapshot;
79
+ }
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Opt-in instrumentation for `DooverClient`. When enabled, counts REST
3
+ * requests and gateway messages and keeps running latency stats. Disabled
4
+ * by default — the record methods short-circuit so production apps pay
5
+ * nothing unless a debug UI turns it on.
6
+ */
7
+ export class DooverStatsCollector {
8
+ constructor() {
9
+ this.enabled = false;
10
+ this.rTotal = 0;
11
+ this.rPending = 0;
12
+ this.rCompleted = 0;
13
+ this.rFailed = 0;
14
+ this.rLatencySum = 0;
15
+ this.rLastLatency = null;
16
+ this.gSent = 0;
17
+ this.gReceived = 0;
18
+ this.rpTotal = 0;
19
+ this.rpPending = 0;
20
+ this.rpCompleted = 0;
21
+ this.rpFailed = 0;
22
+ this.rpTimedOut = 0;
23
+ this.rpAborted = 0;
24
+ this.rpLatencySum = 0;
25
+ this.rpLastLatency = null;
26
+ this.rpPeakPending = 0;
27
+ }
28
+ setEnabled(enabled) {
29
+ this.enabled = enabled;
30
+ }
31
+ isEnabled() {
32
+ return this.enabled;
33
+ }
34
+ reset() {
35
+ this.rTotal = 0;
36
+ this.rPending = 0;
37
+ this.rCompleted = 0;
38
+ this.rFailed = 0;
39
+ this.rLatencySum = 0;
40
+ this.rLastLatency = null;
41
+ this.gSent = 0;
42
+ this.gReceived = 0;
43
+ this.rpTotal = 0;
44
+ this.rpPending = 0;
45
+ this.rpCompleted = 0;
46
+ this.rpFailed = 0;
47
+ this.rpTimedOut = 0;
48
+ this.rpAborted = 0;
49
+ this.rpLatencySum = 0;
50
+ this.rpLastLatency = null;
51
+ this.rpPeakPending = 0;
52
+ }
53
+ /**
54
+ * Record the start of a REST request. Returns the start timestamp the
55
+ * caller must hand back to `recordRestEnd`, or `null` if stats are off.
56
+ */
57
+ recordRestStart() {
58
+ if (!this.enabled)
59
+ return null;
60
+ this.rTotal += 1;
61
+ this.rPending += 1;
62
+ return now();
63
+ }
64
+ recordRestEnd(startedAt, succeeded) {
65
+ if (!this.enabled || startedAt === null)
66
+ return;
67
+ this.rPending = Math.max(0, this.rPending - 1);
68
+ if (succeeded)
69
+ this.rCompleted += 1;
70
+ else
71
+ this.rFailed += 1;
72
+ const latency = now() - startedAt;
73
+ this.rLastLatency = latency;
74
+ this.rLatencySum += latency;
75
+ }
76
+ recordGatewaySent() {
77
+ if (!this.enabled)
78
+ return;
79
+ this.gSent += 1;
80
+ }
81
+ recordGatewayReceived() {
82
+ if (!this.enabled)
83
+ return;
84
+ this.gReceived += 1;
85
+ }
86
+ recordRpcStart() {
87
+ if (!this.enabled)
88
+ return null;
89
+ this.rpTotal += 1;
90
+ this.rpPending += 1;
91
+ if (this.rpPending > this.rpPeakPending)
92
+ this.rpPeakPending = this.rpPending;
93
+ return now();
94
+ }
95
+ recordRpcEnd(startedAt, outcome) {
96
+ if (!this.enabled || startedAt === null)
97
+ return;
98
+ this.rpPending = Math.max(0, this.rpPending - 1);
99
+ switch (outcome) {
100
+ case "success":
101
+ this.rpCompleted += 1;
102
+ break;
103
+ case "error":
104
+ this.rpFailed += 1;
105
+ break;
106
+ case "timeout":
107
+ this.rpTimedOut += 1;
108
+ break;
109
+ case "abort":
110
+ this.rpAborted += 1;
111
+ break;
112
+ }
113
+ const latency = now() - startedAt;
114
+ this.rpLastLatency = latency;
115
+ this.rpLatencySum += latency;
116
+ }
117
+ snapshot() {
118
+ const settled = this.rCompleted + this.rFailed;
119
+ const rpcSettled = this.rpCompleted + this.rpFailed + this.rpTimedOut + this.rpAborted;
120
+ return {
121
+ rest: {
122
+ enabled: this.enabled,
123
+ totalRequests: this.rTotal,
124
+ pendingRequests: this.rPending,
125
+ completedRequests: this.rCompleted,
126
+ failedRequests: this.rFailed,
127
+ averageLatencyMs: settled > 0 ? this.rLatencySum / settled : null,
128
+ lastLatencyMs: this.rLastLatency,
129
+ },
130
+ gateway: {
131
+ enabled: this.enabled,
132
+ messagesSent: this.gSent,
133
+ messagesReceived: this.gReceived,
134
+ },
135
+ rpc: {
136
+ enabled: this.enabled,
137
+ totalRpcs: this.rpTotal,
138
+ pendingRpcs: this.rpPending,
139
+ completedRpcs: this.rpCompleted,
140
+ failedRpcs: this.rpFailed,
141
+ timedOutRpcs: this.rpTimedOut,
142
+ abortedRpcs: this.rpAborted,
143
+ averageLatencyMs: rpcSettled > 0 ? this.rpLatencySum / rpcSettled : null,
144
+ lastLatencyMs: this.rpLastLatency,
145
+ peakPendingRpcs: this.rpPeakPending,
146
+ },
147
+ };
148
+ }
149
+ }
150
+ function now() {
151
+ if (typeof performance !== "undefined" && typeof performance.now === "function") {
152
+ return performance.now();
153
+ }
154
+ return Date.now();
155
+ }
@@ -0,0 +1,24 @@
1
+ import type { AgentScope, DataClientStatus, GatewayClientLike } from "./data-client.js";
2
+ /**
3
+ * Tracks a `DataClient`'s realtime status by subscribing to its gateway's
4
+ * `open` / `ready` / `close` / `wssError` events. Emits a fresh
5
+ * `DataClientStatus` to listeners whenever the derived snapshot changes.
6
+ */
7
+ export declare class ClientStatusTracker {
8
+ private readonly clientId;
9
+ private readonly gateway;
10
+ private readonly knownScope;
11
+ private lastEvent;
12
+ private lastError;
13
+ private session;
14
+ private listeners;
15
+ private detach;
16
+ constructor(clientId: string, gateway: GatewayClientLike, knownScope: () => AgentScope | "unknown" | string);
17
+ /** Call when the agent scope resolves (so listeners re-render). */
18
+ notifyScopeChanged(): void;
19
+ getStatus(): DataClientStatus;
20
+ onChange(listener: (status: DataClientStatus) => void): () => void;
21
+ dispose(): void;
22
+ private transition;
23
+ private emit;
24
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Tracks a `DataClient`'s realtime status by subscribing to its gateway's
3
+ * `open` / `ready` / `close` / `wssError` events. Emits a fresh
4
+ * `DataClientStatus` to listeners whenever the derived snapshot changes.
5
+ */
6
+ export class ClientStatusTracker {
7
+ constructor(clientId, gateway, knownScope) {
8
+ this.clientId = clientId;
9
+ this.gateway = gateway;
10
+ this.knownScope = knownScope;
11
+ this.lastEvent = "init";
12
+ this.session = null;
13
+ this.listeners = new Set();
14
+ this.detach = [];
15
+ const onOpen = () => this.transition("open");
16
+ const onReady = (s) => {
17
+ if (s?.session_id)
18
+ this.session = { id: s.session_id };
19
+ this.transition("ready");
20
+ };
21
+ const onClose = () => this.transition("close");
22
+ const onErr = (e) => {
23
+ this.lastError = e?.message ?? "gateway error";
24
+ this.transition("error");
25
+ };
26
+ gateway.on("open", onOpen);
27
+ gateway.on("ready", onReady);
28
+ gateway.on("close", onClose);
29
+ gateway.on("wssError", onErr);
30
+ this.detach.push(() => gateway.off("open", onOpen), () => gateway.off("ready", onReady), () => gateway.off("close", onClose), () => gateway.off("wssError", onErr));
31
+ }
32
+ /** Call when the agent scope resolves (so listeners re-render). */
33
+ notifyScopeChanged() {
34
+ this.emit();
35
+ }
36
+ getStatus() {
37
+ const connected = this.gateway.isConnected();
38
+ let state;
39
+ if (this.lastEvent === "error")
40
+ state = "error";
41
+ else if (connected)
42
+ state = "connected";
43
+ else if (this.lastEvent === "init")
44
+ state = "disconnected";
45
+ else
46
+ state = "connecting"; // saw open/close but not currently connected → reconnecting
47
+ return {
48
+ clientId: this.clientId,
49
+ connected,
50
+ state,
51
+ session: this.session,
52
+ lastEvent: this.lastEvent,
53
+ latencyMs: null,
54
+ ...(this.lastError ? { lastError: this.lastError } : {}),
55
+ agentScope: this.knownScope(),
56
+ at: Date.now(),
57
+ };
58
+ }
59
+ onChange(listener) {
60
+ this.listeners.add(listener);
61
+ let active = true;
62
+ return () => {
63
+ if (!active)
64
+ return;
65
+ active = false;
66
+ this.listeners.delete(listener);
67
+ };
68
+ }
69
+ dispose() {
70
+ this.detach.forEach((fn) => fn());
71
+ this.detach = [];
72
+ this.listeners.clear();
73
+ }
74
+ transition(event) {
75
+ this.lastEvent = event;
76
+ if (event !== "error") {
77
+ // a successful lifecycle event clears a stale error so state can recover
78
+ this.lastError = undefined;
79
+ }
80
+ this.emit();
81
+ }
82
+ emit() {
83
+ const snapshot = this.getStatus();
84
+ this.listeners.forEach((l) => l(snapshot));
85
+ }
86
+ }