@homebridge-plugins/homebridge-eufy-security 4.7.1 → 5.0.0-beta.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 (469) hide show
  1. package/AUTHORS +4 -0
  2. package/CODE_OF_CONDUCT.md +30 -0
  3. package/CONTRIBUTING.md +77 -0
  4. package/README.md +152 -49
  5. package/SECURITY.md +30 -0
  6. package/config.schema.json +92 -3
  7. package/dist/account/ownership.js +290 -0
  8. package/dist/account/ownership.js.map +1 -0
  9. package/dist/account/persistence.js +274 -0
  10. package/dist/account/persistence.js.map +1 -0
  11. package/dist/account/temporary-authentication.js +348 -0
  12. package/dist/account/temporary-authentication.js.map +1 -0
  13. package/dist/configuration.js +167 -0
  14. package/dist/configuration.js.map +1 -0
  15. package/dist/device/member-evidence.js +66 -0
  16. package/dist/device/member-evidence.js.map +1 -0
  17. package/dist/device/member-trust.js +114 -0
  18. package/dist/device/member-trust.js.map +1 -0
  19. package/dist/device/snapshot.js +190 -0
  20. package/dist/device/snapshot.js.map +1 -0
  21. package/dist/diagnostics.js +2218 -0
  22. package/dist/diagnostics.js.map +1 -0
  23. package/dist/homekit/adapter.js +2 -0
  24. package/dist/homekit/adapter.js.map +1 -0
  25. package/dist/homekit/adapters/battery.js +208 -0
  26. package/dist/homekit/adapters/battery.js.map +1 -0
  27. package/dist/homekit/adapters/camera-controls.js +527 -0
  28. package/dist/homekit/adapters/camera-controls.js.map +1 -0
  29. package/dist/homekit/adapters/camera-streaming.js +1515 -0
  30. package/dist/homekit/adapters/camera-streaming.js.map +1 -0
  31. package/dist/homekit/adapters/contact.js +138 -0
  32. package/dist/homekit/adapters/contact.js.map +1 -0
  33. package/dist/homekit/adapters/doorbell.js +57 -0
  34. package/dist/homekit/adapters/doorbell.js.map +1 -0
  35. package/dist/homekit/adapters/information.js +55 -0
  36. package/dist/homekit/adapters/information.js.map +1 -0
  37. package/dist/homekit/adapters/lock.js +489 -0
  38. package/dist/homekit/adapters/lock.js.map +1 -0
  39. package/dist/homekit/adapters/motion.js +100 -0
  40. package/dist/homekit/adapters/motion.js.map +1 -0
  41. package/dist/homekit/adapters/registry.js +26 -0
  42. package/dist/homekit/adapters/registry.js.map +1 -0
  43. package/dist/homekit/adapters/security-system.js +425 -0
  44. package/dist/homekit/adapters/security-system.js.map +1 -0
  45. package/dist/homekit/adapters/siren.js +136 -0
  46. package/dist/homekit/adapters/siren.js.map +1 -0
  47. package/dist/homekit/adapters/smart-light.js +662 -0
  48. package/dist/homekit/adapters/smart-light.js.map +1 -0
  49. package/dist/homekit/coverage-matrix.js +119 -0
  50. package/dist/homekit/coverage-matrix.js.map +1 -0
  51. package/dist/homekit/device-control.js +175 -0
  52. package/dist/homekit/device-control.js.map +1 -0
  53. package/dist/homekit/reconciler.js +319 -0
  54. package/dist/homekit/reconciler.js.map +1 -0
  55. package/dist/homekit/representation.js +23 -0
  56. package/dist/homekit/representation.js.map +1 -0
  57. package/dist/index.js +4 -9
  58. package/dist/index.js.map +1 -1
  59. package/dist/media/contracts.js +2 -0
  60. package/dist/media/contracts.js.map +1 -0
  61. package/dist/media/last-successful-image.js +208 -0
  62. package/dist/media/last-successful-image.js.map +1 -0
  63. package/dist/media/live-stream.js +1003 -0
  64. package/dist/media/live-stream.js.map +1 -0
  65. package/dist/media/recording.js +560 -0
  66. package/dist/media/recording.js.map +1 -0
  67. package/dist/media/session-budget.js +39 -0
  68. package/dist/media/session-budget.js.map +1 -0
  69. package/dist/media/snapshot.js +406 -0
  70. package/dist/media/snapshot.js.map +1 -0
  71. package/dist/media/station-live-sessions.js +101 -0
  72. package/dist/media/station-live-sessions.js.map +1 -0
  73. package/dist/platform.js +97 -769
  74. package/dist/platform.js.map +1 -1
  75. package/dist/runtime/channel.js +375 -0
  76. package/dist/runtime/channel.js.map +1 -0
  77. package/dist/runtime/owner.js +682 -0
  78. package/dist/runtime/owner.js.map +1 -0
  79. package/dist/runtime/sdk-client.js +211 -0
  80. package/dist/runtime/sdk-client.js.map +1 -0
  81. package/dist/runtime/tracker.js +211 -0
  82. package/dist/runtime/tracker.js.map +1 -0
  83. package/dist/settings.js +1 -43
  84. package/dist/settings.js.map +1 -1
  85. package/dist/storage.js +59 -0
  86. package/dist/storage.js.map +1 -0
  87. package/dist/ui/dashboard.js +181 -0
  88. package/dist/ui/dashboard.js.map +1 -0
  89. package/dist/ui/device-image.js +22 -0
  90. package/dist/ui/device-image.js.map +1 -0
  91. package/dist/ui/runtime-channel-client.js +305 -0
  92. package/dist/ui/runtime-channel-client.js.map +1 -0
  93. package/dist/ui/server.js +259 -0
  94. package/dist/ui/server.js.map +1 -0
  95. package/homebridge-ui/public/app.css +1902 -0
  96. package/homebridge-ui/public/assets/devices/clean/clean-T1250.webp +0 -0
  97. package/homebridge-ui/public/assets/devices/clean/clean-T2070.webp +0 -0
  98. package/homebridge-ui/public/assets/devices/clean/clean-T2080.webp +0 -0
  99. package/homebridge-ui/public/assets/devices/clean/clean-T2081.webp +0 -0
  100. package/homebridge-ui/public/assets/devices/clean/clean-T2103.webp +0 -0
  101. package/homebridge-ui/public/assets/devices/clean/clean-T2117.webp +0 -0
  102. package/homebridge-ui/public/assets/devices/clean/clean-T2118.webp +0 -0
  103. package/homebridge-ui/public/assets/devices/clean/clean-T2119.webp +0 -0
  104. package/homebridge-ui/public/assets/devices/clean/clean-T211A.webp +0 -0
  105. package/homebridge-ui/public/assets/devices/clean/clean-T2120.webp +0 -0
  106. package/homebridge-ui/public/assets/devices/clean/clean-T2123.webp +0 -0
  107. package/homebridge-ui/public/assets/devices/clean/clean-T2128.webp +0 -0
  108. package/homebridge-ui/public/assets/devices/clean/clean-T2130.webp +0 -0
  109. package/homebridge-ui/public/assets/devices/clean/clean-T2132.webp +0 -0
  110. package/homebridge-ui/public/assets/devices/clean/clean-T2150.webp +0 -0
  111. package/homebridge-ui/public/assets/devices/clean/clean-T2181.webp +0 -0
  112. package/homebridge-ui/public/assets/devices/clean/clean-T2182.webp +0 -0
  113. package/homebridge-ui/public/assets/devices/clean/clean-T2190.webp +0 -0
  114. package/homebridge-ui/public/assets/devices/clean/clean-T2192.webp +0 -0
  115. package/homebridge-ui/public/assets/devices/clean/clean-T2193.webp +0 -0
  116. package/homebridge-ui/public/assets/devices/clean/clean-T2194.webp +0 -0
  117. package/homebridge-ui/public/assets/devices/clean/clean-T2210.webp +0 -0
  118. package/homebridge-ui/public/assets/devices/clean/clean-T2250.webp +0 -0
  119. package/homebridge-ui/public/assets/devices/clean/clean-T2251.webp +0 -0
  120. package/homebridge-ui/public/assets/devices/clean/clean-T2252.webp +0 -0
  121. package/homebridge-ui/public/assets/devices/clean/clean-T2253.webp +0 -0
  122. package/homebridge-ui/public/assets/devices/clean/clean-T2254.webp +0 -0
  123. package/homebridge-ui/public/assets/devices/clean/clean-T2255.webp +0 -0
  124. package/homebridge-ui/public/assets/devices/clean/clean-T2256.webp +0 -0
  125. package/homebridge-ui/public/assets/devices/clean/clean-T2257.webp +0 -0
  126. package/homebridge-ui/public/assets/devices/clean/clean-T2258.webp +0 -0
  127. package/homebridge-ui/public/assets/devices/clean/clean-T2259.webp +0 -0
  128. package/homebridge-ui/public/assets/devices/clean/clean-T2261.webp +0 -0
  129. package/homebridge-ui/public/assets/devices/clean/clean-T2262.webp +0 -0
  130. package/homebridge-ui/public/assets/devices/clean/clean-T2266.webp +0 -0
  131. package/homebridge-ui/public/assets/devices/clean/clean-T2267.webp +0 -0
  132. package/homebridge-ui/public/assets/devices/clean/clean-T2268.webp +0 -0
  133. package/homebridge-ui/public/assets/devices/clean/clean-T2270.webp +0 -0
  134. package/homebridge-ui/public/assets/devices/clean/clean-T2272.webp +0 -0
  135. package/homebridge-ui/public/assets/devices/clean/clean-T2273.webp +0 -0
  136. package/homebridge-ui/public/assets/devices/clean/clean-T2276.webp +0 -0
  137. package/homebridge-ui/public/assets/devices/clean/clean-T2277.webp +0 -0
  138. package/homebridge-ui/public/assets/devices/clean/clean-T2278.webp +0 -0
  139. package/homebridge-ui/public/assets/devices/clean/clean-T2280.webp +0 -0
  140. package/homebridge-ui/public/assets/devices/clean/clean-T2292.webp +0 -0
  141. package/homebridge-ui/public/assets/devices/clean/clean-T2320.webp +0 -0
  142. package/homebridge-ui/public/assets/devices/clean/clean-T2351.webp +0 -0
  143. package/homebridge-ui/public/assets/devices/clean/clean-T2352.webp +0 -0
  144. package/homebridge-ui/public/assets/devices/clean/clean-T2353.webp +0 -0
  145. package/homebridge-ui/public/assets/devices/life/life-T8L00.webp +0 -0
  146. package/homebridge-ui/public/assets/devices/life/life-T8L01.webp +0 -0
  147. package/homebridge-ui/public/assets/devices/life/life-T8L02.webp +0 -0
  148. package/homebridge-ui/public/assets/devices/life/life-T8L04.webp +0 -0
  149. package/homebridge-ui/public/assets/devices/life/life-T8L10.webp +0 -0
  150. package/homebridge-ui/public/assets/devices/life/life-T8L20.webp +0 -0
  151. package/homebridge-ui/public/assets/devices/life/life-T8L30.webp +0 -0
  152. package/homebridge-ui/public/assets/devices/life/life-T8L40.webp +0 -0
  153. package/homebridge-ui/public/assets/devices/mower/mower-T2801.webp +0 -0
  154. package/homebridge-ui/public/assets/devices/mower/mower-T280B.webp +0 -0
  155. package/homebridge-ui/public/assets/devices/mower/mower-T2880.webp +0 -0
  156. package/homebridge-ui/public/assets/devices/security/security-T7400.webp +0 -0
  157. package/homebridge-ui/public/assets/devices/security/security-T7401.webp +0 -0
  158. package/homebridge-ui/public/assets/devices/security/security-T8001.webp +0 -0
  159. package/homebridge-ui/public/assets/devices/security/security-T8002.webp +0 -0
  160. package/homebridge-ui/public/assets/devices/security/security-T8010.webp +0 -0
  161. package/homebridge-ui/public/assets/devices/security/security-T8021.webp +0 -0
  162. package/homebridge-ui/public/assets/devices/security/security-T8023.webp +0 -0
  163. package/homebridge-ui/public/assets/devices/security/security-T8025.webp +0 -0
  164. package/homebridge-ui/public/assets/devices/security/security-T8030.webp +0 -0
  165. package/homebridge-ui/public/assets/devices/security/security-T8110.webp +0 -0
  166. package/homebridge-ui/public/assets/devices/security/security-T8111.webp +0 -0
  167. package/homebridge-ui/public/assets/devices/security/security-T8112.webp +0 -0
  168. package/homebridge-ui/public/assets/devices/security/security-T8113.webp +0 -0
  169. package/homebridge-ui/public/assets/devices/security/security-T8114.webp +0 -0
  170. package/homebridge-ui/public/assets/devices/security/security-T8122.webp +0 -0
  171. package/homebridge-ui/public/assets/devices/security/security-T8123.webp +0 -0
  172. package/homebridge-ui/public/assets/devices/security/security-T8124.webp +0 -0
  173. package/homebridge-ui/public/assets/devices/security/security-T8130.webp +0 -0
  174. package/homebridge-ui/public/assets/devices/security/security-T8131.webp +0 -0
  175. package/homebridge-ui/public/assets/devices/security/security-T8134.webp +0 -0
  176. package/homebridge-ui/public/assets/devices/security/security-T8140.webp +0 -0
  177. package/homebridge-ui/public/assets/devices/security/security-T8141.webp +0 -0
  178. package/homebridge-ui/public/assets/devices/security/security-T8150.webp +0 -0
  179. package/homebridge-ui/public/assets/devices/security/security-T8151.webp +0 -0
  180. package/homebridge-ui/public/assets/devices/security/security-T8152.webp +0 -0
  181. package/homebridge-ui/public/assets/devices/security/security-T8153.webp +0 -0
  182. package/homebridge-ui/public/assets/devices/security/security-T8160.webp +0 -0
  183. package/homebridge-ui/public/assets/devices/security/security-T8161.webp +0 -0
  184. package/homebridge-ui/public/assets/devices/security/security-T8162.webp +0 -0
  185. package/homebridge-ui/public/assets/devices/security/security-T8170.webp +0 -0
  186. package/homebridge-ui/public/assets/devices/security/security-T8171.webp +0 -0
  187. package/homebridge-ui/public/assets/devices/security/security-T8172.webp +0 -0
  188. package/homebridge-ui/public/assets/devices/security/security-T8173.webp +0 -0
  189. package/homebridge-ui/public/assets/devices/security/security-T8200.webp +0 -0
  190. package/homebridge-ui/public/assets/devices/security/security-T8200X.webp +0 -0
  191. package/homebridge-ui/public/assets/devices/security/security-T8201.webp +0 -0
  192. package/homebridge-ui/public/assets/devices/security/security-T8203.webp +0 -0
  193. package/homebridge-ui/public/assets/devices/security/security-T8210.webp +0 -0
  194. package/homebridge-ui/public/assets/devices/security/security-T8213.webp +0 -0
  195. package/homebridge-ui/public/assets/devices/security/security-T8214.webp +0 -0
  196. package/homebridge-ui/public/assets/devices/security/security-T8222.webp +0 -0
  197. package/homebridge-ui/public/assets/devices/security/security-T8400.webp +0 -0
  198. package/homebridge-ui/public/assets/devices/security/security-T8401.webp +0 -0
  199. package/homebridge-ui/public/assets/devices/security/security-T8410.webp +0 -0
  200. package/homebridge-ui/public/assets/devices/security/security-T8411.webp +0 -0
  201. package/homebridge-ui/public/assets/devices/security/security-T8414.webp +0 -0
  202. package/homebridge-ui/public/assets/devices/security/security-T8416.webp +0 -0
  203. package/homebridge-ui/public/assets/devices/security/security-T8417.webp +0 -0
  204. package/homebridge-ui/public/assets/devices/security/security-T8419.webp +0 -0
  205. package/homebridge-ui/public/assets/devices/security/security-T8419N.webp +0 -0
  206. package/homebridge-ui/public/assets/devices/security/security-T8420.webp +0 -0
  207. package/homebridge-ui/public/assets/devices/security/security-T8420X.webp +0 -0
  208. package/homebridge-ui/public/assets/devices/security/security-T8422.webp +0 -0
  209. package/homebridge-ui/public/assets/devices/security/security-T8423.webp +0 -0
  210. package/homebridge-ui/public/assets/devices/security/security-T8424.webp +0 -0
  211. package/homebridge-ui/public/assets/devices/security/security-T8425.webp +0 -0
  212. package/homebridge-ui/public/assets/devices/security/security-T8441.webp +0 -0
  213. package/homebridge-ui/public/assets/devices/security/security-T8442.webp +0 -0
  214. package/homebridge-ui/public/assets/devices/security/security-T8452.webp +0 -0
  215. package/homebridge-ui/public/assets/devices/security/security-T84A0.webp +0 -0
  216. package/homebridge-ui/public/assets/devices/security/security-T84A1.webp +0 -0
  217. package/homebridge-ui/public/assets/devices/security/security-T8500.webp +0 -0
  218. package/homebridge-ui/public/assets/devices/security/security-T8502.webp +0 -0
  219. package/homebridge-ui/public/assets/devices/security/security-T8503.webp +0 -0
  220. package/homebridge-ui/public/assets/devices/security/security-T8504.webp +0 -0
  221. package/homebridge-ui/public/assets/devices/security/security-T8506.webp +0 -0
  222. package/homebridge-ui/public/assets/devices/security/security-T8510.webp +0 -0
  223. package/homebridge-ui/public/assets/devices/security/security-T8510P.webp +0 -0
  224. package/homebridge-ui/public/assets/devices/security/security-T8520.webp +0 -0
  225. package/homebridge-ui/public/assets/devices/security/security-T8520P.webp +0 -0
  226. package/homebridge-ui/public/assets/devices/security/security-T8530.webp +0 -0
  227. package/homebridge-ui/public/assets/devices/security/security-T8531.webp +0 -0
  228. package/homebridge-ui/public/assets/devices/security/security-T85D0.webp +0 -0
  229. package/homebridge-ui/public/assets/devices/security/security-T85L0.webp +0 -0
  230. package/homebridge-ui/public/assets/devices/security/security-T85P0.webp +0 -0
  231. package/homebridge-ui/public/assets/devices/security/security-T85V0.webp +0 -0
  232. package/homebridge-ui/public/assets/devices/security/security-T8600.webp +0 -0
  233. package/homebridge-ui/public/assets/devices/security/security-T86P2.webp +0 -0
  234. package/homebridge-ui/public/assets/devices/security/security-T8790.webp +0 -0
  235. package/homebridge-ui/public/assets/devices/security/security-T87B0.webp +0 -0
  236. package/homebridge-ui/public/assets/devices/security/security-T87B2.webp +0 -0
  237. package/homebridge-ui/public/assets/devices/security/security-T8900.webp +0 -0
  238. package/homebridge-ui/public/assets/devices/security/security-T8910.webp +0 -0
  239. package/homebridge-ui/public/assets/devices/security/security-T8920.webp +0 -0
  240. package/homebridge-ui/public/assets/devices/security/security-T8960.webp +0 -0
  241. package/homebridge-ui/public/assets/devices/security/security-T8B0.webp +0 -0
  242. package/homebridge-ui/public/assets/devices/security/security-T8E00.webp +0 -0
  243. package/homebridge-ui/public/assets/devices/security/security-T8N00.webp +0 -0
  244. package/homebridge-ui/public/assets/devices/security/security-T8W11C.webp +0 -0
  245. package/homebridge-ui/public/assets/devices/security/security-T90F0.webp +0 -0
  246. package/homebridge-ui/public/assets/devices/security/security-T90M0.webp +0 -0
  247. package/homebridge-ui/public/assets/devices/security/security-T90R0.webp +0 -0
  248. package/homebridge-ui/public/assets/devices/security/security-T90S0.webp +0 -0
  249. package/homebridge-ui/public/assets/icons/inventory.svg +1 -1
  250. package/homebridge-ui/public/assets/icons/troubleshoot.svg +1 -0
  251. package/homebridge-ui/public/assets/icons/warning.svg +1 -1
  252. package/homebridge-ui/public/assets/logo-dark.svg +10 -0
  253. package/homebridge-ui/public/assets/logo.svg +10 -0
  254. package/homebridge-ui/public/i18n/en.json +218 -0
  255. package/homebridge-ui/public/i18n/fr.json +218 -0
  256. package/homebridge-ui/public/index.html +377 -28
  257. package/homebridge-ui/public/js/app.js +1065 -0
  258. package/homebridge-ui/public/js/dashboard.js +385 -0
  259. package/homebridge-ui/public/js/legacy-settings.js +37 -0
  260. package/homebridge-ui/public/js/profile-wizard.js +68 -0
  261. package/homebridge-ui/server.js +2 -1393
  262. package/i18n/runtime/en.json +100 -0
  263. package/media/Snapshot-Unavailable.jpg +0 -0
  264. package/media/Snapshot-black.jpg +0 -0
  265. package/media/camera-disabled.jpg +0 -0
  266. package/media/camera-offline.jpg +0 -0
  267. package/package.json +29 -24
  268. package/.claude/CLAUDE.md +0 -175
  269. package/.claude/PRD.md +0 -241
  270. package/.claude/docs/debug-recording-lessons.md +0 -91
  271. package/.claude/docs/hksv-recording-fix.md +0 -160
  272. package/.claude/skills/architect/SKILL.md +0 -76
  273. package/.claude/skills/developer/SKILL.md +0 -59
  274. package/.claude/skills/new-device-support/SKILL.md +0 -212
  275. package/.claude/skills/new-device-support/check-device.mjs +0 -363
  276. package/.claude/skills/new-device-support/map-properties.mjs +0 -450
  277. package/.claude/skills/new-device-support/verify-device.mjs +0 -272
  278. package/.claude/skills/planner/SKILL.md +0 -100
  279. package/.claude/skills/qa/SKILL.md +0 -79
  280. package/.claude/skills/support/SKILL.md +0 -175
  281. package/.prettierignore +0 -7
  282. package/.prettierrc.json +0 -7
  283. package/FUNDING.yml +0 -1
  284. package/dist/accessories/AutoSyncStationAccessory.js +0 -157
  285. package/dist/accessories/AutoSyncStationAccessory.js.map +0 -1
  286. package/dist/accessories/BaseAccessory.js +0 -261
  287. package/dist/accessories/BaseAccessory.js.map +0 -1
  288. package/dist/accessories/CameraAccessory.js +0 -431
  289. package/dist/accessories/CameraAccessory.js.map +0 -1
  290. package/dist/accessories/Device.js +0 -65
  291. package/dist/accessories/Device.js.map +0 -1
  292. package/dist/accessories/EntrySensorAccessory.js +0 -48
  293. package/dist/accessories/EntrySensorAccessory.js.map +0 -1
  294. package/dist/accessories/LockAccessory.js +0 -142
  295. package/dist/accessories/LockAccessory.js.map +0 -1
  296. package/dist/accessories/MotionSensorAccessory.js +0 -48
  297. package/dist/accessories/MotionSensorAccessory.js.map +0 -1
  298. package/dist/accessories/SmartDropAccessory.js +0 -141
  299. package/dist/accessories/SmartDropAccessory.js.map +0 -1
  300. package/dist/accessories/StationAccessory.js +0 -373
  301. package/dist/accessories/StationAccessory.js.map +0 -1
  302. package/dist/config.js +0 -26
  303. package/dist/config.js.map +0 -1
  304. package/dist/controller/DebugRecordingManager.js +0 -402
  305. package/dist/controller/DebugRecordingManager.js.map +0 -1
  306. package/dist/controller/LocalLivestreamManager.js +0 -371
  307. package/dist/controller/LocalLivestreamManager.js.map +0 -1
  308. package/dist/controller/recordingDelegate.js +0 -252
  309. package/dist/controller/recordingDelegate.js.map +0 -1
  310. package/dist/controller/snapshotDelegate.js +0 -348
  311. package/dist/controller/snapshotDelegate.js.map +0 -1
  312. package/dist/controller/streamingDelegate.js +0 -389
  313. package/dist/controller/streamingDelegate.js.map +0 -1
  314. package/dist/interfaces.js +0 -2
  315. package/dist/interfaces.js.map +0 -1
  316. package/dist/media/Snapshot-Unavailable.png +0 -0
  317. package/dist/media/Snapshot-Unavailable.xcf +0 -0
  318. package/dist/media/Snapshot-black.png +0 -0
  319. package/dist/media/camera-disabled.png +0 -0
  320. package/dist/media/camera-offline.png +0 -0
  321. package/dist/media/media/Snapshot-Unavailable.png +0 -0
  322. package/dist/media/media/Snapshot-Unavailable.xcf +0 -0
  323. package/dist/media/media/Snapshot-black.png +0 -0
  324. package/dist/media/media/camera-disabled.png +0 -0
  325. package/dist/media/media/camera-offline.png +0 -0
  326. package/dist/utils/Talkback.js +0 -162
  327. package/dist/utils/Talkback.js.map +0 -1
  328. package/dist/utils/accessoriesStore.js +0 -207
  329. package/dist/utils/accessoriesStore.js.map +0 -1
  330. package/dist/utils/configTypes.js +0 -36
  331. package/dist/utils/configTypes.js.map +0 -1
  332. package/dist/utils/ffmpeg.js +0 -1111
  333. package/dist/utils/ffmpeg.js.map +0 -1
  334. package/dist/utils/interfaces.js +0 -8
  335. package/dist/utils/interfaces.js.map +0 -1
  336. package/dist/utils/utils.js +0 -224
  337. package/dist/utils/utils.js.map +0 -1
  338. package/dist/version.js +0 -2
  339. package/dist/version.js.map +0 -1
  340. package/homebridge-eufy-security.png +0 -0
  341. package/homebridge-ui/diagnosticsCrypto.js +0 -112
  342. package/homebridge-ui/public/app.js +0 -237
  343. package/homebridge-ui/public/assets/devices/4g_lte_cam_s330_large.png +0 -0
  344. package/homebridge-ui/public/assets/devices/4g_lte_starlight_large.jpg +0 -0
  345. package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C30.png +0 -0
  346. package/homebridge-ui/public/assets/devices/BATTERY_DOORBELL_C31.png +0 -0
  347. package/homebridge-ui/public/assets/devices/batterydoorbell1080p_large.jpg +0 -0
  348. package/homebridge-ui/public/assets/devices/batterydoorbell2k_large.png +0 -0
  349. package/homebridge-ui/public/assets/devices/batterydoorbell2kdual_large.jpg +0 -0
  350. package/homebridge-ui/public/assets/devices/batterydoorbell_e340_large.png +0 -0
  351. package/homebridge-ui/public/assets/devices/eufy-security-client.png +0 -0
  352. package/homebridge-ui/public/assets/devices/eufyCamS4_large.png +0 -0
  353. package/homebridge-ui/public/assets/devices/eufycam2_large.png +0 -0
  354. package/homebridge-ui/public/assets/devices/eufycam2c_large.jpg +0 -0
  355. package/homebridge-ui/public/assets/devices/eufycam2cpro_large.jpg +0 -0
  356. package/homebridge-ui/public/assets/devices/eufycam2pro_large.jpg +0 -0
  357. package/homebridge-ui/public/assets/devices/eufycam3_large.jpg +0 -0
  358. package/homebridge-ui/public/assets/devices/eufycam3c_large.jpg +0 -0
  359. package/homebridge-ui/public/assets/devices/eufycam3pro_large.png +0 -0
  360. package/homebridge-ui/public/assets/devices/eufycam_large.jpg +0 -0
  361. package/homebridge-ui/public/assets/devices/eufycame330_large.jpg +0 -0
  362. package/homebridge-ui/public/assets/devices/flood_freeze_sensor_e20_t90F0_large.png +0 -0
  363. package/homebridge-ui/public/assets/devices/floodlight2_large.jpg +0 -0
  364. package/homebridge-ui/public/assets/devices/floodlight2pro_large.jpg +0 -0
  365. package/homebridge-ui/public/assets/devices/floodlight_large.jpg +0 -0
  366. package/homebridge-ui/public/assets/devices/floodlightcame340_large.jpg +0 -0
  367. package/homebridge-ui/public/assets/devices/garage_camera_t8452_large.png +0 -0
  368. package/homebridge-ui/public/assets/devices/homebase2_large.png +0 -0
  369. package/homebridge-ui/public/assets/devices/homebase3_large.png +0 -0
  370. package/homebridge-ui/public/assets/devices/homebase_large.jpg +0 -0
  371. package/homebridge-ui/public/assets/devices/homebasemini_large.png +0 -0
  372. package/homebridge-ui/public/assets/devices/indoorcamC210_large.png +0 -0
  373. package/homebridge-ui/public/assets/devices/indoorcamC220_large.png +0 -0
  374. package/homebridge-ui/public/assets/devices/indoorcamC220_t8419N_large.png +0 -0
  375. package/homebridge-ui/public/assets/devices/indoorcamE30_large.png +0 -0
  376. package/homebridge-ui/public/assets/devices/indoorcamc120_large.png +0 -0
  377. package/homebridge-ui/public/assets/devices/indoorcammini_large.jpg +0 -0
  378. package/homebridge-ui/public/assets/devices/indoorcamp24_large.png +0 -0
  379. package/homebridge-ui/public/assets/devices/indoorcams350_large.png +0 -0
  380. package/homebridge-ui/public/assets/devices/keypad_large.png +0 -0
  381. package/homebridge-ui/public/assets/devices/minibase_chime_T8023_large.jpg +0 -0
  382. package/homebridge-ui/public/assets/devices/motionsensor_large.png +0 -0
  383. package/homebridge-ui/public/assets/devices/nvr_s4_max_T8N00_large.png +0 -0
  384. package/homebridge-ui/public/assets/devices/pir_sensor_e20_large.png +0 -0
  385. package/homebridge-ui/public/assets/devices/poe_bullet_ptz_cam_s4_T8E00_large.png +0 -0
  386. package/homebridge-ui/public/assets/devices/sensor_large.png +0 -0
  387. package/homebridge-ui/public/assets/devices/siren_sensor_e20_large.png +0 -0
  388. package/homebridge-ui/public/assets/devices/smartdrop_t8790_large.png +0 -0
  389. package/homebridge-ui/public/assets/devices/smartlock_t8500_large.png +0 -0
  390. package/homebridge-ui/public/assets/devices/smartlock_t8500_wifibridge_large.jpg +0 -0
  391. package/homebridge-ui/public/assets/devices/smartlock_t8503_large.png +0 -0
  392. package/homebridge-ui/public/assets/devices/smartlock_t8504_large.jpg +0 -0
  393. package/homebridge-ui/public/assets/devices/smartlock_t8510P_t8520P_large.png +0 -0
  394. package/homebridge-ui/public/assets/devices/smartlock_t85D0_large.png +0 -0
  395. package/homebridge-ui/public/assets/devices/smartlock_t85L0_large.png +0 -0
  396. package/homebridge-ui/public/assets/devices/smartlock_t85P0_large.png +0 -0
  397. package/homebridge-ui/public/assets/devices/smartlock_t85V0_large.png +0 -0
  398. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8502_large.png +0 -0
  399. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8506_large.png +0 -0
  400. package/homebridge-ui/public/assets/devices/smartlock_touch_and_wifi_t8520_large.png +0 -0
  401. package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_large.png +0 -0
  402. package/homebridge-ui/public/assets/devices/smartlock_touch_t8510_wifibridge_large.jpg +0 -0
  403. package/homebridge-ui/public/assets/devices/smartlock_video_t8530_large.png +0 -0
  404. package/homebridge-ui/public/assets/devices/smartlock_video_t8531_large.png +0 -0
  405. package/homebridge-ui/public/assets/devices/smartlockwifibridge_t8021_large.jpg +0 -0
  406. package/homebridge-ui/public/assets/devices/smartsafe_s10_t7400_large.png +0 -0
  407. package/homebridge-ui/public/assets/devices/smartsafe_s12_t7401_large.png +0 -0
  408. package/homebridge-ui/public/assets/devices/smarttrack_card_t87B2_large.png +0 -0
  409. package/homebridge-ui/public/assets/devices/smarttrack_link_t87B0_large.png +0 -0
  410. package/homebridge-ui/public/assets/devices/smoke_alarm_e10_t90S0_large.png +0 -0
  411. package/homebridge-ui/public/assets/devices/solocamc210_large.jpg +0 -0
  412. package/homebridge-ui/public/assets/devices/solocamc35_large.png +0 -0
  413. package/homebridge-ui/public/assets/devices/solocame20_large.jpg +0 -0
  414. package/homebridge-ui/public/assets/devices/solocame30_large.png +0 -0
  415. package/homebridge-ui/public/assets/devices/solocame40_large.jpg +0 -0
  416. package/homebridge-ui/public/assets/devices/solocame42_large.png +0 -0
  417. package/homebridge-ui/public/assets/devices/solocaml20_large.jpg +0 -0
  418. package/homebridge-ui/public/assets/devices/solocams220_large.jpg +0 -0
  419. package/homebridge-ui/public/assets/devices/solocams340_large.png +0 -0
  420. package/homebridge-ui/public/assets/devices/solocams40_large.jpg +0 -0
  421. package/homebridge-ui/public/assets/devices/soloindoorcamc24_large.jpg +0 -0
  422. package/homebridge-ui/public/assets/devices/solooutdoorcamc22_large.png +0 -0
  423. package/homebridge-ui/public/assets/devices/solooutdoorcamc24_large.jpg +0 -0
  424. package/homebridge-ui/public/assets/devices/unknown.png +0 -0
  425. package/homebridge-ui/public/assets/devices/walllight_s100_large.png +0 -0
  426. package/homebridge-ui/public/assets/devices/walllight_s120_large.png +0 -0
  427. package/homebridge-ui/public/assets/devices/water_freeze_sensor_t8920_large.png +0 -0
  428. package/homebridge-ui/public/assets/devices/wireddoorbell1080p_large.jpg +0 -0
  429. package/homebridge-ui/public/assets/devices/wireddoorbell2k_large.png +0 -0
  430. package/homebridge-ui/public/assets/devices/wireddoorbelldual_large.jpg +0 -0
  431. package/homebridge-ui/public/assets/icons/attach.svg +0 -1
  432. package/homebridge-ui/public/assets/icons/battery_0.svg +0 -1
  433. package/homebridge-ui/public/assets/icons/battery_1.svg +0 -1
  434. package/homebridge-ui/public/assets/icons/battery_2.svg +0 -1
  435. package/homebridge-ui/public/assets/icons/battery_3.svg +0 -1
  436. package/homebridge-ui/public/assets/icons/battery_4.svg +0 -1
  437. package/homebridge-ui/public/assets/icons/battery_5.svg +0 -1
  438. package/homebridge-ui/public/assets/icons/battery_6.svg +0 -1
  439. package/homebridge-ui/public/assets/icons/copy.svg +0 -1
  440. package/homebridge-ui/public/assets/icons/delete.svg +0 -1
  441. package/homebridge-ui/public/assets/icons/download.svg +0 -1
  442. package/homebridge-ui/public/assets/icons/info.svg +0 -1
  443. package/homebridge-ui/public/assets/icons/refresh.svg +0 -1
  444. package/homebridge-ui/public/assets/icons/satellite_alt.svg +0 -1
  445. package/homebridge-ui/public/assets/icons/solar_power.svg +0 -1
  446. package/homebridge-ui/public/components/device-card.js +0 -174
  447. package/homebridge-ui/public/components/guard-modes.js +0 -88
  448. package/homebridge-ui/public/components/number-input.js +0 -121
  449. package/homebridge-ui/public/components/select.js +0 -73
  450. package/homebridge-ui/public/components/toggle.js +0 -68
  451. package/homebridge-ui/public/services/api.js +0 -250
  452. package/homebridge-ui/public/services/config.js +0 -144
  453. package/homebridge-ui/public/style.css +0 -818
  454. package/homebridge-ui/public/utils/countries.js +0 -73
  455. package/homebridge-ui/public/utils/device-images.js +0 -102
  456. package/homebridge-ui/public/utils/helpers.js +0 -115
  457. package/homebridge-ui/public/views/dashboard.js +0 -226
  458. package/homebridge-ui/public/views/device-detail.js +0 -626
  459. package/homebridge-ui/public/views/diagnostics.js +0 -402
  460. package/homebridge-ui/public/views/login.js +0 -650
  461. package/homebridge-ui/public/views/recordings.js +0 -319
  462. package/homebridge-ui/public/views/settings.js +0 -197
  463. package/homebridge-ui/public/views/unsupported-detail.js +0 -296
  464. package/media/Snapshot-Unavailable.png +0 -0
  465. package/media/Snapshot-Unavailable.xcf +0 -0
  466. package/media/Snapshot-black.png +0 -0
  467. package/media/camera-disabled.png +0 -0
  468. package/media/camera-offline.png +0 -0
  469. package/scripts/decrypt-diagnostics.mjs +0 -257
