@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,327 @@
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 UnaryClient } from "@synnaxlabs/freighter";
11
+ import { array, type destructor, primitive, zod } from "@synnaxlabs/x";
12
+ import { z } from "zod";
13
+
14
+ import { actions } from "@/actions";
15
+ import { ontology } from "@/ontology";
16
+ import { createOf, kindOf, reduceAll } from "@/panel/actions";
17
+ import {
18
+ type Action,
19
+ dispatchReqZ,
20
+ rename as renameAction,
21
+ scopedActionZ,
22
+ } from "@/panel/actions.gen";
23
+ import {
24
+ type Key,
25
+ keyZ,
26
+ type New,
27
+ ontologyID,
28
+ type Panel,
29
+ panelZ,
30
+ } from "@/panel/types.gen";
31
+ import { query } from "@/query";
32
+
33
+ export const SET_CHANNEL_NAME = "sy_panel_set";
34
+ export const DELETE_CHANNEL_NAME = "sy_panel_delete";
35
+
36
+ const retrieveReqZ = z.object({
37
+ keys: keyZ.array().optional(),
38
+ parent: ontology.idZ.optional(),
39
+ searchTerm: z.string().optional(),
40
+ offset: z.int().optional(),
41
+ limit: z.int().optional(),
42
+ ignoreNotFoundError: z.boolean().optional(),
43
+ });
44
+ const retrieveMultiParamsZ = retrieveReqZ.or(query.keyListZ(keyZ));
45
+ export interface RetrieveRequest extends z.infer<typeof retrieveReqZ> {}
46
+ const createReqZ = z.object({ panels: panelZ.array() });
47
+ const deleteReqZ = z.object({ keys: keyZ.array() });
48
+
49
+ const retrieveResZ = z.object({ panels: panelZ.array().default(() => []) });
50
+ const createResZ = z.object({ panels: panelZ.array() });
51
+ const emptyResZ = z.object({});
52
+
53
+ const isChildOf = (rel: ontology.Relationship, parent: ontology.ID): boolean =>
54
+ ontology.matchRelationship(rel, {
55
+ from: parent,
56
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
57
+ to: { type: "panel" },
58
+ });
59
+
60
+ /**
61
+ * Client-side matching for a request: exact for key sets. Server-computed
62
+ * shapes (search, limit/offset) never reach this filter; they refetch instead.
63
+ */
64
+ const requestFilter = (req: RetrieveRequest): ((p: Panel) => boolean) => {
65
+ const keySet = primitive.isNonZero(req.keys) ? new Set(req.keys) : undefined;
66
+ return (p) => keySet == null || keySet.has(p.key);
67
+ };
68
+
69
+ export interface ClientConfig {
70
+ unary: UnaryClient;
71
+ ontology: ontology.Client;
72
+ cache: query.Cache;
73
+ }
74
+
75
+ export class Client extends query.Retriever<typeof retrieveMultiParamsZ, Key, Panel> {
76
+ private readonly cfg: ClientConfig;
77
+ private readonly store: query.Table<Key, Panel>;
78
+ private readonly dispatcher: actions.Controller<Key, Panel, Action>;
79
+
80
+ constructor(cfg: ClientConfig) {
81
+ const { cache, ontology: ontologyClient } = cfg;
82
+ // Dispatch mutates documents server-side, so fetched copies never clobber
83
+ // a doc holding locally replayed edits: the table hydrates if-absent.
84
+ const store = cache.createTable<Key, Panel>({
85
+ name: "panels",
86
+ hydrate: "if-absent",
87
+ fetch: async (keys) =>
88
+ await this.execRetrieve({ keys, ignoreNotFoundError: true }),
89
+ listen: [query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ)],
90
+ });
91
+ const dispatcher = new actions.Controller<Key, Panel, Action>({
92
+ store,
93
+ onError: cache.onError,
94
+ reduce: reduceAll,
95
+ kindOf,
96
+ createOf,
97
+ });
98
+ cache.listen(dispatcher.listener(SET_CHANNEL_NAME, scopedActionZ));
99
+ super(cache, {
100
+ name: "panel",
101
+ table: store,
102
+ request: {
103
+ schema: retrieveMultiParamsZ,
104
+ fetch: async (req) => await this.fetchRequest(req),
105
+ matches: (panel, req) => {
106
+ if (!requestFilter(req)(panel)) return false;
107
+ const parent = "parent" in req ? req.parent : undefined;
108
+ return parent == null || this.isCachedChild(parent, panel.key);
109
+ },
110
+ watch: [
111
+ query.watch(
112
+ ontologyClient.cache.relationships,
113
+ (event, req: RetrieveRequest) => {
114
+ if (req.parent == null) return null;
115
+ const rel =
116
+ event.variant === "set"
117
+ ? event.value
118
+ : ontology.relationshipZ.parse(event.key);
119
+ if (!isChildOf(rel, req.parent)) return null;
120
+ return [rel.to.key];
121
+ },
122
+ ),
123
+ ],
124
+ },
125
+ });
126
+ this.cfg = cfg;
127
+ this.store = store;
128
+ this.dispatcher = dispatcher;
129
+ }
130
+
131
+ /** All panels currently in the cache. */
132
+ listCached(): Panel[] {
133
+ return this.store.get();
134
+ }
135
+
136
+ private isCachedChild(parent: ontology.ID, key: Key): boolean {
137
+ return this.cfg.ontology.cache.relationships.has(
138
+ ontology.relationshipToString({
139
+ from: parent,
140
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
141
+ to: ontologyID(key),
142
+ }),
143
+ );
144
+ }
145
+
146
+ async create(panel: New, opts?: query.WriteOptions<Panel[]>): Promise<Panel>;
147
+ async create(panels: New[], opts?: query.WriteOptions<Panel[]>): Promise<Panel[]>;
148
+ async create(
149
+ panels: New | New[],
150
+ opts: query.WriteOptions<Panel[]> = {},
151
+ ): Promise<Panel | Panel[]> {
152
+ const isMany = Array.isArray(panels);
153
+ const optimistic = array
154
+ .toArray(panels)
155
+ .map((p) => zod.parse(panelZ, p, { label: "panel" }));
156
+ const res = await query.optimistic({
157
+ rollbacks: [this.store.set(optimistic)],
158
+ onOptimistic: () => opts.onOptimistic?.(optimistic),
159
+ commit: async () => {
160
+ // onOptimistic may dispatch further local mutations against these keys
161
+ // before the panels exist on the cluster. Send the latest cached docs so
162
+ // the server response doesn't stomp those changes back out.
163
+ const latest = optimistic.map((p) => this.store.get(p.key) ?? p);
164
+ return await this.cfg.unary.send(
165
+ "/panel/create",
166
+ { panels: latest },
167
+ createReqZ,
168
+ createResZ,
169
+ );
170
+ },
171
+ });
172
+ this.store.set(res.panels);
173
+ return isMany ? res.panels : res.panels[0];
174
+ }
175
+
176
+ async rename(key: Key, name: string, opts: query.WriteOptions = {}): Promise<void> {
177
+ const rename = () => [
178
+ query.partialUpdate(this.store, key, { name }),
179
+ this.cfg.ontology.cache.renameResource(ontologyID(key), name),
180
+ ];
181
+ // Rename routes through dispatch so the action channel broadcasts the change
182
+ // to other connected clients.
183
+ await query.optimistic({
184
+ rollbacks: rename(),
185
+ onOptimistic: opts.onOptimistic,
186
+ commit: async () => await this.sendDispatch(key, "", [renameAction({ name })]),
187
+ });
188
+ rename();
189
+ }
190
+
191
+ /**
192
+ * Applies actions to the cached panel and sends them to the server, recording an
193
+ * undoable entry. Returns false without side effects when the panel isn't cached.
194
+ * Rolls back the local apply and rethrows on send failure.
195
+ */
196
+ async dispatch(
197
+ key: Key,
198
+ actions: Action | Action[],
199
+ opts: actions.Options<Panel, Action> = {},
200
+ ): Promise<boolean> {
201
+ return await this.dispatcher.dispatch(
202
+ key,
203
+ array.toArray(actions),
204
+ this.dispatchSender(key),
205
+ opts,
206
+ );
207
+ }
208
+
209
+ /**
210
+ * Reverts the panel's most recent undoable entry. Returns false when
211
+ * nothing is undoable.
212
+ */
213
+ async undo(key: Key): Promise<boolean> {
214
+ return await this.dispatcher.undo(key, this.dispatchSender(key));
215
+ }
216
+
217
+ /**
218
+ * Re-applies the panel's most recently undone entry. Returns false when
219
+ * nothing is redoable.
220
+ */
221
+ async redo(key: Key): Promise<boolean> {
222
+ return await this.dispatcher.redo(key, this.dispatchSender(key));
223
+ }
224
+
225
+ /** Whether the panel has a live undo entry. */
226
+ hasUndo(key: Key): boolean {
227
+ return this.dispatcher.hasUndo(key);
228
+ }
229
+
230
+ /** Whether the panel has a live redo entry. */
231
+ hasRedo(key: Key): boolean {
232
+ return this.dispatcher.hasRedo(key);
233
+ }
234
+
235
+ /**
236
+ * Subscribes to changes in the panel's undo/redo stacks. Returns a
237
+ * destructor that unsubscribes.
238
+ */
239
+ onUndoStateChange(callback: () => void, key?: Key): destructor.Destructor {
240
+ return this.dispatcher.onUndoStateChange(callback, key);
241
+ }
242
+
243
+ /** Stages actions committed atomically as one undoable entry. */
244
+ beginTransaction(key: Key, kind?: string): actions.Transaction<Action> {
245
+ return this.dispatcher.transaction(key, this.dispatchSender(key), kind);
246
+ }
247
+
248
+ private dispatchSender(key: Key): actions.SendDispatch<Action> {
249
+ return async (actions, dispatchKey) =>
250
+ await this.sendDispatch(key, dispatchKey, actions);
251
+ }
252
+
253
+ private async sendDispatch(
254
+ key: Key,
255
+ dispatchKey: string,
256
+ actions: Action[],
257
+ ): Promise<void> {
258
+ await this.cfg.unary.send(
259
+ "/panel/dispatch",
260
+ { key, dispatchKey, actions },
261
+ dispatchReqZ,
262
+ emptyResZ,
263
+ );
264
+ }
265
+
266
+ async delete(key: Key, opts?: query.WriteOptions): Promise<void>;
267
+ async delete(keys: Key[], opts?: query.WriteOptions): Promise<void>;
268
+ async delete(keys: Key | Key[], opts: query.WriteOptions = {}): Promise<void> {
269
+ const keysArr = array.toArray(keys);
270
+ const drop = () => [
271
+ this.cfg.ontology.cache.deleteResources(ontologyID(keysArr)),
272
+ this.store.delete(keysArr),
273
+ ];
274
+ await query.optimistic({
275
+ rollbacks: drop(),
276
+ onOptimistic: opts.onOptimistic,
277
+ commit: async () =>
278
+ await this.cfg.unary.send(
279
+ "/panel/delete",
280
+ { keys: keysArr },
281
+ deleteReqZ,
282
+ emptyResZ,
283
+ ),
284
+ });
285
+ drop();
286
+ }
287
+
288
+ /** Subscribes to every panel delete delivered to the cache. */
289
+ onDelete(handler: (key: Key) => void): destructor.Destructor {
290
+ return this.store.subscribe((event) => {
291
+ if (event.variant === "delete") handler(event.key);
292
+ });
293
+ }
294
+
295
+ /** Subscribes to every panel set delivered to the cache. */
296
+ onSet(handler: (panel: Panel) => void): destructor.Destructor {
297
+ return this.store.subscribe((event) => {
298
+ if (event.variant === "set") handler(event.value);
299
+ });
300
+ }
301
+
302
+ private async execRetrieve(req: RetrieveRequest): Promise<Panel[]> {
303
+ const res = await this.cfg.unary.send(
304
+ "/panel/retrieve",
305
+ req,
306
+ retrieveReqZ,
307
+ retrieveResZ,
308
+ );
309
+ return res.panels;
310
+ }
311
+
312
+ // Parent queries resolve membership through the ontology graph, then fetch
313
+ // the member panels; the panel retrieve endpoint knows nothing of parents.
314
+ private async fetchRequest(req: RetrieveRequest): Promise<Panel[]> {
315
+ const { parent, ...rest } = req;
316
+ if (parent != null) {
317
+ const children = await this.cfg.ontology.children.retrieve({
318
+ ids: parent,
319
+ types: ["panel"],
320
+ });
321
+ const keys = children.map(({ id }) => id.key);
322
+ if (keys.length === 0) return [];
323
+ rest.keys = keys;
324
+ }
325
+ return await this.execRetrieve(rest);
326
+ }
327
+ }
@@ -0,0 +1,14 @@
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
+ export * from "@/panel/actions";
11
+ export * from "@/panel/actions.gen";
12
+ export * from "@/panel/client";
13
+ export * from "@/panel/tree";
14
+ export * from "@/panel/types.gen";
@@ -0,0 +1,10 @@
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
+ export * as panel from "@/panel/external";
@@ -0,0 +1,163 @@
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 location, type spatial } from "@synnaxlabs/x";
11
+
12
+ import { type ontology } from "@/ontology";
13
+ import { type LeafNode, type Node, type Tab, type TabKey } from "@/panel/types.gen";
14
+
15
+ // Nodes in the panel tree are identified by path-derived numeric keys: the root
16
+ // is ROOT_NODE_KEY, and a split's children are childNodeKey(key, "first" | "last").
17
+ // The scheme is shared with the Go and TypeScript reducers; every consumer that
18
+ // addresses nodes (dispatching InsertTab/MoveTab, adapting the tree for
19
+ // rendering) must use these helpers rather than re-deriving the math.
20
+ export const ROOT_NODE_KEY = 1;
21
+
22
+ /** childNodeKey returns the path key of a split's child on the given side. */
23
+ export const childNodeKey = (pathKey: number, side: spatial.Order): number =>
24
+ side === "first" ? pathKey * 2 : pathKey * 2 + 1;
25
+
26
+ /**
27
+ * splitSide returns the child slot the new empty leaf occupies when a leaf is
28
+ * split at the given location: "first" for left/top, "last" otherwise. The
29
+ * convention is shared by location-bearing InsertTab/MoveTab and SplitTab.
30
+ */
31
+ export const splitSide = (loc: location.Outer): spatial.Order =>
32
+ loc === "left" || loc === "top" ? "first" : "last";
33
+
34
+ const pathDirections = (pathKey: number): boolean[] => {
35
+ if (pathKey <= ROOT_NODE_KEY) return [];
36
+ const bits: boolean[] = [];
37
+ while (pathKey > ROOT_NODE_KEY) {
38
+ bits.unshift((pathKey & 1) === 1);
39
+ pathKey >>= 1;
40
+ }
41
+ return bits;
42
+ };
43
+
44
+ /**
45
+ * findNode returns the node at the given path key, or null when the path does
46
+ * not exist in the tree.
47
+ */
48
+ export const findNode = (root: Node | undefined, pathKey: number): Node | undefined => {
49
+ if (root == null) return undefined;
50
+ let n: Node = root;
51
+ for (const isLast of pathDirections(pathKey)) {
52
+ if (n.variant !== "split") return undefined;
53
+ n = isLast ? n.last : n.first;
54
+ }
55
+ return n;
56
+ };
57
+
58
+ /** findTab returns the tab with the given key, or null when absent. */
59
+ export const findTab = (node: Node | undefined, key?: string): Tab | undefined => {
60
+ if (node == null || key == null) return undefined;
61
+ if (node.variant === "leaf") return node.tabs.find((t) => t.key === key);
62
+ return findTab(node.first, key) ?? findTab(node.last, key);
63
+ };
64
+
65
+ /**
66
+ * findTabByResource returns the tab whose resource variant displays the given
67
+ * ontology ID, or null when no tab backs that resource. A resource may back at
68
+ * most one tab per panel, so openers use this to select the existing tab
69
+ * instead of inserting a duplicate.
70
+ */
71
+ export const findTabByResource = (
72
+ node: Node | undefined,
73
+ resource: ontology.ID,
74
+ ): Tab | undefined => {
75
+ if (node == null) return undefined;
76
+ if (node.variant === "leaf")
77
+ return node.tabs.find(
78
+ (t) =>
79
+ t.variant === "resource" &&
80
+ t.resource.type === resource.type &&
81
+ t.resource.key === resource.key,
82
+ );
83
+ return (
84
+ findTabByResource(node.first, resource) ?? findTabByResource(node.last, resource)
85
+ );
86
+ };
87
+
88
+ /**
89
+ * findTabByType returns the tab whose view variant carries the given type, or
90
+ * null when no view of that type is present. Openers of singleton views use this
91
+ * to select the existing tab instead of inserting a duplicate.
92
+ */
93
+ export const findTabByType = (
94
+ node: Node | undefined,
95
+ type: string,
96
+ ): Tab | undefined => {
97
+ if (node == null) return undefined;
98
+ if (node.variant === "leaf")
99
+ return node.tabs.find((t) => t.variant === "view" && t.type === type);
100
+ return findTabByType(node.first, type) ?? findTabByType(node.last, type);
101
+ };
102
+
103
+ /** leafTabGroups returns each leaf's ordered tab keys, leaves in traversal order. */
104
+ export const leafTabGroups = (node: Node | undefined): TabKey[][] => {
105
+ if (node == null) return [];
106
+ if (node.variant === "leaf") return [node.tabs.map((t) => t.key)];
107
+ return [...leafTabGroups(node.first), ...leafTabGroups(node.last)];
108
+ };
109
+
110
+ /** firstTab returns the first tab in traversal order, or null for an empty tree. */
111
+ export const firstTab = (node: Node | undefined): Tab | undefined => {
112
+ if (node == null) return undefined;
113
+ if (node.variant === "leaf") return node.tabs[0];
114
+ return firstTab(node.first) ?? firstTab(node.last);
115
+ };
116
+
117
+ const findLeafPath = (
118
+ node: Node | undefined,
119
+ path: number,
120
+ match: (tabs: Tab[]) => boolean,
121
+ ): number | undefined => {
122
+ if (node == null) return undefined;
123
+ if (node.variant === "leaf") return match(node.tabs) ? path : undefined;
124
+ return (
125
+ findLeafPath(node.first, childNodeKey(path, "first"), match) ??
126
+ findLeafPath(node.last, childNodeKey(path, "last"), match)
127
+ );
128
+ };
129
+
130
+ /** tabLeafPath returns the path key of the leaf holding the given tab, or null. */
131
+ export const tabLeafPath = (
132
+ root: Node | undefined,
133
+ tabKey: string,
134
+ ): number | undefined =>
135
+ findLeafPath(root, ROOT_NODE_KEY, (tabs) => tabs.some((t) => t.key === tabKey));
136
+
137
+ /** findTabLeaf returns the leaf node holding the given tab, or null when absent. */
138
+ export const findTabLeaf = (
139
+ root: Node | undefined,
140
+ tabKey: string,
141
+ ): LeafNode | undefined => {
142
+ const leafPath = tabLeafPath(root, tabKey);
143
+ if (leafPath == null) return undefined;
144
+ const leaf = findNode(root, leafPath);
145
+ return leaf?.variant === "leaf" ? leaf : undefined;
146
+ };
147
+
148
+ /**
149
+ * canSplitTab reports whether the tab can be split off into its own pane: true
150
+ * when the tab shares its leaf with at least one other tab. Splitting the only
151
+ * tab in a leaf is a no-op (the SplitTab action rejects it), so menu
152
+ * affordances for the split should gate on this.
153
+ */
154
+ export const canSplitTab = (root: Node | undefined, tabKey: string): boolean => {
155
+ const leafPath = tabLeafPath(root, tabKey);
156
+ if (leafPath == null) return false;
157
+ const leaf = findNode(root, leafPath);
158
+ return leaf?.variant === "leaf" && leaf.tabs.length >= 2;
159
+ };
160
+
161
+ /** firstLeafPath returns the path key of the first leaf in traversal order. */
162
+ export const firstLeafPath = (root: Node | undefined): number | undefined =>
163
+ findLeafPath(root, ROOT_NODE_KEY, () => true);
@@ -0,0 +1,164 @@
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
+
12
+ import { caseconv, record, spatial, uuid } from "@synnaxlabs/x";
13
+ import { z } from "zod";
14
+
15
+ import { ontology } from "@/ontology";
16
+
17
+ /**
18
+ * View is an inline, self-describing view: a Console-owned type plus an opaque
19
+ * configuration payload, with no backing core document. Used for app-views and tools
20
+ * (docs, explorers, task forms, and the selector pickers).
21
+ */
22
+ export const viewZ = z.object({
23
+ /**
24
+ * type is the Console-owned view type identifier (e.g., 'docs', 'selector') used to
25
+ * select a renderer.
26
+ */
27
+ type: z.string(),
28
+ /**
29
+ * args is an opaque, Console-owned configuration payload for the view. Core never
30
+ * interprets it; it round-trips as-is.
31
+ */
32
+ args: caseconv.preserveCase(record.unknownZ().default(() => ({}))),
33
+ });
34
+ export interface View extends z.infer<typeof viewZ> {}
35
+
36
+ export const tabKeyZ = z.uuid();
37
+ export type TabKey = z.infer<typeof tabKeyZ>;
38
+
39
+ export const keyZ = z.uuid();
40
+ export type Key = z.infer<typeof keyZ>;
41
+
42
+ /** TabBase carries the identity shared by every tab variant. */
43
+ export const tabBaseZ = z.object({
44
+ /**
45
+ * key is the stable unique identifier of this tab within the panel. It is independent
46
+ * of the tab's content, so a tab's content may be swapped without changing the tab's
47
+ * identity or position.
48
+ */
49
+ key: tabKeyZ.default(uuid.create),
50
+ });
51
+ export interface TabBase extends z.infer<typeof tabBaseZ> {}
52
+
53
+ /** ResourceTab is a tab displaying a backing core document. */
54
+ export const resourceTabZ = tabBaseZ.extend({
55
+ variant: z.literal("resource"),
56
+ /**
57
+ * resource is the visualization resource displayed by this tab, set via
58
+ * SetTabResource.
59
+ */
60
+ resource: ontology.idZ,
61
+ });
62
+ export interface ResourceTab extends z.infer<typeof resourceTabZ> {}
63
+
64
+ /**
65
+ * ViewTab is a tab displaying an inline, self-describing view. Unlike a resource, a
66
+ * view has no backing core document: it carries its own type and opaque args. Used for
67
+ * app-views and tools (docs, explorers, task forms, and the selector pickers).
68
+ */
69
+ export const viewTabZ = tabBaseZ.extend(viewZ.shape).extend({
70
+ variant: z.literal("view"),
71
+ });
72
+ export interface ViewTab extends z.infer<typeof viewTabZ> {}
73
+
74
+ export const TAB_TYPES = ["resource", "view"] as const;
75
+ export const tabTypeZ = z.enum(TAB_TYPES);
76
+ export type TabType = z.infer<typeof tabTypeZ>;
77
+
78
+ /**
79
+ * Tab is a single tab in a leaf. Tab content is a discriminated union: a resource (a
80
+ * backing core document, e.g. a line plot) or a view (an inline, self-describing
81
+ * app-view, e.g. docs). A freshly created tab is a view whose type is a selector
82
+ * picker; SetTabResource or SetTabView swaps content in place. Display attributes
83
+ * (name, icon, closability) are resolved at render time from the content. A resource
84
+ * may back at most one tab per panel; views may repeat.
85
+ */
86
+ export const tabZ = z.discriminatedUnion("variant", [resourceTabZ, viewTabZ]);
87
+ export type Tab = ResourceTab | ViewTab;
88
+
89
+ export const TAB_SCHEMAS: {
90
+ [K in TabType]: z.ZodType<Extract<Tab, { variant: K }>>;
91
+ } = {
92
+ resource: resourceTabZ,
93
+ view: viewTabZ,
94
+ };
95
+ export type NewTab = z.input<typeof tabZ>;
96
+
97
+ /** LeafNode is a leaf node in the panel tree displaying a tab strip. */
98
+ export const leafNodeZ = z.object({
99
+ variant: z.literal("leaf"),
100
+ /** tabs is the ordered list of tabs in this leaf. */
101
+ tabs: tabZ.array().default(() => []),
102
+ });
103
+ export interface LeafNode extends z.infer<typeof leafNodeZ> {}
104
+
105
+ /** SplitNode is an interior split node dividing its area between two children. */
106
+ export const splitNodeZ = z.object({
107
+ variant: z.literal("split"),
108
+ /** direction is the axis along which this node is split. */
109
+ direction: spatial.directionZ,
110
+ /**
111
+ * size is the fraction in [0, 1] of the parent area allocated to first. The remainder
112
+ * is allocated to last.
113
+ */
114
+ size: spatial.decimalZ,
115
+ /** first is the first child (left for x, top for y). */
116
+ get first(): z.ZodType<Node> {
117
+ return nodeZ;
118
+ },
119
+ /** last is the second child (right for x, bottom for y). */
120
+ get last(): z.ZodType<Node> {
121
+ return nodeZ;
122
+ },
123
+ });
124
+ export interface SplitNode extends z.infer<typeof splitNodeZ> {}
125
+
126
+ export const NODE_TYPES = ["leaf", "split"] as const;
127
+ export const nodeTypeZ = z.enum(NODE_TYPES);
128
+ export type NodeType = z.infer<typeof nodeTypeZ>;
129
+
130
+ /**
131
+ * Node is a node in the panel tree: either a leaf displaying a tab strip or an interior
132
+ * split. Nodes are identified by path-derived numeric keys during traversal (1 = root,
133
+ * 2k = first child, 2k+1 = last child).
134
+ */
135
+ export const nodeZ = z.discriminatedUnion("variant", [leafNodeZ, splitNodeZ]);
136
+ export type Node = LeafNode | SplitNode;
137
+
138
+ export const NODE_SCHEMAS: {
139
+ [K in NodeType]: z.ZodType<Extract<Node, { variant: K }>>;
140
+ } = {
141
+ leaf: leafNodeZ,
142
+ split: splitNodeZ,
143
+ };
144
+
145
+ /** Panel is a project-owned tree of visualization tabs. */
146
+ export const panelZ = z.object({
147
+ /** key is the unique identifier for this panel. */
148
+ key: keyZ.default(uuid.create),
149
+ /** name is a human-readable name for the panel. */
150
+ name: z.string().min(1, "name is required"),
151
+ /** root is the root of the panel tree. */
152
+ root: nodeZ.prefault({ variant: "leaf", tabs: [] }),
153
+ /**
154
+ * parent is the parent resource for the panel in the ontology, required on create.
155
+ * Parenthood lives in the ontology graph, so the field is not persisted on the panel
156
+ * record and is absent on retrieve.
157
+ */
158
+ parent: ontology.idZ.optional(),
159
+ });
160
+ export interface Panel extends z.infer<typeof panelZ> {}
161
+ export interface New extends z.input<typeof panelZ> {}
162
+
163
+ export const ontologyID = ontology.createIDFactory<Key>("panel");
164
+ export const TYPE_ONTOLOGY_ID = ontologyID("");