@cavi-ai/api-client 0.1.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 (665) hide show
  1. package/ARCHITECTURE.md +12 -0
  2. package/CHANGELOG.md +80 -0
  3. package/CONTRIBUTING.md +158 -0
  4. package/LICENSE +21 -0
  5. package/README.md +618 -0
  6. package/SECURITY.md +48 -0
  7. package/dist/contracts/index.d.ts +5 -0
  8. package/dist/contracts/index.d.ts.map +1 -0
  9. package/dist/contracts/index.js +4 -0
  10. package/dist/contracts/paths.d.ts +154 -0
  11. package/dist/contracts/paths.d.ts.map +1 -0
  12. package/dist/contracts/paths.js +89 -0
  13. package/dist/contracts/resolve.d.ts +7 -0
  14. package/dist/contracts/resolve.d.ts.map +1 -0
  15. package/dist/contracts/resolve.js +22 -0
  16. package/dist/contracts/surfaces.d.ts +13 -0
  17. package/dist/contracts/surfaces.d.ts.map +1 -0
  18. package/dist/contracts/surfaces.js +332 -0
  19. package/dist/contracts/team-manifest.d.ts +200 -0
  20. package/dist/contracts/team-manifest.d.ts.map +1 -0
  21. package/dist/contracts/team-manifest.js +951 -0
  22. package/dist/core/data/guards.d.ts +6 -0
  23. package/dist/core/data/guards.d.ts.map +1 -0
  24. package/dist/core/data/guards.js +22 -0
  25. package/dist/core/data/index.d.ts +2 -0
  26. package/dist/core/data/index.d.ts.map +1 -0
  27. package/dist/core/data/index.js +1 -0
  28. package/dist/core/env/config.d.ts +40 -0
  29. package/dist/core/env/config.d.ts.map +1 -0
  30. package/dist/core/env/config.js +44 -0
  31. package/dist/core/env/index.d.ts +3 -0
  32. package/dist/core/env/index.d.ts.map +1 -0
  33. package/dist/core/env/index.js +2 -0
  34. package/dist/core/env/repo-root.d.ts +11 -0
  35. package/dist/core/env/repo-root.d.ts.map +1 -0
  36. package/dist/core/env/repo-root.js +36 -0
  37. package/dist/core/gateway/agent/commands.d.ts +93 -0
  38. package/dist/core/gateway/agent/commands.d.ts.map +1 -0
  39. package/dist/core/gateway/agent/commands.js +351 -0
  40. package/dist/core/gateway/agent/config.d.ts +158 -0
  41. package/dist/core/gateway/agent/config.d.ts.map +1 -0
  42. package/dist/core/gateway/agent/config.js +536 -0
  43. package/dist/core/gateway/agent/index.d.ts +4 -0
  44. package/dist/core/gateway/agent/index.d.ts.map +1 -0
  45. package/dist/core/gateway/agent/index.js +3 -0
  46. package/dist/core/gateway/agent/voice-config.d.ts +20 -0
  47. package/dist/core/gateway/agent/voice-config.d.ts.map +1 -0
  48. package/dist/core/gateway/agent/voice-config.js +65 -0
  49. package/dist/core/gateway/client/capabilities.d.ts +28 -0
  50. package/dist/core/gateway/client/capabilities.d.ts.map +1 -0
  51. package/dist/core/gateway/client/capabilities.js +288 -0
  52. package/dist/core/gateway/client/client.d.ts +106 -0
  53. package/dist/core/gateway/client/client.d.ts.map +1 -0
  54. package/dist/core/gateway/client/client.js +41 -0
  55. package/dist/core/gateway/client/error-details.d.ts +17 -0
  56. package/dist/core/gateway/client/error-details.d.ts.map +1 -0
  57. package/dist/core/gateway/client/error-details.js +50 -0
  58. package/dist/core/gateway/client/fetch.d.ts +24 -0
  59. package/dist/core/gateway/client/fetch.d.ts.map +1 -0
  60. package/dist/core/gateway/client/fetch.js +98 -0
  61. package/dist/core/gateway/client/index.d.ts +6 -0
  62. package/dist/core/gateway/client/index.d.ts.map +1 -0
  63. package/dist/core/gateway/client/index.js +5 -0
  64. package/dist/core/gateway/client/runtime-targets.d.ts +11 -0
  65. package/dist/core/gateway/client/runtime-targets.d.ts.map +1 -0
  66. package/dist/core/gateway/client/runtime-targets.js +86 -0
  67. package/dist/core/gateway/envelope/envelope.d.ts +25 -0
  68. package/dist/core/gateway/envelope/envelope.d.ts.map +1 -0
  69. package/dist/core/gateway/envelope/envelope.js +141 -0
  70. package/dist/core/gateway/envelope/index.d.ts +3 -0
  71. package/dist/core/gateway/envelope/index.d.ts.map +1 -0
  72. package/dist/core/gateway/envelope/index.js +1 -0
  73. package/dist/core/gateway/envelope/types.d.ts +32 -0
  74. package/dist/core/gateway/envelope/types.d.ts.map +1 -0
  75. package/dist/core/gateway/envelope/types.js +1 -0
  76. package/dist/core/gateway/index.d.ts +11 -0
  77. package/dist/core/gateway/index.d.ts.map +1 -0
  78. package/dist/core/gateway/index.js +10 -0
  79. package/dist/core/gateway/jobs.d.ts +44 -0
  80. package/dist/core/gateway/jobs.d.ts.map +1 -0
  81. package/dist/core/gateway/jobs.js +104 -0
  82. package/dist/core/gateway/portal/config-patch.d.ts +42 -0
  83. package/dist/core/gateway/portal/config-patch.d.ts.map +1 -0
  84. package/dist/core/gateway/portal/config-patch.js +99 -0
  85. package/dist/core/gateway/portal/index.d.ts +2 -0
  86. package/dist/core/gateway/portal/index.d.ts.map +1 -0
  87. package/dist/core/gateway/portal/index.js +1 -0
  88. package/dist/core/gateway/providers/factory.d.ts +18 -0
  89. package/dist/core/gateway/providers/factory.d.ts.map +1 -0
  90. package/dist/core/gateway/providers/factory.js +40 -0
  91. package/dist/core/gateway/providers/index.d.ts +5 -0
  92. package/dist/core/gateway/providers/index.d.ts.map +1 -0
  93. package/dist/core/gateway/providers/index.js +4 -0
  94. package/dist/core/gateway/providers/normalize.d.ts +2 -0
  95. package/dist/core/gateway/providers/normalize.d.ts.map +1 -0
  96. package/dist/core/gateway/providers/normalize.js +6 -0
  97. package/dist/core/gateway/providers/registry.d.ts +5 -0
  98. package/dist/core/gateway/providers/registry.d.ts.map +1 -0
  99. package/dist/core/gateway/providers/registry.js +76 -0
  100. package/dist/core/gateway/providers/types.d.ts +42 -0
  101. package/dist/core/gateway/providers/types.d.ts.map +1 -0
  102. package/dist/core/gateway/providers/types.js +4 -0
  103. package/dist/core/gateway/resources/index.d.ts +3 -0
  104. package/dist/core/gateway/resources/index.d.ts.map +1 -0
  105. package/dist/core/gateway/resources/index.js +2 -0
  106. package/dist/core/gateway/resources/media.d.ts +165 -0
  107. package/dist/core/gateway/resources/media.d.ts.map +1 -0
  108. package/dist/core/gateway/resources/media.js +170 -0
  109. package/dist/core/gateway/resources/wiki.d.ts +136 -0
  110. package/dist/core/gateway/resources/wiki.d.ts.map +1 -0
  111. package/dist/core/gateway/resources/wiki.js +72 -0
  112. package/dist/core/gateway/rpc/client.d.ts +150 -0
  113. package/dist/core/gateway/rpc/client.d.ts.map +1 -0
  114. package/dist/core/gateway/rpc/client.js +675 -0
  115. package/dist/core/gateway/rpc/device-crypto.d.ts +19 -0
  116. package/dist/core/gateway/rpc/device-crypto.d.ts.map +1 -0
  117. package/dist/core/gateway/rpc/device-crypto.js +75 -0
  118. package/dist/core/gateway/rpc/device-store.d.ts +8 -0
  119. package/dist/core/gateway/rpc/device-store.d.ts.map +1 -0
  120. package/dist/core/gateway/rpc/device-store.js +113 -0
  121. package/dist/core/gateway/rpc/error.d.ts +5 -0
  122. package/dist/core/gateway/rpc/error.d.ts.map +1 -0
  123. package/dist/core/gateway/rpc/error.js +9 -0
  124. package/dist/core/gateway/rpc/index.d.ts +6 -0
  125. package/dist/core/gateway/rpc/index.d.ts.map +1 -0
  126. package/dist/core/gateway/rpc/index.js +5 -0
  127. package/dist/core/gateway/rpc/preauth-handshake.d.ts +39 -0
  128. package/dist/core/gateway/rpc/preauth-handshake.d.ts.map +1 -0
  129. package/dist/core/gateway/rpc/preauth-handshake.js +58 -0
  130. package/dist/core/gateway/run/contracts.d.ts +126 -0
  131. package/dist/core/gateway/run/contracts.d.ts.map +1 -0
  132. package/dist/core/gateway/run/contracts.js +23 -0
  133. package/dist/core/gateway/run/event-stream.d.ts +106 -0
  134. package/dist/core/gateway/run/event-stream.d.ts.map +1 -0
  135. package/dist/core/gateway/run/event-stream.js +264 -0
  136. package/dist/core/gateway/run/index.d.ts +5 -0
  137. package/dist/core/gateway/run/index.d.ts.map +1 -0
  138. package/dist/core/gateway/run/index.js +4 -0
  139. package/dist/core/gateway/run/sse-run-event-provider.d.ts +55 -0
  140. package/dist/core/gateway/run/sse-run-event-provider.d.ts.map +1 -0
  141. package/dist/core/gateway/run/sse-run-event-provider.js +394 -0
  142. package/dist/core/gateway/run/stream-failure.d.ts +11 -0
  143. package/dist/core/gateway/run/stream-failure.d.ts.map +1 -0
  144. package/dist/core/gateway/run/stream-failure.js +101 -0
  145. package/dist/core/gateway/snapshots/cache.d.ts +7 -0
  146. package/dist/core/gateway/snapshots/cache.d.ts.map +1 -0
  147. package/dist/core/gateway/snapshots/cache.js +13 -0
  148. package/dist/core/gateway/snapshots/contracts.d.ts +279 -0
  149. package/dist/core/gateway/snapshots/contracts.d.ts.map +1 -0
  150. package/dist/core/gateway/snapshots/contracts.js +1 -0
  151. package/dist/core/gateway/snapshots/index.d.ts +7 -0
  152. package/dist/core/gateway/snapshots/index.d.ts.map +1 -0
  153. package/dist/core/gateway/snapshots/index.js +6 -0
  154. package/dist/core/gateway/snapshots/loaders.d.ts +76 -0
  155. package/dist/core/gateway/snapshots/loaders.d.ts.map +1 -0
  156. package/dist/core/gateway/snapshots/loaders.js +515 -0
  157. package/dist/core/gateway/snapshots/session-loaders.d.ts +116 -0
  158. package/dist/core/gateway/snapshots/session-loaders.d.ts.map +1 -0
  159. package/dist/core/gateway/snapshots/session-loaders.js +310 -0
  160. package/dist/core/gateway/snapshots/system-loaders.d.ts +16 -0
  161. package/dist/core/gateway/snapshots/system-loaders.d.ts.map +1 -0
  162. package/dist/core/gateway/snapshots/system-loaders.js +61 -0
  163. package/dist/core/gateway/snapshots/transforms.d.ts +38 -0
  164. package/dist/core/gateway/snapshots/transforms.d.ts.map +1 -0
  165. package/dist/core/gateway/snapshots/transforms.js +328 -0
  166. package/dist/core/http/client-id.d.ts +6 -0
  167. package/dist/core/http/client-id.d.ts.map +1 -0
  168. package/dist/core/http/client-id.js +29 -0
  169. package/dist/core/http/client.d.ts +25 -0
  170. package/dist/core/http/client.d.ts.map +1 -0
  171. package/dist/core/http/client.js +234 -0
  172. package/dist/core/http/contracts.d.ts +3 -0
  173. package/dist/core/http/contracts.d.ts.map +1 -0
  174. package/dist/core/http/contracts.js +5 -0
  175. package/dist/core/http/errors.d.ts +17 -0
  176. package/dist/core/http/errors.d.ts.map +1 -0
  177. package/dist/core/http/errors.js +16 -0
  178. package/dist/core/http/gateway-error.d.ts +15 -0
  179. package/dist/core/http/gateway-error.d.ts.map +1 -0
  180. package/dist/core/http/gateway-error.js +15 -0
  181. package/dist/core/http/index.d.ts +10 -0
  182. package/dist/core/http/index.d.ts.map +1 -0
  183. package/dist/core/http/index.js +9 -0
  184. package/dist/core/http/json-client.d.ts +17 -0
  185. package/dist/core/http/json-client.d.ts.map +1 -0
  186. package/dist/core/http/json-client.js +62 -0
  187. package/dist/core/http/raw-client.d.ts +16 -0
  188. package/dist/core/http/raw-client.d.ts.map +1 -0
  189. package/dist/core/http/raw-client.js +36 -0
  190. package/dist/core/http/redaction.d.ts +20 -0
  191. package/dist/core/http/redaction.d.ts.map +1 -0
  192. package/dist/core/http/redaction.js +58 -0
  193. package/dist/core/http/types.d.ts +44 -0
  194. package/dist/core/http/types.d.ts.map +1 -0
  195. package/dist/core/http/types.js +3 -0
  196. package/dist/core/runtime/index.d.ts +2 -0
  197. package/dist/core/runtime/index.d.ts.map +1 -0
  198. package/dist/core/runtime/index.js +1 -0
  199. package/dist/core/runtime/paths.d.ts +5 -0
  200. package/dist/core/runtime/paths.d.ts.map +1 -0
  201. package/dist/core/runtime/paths.js +29 -0
  202. package/dist/core/sse/index.d.ts +2 -0
  203. package/dist/core/sse/index.d.ts.map +1 -0
  204. package/dist/core/sse/index.js +1 -0
  205. package/dist/core/sse/stream.d.ts +17 -0
  206. package/dist/core/sse/stream.d.ts.map +1 -0
  207. package/dist/core/sse/stream.js +106 -0
  208. package/dist/core/ws/close.d.ts +11 -0
  209. package/dist/core/ws/close.d.ts.map +1 -0
  210. package/dist/core/ws/close.js +34 -0
  211. package/dist/core/ws/gateway-websocket.d.ts +2 -0
  212. package/dist/core/ws/gateway-websocket.d.ts.map +1 -0
  213. package/dist/core/ws/gateway-websocket.js +1 -0
  214. package/dist/core/ws/index.d.ts +4 -0
  215. package/dist/core/ws/index.d.ts.map +1 -0
  216. package/dist/core/ws/index.js +3 -0
  217. package/dist/core/ws/targets.d.ts +21 -0
  218. package/dist/core/ws/targets.d.ts.map +1 -0
  219. package/dist/core/ws/targets.js +61 -0
  220. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.d.ts +21 -0
  221. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.d.ts.map +1 -0
  222. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.js +22 -0
  223. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.d.ts +30 -0
  224. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.d.ts.map +1 -0
  225. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.js +72 -0
  226. package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.d.ts +4 -0
  227. package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.d.ts.map +1 -0
  228. package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.js +66 -0
  229. package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.d.ts +7 -0
  230. package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.d.ts.map +1 -0
  231. package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.js +318 -0
  232. package/dist/extensions/cavi/adapters/create-cavi-control-adapters.d.ts +88 -0
  233. package/dist/extensions/cavi/adapters/create-cavi-control-adapters.d.ts.map +1 -0
  234. package/dist/extensions/cavi/adapters/create-cavi-control-adapters.js +172 -0
  235. package/dist/extensions/cavi/client.d.ts +72 -0
  236. package/dist/extensions/cavi/client.d.ts.map +1 -0
  237. package/dist/extensions/cavi/client.js +19 -0
  238. package/dist/extensions/cavi/contracts/index.d.ts +6 -0
  239. package/dist/extensions/cavi/contracts/index.d.ts.map +1 -0
  240. package/dist/extensions/cavi/contracts/index.js +5 -0
  241. package/dist/extensions/cavi/contracts/mobile.d.ts +441 -0
  242. package/dist/extensions/cavi/contracts/mobile.d.ts.map +1 -0
  243. package/dist/extensions/cavi/contracts/mobile.js +467 -0
  244. package/dist/extensions/cavi/contracts/paths.d.ts +121 -0
  245. package/dist/extensions/cavi/contracts/paths.d.ts.map +1 -0
  246. package/dist/extensions/cavi/contracts/paths.js +197 -0
  247. package/dist/extensions/cavi/contracts/portals.d.ts +78 -0
  248. package/dist/extensions/cavi/contracts/portals.d.ts.map +1 -0
  249. package/dist/extensions/cavi/contracts/portals.js +70 -0
  250. package/dist/extensions/cavi/contracts/resolve.d.ts +3 -0
  251. package/dist/extensions/cavi/contracts/resolve.d.ts.map +1 -0
  252. package/dist/extensions/cavi/contracts/resolve.js +4 -0
  253. package/dist/extensions/cavi/contracts/surfaces.d.ts +5 -0
  254. package/dist/extensions/cavi/contracts/surfaces.d.ts.map +1 -0
  255. package/dist/extensions/cavi/contracts/surfaces.js +551 -0
  256. package/dist/extensions/cavi/discourse/contracts.d.ts +5 -0
  257. package/dist/extensions/cavi/discourse/contracts.d.ts.map +1 -0
  258. package/dist/extensions/cavi/discourse/contracts.js +7 -0
  259. package/dist/extensions/cavi/discourse/fallback.d.ts +3 -0
  260. package/dist/extensions/cavi/discourse/fallback.d.ts.map +1 -0
  261. package/dist/extensions/cavi/discourse/fallback.js +364 -0
  262. package/dist/extensions/cavi/discourse/live.d.ts +5 -0
  263. package/dist/extensions/cavi/discourse/live.d.ts.map +1 -0
  264. package/dist/extensions/cavi/discourse/live.js +22 -0
  265. package/dist/extensions/cavi/discourse/normalize-helpers.d.ts +11 -0
  266. package/dist/extensions/cavi/discourse/normalize-helpers.d.ts.map +1 -0
  267. package/dist/extensions/cavi/discourse/normalize-helpers.js +155 -0
  268. package/dist/extensions/cavi/discourse/normalize.d.ts +4 -0
  269. package/dist/extensions/cavi/discourse/normalize.d.ts.map +1 -0
  270. package/dist/extensions/cavi/discourse/normalize.js +287 -0
  271. package/dist/extensions/cavi/domain/discourse.d.ts +161 -0
  272. package/dist/extensions/cavi/domain/discourse.d.ts.map +1 -0
  273. package/dist/extensions/cavi/domain/discourse.js +1 -0
  274. package/dist/extensions/cavi/domain/index.d.ts +6 -0
  275. package/dist/extensions/cavi/domain/index.d.ts.map +1 -0
  276. package/dist/extensions/cavi/domain/index.js +5 -0
  277. package/dist/extensions/cavi/domain/library.d.ts +80 -0
  278. package/dist/extensions/cavi/domain/library.d.ts.map +1 -0
  279. package/dist/extensions/cavi/domain/library.js +2 -0
  280. package/dist/extensions/cavi/domain/observability.d.ts +34 -0
  281. package/dist/extensions/cavi/domain/observability.d.ts.map +1 -0
  282. package/dist/extensions/cavi/domain/observability.js +1 -0
  283. package/dist/extensions/cavi/domain/operator.d.ts +420 -0
  284. package/dist/extensions/cavi/domain/operator.d.ts.map +1 -0
  285. package/dist/extensions/cavi/domain/operator.js +1 -0
  286. package/dist/extensions/cavi/domain/project-board.d.ts +96 -0
  287. package/dist/extensions/cavi/domain/project-board.d.ts.map +1 -0
  288. package/dist/extensions/cavi/domain/project-board.js +1 -0
  289. package/dist/extensions/cavi/fallbacks/provider.d.ts +13 -0
  290. package/dist/extensions/cavi/fallbacks/provider.d.ts.map +1 -0
  291. package/dist/extensions/cavi/fallbacks/provider.js +23 -0
  292. package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.d.ts +3 -0
  293. package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.d.ts.map +1 -0
  294. package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.js +6 -0
  295. package/dist/extensions/cavi/fallbacks/snapshots/cost-history.d.ts +3 -0
  296. package/dist/extensions/cavi/fallbacks/snapshots/cost-history.d.ts.map +1 -0
  297. package/dist/extensions/cavi/fallbacks/snapshots/cost-history.js +73 -0
  298. package/dist/extensions/cavi/fallbacks/snapshots/incidents.d.ts +3 -0
  299. package/dist/extensions/cavi/fallbacks/snapshots/incidents.d.ts.map +1 -0
  300. package/dist/extensions/cavi/fallbacks/snapshots/incidents.js +50 -0
  301. package/dist/extensions/cavi/fallbacks/snapshots/index.d.ts +10 -0
  302. package/dist/extensions/cavi/fallbacks/snapshots/index.d.ts.map +1 -0
  303. package/dist/extensions/cavi/fallbacks/snapshots/index.js +9 -0
  304. package/dist/extensions/cavi/fallbacks/snapshots/library.d.ts +3 -0
  305. package/dist/extensions/cavi/fallbacks/snapshots/library.d.ts.map +1 -0
  306. package/dist/extensions/cavi/fallbacks/snapshots/library.js +110 -0
  307. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.d.ts +8 -0
  308. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.d.ts.map +1 -0
  309. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.js +29 -0
  310. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.d.ts +4 -0
  311. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.d.ts.map +1 -0
  312. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.js +3 -0
  313. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.d.ts +3 -0
  314. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.d.ts.map +1 -0
  315. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.js +63 -0
  316. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.d.ts +3 -0
  317. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.d.ts.map +1 -0
  318. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.js +716 -0
  319. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.d.ts +3 -0
  320. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.d.ts.map +1 -0
  321. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.js +38 -0
  322. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.d.ts +3 -0
  323. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.d.ts.map +1 -0
  324. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.js +84 -0
  325. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.d.ts +3 -0
  326. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.d.ts.map +1 -0
  327. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.js +111 -0
  328. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.d.ts +3 -0
  329. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.d.ts.map +1 -0
  330. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.js +16 -0
  331. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.d.ts +3 -0
  332. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.d.ts.map +1 -0
  333. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.js +43 -0
  334. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.d.ts +3 -0
  335. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.d.ts.map +1 -0
  336. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.js +16 -0
  337. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.d.ts +4 -0
  338. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.d.ts.map +1 -0
  339. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.js +65 -0
  340. package/dist/extensions/cavi/fallbacks/snapshots/overview.d.ts +3 -0
  341. package/dist/extensions/cavi/fallbacks/snapshots/overview.d.ts.map +1 -0
  342. package/dist/extensions/cavi/fallbacks/snapshots/overview.js +40 -0
  343. package/dist/extensions/cavi/fallbacks/snapshots/routing.d.ts +3 -0
  344. package/dist/extensions/cavi/fallbacks/snapshots/routing.d.ts.map +1 -0
  345. package/dist/extensions/cavi/fallbacks/snapshots/routing.js +36 -0
  346. package/dist/extensions/cavi/fallbacks/snapshots/runs.d.ts +4 -0
  347. package/dist/extensions/cavi/fallbacks/snapshots/runs.d.ts.map +1 -0
  348. package/dist/extensions/cavi/fallbacks/snapshots/runs.js +133 -0
  349. package/dist/extensions/cavi/fallbacks/snapshots/shared.d.ts +2 -0
  350. package/dist/extensions/cavi/fallbacks/snapshots/shared.d.ts.map +1 -0
  351. package/dist/extensions/cavi/fallbacks/snapshots/shared.js +1 -0
  352. package/dist/extensions/cavi/index.d.ts +27 -0
  353. package/dist/extensions/cavi/index.d.ts.map +1 -0
  354. package/dist/extensions/cavi/index.js +26 -0
  355. package/dist/extensions/cavi/library/api.d.ts +18 -0
  356. package/dist/extensions/cavi/library/api.d.ts.map +1 -0
  357. package/dist/extensions/cavi/library/api.js +67 -0
  358. package/dist/extensions/cavi/library/client.d.ts +51 -0
  359. package/dist/extensions/cavi/library/client.d.ts.map +1 -0
  360. package/dist/extensions/cavi/library/client.js +23 -0
  361. package/dist/extensions/cavi/library/clip.d.ts +93 -0
  362. package/dist/extensions/cavi/library/clip.d.ts.map +1 -0
  363. package/dist/extensions/cavi/library/clip.js +272 -0
  364. package/dist/extensions/cavi/operator-control/constants.d.ts +4 -0
  365. package/dist/extensions/cavi/operator-control/constants.d.ts.map +1 -0
  366. package/dist/extensions/cavi/operator-control/constants.js +3 -0
  367. package/dist/extensions/cavi/operator-control/defaults.d.ts +11 -0
  368. package/dist/extensions/cavi/operator-control/defaults.d.ts.map +1 -0
  369. package/dist/extensions/cavi/operator-control/defaults.js +243 -0
  370. package/dist/extensions/cavi/operator-control/load-section.d.ts +24 -0
  371. package/dist/extensions/cavi/operator-control/load-section.d.ts.map +1 -0
  372. package/dist/extensions/cavi/operator-control/load-section.js +46 -0
  373. package/dist/extensions/cavi/portal/client.d.ts +16 -0
  374. package/dist/extensions/cavi/portal/client.d.ts.map +1 -0
  375. package/dist/extensions/cavi/portal/client.js +38 -0
  376. package/dist/extensions/cavi/portal/tts.d.ts +69 -0
  377. package/dist/extensions/cavi/portal/tts.d.ts.map +1 -0
  378. package/dist/extensions/cavi/portal/tts.js +116 -0
  379. package/dist/extensions/cavi/project-board/constants.d.ts +68 -0
  380. package/dist/extensions/cavi/project-board/constants.d.ts.map +1 -0
  381. package/dist/extensions/cavi/project-board/constants.js +9 -0
  382. package/dist/extensions/cavi/project-board/fallback.d.ts +3 -0
  383. package/dist/extensions/cavi/project-board/fallback.d.ts.map +1 -0
  384. package/dist/extensions/cavi/project-board/fallback.js +127 -0
  385. package/dist/extensions/cavi/project-board/live.d.ts +16 -0
  386. package/dist/extensions/cavi/project-board/live.d.ts.map +1 -0
  387. package/dist/extensions/cavi/project-board/live.js +86 -0
  388. package/dist/extensions/cavi/project-board/mutations.d.ts +43 -0
  389. package/dist/extensions/cavi/project-board/mutations.d.ts.map +1 -0
  390. package/dist/extensions/cavi/project-board/mutations.js +210 -0
  391. package/dist/extensions/cavi/project-board/normalize.d.ts +23 -0
  392. package/dist/extensions/cavi/project-board/normalize.d.ts.map +1 -0
  393. package/dist/extensions/cavi/project-board/normalize.js +410 -0
  394. package/dist/extensions/cavi/project-board/trace-id.d.ts +2 -0
  395. package/dist/extensions/cavi/project-board/trace-id.d.ts.map +1 -0
  396. package/dist/extensions/cavi/project-board/trace-id.js +7 -0
  397. package/dist/extensions/cavi/registry/canonical-team-registry.d.ts +41 -0
  398. package/dist/extensions/cavi/registry/canonical-team-registry.d.ts.map +1 -0
  399. package/dist/extensions/cavi/registry/canonical-team-registry.js +102 -0
  400. package/dist/extensions/cavi/registry/portal-library-registry.d.ts +6 -0
  401. package/dist/extensions/cavi/registry/portal-library-registry.d.ts.map +1 -0
  402. package/dist/extensions/cavi/registry/portal-library-registry.js +17 -0
  403. package/dist/extensions/cavi/registry/session-keys.d.ts +16 -0
  404. package/dist/extensions/cavi/registry/session-keys.d.ts.map +1 -0
  405. package/dist/extensions/cavi/registry/session-keys.js +68 -0
  406. package/dist/extensions/cavi/registry/team-registry-config.d.ts +6 -0
  407. package/dist/extensions/cavi/registry/team-registry-config.d.ts.map +1 -0
  408. package/dist/extensions/cavi/registry/team-registry-config.js +23 -0
  409. package/dist/extensions/cavi/registry/team-registry.d.ts +49 -0
  410. package/dist/extensions/cavi/registry/team-registry.d.ts.map +1 -0
  411. package/dist/extensions/cavi/registry/team-registry.js +290 -0
  412. package/dist/extensions/cavi/runtime/env-config.d.ts +35 -0
  413. package/dist/extensions/cavi/runtime/env-config.d.ts.map +1 -0
  414. package/dist/extensions/cavi/runtime/env-config.js +74 -0
  415. package/dist/extensions/cavi/runtime/paths.d.ts +11 -0
  416. package/dist/extensions/cavi/runtime/paths.d.ts.map +1 -0
  417. package/dist/extensions/cavi/runtime/paths.js +43 -0
  418. package/dist/extensions/cavi/runtime/standalone-mode.d.ts +3 -0
  419. package/dist/extensions/cavi/runtime/standalone-mode.d.ts.map +1 -0
  420. package/dist/extensions/cavi/runtime/standalone-mode.js +15 -0
  421. package/dist/index.d.ts +70 -0
  422. package/dist/index.d.ts.map +1 -0
  423. package/dist/index.js +75 -0
  424. package/dist/providers/hermes/agent-config.d.ts +36 -0
  425. package/dist/providers/hermes/agent-config.d.ts.map +1 -0
  426. package/dist/providers/hermes/agent-config.js +242 -0
  427. package/dist/providers/hermes/chat-run.d.ts +106 -0
  428. package/dist/providers/hermes/chat-run.d.ts.map +1 -0
  429. package/dist/providers/hermes/chat-run.js +221 -0
  430. package/dist/providers/hermes/client.d.ts +13 -0
  431. package/dist/providers/hermes/client.d.ts.map +1 -0
  432. package/dist/providers/hermes/client.js +6 -0
  433. package/dist/providers/hermes/env-config.d.ts +18 -0
  434. package/dist/providers/hermes/env-config.d.ts.map +1 -0
  435. package/dist/providers/hermes/env-config.js +38 -0
  436. package/dist/providers/hermes/index.d.ts +12 -0
  437. package/dist/providers/hermes/index.d.ts.map +1 -0
  438. package/dist/providers/hermes/index.js +11 -0
  439. package/dist/providers/hermes/media.d.ts +6 -0
  440. package/dist/providers/hermes/media.d.ts.map +1 -0
  441. package/dist/providers/hermes/media.js +10 -0
  442. package/dist/providers/hermes/provider-module.d.ts +3 -0
  443. package/dist/providers/hermes/provider-module.d.ts.map +1 -0
  444. package/dist/providers/hermes/provider-module.js +22 -0
  445. package/dist/providers/hermes/sse-run-event-provider.d.ts +24 -0
  446. package/dist/providers/hermes/sse-run-event-provider.d.ts.map +1 -0
  447. package/dist/providers/hermes/sse-run-event-provider.js +32 -0
  448. package/dist/providers/hermes/team-registry-config.d.ts +3 -0
  449. package/dist/providers/hermes/team-registry-config.d.ts.map +1 -0
  450. package/dist/providers/hermes/team-registry-config.js +1 -0
  451. package/dist/providers/hermes/team-registry.d.ts +3 -0
  452. package/dist/providers/hermes/team-registry.d.ts.map +1 -0
  453. package/dist/providers/hermes/team-registry.js +5 -0
  454. package/dist/providers/hermes/websocket.d.ts +6 -0
  455. package/dist/providers/hermes/websocket.d.ts.map +1 -0
  456. package/dist/providers/hermes/websocket.js +6 -0
  457. package/dist/providers/hermes/wiki.d.ts +6 -0
  458. package/dist/providers/hermes/wiki.d.ts.map +1 -0
  459. package/dist/providers/hermes/wiki.js +10 -0
  460. package/dist/providers/openclaw/agent-config.d.ts +6 -0
  461. package/dist/providers/openclaw/agent-config.d.ts.map +1 -0
  462. package/dist/providers/openclaw/agent-config.js +10 -0
  463. package/dist/providers/openclaw/client.d.ts +13 -0
  464. package/dist/providers/openclaw/client.d.ts.map +1 -0
  465. package/dist/providers/openclaw/client.js +6 -0
  466. package/dist/providers/openclaw/index.d.ts +10 -0
  467. package/dist/providers/openclaw/index.d.ts.map +1 -0
  468. package/dist/providers/openclaw/index.js +9 -0
  469. package/dist/providers/openclaw/media.d.ts +6 -0
  470. package/dist/providers/openclaw/media.d.ts.map +1 -0
  471. package/dist/providers/openclaw/media.js +10 -0
  472. package/dist/providers/openclaw/provider-module.d.ts +3 -0
  473. package/dist/providers/openclaw/provider-module.d.ts.map +1 -0
  474. package/dist/providers/openclaw/provider-module.js +16 -0
  475. package/dist/providers/openclaw/sse-run-event-provider.d.ts +6 -0
  476. package/dist/providers/openclaw/sse-run-event-provider.d.ts.map +1 -0
  477. package/dist/providers/openclaw/sse-run-event-provider.js +10 -0
  478. package/dist/providers/openclaw/team-registry-config.d.ts +3 -0
  479. package/dist/providers/openclaw/team-registry-config.d.ts.map +1 -0
  480. package/dist/providers/openclaw/team-registry-config.js +1 -0
  481. package/dist/providers/openclaw/team-registry.d.ts +3 -0
  482. package/dist/providers/openclaw/team-registry.d.ts.map +1 -0
  483. package/dist/providers/openclaw/team-registry.js +5 -0
  484. package/dist/providers/openclaw/websocket.d.ts +6 -0
  485. package/dist/providers/openclaw/websocket.d.ts.map +1 -0
  486. package/dist/providers/openclaw/websocket.js +28 -0
  487. package/dist/providers/openclaw/wiki.d.ts +6 -0
  488. package/dist/providers/openclaw/wiki.d.ts.map +1 -0
  489. package/dist/providers/openclaw/wiki.js +10 -0
  490. package/dist/react/gateway-provider.d.ts +142 -0
  491. package/dist/react/gateway-provider.d.ts.map +1 -0
  492. package/dist/react/gateway-provider.js +569 -0
  493. package/dist/react/index.d.ts +2 -0
  494. package/dist/react/index.d.ts.map +1 -0
  495. package/dist/react/index.js +1 -0
  496. package/docs/assets/api-client-hero.svg +73 -0
  497. package/docs/cavi-team-manifest.example.ts +219 -0
  498. package/docs/team-manifest.consumer.template.ts +248 -0
  499. package/docs/team-manifest.md +252 -0
  500. package/package.json +152 -0
  501. package/src/contracts/index.ts +4 -0
  502. package/src/contracts/paths.ts +126 -0
  503. package/src/contracts/resolve.ts +42 -0
  504. package/src/contracts/surfaces.ts +366 -0
  505. package/src/contracts/team-manifest.ts +1402 -0
  506. package/src/core/data/guards.ts +26 -0
  507. package/src/core/data/index.ts +1 -0
  508. package/src/core/env/config.ts +97 -0
  509. package/src/core/env/index.ts +2 -0
  510. package/src/core/env/repo-root.ts +59 -0
  511. package/src/core/gateway/README.md +35 -0
  512. package/src/core/gateway/agent/commands.ts +482 -0
  513. package/src/core/gateway/agent/config.ts +786 -0
  514. package/src/core/gateway/agent/index.ts +3 -0
  515. package/src/core/gateway/agent/voice-config.ts +91 -0
  516. package/src/core/gateway/client/capabilities.ts +385 -0
  517. package/src/core/gateway/client/client.ts +137 -0
  518. package/src/core/gateway/client/error-details.ts +74 -0
  519. package/src/core/gateway/client/fetch.ts +180 -0
  520. package/src/core/gateway/client/index.ts +5 -0
  521. package/src/core/gateway/client/runtime-targets.ts +132 -0
  522. package/src/core/gateway/envelope/envelope.ts +204 -0
  523. package/src/core/gateway/envelope/index.ts +2 -0
  524. package/src/core/gateway/envelope/types.ts +48 -0
  525. package/src/core/gateway/index.ts +10 -0
  526. package/src/core/gateway/jobs.ts +178 -0
  527. package/src/core/gateway/portal/config-patch.ts +136 -0
  528. package/src/core/gateway/portal/index.ts +1 -0
  529. package/src/core/gateway/providers/factory.ts +77 -0
  530. package/src/core/gateway/providers/index.ts +4 -0
  531. package/src/core/gateway/providers/normalize.ts +7 -0
  532. package/src/core/gateway/providers/registry.ts +96 -0
  533. package/src/core/gateway/providers/types.ts +73 -0
  534. package/src/core/gateway/resources/index.ts +2 -0
  535. package/src/core/gateway/resources/media.ts +474 -0
  536. package/src/core/gateway/resources/wiki.ts +301 -0
  537. package/src/core/gateway/rpc/client.ts +1067 -0
  538. package/src/core/gateway/rpc/device-crypto.ts +101 -0
  539. package/src/core/gateway/rpc/device-store.ts +147 -0
  540. package/src/core/gateway/rpc/error.ts +11 -0
  541. package/src/core/gateway/rpc/index.ts +5 -0
  542. package/src/core/gateway/rpc/preauth-handshake.ts +99 -0
  543. package/src/core/gateway/run/contracts.ts +155 -0
  544. package/src/core/gateway/run/event-stream.ts +373 -0
  545. package/src/core/gateway/run/index.ts +4 -0
  546. package/src/core/gateway/run/sse-run-event-provider.ts +513 -0
  547. package/src/core/gateway/run/stream-failure.ts +135 -0
  548. package/src/core/gateway/snapshots/cache.ts +22 -0
  549. package/src/core/gateway/snapshots/contracts.ts +293 -0
  550. package/src/core/gateway/snapshots/index.ts +6 -0
  551. package/src/core/gateway/snapshots/loaders.ts +738 -0
  552. package/src/core/gateway/snapshots/session-loaders.ts +534 -0
  553. package/src/core/gateway/snapshots/system-loaders.ts +93 -0
  554. package/src/core/gateway/snapshots/transforms.ts +508 -0
  555. package/src/core/http/client-id.ts +40 -0
  556. package/src/core/http/client.ts +271 -0
  557. package/src/core/http/contracts.ts +9 -0
  558. package/src/core/http/errors.ts +26 -0
  559. package/src/core/http/gateway-error.ts +38 -0
  560. package/src/core/http/index.ts +9 -0
  561. package/src/core/http/json-client.ts +90 -0
  562. package/src/core/http/raw-client.ts +57 -0
  563. package/src/core/http/redaction.ts +78 -0
  564. package/src/core/http/types.ts +59 -0
  565. package/src/core/runtime/index.ts +1 -0
  566. package/src/core/runtime/paths.ts +44 -0
  567. package/src/core/sse/index.ts +1 -0
  568. package/src/core/sse/stream.ts +118 -0
  569. package/src/core/ws/close.ts +51 -0
  570. package/src/core/ws/gateway-websocket.ts +8 -0
  571. package/src/core/ws/index.ts +3 -0
  572. package/src/core/ws/targets.ts +74 -0
  573. package/src/extensions/README.md +16 -0
  574. package/src/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.ts +33 -0
  575. package/src/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.ts +152 -0
  576. package/src/extensions/cavi/adapters/cavi-control-adapters/library-live.ts +120 -0
  577. package/src/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.ts +422 -0
  578. package/src/extensions/cavi/adapters/create-cavi-control-adapters.ts +350 -0
  579. package/src/extensions/cavi/client.ts +25 -0
  580. package/src/extensions/cavi/contracts/index.ts +5 -0
  581. package/src/extensions/cavi/contracts/mobile.ts +528 -0
  582. package/src/extensions/cavi/contracts/paths.ts +242 -0
  583. package/src/extensions/cavi/contracts/portals.ts +165 -0
  584. package/src/extensions/cavi/contracts/resolve.ts +6 -0
  585. package/src/extensions/cavi/contracts/surfaces.ts +567 -0
  586. package/src/extensions/cavi/discourse/contracts.ts +9 -0
  587. package/src/extensions/cavi/discourse/fallback.ts +387 -0
  588. package/src/extensions/cavi/discourse/live.ts +36 -0
  589. package/src/extensions/cavi/discourse/normalize-helpers.ts +202 -0
  590. package/src/extensions/cavi/discourse/normalize.ts +415 -0
  591. package/src/extensions/cavi/domain/discourse.ts +209 -0
  592. package/src/extensions/cavi/domain/index.ts +5 -0
  593. package/src/extensions/cavi/domain/library.ts +96 -0
  594. package/src/extensions/cavi/domain/observability.ts +36 -0
  595. package/src/extensions/cavi/domain/operator.ts +486 -0
  596. package/src/extensions/cavi/domain/project-board.ts +107 -0
  597. package/src/extensions/cavi/fallbacks/provider.ts +57 -0
  598. package/src/extensions/cavi/fallbacks/snapshots/agent-memory.ts +8 -0
  599. package/src/extensions/cavi/fallbacks/snapshots/cost-history.ts +101 -0
  600. package/src/extensions/cavi/fallbacks/snapshots/incidents.ts +56 -0
  601. package/src/extensions/cavi/fallbacks/snapshots/index.ts +9 -0
  602. package/src/extensions/cavi/fallbacks/snapshots/library.ts +112 -0
  603. package/src/extensions/cavi/fallbacks/snapshots/operator-control/defaults.ts +57 -0
  604. package/src/extensions/cavi/fallbacks/snapshots/operator-control/index.ts +3 -0
  605. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.ts +65 -0
  606. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.ts +735 -0
  607. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.ts +41 -0
  608. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.ts +87 -0
  609. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.ts +113 -0
  610. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.ts +19 -0
  611. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.ts +46 -0
  612. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.ts +18 -0
  613. package/src/extensions/cavi/fallbacks/snapshots/operator-control/transports.ts +81 -0
  614. package/src/extensions/cavi/fallbacks/snapshots/overview.ts +42 -0
  615. package/src/extensions/cavi/fallbacks/snapshots/routing.ts +38 -0
  616. package/src/extensions/cavi/fallbacks/snapshots/runs.ts +141 -0
  617. package/src/extensions/cavi/fallbacks/snapshots/shared.ts +1 -0
  618. package/src/extensions/cavi/index.ts +52 -0
  619. package/src/extensions/cavi/library/api.ts +120 -0
  620. package/src/extensions/cavi/library/client.ts +54 -0
  621. package/src/extensions/cavi/library/clip.ts +389 -0
  622. package/src/extensions/cavi/operator-control/constants.ts +3 -0
  623. package/src/extensions/cavi/operator-control/defaults.ts +254 -0
  624. package/src/extensions/cavi/operator-control/load-section.ts +92 -0
  625. package/src/extensions/cavi/portal/client.ts +63 -0
  626. package/src/extensions/cavi/portal/tts.ts +213 -0
  627. package/src/extensions/cavi/project-board/constants.ts +84 -0
  628. package/src/extensions/cavi/project-board/fallback.ts +129 -0
  629. package/src/extensions/cavi/project-board/live.ts +121 -0
  630. package/src/extensions/cavi/project-board/mutations.ts +306 -0
  631. package/src/extensions/cavi/project-board/normalize.ts +552 -0
  632. package/src/extensions/cavi/project-board/trace-id.ts +9 -0
  633. package/src/extensions/cavi/registry/canonical-team-registry.ts +193 -0
  634. package/src/extensions/cavi/registry/portal-library-registry.ts +24 -0
  635. package/src/extensions/cavi/registry/session-keys.ts +92 -0
  636. package/src/extensions/cavi/registry/team-registry-config.ts +36 -0
  637. package/src/extensions/cavi/registry/team-registry.ts +414 -0
  638. package/src/extensions/cavi/runtime/env-config.ts +114 -0
  639. package/src/extensions/cavi/runtime/paths.ts +82 -0
  640. package/src/extensions/cavi/runtime/standalone-mode.ts +28 -0
  641. package/src/index.ts +576 -0
  642. package/src/providers/hermes/agent-config.ts +322 -0
  643. package/src/providers/hermes/chat-run.ts +340 -0
  644. package/src/providers/hermes/client.ts +21 -0
  645. package/src/providers/hermes/env-config.ts +58 -0
  646. package/src/providers/hermes/index.ts +11 -0
  647. package/src/providers/hermes/media.ts +12 -0
  648. package/src/providers/hermes/provider-module.ts +26 -0
  649. package/src/providers/hermes/sse-run-event-provider.ts +47 -0
  650. package/src/providers/hermes/team-registry-config.ts +2 -0
  651. package/src/providers/hermes/team-registry.ts +12 -0
  652. package/src/providers/hermes/websocket.ts +16 -0
  653. package/src/providers/hermes/wiki.ts +12 -0
  654. package/src/providers/openclaw/agent-config.ts +12 -0
  655. package/src/providers/openclaw/client.ts +21 -0
  656. package/src/providers/openclaw/index.ts +9 -0
  657. package/src/providers/openclaw/media.ts +12 -0
  658. package/src/providers/openclaw/provider-module.ts +20 -0
  659. package/src/providers/openclaw/sse-run-event-provider.ts +16 -0
  660. package/src/providers/openclaw/team-registry-config.ts +2 -0
  661. package/src/providers/openclaw/team-registry.ts +12 -0
  662. package/src/providers/openclaw/websocket.ts +56 -0
  663. package/src/providers/openclaw/wiki.ts +12 -0
  664. package/src/react/gateway-provider.tsx +835 -0
  665. package/src/react/index.ts +1 -0