@@ -0,0 +1,181 @@
1
+ import { describeHomeKitRepresentation } from '../homekit/representation.js';
2
+ import { MOTION_EVENT_REQUIREMENTS } from '../homekit/adapters/motion.js';
3
+ import { DOORBELL_PRESS_EVENT } from '../homekit/adapters/doorbell.js';
4
+ import { PLUGIN_VERSION } from '../diagnostics.js';
5
+ const DASHBOARD_FRESH_THRESHOLD_MS = 90_000;
6
+ function categoryOf(codec) {
7
+ if (codec === 'vacuum' || codec === 'mower') {
8
+ return 'clean';
9
+ }
10
+ if (codec === 'light' || codec === 'printer') {
11
+ return 'life';
12
+ }
13
+ return 'security';
14
+ }
15
+ function artworkOf(manifest) {
16
+ const model = manifest.model?.toUpperCase();
17
+ if (!model?.match(/^T[A-Z0-9]+$/)) {
18
+ return undefined;
19
+ }
20
+ const family = manifest.codec === 'vacuum' ? 'clean' : manifest.codec === 'mower' ? 'mower' : categoryOf(manifest.codec);
21
+ return `assets/devices/${family}/${family}-${model}.webp`;
22
+ }
23
+ function deviceClassOf(codec) {
24
+ const classes = {
25
+ station: 'homebase',
26
+ camera: 'camera',
27
+ sensor: 'sensor',
28
+ vacuum: 'vacuum',
29
+ mower: 'mower',
30
+ lock: 'other',
31
+ keypad: 'other',
32
+ light: 'light',
33
+ printer: 'printer',
34
+ display: 'other',
35
+ };
36
+ return classes[codec];
37
+ }
38
+ /**
39
+ * One device as the interface states it, offering only the preferences that device's representation would obey.
40
+ *
41
+ * A preference nothing reads is worse than an absent one: it invites a choice, records it, and changes nothing.
42
+ * Audio and snapshot mode both reach a camera's stream and nowhere else, so both require the camera capability —
43
+ * an `audio` capability alone is a speaker, which a station has for its siren and chimes and which no stream
44
+ * setting governs.
45
+ */
46
+ function projectDevice(manifest, representationEnabled) {
47
+ const admission = describeHomeKitRepresentation(manifest);
48
+ const represented = admission.represented && representationEnabled !== false;
49
+ const streams = admission.represented && manifest.capabilities.includes('camera');
50
+ const preferences = admission.represented ? ['represented'] : [];
51
+ if (streams && manifest.capabilities.includes('audio')) {
52
+ preferences.push('audio');
53
+ }
54
+ if (streams) {
55
+ preferences.push('snapshotMode');
56
+ }
57
+ return {
58
+ serial: manifest.sn,
59
+ name: manifest.name,
60
+ modelName: manifest.modelName,
61
+ category: categoryOf(manifest.codec),
62
+ deviceClass: deviceClassOf(manifest.codec),
63
+ recognized: true,
64
+ represented,
65
+ controllable: admission.controllable && represented,
66
+ diagnosticOnly: !admission.represented,
67
+ artwork: artworkOf(manifest),
68
+ preferences,
69
+ representation: admission.services,
70
+ };
71
+ }
72
+ /**
73
+ * Adds what the runtime observes to what its published inventory states.
74
+ *
75
+ * Keyed by the serial the inventory already carries, which is the one field of an observation this does not
76
+ * copy because the tile already states it. An unobserved field never arrives, so a device no observation
77
+ * mentions and a runtime that serves none both leave a tile with no observed field rather than a false one.
78
+ */
79
+ function observed(device, observations) {
80
+ const observation = observations.get(device.serial);
81
+ if (!observation) {
82
+ return device;
83
+ }
84
+ const { serial, ...fields } = observation;
85
+ return { ...device, ...fields };
86
+ }
87
+ /**
88
+ * Every media-triggering event the discovered devices report, which is what the warm-up setting may choose from.
89
+ *
90
+ * Read off the manifests of whichever inventory is being shown, so the offer matches the devices beside it.
91
+ */
92
+ function warmUpCandidatesOf(snapshot) {
93
+ const mediaTriggering = new Set([
94
+ ...MOTION_EVENT_REQUIREMENTS.map(({ eventName }) => eventName),
95
+ DOORBELL_PRESS_EVENT,
96
+ ]);
97
+ return [
98
+ ...new Set((snapshot?.devices ?? [])
99
+ .flatMap((manifest) => manifest.details.flatMap(({ events }) => events))
100
+ .filter((event) => mediaTriggering.has(event))),
101
+ ].sort();
102
+ }
103
+ /** Classifies runtime evidence, whether it was published to a file or stated by the running process. */
104
+ function stateOf(evidence) {
105
+ if (evidence.state === 'authentication-required') {
106
+ return 'authentication-required';
107
+ }
108
+ if (evidence.state === 'owner-conflict') {
109
+ return 'owner-conflict';
110
+ }
111
+ if (evidence.state === 'degraded' && evidence.status === 'transport-degraded') {
112
+ return 'degraded';
113
+ }
114
+ if (evidence.state === 'ready' && evidence.complete) {
115
+ return 'ready';
116
+ }
117
+ return 'incomplete';
118
+ }
119
+ /**
120
+ * Projects one persisted runtime snapshot without opening an Eufy connection.
121
+ *
122
+ * The devices only ever come from a published inventory, which is the allowlisted read model and the one
123
+ * thing a stale or degraded runtime retains. The runtime's state is the live one whenever a runtime is there
124
+ * to state it, and the file's own state and freshness alone when none is.
125
+ *
126
+ * An inventory committed for an account no runtime has started is shown as `restart-required`. That is the state
127
+ * after an interactive authentication, which discovers the account's devices and commits them with the
128
+ * generation, and on a first setup: the devices are known, and nothing about them is live until Homebridge
129
+ * restarts. Whenever the published record names the account that is active, none of this applies.
130
+ */
131
+ /**
132
+ * What the running build is, where it is not the one this process loaded.
133
+ *
134
+ * The comparison is only ever between two builds that both said which they are, so a runtime predating the field
135
+ * reads as agreement. `restartable` is narrowed to a definite boolean here, because the interface offers an
136
+ * action rather than a maybe.
137
+ */
138
+ function superseded(live) {
139
+ if (live.version === undefined || live.version === PLUGIN_VERSION) {
140
+ return {};
141
+ }
142
+ return { runningVersion: live.version, restartable: live.restartable === true };
143
+ }
144
+ export async function readDashboard(tracker, now = Date.now, representationPreferences = {}, channel, accounts) {
145
+ const record = await tracker.read();
146
+ const project = (snapshot) => snapshot?.devices.map((manifest) => projectDevice(manifest, representationPreferences[manifest.sn])) ?? [];
147
+ const active = await accounts?.active();
148
+ if (active && record?.generation !== active.generation) {
149
+ const discovered = active.snapshot.load() ?? undefined;
150
+ if (discovered) {
151
+ return {
152
+ state: 'restart-required',
153
+ devices: project(discovered),
154
+ warmUpCandidates: warmUpCandidatesOf(discovered),
155
+ };
156
+ }
157
+ }
158
+ if (!record) {
159
+ return { state: 'missing', devices: [], warmUpCandidates: [] };
160
+ }
161
+ const updatedAt = Date.parse(record.updatedAt);
162
+ const age = now() - updatedAt;
163
+ const devices = project(record.snapshot);
164
+ const warmUpCandidates = warmUpCandidatesOf(record.snapshot);
165
+ const live = await channel?.read();
166
+ if (live) {
167
+ const observations = new Map((live.devices ?? []).map((observation) => [observation.serial, observation]));
168
+ return {
169
+ state: stateOf(live.status),
170
+ updatedAt: live.status.updatedAt,
171
+ devices: devices.map((device) => observed(device, observations)),
172
+ warmUpCandidates,
173
+ ...superseded(live),
174
+ };
175
+ }
176
+ if (!Number.isFinite(updatedAt) || age < -5_000 || age > DASHBOARD_FRESH_THRESHOLD_MS) {
177
+ return { state: 'stale', updatedAt: record.updatedAt, devices, warmUpCandidates };
178
+ }
179
+ return { state: stateOf(record), updatedAt: record.updatedAt, devices, warmUpCandidates };
180
+ }
181
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/ui/dashboard.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,4BAA4B,GAAG,MAAM,CAAC;AA+F5C,SAAS,UAAU,CAAC,KAA8B;IAChD,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,SAAS,CAAC,QAAwB;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GACV,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5G,OAAO,kBAAkB,MAAM,IAAI,MAAM,IAAI,KAAK,OAAO,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,KAA8B;IACnD,MAAM,OAAO,GAAoE;QAC/E,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,OAAO;KACjB,CAAC;IACF,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,QAAwB,EAAE,qBAA0C;IACzF,MAAM,SAAS,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,IAAI,qBAAqB,KAAK,KAAK,CAAC;IAC7E,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClF,MAAM,WAAW,GAAmC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,IAAI,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,EAAE;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,WAAW,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC1C,UAAU,EAAE,IAAI;QAChB,WAAW;QACX,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,WAAW;QACnD,cAAc,EAAE,CAAC,SAAS,CAAC,WAAW;QACtC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC5B,WAAW;QACX,cAAc,EAAE,SAAS,CAAC,QAAQ;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,QAAQ,CAAC,MAAuB,EAAE,YAAuD;IAChG,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,WAAW,CAAC;IAC1C,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,QAA4C;IACtE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS;QACtC,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC;QAC9D,oBAAoB;KACrB,CAAC,CAAC;IACH,OAAO;QACL,GAAG,IAAI,GAAG,CACR,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC;aACtB,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;aACvE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CACjD;KACF,CAAC,IAAI,EAAE,CAAC;AACX,CAAC;AAED,wGAAwG;AACxG,SAAS,OAAO,CAAC,QAAqE;IACpF,IAAI,QAAQ,CAAC,KAAK,KAAK,yBAAyB,EAAE,CAAC;QACjD,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,gBAAgB,EAAE,CAAC;QACxC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QAC9E,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACpD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;GAWG;AACH;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,IAA2B;IAC7C,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAyB,EACzB,GAAG,GAAiB,IAAI,CAAC,GAAG,EAC5B,yBAAyB,GAAsC,EAAE,EACjE,OAA8B,EAC9B,QAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,CAAC,QAA4C,EAAqB,EAAE,CAClF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,yBAAyB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7G,MAAM,MAAM,GAAG,MAAM,QAAQ,EAAE,MAAM,EAAE,CAAC;IACxC,IAAI,MAAM,IAAI,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;QACvD,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;gBAC5B,gBAAgB,EAAE,kBAAkB,CAAC,UAAU,CAAC;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,SAAS,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3G,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAChE,gBAAgB;YAChB,GAAG,UAAU,CAAC,IAAI,CAAC;SACpB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,GAAG,4BAA4B,EAAE,CAAC;QACtF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The retained last successful image for one device, where it exists and may be shown.
3
+ *
4
+ * Withheld for a camera an admitted observation reports as disabled: a real frame from before the camera was
5
+ * switched off would misrepresent what it is doing now. An enablement nothing observes is not a disabled one,
6
+ * so a device on a runtime that is not running, and a camera whose reading the SDK declines to stand behind,
7
+ * are served. Withholding on the unknown instead would blank a tile on every first setup and every stopped
8
+ * runtime, which is the more common state by far.
9
+ *
10
+ * The image is answered as base64 for a `data:` URL, which is the one shape this interface ships bytes to the
11
+ * browser in. Nothing here reaches a log or a support archive: these are plaintext camera images, and the
12
+ * archive excludes their class permanently.
13
+ */
14
+ export async function readDeviceImage(images, channel, serial) {
15
+ const reading = await channel.read();
16
+ if (reading?.devices?.find((device) => device.serial === serial)?.enabled === false) {
17
+ return { image: null };
18
+ }
19
+ const jpeg = await images.read(serial);
20
+ return { image: jpeg ? jpeg.toString('base64') : null };
21
+ }
22
+ //# sourceMappingURL=device-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-image.js","sourceRoot":"","sources":["../../src/ui/device-image.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAmD,EACnD,OAA6B,EAC7B,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;QACpF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,305 @@
1
+ import { createConnection } from 'node:net';
2
+ import { answeredDevice, answeredStatus, areRuntimeChannelDevices, FrameReader, isRuntimeChannelStatus, ownedSocket, RUNTIME_CHANNEL_CONNECT_TIMEOUT_MS, RUNTIME_CHANNEL_PROTOCOL, RUNTIME_CHANNEL_RESPONSE_TIMEOUT_MS, RUNTIME_CHANNEL_STAND_DOWN_TIMEOUT_MS, RUNTIME_DEVICES_PATH, RUNTIME_DIAGNOSTICS_PATH, RUNTIME_RESTART_PATH, RUNTIME_STAND_DOWN_PATH, RUNTIME_STATUS_PATH, } from '../runtime/channel.js';
3
+ const STATUS_REQUEST = 1;
4
+ const DEVICES_REQUEST = 2;
5
+ const DIAGNOSTICS_REQUEST = 3;
6
+ const DEPARTURE_REQUEST = 4;
7
+ /**
8
+ * Speaks the channel the runtime serves while it owns the account session: reads, notifications, requests.
9
+ *
10
+ * Every failure resolves to absence rather than rejecting: an unreachable address, a refused connection, a
11
+ * protocol this client does not speak, a bound endpoint that never answers within the response bound, a
12
+ * frame larger than the bound, a malformed or unrecognised status, and a shared address that is not an
13
+ * owner-only socket belonging to this user are one outcome, which is that there is no runtime to ask. A
14
+ * refused request is not one of them: a path this runtime does not serve leaves its own answer out and the
15
+ * rest of the reading stands.
16
+ *
17
+ * One connection per operation, its requests correlated by identity, closed once the operation settles.
18
+ */
19
+ export class RuntimeChannelClient {
20
+ endpoint;
21
+ connectTimeoutMs;
22
+ responseTimeoutMs;
23
+ standDownTimeoutMs;
24
+ constructor(endpoint, options = {}) {
25
+ this.endpoint = endpoint;
26
+ this.connectTimeoutMs = options.connectTimeoutMs ?? RUNTIME_CHANNEL_CONNECT_TIMEOUT_MS;
27
+ this.responseTimeoutMs = options.responseTimeoutMs ?? RUNTIME_CHANNEL_RESPONSE_TIMEOUT_MS;
28
+ this.standDownTimeoutMs = options.standDownTimeoutMs ?? RUNTIME_CHANNEL_STAND_DOWN_TIMEOUT_MS;
29
+ }
30
+ async read() {
31
+ return this.over(undefined, (connection) => this.exchange(connection));
32
+ }
33
+ /**
34
+ * Tells the runtime which authorized evidence window was written, so it reads the file now.
35
+ *
36
+ * Settles once the runtime has answered, within the same bounds a read observes. Nothing is reported either
37
+ * way: the file the runtime reads is the authority, and it decided before this was sent.
38
+ */
39
+ async notifyAuthorization(supportCaseId) {
40
+ return this.over(undefined, (connection) => this.notified(connection, supportCaseId));
41
+ }
42
+ /**
43
+ * Asks the runtime to release the account session, reporting whether it stood down.
44
+ *
45
+ * True means the request was sent and the endpoint then closed without refusing it. A runtime closes it inside
46
+ * the ownership release guard, so the lease is released, but this remains a claim about another process and
47
+ * never proof: only acquiring the lease is that. False is every other outcome — an explicit refusal, a runtime
48
+ * that is absent or speaks another protocol, and one that did not finish within the bound — and they are one
49
+ * answer, which is that the session was not freed.
50
+ */
51
+ async requestStandDown() {
52
+ return this.over(false, (connection) => this.accepted(connection, RUNTIME_STAND_DOWN_PATH));
53
+ }
54
+ /**
55
+ * Asks the runtime to end itself so Homebridge brings up the installed build, reporting whether it accepted.
56
+ *
57
+ * A runtime that does not serve the path, or refuses because ending it would not replace it, is a false rather
58
+ * than a failure, so a caller never has to tell an old runtime apart from an unwilling one.
59
+ */
60
+ async requestRestart() {
61
+ return this.over(false, (connection) => this.accepted(connection, RUNTIME_RESTART_PATH));
62
+ }
63
+ /**
64
+ * Runs one operation over its own connection, answering `absent` wherever the endpoint could not be used.
65
+ *
66
+ * The connection is closed however the operation ends. A shared address is proven to be an owner-only socket of
67
+ * this user before it is connected to, because an address another local user can create an entry at is one they
68
+ * could be answering at.
69
+ */
70
+ async over(absent, operation) {
71
+ if (this.endpoint.shared && !(await ownedSocket(this.endpoint.path))) {
72
+ return absent;
73
+ }
74
+ let connection;
75
+ try {
76
+ connection = await this.connect();
77
+ return await operation(connection);
78
+ }
79
+ catch {
80
+ return absent;
81
+ }
82
+ finally {
83
+ connection?.destroy();
84
+ }
85
+ }
86
+ connect() {
87
+ return new Promise((resolve, reject) => {
88
+ const connection = createConnection(this.endpoint.path);
89
+ const settle = setTimeout(() => {
90
+ connection.destroy();
91
+ reject(new Error('runtime channel connect timed out'));
92
+ }, this.connectTimeoutMs);
93
+ settle.unref();
94
+ connection.once('error', (error) => {
95
+ clearTimeout(settle);
96
+ reject(error);
97
+ });
98
+ connection.once('connect', () => {
99
+ clearTimeout(settle);
100
+ resolve(connection);
101
+ });
102
+ });
103
+ }
104
+ /**
105
+ * Sends one notification after the greeting and concludes when it is answered.
106
+ *
107
+ * Concludes rather than fails on every other outcome. A protocol this client does not speak concludes without
108
+ * sending, so a runtime running older code is never handed a frame it would read as something else.
109
+ */
110
+ notified(connection, supportCaseId) {
111
+ return new Promise((resolve) => {
112
+ const settle = setTimeout(resolve, this.responseTimeoutMs);
113
+ settle.unref();
114
+ const conclude = () => {
115
+ clearTimeout(settle);
116
+ resolve();
117
+ };
118
+ const reader = new FrameReader();
119
+ let greeted = false;
120
+ connection.once('error', conclude);
121
+ connection.once('close', conclude);
122
+ connection.on('data', (chunk) => {
123
+ const frames = reader.accept(chunk);
124
+ if (!frames) {
125
+ conclude();
126
+ return;
127
+ }
128
+ for (const frame of frames) {
129
+ let parsed;
130
+ try {
131
+ parsed = JSON.parse(frame);
132
+ }
133
+ catch {
134
+ conclude();
135
+ return;
136
+ }
137
+ if (greeted) {
138
+ if (parsed?.id === DIAGNOSTICS_REQUEST) {
139
+ conclude();
140
+ return;
141
+ }
142
+ continue;
143
+ }
144
+ if (parsed?.protocol !== RUNTIME_CHANNEL_PROTOCOL) {
145
+ conclude();
146
+ return;
147
+ }
148
+ greeted = true;
149
+ connection.write(`${JSON.stringify({
150
+ v: RUNTIME_CHANNEL_PROTOCOL,
151
+ id: DIAGNOSTICS_REQUEST,
152
+ path: RUNTIME_DIAGNOSTICS_PATH,
153
+ body: { supportCaseId },
154
+ })}\n`);
155
+ }
156
+ });
157
+ });
158
+ }
159
+ /**
160
+ * Sends one departure request after the greeting and reports what became of it.
161
+ *
162
+ * A runtime that releases its session or ends for replacement closes its endpoint at the end of its own bounded
163
+ * shutdown, so the closing is the completion this waits for and an explicit refusal is the one answer that ends
164
+ * it early. Acceptance is not waited for, because a runtime that closes the connection may not have flushed it.
165
+ * A protocol this client does not speak is never sent the request, so a frame an older runtime reads as
166
+ * something else cannot take a session down that nothing asked for.
167
+ */
168
+ accepted(connection, path) {
169
+ return new Promise((resolve) => {
170
+ const settle = setTimeout(() => resolve(false), this.standDownTimeoutMs);
171
+ settle.unref();
172
+ const conclude = (accepted) => {
173
+ clearTimeout(settle);
174
+ resolve(accepted);
175
+ };
176
+ const reader = new FrameReader();
177
+ let requested = false;
178
+ connection.once('error', () => conclude(requested));
179
+ connection.once('close', () => conclude(requested));
180
+ connection.on('data', (chunk) => {
181
+ const frames = reader.accept(chunk);
182
+ if (!frames) {
183
+ conclude(false);
184
+ return;
185
+ }
186
+ for (const frame of frames) {
187
+ let parsed;
188
+ try {
189
+ parsed = JSON.parse(frame);
190
+ }
191
+ catch {
192
+ conclude(false);
193
+ return;
194
+ }
195
+ if (!requested) {
196
+ if (parsed?.protocol !== RUNTIME_CHANNEL_PROTOCOL) {
197
+ conclude(false);
198
+ return;
199
+ }
200
+ requested = true;
201
+ connection.write(`${JSON.stringify({ v: RUNTIME_CHANNEL_PROTOCOL, id: DEPARTURE_REQUEST, path })}\n`);
202
+ continue;
203
+ }
204
+ const response = parsed;
205
+ if (response?.id === DEPARTURE_REQUEST && !response.ok) {
206
+ conclude(false);
207
+ return;
208
+ }
209
+ }
210
+ });
211
+ });
212
+ }
213
+ exchange(connection) {
214
+ return new Promise((resolve, reject) => {
215
+ const settle = setTimeout(() => concludeOrFail('runtime channel response timed out'), this.responseTimeoutMs);
216
+ settle.unref();
217
+ const reader = new FrameReader();
218
+ let greeting;
219
+ const fail = (message) => {
220
+ clearTimeout(settle);
221
+ reject(new Error(message));
222
+ };
223
+ /**
224
+ * Concludes with the status alone where the observations never settled.
225
+ *
226
+ * The status is one answer and the observations are another, so a runtime that answers the first and
227
+ * then says nothing must not cost both. Only a read with no status at all is a failure.
228
+ */
229
+ const concludeOrFail = (message) => {
230
+ if (greeting && answeredStatusValue) {
231
+ devicesSettled = true;
232
+ settleIfComplete();
233
+ return;
234
+ }
235
+ fail(message);
236
+ };
237
+ connection.once('error', () => concludeOrFail('runtime channel faulted'));
238
+ connection.once('close', () => concludeOrFail('runtime channel closed before answering'));
239
+ let answeredStatusValue;
240
+ let answeredDevices;
241
+ let devicesSettled = false;
242
+ const settleIfComplete = () => {
243
+ if (!greeting || !answeredStatusValue || !devicesSettled) {
244
+ return;
245
+ }
246
+ clearTimeout(settle);
247
+ resolve({
248
+ ready: greeting.ready,
249
+ status: answeredStatusValue,
250
+ ...(answeredDevices === undefined ? {} : { devices: answeredDevices }),
251
+ ...(greeting.version === undefined ? {} : { version: greeting.version }),
252
+ ...(greeting.restartable === undefined ? {} : { restartable: greeting.restartable }),
253
+ });
254
+ };
255
+ connection.on('data', (chunk) => {
256
+ const frames = reader.accept(chunk);
257
+ if (!frames) {
258
+ connection.destroy();
259
+ return;
260
+ }
261
+ for (const frame of frames) {
262
+ let parsed;
263
+ try {
264
+ parsed = JSON.parse(frame);
265
+ }
266
+ catch {
267
+ fail('runtime channel sent an unreadable frame');
268
+ return;
269
+ }
270
+ if (!greeting) {
271
+ const opened = parsed;
272
+ if (opened?.protocol !== RUNTIME_CHANNEL_PROTOCOL || typeof opened.ready !== 'boolean') {
273
+ fail('runtime channel speaks another protocol');
274
+ return;
275
+ }
276
+ greeting = opened;
277
+ connection.write(`${JSON.stringify({ v: RUNTIME_CHANNEL_PROTOCOL, id: STATUS_REQUEST, path: RUNTIME_STATUS_PATH })}\n` +
278
+ `${JSON.stringify({ v: RUNTIME_CHANNEL_PROTOCOL, id: DEVICES_REQUEST, path: RUNTIME_DEVICES_PATH })}\n`);
279
+ continue;
280
+ }
281
+ const response = parsed;
282
+ if (response?.id === STATUS_REQUEST) {
283
+ if (!response.ok || !isRuntimeChannelStatus(response.data)) {
284
+ fail('runtime channel answered no status this client can use');
285
+ return;
286
+ }
287
+ answeredStatusValue = answeredStatus(response.data);
288
+ }
289
+ else if (response?.id === DEVICES_REQUEST) {
290
+ devicesSettled = true;
291
+ if (response.ok) {
292
+ if (!areRuntimeChannelDevices(response.data)) {
293
+ fail('runtime channel answered no observations this client can use');
294
+ return;
295
+ }
296
+ answeredDevices = response.data.map(answeredDevice);
297
+ }
298
+ }
299
+ settleIfComplete();
300
+ }
301
+ });
302
+ });
303
+ }
304
+ }
305
+ //# sourceMappingURL=runtime-channel-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-channel-client.js","sourceRoot":"","sources":["../../src/ui/runtime-channel-client.ts"],"names":[],"mappings":"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"}