@synnaxlabs/client 0.56.1 → 0.57.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 (741) hide show
  1. package/dist/client-B08VDLSA.js +14463 -0
  2. package/dist/client-B08VDLSA.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +71 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +43 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +37 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +40 -17
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +279 -0
  398. package/src/framer/cache/reader.ts +160 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +104 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +18 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -0,0 +1,267 @@
1
+ // Copyright 2026 Synnax Labs, Inc.
2
+ //
3
+ // Use of this software is governed by the Business Source License included in the file
4
+ // licenses/BSL.txt.
5
+ //
6
+ // As of the Change Date specified in that file, in accordance with the Business Source
7
+ // License, use of this software will be governed by the Apache License, Version 2.0,
8
+ // included in the file licenses/APL.txt.
9
+
10
+ // Code generated by Oracle. DO NOT EDIT.
11
+ import { spatial, zod } from "@synnaxlabs/x";
12
+ import { type Draft } from "immer";
13
+ import { z } from "zod";
14
+
15
+ import { actions } from "@/actions";
16
+ import { ontology } from "@/ontology";
17
+ import { keyZ, type Panel, panelZ, tabKeyZ, tabZ, viewZ } from "@/panel/types.gen";
18
+
19
+ /**
20
+ * Create replaces the document with the given created state. Emitted by the Core on
21
+ * create so remote caches ingest new documents; clients never dispatch it.
22
+ */
23
+ export const createPayloadZ = z.object({
24
+ panel: panelZ,
25
+ });
26
+
27
+ export type CreatePayload = z.infer<typeof createPayloadZ>;
28
+
29
+ /** Rename renames the panel. */
30
+ export const renamePayloadZ = z.object({
31
+ name: z.string(),
32
+ });
33
+
34
+ export type RenamePayload = z.infer<typeof renamePayloadZ>;
35
+
36
+ /**
37
+ * InsertTabs inserts tabs into a leaf in order, starting at the given index and
38
+ * appending when index is absent or past the leaf's end. The destination leaf is
39
+ * resolved from target_tab (the leaf holding that tab) when set, otherwise from the
40
+ * target_leaf path-derived key, otherwise the first leaf in traversal order. Both are
41
+ * hints: a target that no longer resolves to a leaf falls back to the first leaf
42
+ * instead of failing, so a placement invalidated between the gesture and the dispatch
43
+ * still opens the tabs. The fallback drops location too, leaving a leaf the caller
44
+ * never pointed at unsplit. When location is an edge, the resolved leaf is split once
45
+ * at that location and every tab is inserted into the new empty leaf; a center location
46
+ * places the tabs directly in the resolved leaf, equivalent to absent. The split is
47
+ * deferred to the first tab that lands, so a batch whose every tab is skipped leaves no
48
+ * empty pane behind. A tab whose key is already in the tree has its content refreshed
49
+ * and keeps its position unless the payload carries an explicit placement, in which
50
+ * case it is relocated with the rest. Inserting a resource tab whose resource already
51
+ * backs a different tab is skipped, as is a view tab of a type already backing a tab
52
+ * when singleton is set: each may back at most one tab per panel, and callers select
53
+ * the existing tab instead. Skipping one tab does not stop the others.
54
+ */
55
+ export const insertTabsPayloadZ = z.object({
56
+ tabs: tabZ.array().default(() => []),
57
+ targetLeaf: z.int32().optional(),
58
+ targetTab: tabKeyZ.optional(),
59
+ index: z.int32().optional(),
60
+ location: spatial.locationZ.optional(),
61
+ singleton: z.boolean().optional(),
62
+ });
63
+
64
+ export type InsertTabsPayload = z.infer<typeof insertTabsPayloadZ>;
65
+
66
+ /**
67
+ * RemoveTab removes the tab with the given key. If the containing leaf becomes empty
68
+ * and has a sibling, the reducer collapses the parent split.
69
+ */
70
+ export const removeTabPayloadZ = z.object({
71
+ key: tabKeyZ,
72
+ });
73
+
74
+ export type RemoveTabPayload = z.infer<typeof removeTabPayloadZ>;
75
+
76
+ /**
77
+ * MoveTab moves a tab to a position within the panel. When location is an edge, the
78
+ * target leaf is first split at that location and the tab moves into the new empty
79
+ * leaf; moving a leaf's only tab to an edge of its own leaf is a no-op. A center
80
+ * location places the tab directly in the target leaf, equivalent to absent.
81
+ * Cross-panel moves are RemoveTab on the source plus InsertTabs on the destination (two
82
+ * dispatches; not atomic).
83
+ */
84
+ export const moveTabPayloadZ = z.object({
85
+ key: tabKeyZ,
86
+ targetLeaf: z.int32(),
87
+ index: z.int32().optional(),
88
+ location: spatial.locationZ.optional(),
89
+ });
90
+
91
+ export type MoveTabPayload = z.infer<typeof moveTabPayloadZ>;
92
+
93
+ /**
94
+ * SplitTab splits the tab with the given key off its leaf into a new sibling pane,
95
+ * moving the tab into it. direction x places the new pane to the right, y to the
96
+ * bottom. The tab must share its leaf with at least one other tab; splitting the only
97
+ * tab in a leaf is a no-op.
98
+ */
99
+ export const splitTabPayloadZ = z.object({
100
+ key: tabKeyZ,
101
+ direction: spatial.directionZ,
102
+ });
103
+
104
+ export type SplitTabPayload = z.infer<typeof splitTabPayloadZ>;
105
+
106
+ /** ResizeSplit adjusts the size ratio of a split node. size in [0, 1]. */
107
+ export const resizeSplitPayloadZ = z.object({
108
+ split: z.int32(),
109
+ size: spatial.decimalZ,
110
+ });
111
+
112
+ export type ResizeSplitPayload = z.infer<typeof resizeSplitPayloadZ>;
113
+
114
+ /**
115
+ * SetTabResource sets the visualization resource displayed by the tab with the given
116
+ * key, swapping it in place without changing the tab's identity or position. Clears any
117
+ * view set on the tab. A no-op when the resource already backs another tab in the
118
+ * panel. Used to fill a freshly inserted selector tab once the user picks a
119
+ * visualization.
120
+ */
121
+ export const setTabResourcePayloadZ = z.object({
122
+ key: tabKeyZ,
123
+ resource: ontology.idZ,
124
+ });
125
+
126
+ export type SetTabResourcePayload = z.infer<typeof setTabResourcePayloadZ>;
127
+
128
+ /**
129
+ * SetTabView sets the inline view displayed by the tab with the given key, swapping it
130
+ * in place without changing the tab's identity or position. Clears any resource set on
131
+ * the tab.
132
+ */
133
+ export const setTabViewPayloadZ = z.object({
134
+ key: tabKeyZ,
135
+ view: viewZ,
136
+ });
137
+
138
+ export type SetTabViewPayload = z.infer<typeof setTabViewPayloadZ>;
139
+
140
+ export const actionZ = z.discriminatedUnion("type", [
141
+ z.object({ type: z.literal("create"), create: createPayloadZ }),
142
+ z.object({ type: z.literal("rename"), rename: renamePayloadZ }),
143
+ z.object({ type: z.literal("insert_tabs"), insertTabs: insertTabsPayloadZ }),
144
+ z.object({ type: z.literal("remove_tab"), removeTab: removeTabPayloadZ }),
145
+ z.object({ type: z.literal("move_tab"), moveTab: moveTabPayloadZ }),
146
+ z.object({ type: z.literal("split_tab"), splitTab: splitTabPayloadZ }),
147
+ z.object({ type: z.literal("resize_split"), resizeSplit: resizeSplitPayloadZ }),
148
+ z.object({
149
+ type: z.literal("set_tab_resource"),
150
+ setTabResource: setTabResourcePayloadZ,
151
+ }),
152
+ z.object({ type: z.literal("set_tab_view"), setTabView: setTabViewPayloadZ }),
153
+ ]);
154
+
155
+ export type Action = z.infer<typeof actionZ>;
156
+
157
+ export const create = (payload: z.input<typeof createPayloadZ>): Action => ({
158
+ type: "create",
159
+ create: zod.parse(createPayloadZ, payload, {
160
+ label: "panel create action payload",
161
+ }),
162
+ });
163
+
164
+ export const rename = (payload: z.input<typeof renamePayloadZ>): Action => ({
165
+ type: "rename",
166
+ rename: zod.parse(renamePayloadZ, payload, {
167
+ label: "panel rename action payload",
168
+ }),
169
+ });
170
+
171
+ export const insertTabs = (payload: z.input<typeof insertTabsPayloadZ>): Action => ({
172
+ type: "insert_tabs",
173
+ insertTabs: zod.parse(insertTabsPayloadZ, payload, {
174
+ label: "panel insert_tabs action payload",
175
+ }),
176
+ });
177
+
178
+ export const removeTab = (payload: z.input<typeof removeTabPayloadZ>): Action => ({
179
+ type: "remove_tab",
180
+ removeTab: zod.parse(removeTabPayloadZ, payload, {
181
+ label: "panel remove_tab action payload",
182
+ }),
183
+ });
184
+
185
+ export const moveTab = (payload: z.input<typeof moveTabPayloadZ>): Action => ({
186
+ type: "move_tab",
187
+ moveTab: zod.parse(moveTabPayloadZ, payload, {
188
+ label: "panel move_tab action payload",
189
+ }),
190
+ });
191
+
192
+ export const splitTab = (payload: z.input<typeof splitTabPayloadZ>): Action => ({
193
+ type: "split_tab",
194
+ splitTab: zod.parse(splitTabPayloadZ, payload, {
195
+ label: "panel split_tab action payload",
196
+ }),
197
+ });
198
+
199
+ export const resizeSplit = (payload: z.input<typeof resizeSplitPayloadZ>): Action => ({
200
+ type: "resize_split",
201
+ resizeSplit: zod.parse(resizeSplitPayloadZ, payload, {
202
+ label: "panel resize_split action payload",
203
+ }),
204
+ });
205
+
206
+ export const setTabResource = (
207
+ payload: z.input<typeof setTabResourcePayloadZ>,
208
+ ): Action => ({
209
+ type: "set_tab_resource",
210
+ setTabResource: zod.parse(setTabResourcePayloadZ, payload, {
211
+ label: "panel set_tab_resource action payload",
212
+ }),
213
+ });
214
+
215
+ export const setTabView = (payload: z.input<typeof setTabViewPayloadZ>): Action => ({
216
+ type: "set_tab_view",
217
+ setTabView: zod.parse(setTabViewPayloadZ, payload, {
218
+ label: "panel set_tab_view action payload",
219
+ }),
220
+ });
221
+
222
+ export type HandlerResult = actions.HandlerResult<Action>;
223
+
224
+ export type ReduceAllResult = actions.ReduceAllResult<Panel, Action>;
225
+
226
+ export interface Handlers {
227
+ create: (state: Draft<Panel>, payload: CreatePayload) => HandlerResult;
228
+ rename: (state: Draft<Panel>, payload: RenamePayload) => HandlerResult;
229
+ insertTabs: (state: Draft<Panel>, payload: InsertTabsPayload) => HandlerResult;
230
+ removeTab: (state: Draft<Panel>, payload: RemoveTabPayload) => HandlerResult;
231
+ moveTab: (state: Draft<Panel>, payload: MoveTabPayload) => HandlerResult;
232
+ splitTab: (state: Draft<Panel>, payload: SplitTabPayload) => HandlerResult;
233
+ resizeSplit: (state: Draft<Panel>, payload: ResizeSplitPayload) => HandlerResult;
234
+ setTabResource: (
235
+ state: Draft<Panel>,
236
+ payload: SetTabResourcePayload,
237
+ ) => HandlerResult;
238
+ setTabView: (state: Draft<Panel>, payload: SetTabViewPayload) => HandlerResult;
239
+ }
240
+
241
+ export const createReduceAll = (handlers: Handlers) =>
242
+ actions.createReduceAll<Panel, Action>((state, action) => {
243
+ switch (action.type) {
244
+ case "create":
245
+ return handlers.create(state, action.create);
246
+ case "rename":
247
+ return handlers.rename(state, action.rename);
248
+ case "insert_tabs":
249
+ return handlers.insertTabs(state, action.insertTabs);
250
+ case "remove_tab":
251
+ return handlers.removeTab(state, action.removeTab);
252
+ case "move_tab":
253
+ return handlers.moveTab(state, action.moveTab);
254
+ case "split_tab":
255
+ return handlers.splitTab(state, action.splitTab);
256
+ case "resize_split":
257
+ return handlers.resizeSplit(state, action.resizeSplit);
258
+ case "set_tab_resource":
259
+ return handlers.setTabResource(state, action.setTabResource);
260
+ case "set_tab_view":
261
+ return handlers.setTabView(state, action.setTabView);
262
+ }
263
+ });
264
+
265
+ export const scopedActionZ = actions.scopedZ(keyZ, actionZ);
266
+
267
+ export const dispatchReqZ = actions.dispatchReqZ(keyZ, actionZ);
@@ -0,0 +1,357 @@
1
+ // Copyright 2026 Synnax Labs, Inc.
2
+ //
3
+ // Use of this software is governed by the Business Source License included in the file
4
+ // licenses/BSL.txt.
5
+ //
6
+ // As of the Change Date specified in that file, in accordance with the Business Source
7
+ // License, use of this software will be governed by the Apache License, Version 2.0,
8
+ // included in the file licenses/APL.txt.
9
+
10
+ import { type spatial } from "@synnaxlabs/x";
11
+ import { type Draft } from "immer";
12
+
13
+ import {
14
+ type Action,
15
+ createReduceAll,
16
+ type HandlerResult,
17
+ type Handlers,
18
+ type InsertTabsPayload,
19
+ } from "@/panel/actions.gen";
20
+ import {
21
+ findNode,
22
+ findTab,
23
+ findTabByResource,
24
+ findTabByType,
25
+ firstLeafPath,
26
+ ROOT_NODE_KEY,
27
+ tabLeafPath,
28
+ } from "@/panel/tree";
29
+ import { type LeafNode, type Node, type Panel, type Tab } from "@/panel/types.gen";
30
+
31
+ const NO_OP: HandlerResult = { inverse: [], targets: [] };
32
+
33
+ const walkLeaf = (root: Draft<Node>, pathKey: number): Draft<LeafNode> | null => {
34
+ const n = findNode(root, pathKey);
35
+ if (n == null || n.variant !== "leaf") return null;
36
+ return n;
37
+ };
38
+
39
+ // replaceNodeAt swaps the node at the given path key for next, assigning through
40
+ // the parent split (or the panel root for ROOT_PATH). Returns false when the
41
+ // path does not resolve to a node.
42
+ const replaceNodeAt = (state: Draft<Panel>, pathKey: number, next: Node): boolean => {
43
+ if (pathKey === ROOT_NODE_KEY) {
44
+ state.root = next;
45
+ return true;
46
+ }
47
+ const parent = findNode(state.root, pathKey >> 1);
48
+ if (parent == null || parent.variant !== "split") return false;
49
+ if ((pathKey & 1) === 1) parent.last = next;
50
+ else parent.first = next;
51
+ return true;
52
+ };
53
+
54
+ // removeTab mirrors removeTab in core/pkg/service/panel/tree.go, removing a tab
55
+ // and leaving any emptied leaf in place. Collapsing empty leaves is the caller's
56
+ // responsibility (collapseEmptyLeaves), deferred so that a split-then-move
57
+ // sequence (MoveTab with an edge location, or SplitTab) can target the freshly
58
+ // created empty sibling before the tree is tidied.
59
+ const removeTab = (n: Draft<Node>, key: string): Tab | null => {
60
+ if (n.variant === "leaf") {
61
+ const idx = n.tabs.findIndex((t) => t.key === key);
62
+ if (idx < 0) return null;
63
+ const [removed] = n.tabs.splice(idx, 1);
64
+ return removed ?? null;
65
+ }
66
+ return removeTab(n.first, key) ?? removeTab(n.last, key);
67
+ };
68
+
69
+ const isEmptyLeaf = (n: Draft<Node>): boolean =>
70
+ n.variant === "leaf" && n.tabs.length === 0;
71
+
72
+ // collapseEmptyLeaves mirrors collapseEmptyLeaves in core/pkg/service/panel/tree.go,
73
+ // rewriting the tree bottom-up: every split with exactly one empty-leaf side is
74
+ // replaced by its surviving sibling subtree.
75
+ const collapseEmptyLeaves = (state: Draft<Panel>): void => {
76
+ state.root = collapseNode(state.root);
77
+ };
78
+
79
+ const collapseNode = (n: Draft<Node>): Draft<Node> => {
80
+ if (n.variant !== "split") return n;
81
+ n.first = collapseNode(n.first);
82
+ n.last = collapseNode(n.last);
83
+ const firstEmpty = isEmptyLeaf(n.first);
84
+ const lastEmpty = isEmptyLeaf(n.last);
85
+ if (firstEmpty && !lastEmpty) return n.last;
86
+ if (lastEmpty && !firstEmpty) return n.first;
87
+ return n;
88
+ };
89
+
90
+ // directionAndSideForLocation maps a spatial.Location onto the (direction, side)
91
+ // pair that places a new empty leaf on that side of the original. Returns null
92
+ // for locations that do not divide the area in two (e.g., "center").
93
+ const directionAndSideForLocation = (
94
+ loc: spatial.Location,
95
+ ): { direction: spatial.Direction; side: spatial.Order } | null => {
96
+ switch (loc) {
97
+ case "left":
98
+ return { direction: "x", side: "first" };
99
+ case "right":
100
+ return { direction: "x", side: "last" };
101
+ case "top":
102
+ return { direction: "y", side: "first" };
103
+ case "bottom":
104
+ return { direction: "y", side: "last" };
105
+ default:
106
+ return null;
107
+ }
108
+ };
109
+
110
+ // splitLeafAt mirrors splitLeafAt + splitLeafForPlacement in
111
+ // core/pkg/service/panel/tree.go, replacing the leaf at the given path with a
112
+ // split holding the original leaf and a new empty sibling on the given side.
113
+ // Returns the path key of the new empty leaf, or null when the path does not
114
+ // resolve to a leaf or the location cannot produce a split.
115
+ const splitLeafAt = (
116
+ state: Draft<Panel>,
117
+ leafPath: number,
118
+ loc: spatial.Location,
119
+ size: number,
120
+ ): number | null => {
121
+ const node = findNode(state.root, leafPath);
122
+ if (node == null || node.variant !== "leaf") return null;
123
+ const ds = directionAndSideForLocation(loc);
124
+ if (ds == null) return null;
125
+ const empty: Node = { variant: "leaf", tabs: [] };
126
+ const split: Node = {
127
+ variant: "split",
128
+ direction: ds.direction,
129
+ size,
130
+ first: ds.side === "first" ? empty : node,
131
+ last: ds.side === "first" ? node : empty,
132
+ };
133
+ if (!replaceNodeAt(state, leafPath, split)) return null;
134
+ return ds.side === "first" ? leafPath * 2 : leafPath * 2 + 1;
135
+ };
136
+
137
+ // replaceTab swaps the tab with the given key for next in place, keeping its
138
+ // position within its leaf. Returns false when no tab matches the key.
139
+ const replaceTab = (n: Draft<Node>, key: string, next: Tab): boolean => {
140
+ if (n.variant === "leaf") {
141
+ const idx = n.tabs.findIndex((t) => t.key === key);
142
+ if (idx < 0) return false;
143
+ n.tabs[idx] = next;
144
+ return true;
145
+ }
146
+ return replaceTab(n.first, key, next) || replaceTab(n.last, key, next);
147
+ };
148
+
149
+ // resolveTargetLeaf resolves the destination leaf from the payload's addressing
150
+ // hints, in priority order: the leaf holding targetTab, the targetLeaf path key,
151
+ // then the first leaf in traversal order. `stale` reports that a hint was given and
152
+ // no longer resolves, which drops the location along with it: the tabs still land,
153
+ // but a leaf the caller never pointed at is not split.
154
+ const resolveTargetLeaf = (
155
+ root: Draft<Node>,
156
+ payload: InsertTabsPayload,
157
+ ): { leaf: number | undefined; stale: boolean } => {
158
+ const { targetTab, targetLeaf } = payload;
159
+ if (targetTab != null) {
160
+ const path = tabLeafPath(root, targetTab);
161
+ if (path != null) return { leaf: path, stale: false };
162
+ }
163
+ if (targetLeaf != null && findNode(root, targetLeaf)?.variant === "leaf")
164
+ return { leaf: targetLeaf, stale: false };
165
+ return {
166
+ leaf: firstLeafPath(root),
167
+ stale: targetTab != null || targetLeaf != null,
168
+ };
169
+ };
170
+
171
+ const handlers: Handlers = {
172
+ create: (state, payload) => {
173
+ Object.assign(state, payload.panel);
174
+ return { inverse: [], targets: [payload.panel.key] };
175
+ },
176
+
177
+ rename: (state, payload) => {
178
+ state.name = payload.name;
179
+ return { inverse: [], targets: [state.key] };
180
+ },
181
+
182
+ // insertTabs upserts each tab in order into one destination leaf. A tab whose key is
183
+ // already in the tree always has its content refreshed; it keeps its current position
184
+ // unless the caller gives an explicit placement (targetTab, targetLeaf, location, or
185
+ // index), in which case it is relocated with the rest. A tab that would put a second
186
+ // tab behind the same resource, or a second singleton view behind the same type, is
187
+ // skipped; the rest of the batch still lands, and callers select the existing tab
188
+ // instead. Mirrors InsertTabsPayload.Handle in core/pkg/service/panel/actions.go.
189
+ insertTabs: (state, payload) => {
190
+ const placementGiven =
191
+ payload.targetTab != null ||
192
+ payload.targetLeaf != null ||
193
+ payload.location != null ||
194
+ payload.index != null;
195
+ const resolved = resolveTargetLeaf(state.root, payload);
196
+ let targetLeaf = resolved.leaf;
197
+ if (targetLeaf == null) return NO_OP;
198
+ // The edge split is deferred to the first tab that actually lands, so a batch
199
+ // whose every tab is a duplicate leaves no empty pane behind.
200
+ let pendingSplit =
201
+ !resolved.stale && payload.location != null && payload.location !== "center"
202
+ ? payload.location
203
+ : undefined;
204
+ let index = payload.index;
205
+ const targets: string[] = [];
206
+ for (const tab of payload.tabs) {
207
+ if (tab.variant === "resource") {
208
+ const existing = findTabByResource(state.root, tab.resource);
209
+ if (existing != null && existing.key !== tab.key) continue;
210
+ }
211
+ if (payload.singleton && tab.variant === "view") {
212
+ const existing = findTabByType(state.root, tab.type);
213
+ if (existing != null && existing.key !== tab.key) continue;
214
+ }
215
+ const exists = findTab(state.root, tab.key) != null;
216
+ if (exists && !placementGiven) {
217
+ replaceTab(state.root, tab.key, tab);
218
+ targets.push(tab.key);
219
+ continue;
220
+ }
221
+ if (pendingSplit != null) {
222
+ targetLeaf = splitLeafAt(state, targetLeaf, pendingSplit, 0.5) ?? targetLeaf;
223
+ pendingSplit = undefined;
224
+ }
225
+ const leaf = walkLeaf(state.root, targetLeaf);
226
+ if (leaf == null) break;
227
+ if (exists) removeTab(state.root, tab.key);
228
+ // An index past the leaf's end is a drop position invalidated between the
229
+ // gesture and the dispatch. It clamps to the end, as moveTab does.
230
+ const at =
231
+ index != null && index >= 0 && index <= leaf.tabs.length
232
+ ? index
233
+ : leaf.tabs.length;
234
+ leaf.tabs.splice(at, 0, tab);
235
+ if (index != null) index = at + 1;
236
+ targets.push(tab.key);
237
+ }
238
+ if (targets.length === 0) return NO_OP;
239
+ collapseEmptyLeaves(state);
240
+ return { inverse: [], targets };
241
+ },
242
+
243
+ removeTab: (state, payload) => {
244
+ const removed = removeTab(state.root, payload.key);
245
+ if (removed == null) return NO_OP;
246
+ collapseEmptyLeaves(state);
247
+ return { inverse: [], targets: [payload.key] };
248
+ },
249
+
250
+ // The target leaf is resolved before the remove, and empty-leaf collapse is
251
+ // deferred until after the insert, so the destination may be a leaf the
252
+ // source's removal would otherwise collapse away (e.g. the empty sibling
253
+ // created by the preceding edge split).
254
+ moveTab: (state, payload) => {
255
+ const srcLeaf = tabLeafPath(state.root, payload.key);
256
+ const srcNode = srcLeaf != null ? findNode(state.root, srcLeaf) : undefined;
257
+ const srcIdx =
258
+ srcNode?.variant === "leaf"
259
+ ? srcNode.tabs.findIndex((t) => t.key === payload.key)
260
+ : -1;
261
+ let targetLeaf = payload.targetLeaf;
262
+ if (payload.location != null && payload.location !== "center") {
263
+ const current = walkLeaf(state.root, targetLeaf);
264
+ if (current == null) return NO_OP;
265
+ // Moving a leaf's only tab to an edge of its own leaf is degenerate: the
266
+ // result would be the tab beside an empty pane.
267
+ if (current.tabs.length === 1 && current.tabs[0].key === payload.key)
268
+ return NO_OP;
269
+ const placed = splitLeafAt(state, targetLeaf, payload.location, 0.5);
270
+ if (placed == null) return NO_OP;
271
+ targetLeaf = placed;
272
+ }
273
+ const target = walkLeaf(state.root, targetLeaf);
274
+ if (target == null) return NO_OP;
275
+ const removed = removeTab(state.root, payload.key);
276
+ if (removed == null) return NO_OP;
277
+ let idx = payload.index ?? target.tabs.length;
278
+ // The index counts the moved tab as still present, so a same-leaf move
279
+ // decrements it past the tab's own slot to stay valid after the remove.
280
+ if (payload.index != null && srcLeaf === targetLeaf && srcIdx < idx) idx--;
281
+ if (idx < 0 || idx > target.tabs.length) target.tabs.push(removed);
282
+ else target.tabs.splice(idx, 0, removed);
283
+ collapseEmptyLeaves(state);
284
+ return { inverse: [], targets: [payload.key] };
285
+ },
286
+
287
+ // splitTab resolves the tab's own leaf, splits it on the direction-mapped edge (x ->
288
+ // right, y -> bottom), and moves the tab into the new sibling pane. A leaf holding a
289
+ // single tab is a no-op (the result would be the tab beside an empty pane).
290
+ splitTab: (state, payload) => {
291
+ const leafPath = tabLeafPath(state.root, payload.key);
292
+ if (leafPath == null) return NO_OP;
293
+ const source = walkLeaf(state.root, leafPath);
294
+ if (source == null || source.tabs.length < 2) return NO_OP;
295
+ const location = payload.direction === "y" ? "bottom" : "right";
296
+ const placed = splitLeafAt(state, leafPath, location, 0.5);
297
+ if (placed == null) return NO_OP;
298
+ const removed = removeTab(state.root, payload.key);
299
+ if (removed == null) return NO_OP;
300
+ const target = walkLeaf(state.root, placed);
301
+ if (target == null) return NO_OP;
302
+ target.tabs.splice(0, 0, removed);
303
+ collapseEmptyLeaves(state);
304
+ return { inverse: [], targets: [payload.key] };
305
+ },
306
+
307
+ resizeSplit: (state, payload) => {
308
+ const node = findNode(state.root, payload.split);
309
+ if (node == null || node.variant !== "split") return NO_OP;
310
+ // An equal size must not touch the draft: the dispatch substrate detects
311
+ // no-op vectors by reference equality and skips the server send.
312
+ if (node.size === payload.size) return NO_OP;
313
+ node.size = payload.size;
314
+ return { inverse: [], targets: [String(payload.split)] };
315
+ },
316
+
317
+ // setTabResource swaps the tab's content to the resource in place, clearing any view.
318
+ // A no-op when the resource already backs a different tab: a resource may back at
319
+ // most one tab per panel, and callers select the existing tab instead.
320
+ setTabResource: (state, payload) => {
321
+ const existing = findTabByResource(state.root, payload.resource);
322
+ if (existing != null && existing.key !== payload.key) return NO_OP;
323
+ const next: Tab = {
324
+ variant: "resource",
325
+ key: payload.key,
326
+ resource: payload.resource,
327
+ };
328
+ if (!replaceTab(state.root, payload.key, next)) return NO_OP;
329
+ return { inverse: [], targets: [payload.key] };
330
+ },
331
+
332
+ // setTabView swaps the tab's content to the inline view in place, clearing
333
+ // any resource.
334
+ setTabView: (state, payload) => {
335
+ const next: Tab = { variant: "view", key: payload.key, ...payload.view };
336
+ if (!replaceTab(state.root, payload.key, next)) return NO_OP;
337
+ return { inverse: [], targets: [payload.key] };
338
+ },
339
+ };
340
+
341
+ export const reduceAll = createReduceAll(handlers);
342
+
343
+ // createOf hands the dispatch controller the document carried by a create
344
+ // action so frames for never-cached documents ingest instead of drop.
345
+ export const createOf = (action: Action) =>
346
+ action.type === "create" ? action.create.panel : undefined;
347
+
348
+ export const kindOf = (actions: Action[]): string => {
349
+ if (actions.length === 0) return "default";
350
+ // Drag-resize streams ResizeSplit; coalesce them into a single undoable per
351
+ // gesture so one ⌘Z reverses the entire drag.
352
+ if (actions.every((a) => a.type === "resize_split")) return "resize";
353
+ // Same for cross-leaf drags that produce a stream of MoveTab.
354
+ if (actions.every((a) => a.type === "move_tab")) return "move";
355
+ if (actions.length === 1) return actions[0].type;
356
+ return "transaction";
357
+ };