@@ -0,0 +1,1067 @@
1
+ // CANONICAL — single source of truth lives here. Do not duplicate. See packages/README.md.
2
+
3
+ import { buildDeviceAuthPayloadV3, signPayload } from "./device-crypto.js";
4
+ import {
5
+ loadOrCreateDeviceIdentity,
6
+ isDeviceIdentitySupported,
7
+ type DeviceIdentity,
8
+ } from "./device-store.js";
9
+ import { GatewayRpcError } from "./error.js";
10
+ import {
11
+ GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS,
12
+ resolveDeviceTokenOnlyFallbackMs,
13
+ type GatewayPreauthHandshakeEnv,
14
+ type GatewayPreauthHandshakeEnvKeys,
15
+ } from "./preauth-handshake.js";
16
+ import {
17
+ describeWebSocketClose,
18
+ type WebSocketCloseLike,
19
+ } from "../../ws/close.js";
20
+
21
+ declare const process:
22
+ | {
23
+ env: Record<string, string | undefined>;
24
+ }
25
+ | undefined;
26
+
27
+ export { GatewayRpcError } from "./error.js";
28
+ export {
29
+ DEFAULT_PREAUTH_HANDSHAKE_TIMEOUT_MS,
30
+ GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS,
31
+ resolvePreauthHandshakeTimeoutMs,
32
+ resolveDeviceTokenOnlyFallbackMs,
33
+ resolvePreauthHandshakeTimeoutMsFromEnv,
34
+ type GatewayPreauthHandshakeEnv,
35
+ type GatewayPreauthHandshakeEnvKeys,
36
+ type ResolvePreauthHandshakeTimeoutMsParams,
37
+ type ResolveDeviceTokenOnlyFallbackMsParams,
38
+ } from "./preauth-handshake.js";
39
+ export { signPayload } from "./device-crypto.js";
40
+
41
+ export {
42
+ loadOrCreateDeviceIdentity,
43
+ isDeviceIdentitySupported,
44
+ type DeviceIdentity,
45
+ } from "./device-store.js";
46
+
47
+ export {
48
+ BASELINE_SESSIONS_LIST_PARAMS,
49
+ EMPTY_SESSIONS_USAGE,
50
+ SESSIONS_DETAIL_CACHE_TTL_MS,
51
+ canonicalizeSessionDetailParams,
52
+ canonicalizeSessionsListParams,
53
+ canonicalizeSessionsPreviewParams,
54
+ canonicalizeSessionsUsageParams,
55
+ createSessionLoaders,
56
+ isUnchangedSessionsListPayload,
57
+ normalizeSessionsListPayload,
58
+ type SessionDetailPayload,
59
+ type SessionDetailRequestParams,
60
+ type SessionLoaders,
61
+ type SessionPatchInput,
62
+ type SessionsListPayloadWithCache,
63
+ type SessionsListRequestParams,
64
+ type SessionsListRpcPayload,
65
+ type SessionsListUnchangedPayload,
66
+ type SessionsPreviewRequestParams,
67
+ } from "../snapshots/session-loaders.js";
68
+
69
+ type GatewayRpcRequest = {
70
+ type: "req";
71
+ id: string;
72
+ method: string;
73
+ params?: Record<string, unknown>;
74
+ };
75
+
76
+ type GatewayRpcResponse = {
77
+ type: "res";
78
+ id: string;
79
+ ok: boolean;
80
+ payload?: unknown;
81
+ error?: { code?: string; message?: string };
82
+ };
83
+
84
+ type GatewayEventFrame = {
85
+ type: "event";
86
+ event: string;
87
+ payload?: unknown;
88
+ };
89
+
90
+ type GatewayHello = {
91
+ type: "hello-ok";
92
+ protocol: number;
93
+ auth?: {
94
+ scopes?: string[];
95
+ role?: string;
96
+ };
97
+ };
98
+
99
+ type PendingRequest = {
100
+ resolve: (value: unknown) => void;
101
+ reject: (error: Error) => void;
102
+ };
103
+
104
+ type QueuedRequest = {
105
+ resolve: () => void;
106
+ reject: (error: Error) => void;
107
+ };
108
+
109
+ export type GatewayStreamEvent = {
110
+ event: string;
111
+ payload: unknown;
112
+ };
113
+
114
+ export type GatewayConnectionState =
115
+ | "idle"
116
+ | "connecting"
117
+ | "reconnecting"
118
+ | "connected"
119
+ | "error";
120
+
121
+ const REQUEST_TIMEOUT_MS = 10_000;
122
+ const MAX_CONCURRENT_RPC_REQUESTS = 3;
123
+ export const DEFAULT_GATEWAY_PROTOCOL_VERSION = 4;
124
+ const DEFAULT_GATEWAY_RPC_CLIENT_VERSION = "0.1.0";
125
+ const DEFAULT_GATEWAY_RPC_CLIENT_SCOPES = ["operator.read"] as const;
126
+
127
+ /** Completed WebSocket RPC (after response or failure). Params are redacted. */
128
+ export type GatewayRpcTraceEntry = {
129
+ at: number;
130
+ transport: "websocket";
131
+ correlationId: string;
132
+ method: string;
133
+ durationMs: number;
134
+ ok: boolean;
135
+ params: Record<string, unknown>;
136
+ /** JSON preview of successful payload (bounded). */
137
+ resultPreview?: string;
138
+ /** Populated when `ok` is false. */
139
+ error?: { name: string; message: string; code?: string };
140
+ };
141
+
142
+ export type GatewayRpcClientOptions = {
143
+ clientId?: string;
144
+ clientVersion?: string;
145
+ clientMode?: string;
146
+ clientPlatform?: string;
147
+ /**
148
+ * Gateway protocol compatibility range to advertise during connect.
149
+ * Defaults to the current generic gateway protocol. Override only when
150
+ * talking to a gateway with a known alternate compatibility contract.
151
+ */
152
+ minProtocol?: number;
153
+ maxProtocol?: number;
154
+ enableDeviceIdentity?: boolean;
155
+ /**
156
+ * Optional platform-specific device identity loader. Browser callers use the
157
+ * built-in IndexedDB/WebCrypto store; React Native callers can provide a
158
+ * SecureStore-backed loader while still using the shared connect signer.
159
+ */
160
+ deviceIdentityLoader?: () => Promise<DeviceIdentity | null>;
161
+ /**
162
+ * Operator scopes to request on connect. Empty/blank entries are ignored.
163
+ * When omitted, defaults to `["operator.read"]` for backwards compatibility;
164
+ * callers needing admin-level methods (e.g. `device.pair.approve`) must opt in
165
+ * explicitly so the gateway does not silently downgrade them to read-only.
166
+ */
167
+ requestedScopes?: readonly string[];
168
+ /**
169
+ * Gateway pre-auth handshake budget (ms). Set this to the same value as server
170
+ * handshake config when it is not the default, especially for browser clients
171
+ * that cannot read gateway env.
172
+ */
173
+ preauthHandshakeTimeoutMs?: number;
174
+ /**
175
+ * Env bag and keys for provider-specific pre-auth handshake config. Core uses
176
+ * GATEWAY_* keys by default; providers can pass their own keys without baking
177
+ * product names into the core client.
178
+ */
179
+ preauthHandshakeEnv?: GatewayPreauthHandshakeEnv;
180
+ preauthHandshakeEnvKeys?: GatewayPreauthHandshakeEnvKeys;
181
+ /** Override the per-RPC response timeout. */
182
+ requestTimeoutMs?: number;
183
+ /** Override client-side RPC concurrency. */
184
+ maxConcurrentRequests?: number;
185
+ /** Override the default requested scopes used when requestedScopes is omitted. */
186
+ defaultRequestedScopes?: readonly string[];
187
+ /**
188
+ * Optional hook for completed RPCs (success, gateway error, timeout, or send failure).
189
+ * Params are redacted; payloads are truncated. Must not throw.
190
+ */
191
+ onRpcTrace?: (entry: GatewayRpcTraceEntry) => void;
192
+ };
193
+
194
+ function normalizeGatewayScopes(scopes: readonly string[] | undefined): string[] {
195
+ if (!scopes || scopes.length === 0) {
196
+ return [];
197
+ }
198
+ const seen = new Set<string>();
199
+ const result: string[] = [];
200
+ for (const scope of scopes) {
201
+ if (typeof scope !== "string") {
202
+ continue;
203
+ }
204
+ const trimmed = scope.trim();
205
+ if (trimmed.length === 0 || seen.has(trimmed)) {
206
+ continue;
207
+ }
208
+ seen.add(trimmed);
209
+ result.push(trimmed);
210
+ }
211
+ return result;
212
+ }
213
+
214
+ export function resolveGatewayConnectScopes(
215
+ options?: GatewayRpcClientOptions,
216
+ ): string[] {
217
+ const requested = normalizeGatewayScopes(options?.requestedScopes);
218
+ if (requested.length > 0) {
219
+ return requested;
220
+ }
221
+ const defaultRequested = normalizeGatewayScopes(options?.defaultRequestedScopes);
222
+ if (defaultRequested.length > 0) {
223
+ return defaultRequested;
224
+ }
225
+ return [...DEFAULT_GATEWAY_RPC_CLIENT_SCOPES];
226
+ }
227
+
228
+ /** Resolved client fields for `connect` and device-auth v3 signing (must stay aligned). */
229
+ export type ResolvedGatewayRpcClientProfile = {
230
+ clientId: string;
231
+ clientVersion: string;
232
+ clientPlatform: string;
233
+ clientMode: string;
234
+ };
235
+
236
+ export function resolveGatewayRpcClientProfile(
237
+ options?: GatewayRpcClientOptions,
238
+ ): ResolvedGatewayRpcClientProfile {
239
+ const clientId = options?.clientId?.trim();
240
+ if (!clientId) {
241
+ throw new Error(
242
+ "Missing clientId. Pass clientId to useGatewayEventStream, GatewayClientProvider, or useGatewayClient.",
243
+ );
244
+ }
245
+ return {
246
+ clientId,
247
+ clientVersion: options?.clientVersion ?? DEFAULT_GATEWAY_RPC_CLIENT_VERSION,
248
+ clientPlatform: options?.clientPlatform ?? "web",
249
+ clientMode: options?.clientMode ?? "webchat",
250
+ };
251
+ }
252
+
253
+ function resolveGatewayProtocolRange(options?: GatewayRpcClientOptions): {
254
+ minProtocol: number;
255
+ maxProtocol: number;
256
+ } {
257
+ const minProtocol = options?.minProtocol ?? DEFAULT_GATEWAY_PROTOCOL_VERSION;
258
+ const maxProtocol = options?.maxProtocol ?? DEFAULT_GATEWAY_PROTOCOL_VERSION;
259
+ if (
260
+ !Number.isInteger(minProtocol) ||
261
+ !Number.isInteger(maxProtocol) ||
262
+ minProtocol < 1 ||
263
+ maxProtocol < 1 ||
264
+ minProtocol > maxProtocol
265
+ ) {
266
+ throw new Error("Gateway protocol range must be positive integers with minProtocol <= maxProtocol.");
267
+ }
268
+ return { minProtocol, maxProtocol };
269
+ }
270
+
271
+ /** Defaults for React Native while preserving caller-provided client identity. */
272
+ export function mergeGatewayRpcClientOptionsForReactNative(
273
+ options?: GatewayRpcClientOptions,
274
+ ): GatewayRpcClientOptions {
275
+ return {
276
+ ...options,
277
+ enableDeviceIdentity: options?.enableDeviceIdentity ?? true,
278
+ clientPlatform: options?.clientPlatform ?? "react-native",
279
+ clientMode: options?.clientMode,
280
+ };
281
+ }
282
+
283
+ export function createGatewayRpcConnectParams(params: {
284
+ authToken: string | null;
285
+ userAgent: string;
286
+ locale: string;
287
+ options?: GatewayRpcClientOptions;
288
+ device?: {
289
+ id: string;
290
+ publicKey: string;
291
+ signature: string;
292
+ signedAt: number;
293
+ nonce: string;
294
+ } | null;
295
+ }): Record<string, unknown> {
296
+ const client = resolveGatewayRpcClientProfile(params.options);
297
+ const protocol = resolveGatewayProtocolRange(params.options);
298
+ const result: Record<string, unknown> = {
299
+ minProtocol: protocol.minProtocol,
300
+ maxProtocol: protocol.maxProtocol,
301
+ client: {
302
+ id: client.clientId,
303
+ version: client.clientVersion,
304
+ platform: client.clientPlatform,
305
+ mode: client.clientMode,
306
+ },
307
+ role: "operator",
308
+ scopes: resolveGatewayConnectScopes(params.options),
309
+ caps: [],
310
+ auth: params.authToken
311
+ ? {
312
+ token: params.authToken,
313
+ password: params.authToken,
314
+ }
315
+ : undefined,
316
+ userAgent: params.userAgent,
317
+ locale: params.locale,
318
+ };
319
+ if (params.device) {
320
+ result.device = params.device;
321
+ }
322
+ return result;
323
+ }
324
+
325
+ function normalizeGatewayRpcError(
326
+ error: unknown,
327
+ fallbackMessage: string,
328
+ fallbackCode = "gateway_error",
329
+ ): GatewayRpcError {
330
+ if (error instanceof GatewayRpcError) {
331
+ return error;
332
+ }
333
+ if (error instanceof Error) {
334
+ return new GatewayRpcError(error.message, fallbackCode);
335
+ }
336
+ return new GatewayRpcError(fallbackMessage, fallbackCode);
337
+ }
338
+
339
+ function redactGatewayRpcTraceParams(
340
+ method: string,
341
+ params: Record<string, unknown>,
342
+ ): Record<string, unknown> {
343
+ try {
344
+ const clone = JSON.parse(JSON.stringify(params)) as Record<string, unknown>;
345
+ if (method === "connect") {
346
+ const auth = clone.auth;
347
+ if (auth && typeof auth === "object" && !Array.isArray(auth)) {
348
+ const a = auth as Record<string, unknown>;
349
+ if (typeof a.token === "string") a.token = "***";
350
+ if (typeof a.password === "string") a.password = "***";
351
+ }
352
+ const device = clone.device;
353
+ if (device && typeof device === "object" && !Array.isArray(device)) {
354
+ const d = device as Record<string, unknown>;
355
+ if (typeof d.signature === "string") d.signature = "***";
356
+ if (typeof d.publicKey === "string" && d.publicKey.length > 24) {
357
+ d.publicKey = `${String(d.publicKey).slice(0, 12)}…(redacted)`;
358
+ }
359
+ }
360
+ }
361
+ return clone;
362
+ } catch {
363
+ return { _redactionNote: "params not JSON-serializable", method };
364
+ }
365
+ }
366
+
367
+ function summarizeRpcTraceResult(value: unknown, maxChars: number): string {
368
+ try {
369
+ const s = JSON.stringify(value);
370
+ if (s.length <= maxChars) return s;
371
+ return `${s.slice(0, maxChars)}…[truncated ${s.length - maxChars} chars]`;
372
+ } catch {
373
+ return String(value);
374
+ }
375
+ }
376
+
377
+ function serializeRpcTraceError(error: Error): {
378
+ name: string;
379
+ message: string;
380
+ code?: string;
381
+ } {
382
+ if (error instanceof GatewayRpcError) {
383
+ return { name: error.name, message: error.message, code: error.code };
384
+ }
385
+ return { name: error.name, message: error.message };
386
+ }
387
+
388
+ function createGatewaySocketClosedError(
389
+ event?: WebSocketCloseLike | null,
390
+ ): GatewayRpcError {
391
+ const closed = describeWebSocketClose(event, "gateway closed");
392
+ return new GatewayRpcError(
393
+ closed.code === null && closed.reason === null
394
+ ? "gateway websocket closed"
395
+ : closed.message,
396
+ "socket_closed",
397
+ );
398
+ }
399
+
400
+ function readGatewayPreauthHandshakeEnv(): GatewayPreauthHandshakeEnv | undefined {
401
+ if (typeof process === "undefined") {
402
+ return undefined;
403
+ }
404
+ const env: Record<string, string | undefined> = {
405
+ [GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.timeoutMs]:
406
+ process.env[GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.timeoutMs],
407
+ };
408
+ if (GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.testTimeoutMs) {
409
+ env[GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.testTimeoutMs] =
410
+ process.env[GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.testTimeoutMs];
411
+ }
412
+ if (GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.testFlag) {
413
+ env[GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.testFlag] =
414
+ process.env[GATEWAY_PREAUTH_HANDSHAKE_ENV_KEYS.testFlag];
415
+ }
416
+ return env;
417
+ }
418
+
419
+ function resolvePositiveIntegerOption(
420
+ value: number | undefined,
421
+ fallback: number,
422
+ ): number {
423
+ return typeof value === "number" && Number.isInteger(value) && value > 0
424
+ ? value
425
+ : fallback;
426
+ }
427
+
428
+ export class GatewayRpcClient {
429
+ private socket: WebSocket | null = null;
430
+
431
+ private connectPromise: Promise<void> | null = null;
432
+
433
+ private pending = new Map<string, PendingRequest>();
434
+
435
+ private activeRpcRequests = 0;
436
+
437
+ private queuedRpcRequests: QueuedRequest[] = [];
438
+
439
+ private sequence = 0;
440
+
441
+ private connected = false;
442
+
443
+ /** Set when a connect RPC is explicitly rejected (auth failure, etc.) so onClose
444
+ * does not emit a retryable socket_closed error that triggers an infinite reconnect loop. */
445
+ private connectRejected = false;
446
+
447
+ private eventListeners = new Set<(event: GatewayStreamEvent) => void>();
448
+
449
+ private stateListeners = new Set<
450
+ (state: GatewayConnectionState, error: Error | null) => void
451
+ >();
452
+
453
+ private state: GatewayConnectionState = "idle";
454
+
455
+ private lastError: Error | null = null;
456
+
457
+ private intentionalClose = false;
458
+
459
+ private emitRpcTrace(entry: GatewayRpcTraceEntry): void {
460
+ const hook = this.options.onRpcTrace;
461
+ if (!hook) {
462
+ return;
463
+ }
464
+ try {
465
+ hook(entry);
466
+ } catch {
467
+ /* ignore observer failures */
468
+ }
469
+ }
470
+
471
+ private deviceIdentity: DeviceIdentity | null = null;
472
+
473
+ private deviceIdentityReady: Promise<void>;
474
+
475
+ /** Incremented on each connect attempt; stale async connect paths must not resolve the outer promise. */
476
+ private connectAttemptSeq = 0;
477
+
478
+ constructor(
479
+ private readonly wsUrl: string,
480
+ private readonly authToken: string | null,
481
+ private readonly options: GatewayRpcClientOptions = {},
482
+ ) {
483
+ const enableDevice = options.enableDeviceIdentity !== false;
484
+ const identityLoader =
485
+ enableDevice && options.deviceIdentityLoader
486
+ ? options.deviceIdentityLoader
487
+ : enableDevice && isDeviceIdentitySupported()
488
+ ? loadOrCreateDeviceIdentity
489
+ : null;
490
+ if (identityLoader) {
491
+ this.deviceIdentityReady = identityLoader().then(
492
+ (identity) => {
493
+ this.deviceIdentity = identity;
494
+ },
495
+ () => {
496
+ /* graceful degradation */
497
+ },
498
+ );
499
+ } else {
500
+ this.deviceIdentityReady = Promise.resolve();
501
+ }
502
+ }
503
+
504
+ getConnectionState(): GatewayConnectionState {
505
+ return this.state;
506
+ }
507
+
508
+ getLastError(): Error | null {
509
+ return this.lastError;
510
+ }
511
+
512
+ onEvent(listener: (event: GatewayStreamEvent) => void): () => void {
513
+ this.eventListeners.add(listener);
514
+ return () => {
515
+ this.eventListeners.delete(listener);
516
+ };
517
+ }
518
+
519
+ onStateChange(
520
+ listener: (state: GatewayConnectionState, error: Error | null) => void,
521
+ ): () => void {
522
+ this.stateListeners.add(listener);
523
+ // Defer the initial snapshot so React subscribers don't run setState synchronously
524
+ // during the same commit as subscribe (Strict Mode / navigation mount → "state update
525
+ // before component mounted" warnings on RN/React 19).
526
+ const deliverInitial = () => {
527
+ if (!this.stateListeners.has(listener)) {
528
+ return;
529
+ }
530
+ listener(this.state, this.lastError);
531
+ };
532
+ if (typeof queueMicrotask === "function") {
533
+ queueMicrotask(deliverInitial);
534
+ } else {
535
+ void Promise.resolve().then(deliverInitial);
536
+ }
537
+ return () => {
538
+ this.stateListeners.delete(listener);
539
+ };
540
+ }
541
+
542
+ async connect(): Promise<void> {
543
+ await this.ensureConnected();
544
+ }
545
+
546
+ async request<TPayload>(
547
+ method: string,
548
+ params: Record<string, unknown> = {},
549
+ ): Promise<TPayload> {
550
+ await this.ensureConnected();
551
+ return this.runWithRpcBackpressure(() =>
552
+ this.requestRaw<TPayload>(method, params),
553
+ );
554
+ }
555
+
556
+ async close(): Promise<void> {
557
+ this.connectAttemptSeq += 1;
558
+ this.intentionalClose = true;
559
+ this.connected = false;
560
+ this.connectPromise = null;
561
+ if (!this.socket) {
562
+ this.setState("idle", null);
563
+ return;
564
+ }
565
+ this.socket.close();
566
+ this.socket = null;
567
+ for (const pending of this.pending.values()) {
568
+ pending.reject(new GatewayRpcError("connection closed", "closed"));
569
+ }
570
+ this.pending.clear();
571
+ this.rejectQueuedRpcRequests(
572
+ new GatewayRpcError("connection closed", "closed"),
573
+ );
574
+ this.setState("idle", null);
575
+ }
576
+
577
+ private setState(state: GatewayConnectionState, error: Error | null): void {
578
+ this.state = state;
579
+ this.lastError = error;
580
+ for (const listener of this.stateListeners) {
581
+ listener(state, error);
582
+ }
583
+ }
584
+
585
+ private getConnectClientInfo(): { userAgent: string; locale: string } {
586
+ if (typeof navigator !== "undefined") {
587
+ return {
588
+ userAgent: navigator.userAgent,
589
+ locale: navigator.language,
590
+ };
591
+ }
592
+ return { userAgent: "unknown", locale: "en" };
593
+ }
594
+
595
+ private async ensureConnected(): Promise<void> {
596
+ if (
597
+ this.connected &&
598
+ this.socket &&
599
+ this.socket.readyState === WebSocket.OPEN
600
+ ) {
601
+ return;
602
+ }
603
+ if (this.connectPromise) {
604
+ return this.connectPromise;
605
+ }
606
+
607
+ this.setState("connecting", null);
608
+ this.connectPromise = new Promise<void>((resolve, reject) => {
609
+ const ws = new WebSocket(this.wsUrl);
610
+ this.socket = ws;
611
+ this.intentionalClose = false;
612
+ this.connectRejected = false;
613
+ let connectPhase: "waiting" | "requesting" | "settled" = "waiting";
614
+ let connectTimer: ReturnType<typeof setTimeout> | null = null;
615
+
616
+ const clearConnectTimer = () => {
617
+ if (connectTimer !== null) {
618
+ clearTimeout(connectTimer);
619
+ connectTimer = null;
620
+ }
621
+ };
622
+
623
+ const { userAgent, locale } = this.getConnectClientInfo();
624
+
625
+ const preferDeviceChallengeFirst =
626
+ this.options.enableDeviceIdentity !== false &&
627
+ Boolean(this.options.deviceIdentityLoader ?? isDeviceIdentitySupported());
628
+ const handshakeEnv =
629
+ this.options.preauthHandshakeEnv ?? readGatewayPreauthHandshakeEnv();
630
+ const tokenOnlyFallbackMs = preferDeviceChallengeFirst
631
+ ? resolveDeviceTokenOnlyFallbackMs({
632
+ env: handshakeEnv,
633
+ envKeys: this.options.preauthHandshakeEnvKeys,
634
+ preauthHandshakeTimeoutMs: this.options.preauthHandshakeTimeoutMs,
635
+ })
636
+ : 0;
637
+
638
+ const isCurrentOpenSocket = () =>
639
+ this.socket === ws && ws.readyState === WebSocket.OPEN;
640
+
641
+ const sendConnect = (nonce?: string) => {
642
+ if (connectPhase !== "waiting" || !isCurrentOpenSocket()) {
643
+ return;
644
+ }
645
+ clearConnectTimer();
646
+ connectPhase = "requesting";
647
+ const seq = ++this.connectAttemptSeq;
648
+
649
+ const doConnect = async () => {
650
+ await this.deviceIdentityReady;
651
+
652
+ let device: {
653
+ id: string;
654
+ publicKey: string;
655
+ signature: string;
656
+ signedAt: number;
657
+ nonce: string;
658
+ } | null = null;
659
+ if (this.deviceIdentity && nonce) {
660
+ const client = resolveGatewayRpcClientProfile(this.options);
661
+ const role = "operator";
662
+ const scopes = resolveGatewayConnectScopes(this.options);
663
+ const signedAtMs = Date.now();
664
+ const token = this.authToken ?? "";
665
+
666
+ const payload = buildDeviceAuthPayloadV3({
667
+ deviceId: this.deviceIdentity.deviceId,
668
+ clientId: client.clientId,
669
+ clientMode: client.clientMode,
670
+ role,
671
+ scopes,
672
+ signedAtMs,
673
+ token,
674
+ nonce,
675
+ platform: client.clientPlatform,
676
+ });
677
+ const signature = await signPayload(
678
+ this.deviceIdentity.privateKey,
679
+ payload,
680
+ );
681
+
682
+ device = {
683
+ id: this.deviceIdentity.deviceId,
684
+ publicKey: this.deviceIdentity.publicKeyBase64Url,
685
+ signature,
686
+ signedAt: signedAtMs,
687
+ nonce,
688
+ };
689
+ }
690
+
691
+ return this.requestRaw<GatewayHello>(
692
+ "connect",
693
+ createGatewayRpcConnectParams({
694
+ authToken: this.authToken,
695
+ userAgent,
696
+ locale,
697
+ options: this.options,
698
+ device,
699
+ }),
700
+ );
701
+ };
702
+
703
+ void doConnect()
704
+ .then(() => {
705
+ if (seq !== this.connectAttemptSeq || connectPhase === "settled") {
706
+ return;
707
+ }
708
+ if (!isCurrentOpenSocket()) {
709
+ connectPhase = "settled";
710
+ const closeError = createGatewaySocketClosedError();
711
+ reject(closeError);
712
+ return;
713
+ }
714
+ connectPhase = "settled";
715
+ this.connected = true;
716
+ this.setState("connected", null);
717
+ resolve();
718
+ })
719
+ .catch((error) => {
720
+ if (seq !== this.connectAttemptSeq || connectPhase === "settled") {
721
+ return;
722
+ }
723
+ if (this.connected) {
724
+ return;
725
+ }
726
+ connectPhase = "settled";
727
+ const normalizedError = normalizeGatewayRpcError(
728
+ error,
729
+ "gateway connect failed",
730
+ "connect_failed",
731
+ );
732
+ this.setState("error", normalizedError);
733
+ this.connectRejected = true;
734
+ this.intentionalClose = true;
735
+ if (
736
+ ws.readyState === WebSocket.OPEN ||
737
+ ws.readyState === WebSocket.CONNECTING
738
+ ) {
739
+ ws.close();
740
+ }
741
+ reject(normalizedError);
742
+ });
743
+ };
744
+
745
+ const onOpen = () => {
746
+ if (tokenOnlyFallbackMs <= 0) {
747
+ sendConnect(undefined);
748
+ return;
749
+ }
750
+ connectTimer = setTimeout(() => {
751
+ sendConnect(undefined);
752
+ }, tokenOnlyFallbackMs);
753
+ };
754
+
755
+ const onMessage = (event: MessageEvent) => {
756
+ if (typeof event.data === "string") {
757
+ try {
758
+ const parsed = JSON.parse(event.data) as {
759
+ type?: unknown;
760
+ event?: unknown;
761
+ payload?: { nonce?: string };
762
+ };
763
+ if (
764
+ connectPhase === "waiting" &&
765
+ parsed.type === "event" &&
766
+ parsed.event === "connect.challenge" &&
767
+ isCurrentOpenSocket()
768
+ ) {
769
+ const nonce =
770
+ typeof parsed.payload?.nonce === "string"
771
+ ? parsed.payload.nonce
772
+ : undefined;
773
+ sendConnect(nonce);
774
+ return;
775
+ }
776
+ } catch {
777
+ // Let the regular frame handler ignore invalid payloads.
778
+ }
779
+ }
780
+ this.handleMessage(event);
781
+ };
782
+
783
+ const onError = () => {
784
+ clearConnectTimer();
785
+ const error = new GatewayRpcError(
786
+ "gateway websocket failed",
787
+ "socket_error",
788
+ );
789
+ this.setState("error", error);
790
+ if (connectPhase !== "settled") {
791
+ connectPhase = "settled";
792
+ }
793
+ reject(error);
794
+ };
795
+
796
+ const onClose = (event: Event) => {
797
+ clearConnectTimer();
798
+ this.connected = false;
799
+ this.connectPromise = null;
800
+ if (this.socket === ws) {
801
+ this.socket = null;
802
+ }
803
+ const closeError = createGatewaySocketClosedError(
804
+ event as WebSocketCloseLike,
805
+ );
806
+ for (const pending of this.pending.values()) {
807
+ pending.reject(closeError);
808
+ }
809
+ this.pending.clear();
810
+ this.rejectQueuedRpcRequests(closeError);
811
+ if (this.connectRejected) {
812
+ this.intentionalClose = false;
813
+ this.connectRejected = false;
814
+ return;
815
+ }
816
+ if (this.intentionalClose) {
817
+ this.intentionalClose = false;
818
+ return;
819
+ }
820
+ this.setState("error", closeError);
821
+ if (connectPhase !== "settled") {
822
+ connectPhase = "settled";
823
+ reject(closeError);
824
+ }
825
+ };
826
+
827
+ ws.addEventListener("open", onOpen, { once: true });
828
+ ws.addEventListener("message", onMessage);
829
+ ws.addEventListener("error", onError, { once: true });
830
+ ws.addEventListener("close", onClose);
831
+ }).finally(() => {
832
+ this.connectPromise = null;
833
+ });
834
+
835
+ return this.connectPromise;
836
+ }
837
+
838
+ private async requestRaw<TPayload>(
839
+ method: string,
840
+ params: Record<string, unknown>,
841
+ ): Promise<TPayload> {
842
+ const ws = this.socket;
843
+ if (!ws || ws.readyState !== WebSocket.OPEN) {
844
+ throw new GatewayRpcError(
845
+ "gateway websocket is not connected",
846
+ "socket_unavailable",
847
+ );
848
+ }
849
+
850
+ // Per-client monotonic sequence + time; duplicate ids across tabs/processes are negligible for this protocol.
851
+ const id = `mc-${Date.now()}-${this.sequence++}`;
852
+ const frame: GatewayRpcRequest = {
853
+ type: "req",
854
+ id,
855
+ method,
856
+ params,
857
+ };
858
+
859
+ const startedAt = Date.now();
860
+ const redactedParams = redactGatewayRpcTraceParams(method, params);
861
+
862
+ return await new Promise<TPayload>((resolve, reject) => {
863
+ const emitDone = (
864
+ outcome:
865
+ | {
866
+ ok: true;
867
+ value: unknown;
868
+ }
869
+ | {
870
+ ok: false;
871
+ error: Error;
872
+ },
873
+ ): void => {
874
+ const durationMs = Date.now() - startedAt;
875
+ if (outcome.ok) {
876
+ this.emitRpcTrace({
877
+ at: Date.now(),
878
+ transport: "websocket",
879
+ correlationId: id,
880
+ method,
881
+ durationMs,
882
+ ok: true,
883
+ params: redactedParams,
884
+ resultPreview: summarizeRpcTraceResult(outcome.value, 24_000),
885
+ });
886
+ } else {
887
+ this.emitRpcTrace({
888
+ at: Date.now(),
889
+ transport: "websocket",
890
+ correlationId: id,
891
+ method,
892
+ durationMs,
893
+ ok: false,
894
+ params: redactedParams,
895
+ error: serializeRpcTraceError(outcome.error),
896
+ });
897
+ }
898
+ };
899
+
900
+ const requestTimeoutMs = resolvePositiveIntegerOption(
901
+ this.options.requestTimeoutMs,
902
+ REQUEST_TIMEOUT_MS,
903
+ );
904
+ const timeout = setTimeout(() => {
905
+ const p = this.pending.get(id);
906
+ this.pending.delete(id);
907
+ if (p) {
908
+ p.reject(
909
+ new GatewayRpcError(`request timed out: ${method}`, "timeout"),
910
+ );
911
+ }
912
+ }, requestTimeoutMs);
913
+
914
+ this.pending.set(id, {
915
+ resolve: (value) => {
916
+ clearTimeout(timeout);
917
+ emitDone({ ok: true, value });
918
+ resolve(value as TPayload);
919
+ },
920
+ reject: (error) => {
921
+ clearTimeout(timeout);
922
+ const err = error instanceof Error ? error : new Error(String(error));
923
+ emitDone({ ok: false, error: err });
924
+ reject(err);
925
+ },
926
+ });
927
+
928
+ try {
929
+ ws.send(JSON.stringify(frame));
930
+ } catch (error) {
931
+ const p = this.pending.get(id);
932
+ this.pending.delete(id);
933
+ clearTimeout(timeout);
934
+ const err = normalizeGatewayRpcError(
935
+ error,
936
+ `gateway request failed: ${method}`,
937
+ "socket_error",
938
+ );
939
+ if (p) {
940
+ p.reject(err);
941
+ } else {
942
+ reject(err);
943
+ }
944
+ }
945
+ });
946
+ }
947
+
948
+ private async runWithRpcBackpressure<TPayload>(
949
+ run: () => Promise<TPayload>,
950
+ ): Promise<TPayload> {
951
+ let slotReserved = false;
952
+ const maxConcurrentRequests = resolvePositiveIntegerOption(
953
+ this.options.maxConcurrentRequests,
954
+ MAX_CONCURRENT_RPC_REQUESTS,
955
+ );
956
+ if (this.activeRpcRequests >= maxConcurrentRequests) {
957
+ await new Promise<void>((resolve, reject) => {
958
+ this.queuedRpcRequests.push({
959
+ resolve: () => {
960
+ slotReserved = true;
961
+ resolve();
962
+ },
963
+ reject,
964
+ });
965
+ });
966
+ }
967
+
968
+ if (!slotReserved) {
969
+ this.activeRpcRequests += 1;
970
+ }
971
+ try {
972
+ return await run();
973
+ } finally {
974
+ this.activeRpcRequests = Math.max(0, this.activeRpcRequests - 1);
975
+ this.drainQueuedRpcRequests();
976
+ }
977
+ }
978
+
979
+ private drainQueuedRpcRequests(): void {
980
+ const maxConcurrentRequests = resolvePositiveIntegerOption(
981
+ this.options.maxConcurrentRequests,
982
+ MAX_CONCURRENT_RPC_REQUESTS,
983
+ );
984
+ while (
985
+ this.activeRpcRequests < maxConcurrentRequests &&
986
+ this.queuedRpcRequests.length > 0
987
+ ) {
988
+ const next = this.queuedRpcRequests.shift();
989
+ next?.resolve();
990
+ this.activeRpcRequests += 1;
991
+ }
992
+ }
993
+
994
+ private rejectQueuedRpcRequests(error: Error): void {
995
+ const queued = this.queuedRpcRequests.splice(0);
996
+ for (const request of queued) {
997
+ request.reject(error);
998
+ }
999
+ }
1000
+
1001
+ private handleMessage(event: MessageEvent): void {
1002
+ if (typeof event.data !== "string") {
1003
+ return;
1004
+ }
1005
+
1006
+ let parsed: unknown;
1007
+ try {
1008
+ parsed = JSON.parse(event.data);
1009
+ } catch {
1010
+ return;
1011
+ }
1012
+
1013
+ if (!parsed || typeof parsed !== "object") {
1014
+ return;
1015
+ }
1016
+
1017
+ const eventFrame = parsed as Partial<GatewayEventFrame>;
1018
+ if (eventFrame.type === "event" && typeof eventFrame.event === "string") {
1019
+ const streamEvent: GatewayStreamEvent = {
1020
+ event: eventFrame.event,
1021
+ payload: eventFrame.payload,
1022
+ };
1023
+ for (const listener of this.eventListeners) {
1024
+ listener(streamEvent);
1025
+ }
1026
+ return;
1027
+ }
1028
+
1029
+ const frame = parsed as Partial<GatewayRpcResponse>;
1030
+ if (frame.type !== "res" || typeof frame.id !== "string") {
1031
+ return;
1032
+ }
1033
+
1034
+ const pending = this.pending.get(frame.id);
1035
+ if (!pending) {
1036
+ return;
1037
+ }
1038
+ this.pending.delete(frame.id);
1039
+
1040
+ if (!frame.ok) {
1041
+ const message = frame.error?.message ?? "gateway request failed";
1042
+ pending.reject(
1043
+ new GatewayRpcError(message, frame.error?.code ?? "request_failed"),
1044
+ );
1045
+ return;
1046
+ }
1047
+
1048
+ pending.resolve(frame.payload);
1049
+ }
1050
+ }
1051
+
1052
+ export {
1053
+ resolveGatewayTargets,
1054
+ tryResolveGatewayTargets,
1055
+ } from "../../ws/targets.js";
1056
+
1057
+ export {
1058
+ PORTAL_CONFIG_PATCH_CLIENT_ID_HEADER,
1059
+ PORTAL_CONFIG_PATCH_CONTRACT,
1060
+ PORTAL_CONFIG_PATCH_CONTRACT_VERSION,
1061
+ PortalConfigPatchError,
1062
+ portalConfigPatchPath,
1063
+ postPortalConfigPatch,
1064
+ unflattenPortalConfigPatchKeys,
1065
+ type PortalConfigPatchRequestBody,
1066
+ type PostPortalConfigPatchParams,
1067
+ } from "../portal/config-patch.js";