@synnaxlabs/client 0.56.2 → 0.57.1

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-DDACDVZ-.js +14505 -0
  2. package/dist/client-DDACDVZ-.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 +91 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +57 -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 +39 -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 +39 -16
  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 +340 -0
  398. package/src/framer/cache/reader.ts +231 -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 +108 -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 +19 -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
@@ -11,21 +11,25 @@ import { type UnaryClient } from "@synnaxlabs/freighter";
11
11
  import { array } from "@synnaxlabs/x";
12
12
  import { z } from "zod";
13
13
 
14
+ import { query } from "@/query";
15
+ import { createPairKey } from "@/ranger/kv/payload";
14
16
  import { type Pair, pairZ } from "@/ranger/kv/types.gen";
15
17
  import { type Key, keyZ } from "@/ranger/types.gen";
16
18
 
17
19
  const getReqZ = z.object({ range: keyZ, keys: z.string().array() });
18
- const getResZ = z.object({ pairs: array.nullishToEmpty(pairZ) });
20
+ const getResZ = z.object({ pairs: pairZ.array().default(() => []) });
19
21
  const setReqZ = z.object({ range: keyZ, pairs: pairZ.array() });
20
22
  const deleteReqZ = z.object({ range: keyZ, keys: z.string().array() });
21
23
 
22
24
  export class Client {
23
25
  private readonly rangeKey: Key;
24
26
  private readonly client: UnaryClient;
27
+ private readonly pairs: query.Table<string, Pair>;
25
28
 
26
- constructor(rng: Key, client: UnaryClient) {
29
+ constructor(rng: Key, client: UnaryClient, pairs: query.Table<string, Pair>) {
27
30
  this.rangeKey = rng;
28
31
  this.client = client;
32
+ this.pairs = pairs;
29
33
  }
30
34
 
31
35
  async get(key: string): Promise<string>;
@@ -45,32 +49,59 @@ export class Client {
45
49
  return await this.get([]);
46
50
  }
47
51
 
48
- async set(key: string, value: string): Promise<void>;
49
- async set(kv: Record<string, string>): Promise<void>;
50
- async set(key: string | Record<string, string>, value: string = ""): Promise<void> {
52
+ async set(key: string, value: string, opts?: query.WriteOptions): Promise<void>;
53
+ async set(kv: Record<string, string>, opts?: query.WriteOptions): Promise<void>;
54
+ async set(
55
+ key: string | Record<string, string>,
56
+ valueOrOpts: string | query.WriteOptions = "",
57
+ opts: query.WriteOptions = {},
58
+ ): Promise<void> {
51
59
  let pairs: Pair[];
52
- if (typeof key == "string") pairs = [{ range: this.rangeKey, key, value }];
53
- else
60
+ if (typeof key === "string")
61
+ pairs = [{ range: this.rangeKey, key, value: valueOrOpts as string }];
62
+ else {
54
63
  pairs = Object.entries(key).map(([k, v]) => ({
55
64
  range: this.rangeKey,
56
65
  key: k,
57
66
  value: v,
58
67
  }));
59
-
60
- await this.client.send(
61
- "/range/kv/set",
62
- { range: this.rangeKey, pairs },
63
- setReqZ,
64
- z.unknown(),
65
- );
68
+ if (typeof valueOrOpts === "object") opts = valueOrOpts;
69
+ }
70
+ // Pair.key is the bare key; the table is keyed by createPairKey, so keyed-object
71
+ // set would mis-key entries.
72
+ const apply = () => pairs.map((p) => this.pairs.set(createPairKey(p), p));
73
+ await query.optimistic({
74
+ rollbacks: apply(),
75
+ onOptimistic: opts.onOptimistic,
76
+ commit: async () =>
77
+ await this.client.send(
78
+ "/range/kv/set",
79
+ { range: this.rangeKey, pairs },
80
+ setReqZ,
81
+ z.unknown(),
82
+ ),
83
+ });
84
+ apply();
66
85
  }
67
86
 
68
- async delete(key: string | string[]): Promise<void> {
69
- await this.client.send(
70
- "/range/kv/delete",
71
- { range: this.rangeKey, keys: array.toArray(key) },
72
- deleteReqZ,
73
- z.unknown(),
74
- );
87
+ async delete(key: string | string[], opts: query.WriteOptions = {}): Promise<void> {
88
+ const keys = array.toArray(key);
89
+ const drop = () => [
90
+ this.pairs.delete(
91
+ keys.map((k) => createPairKey({ range: this.rangeKey, key: k })),
92
+ ),
93
+ ];
94
+ await query.optimistic({
95
+ rollbacks: drop(),
96
+ onOptimistic: opts.onOptimistic,
97
+ commit: async () =>
98
+ await this.client.send(
99
+ "/range/kv/delete",
100
+ { range: this.rangeKey, keys },
101
+ deleteReqZ,
102
+ z.unknown(),
103
+ ),
104
+ });
105
+ drop();
75
106
  }
76
107
  }
@@ -11,6 +11,9 @@ import { z } from "zod";
11
11
 
12
12
  import { type Key } from "@/ranger/types.gen";
13
13
 
14
+ /** Zod schema for {@link Name}. A range name cannot be empty. */
14
15
  export const nameZ = z.string().min(1);
16
+ /** A range's display name. */
15
17
  export type Name = z.infer<typeof nameZ>;
18
+ /** One or many ranges, named by key or by name. */
16
19
  export type Params = Key | Name | Key[] | Name[];
@@ -9,20 +9,20 @@
9
9
 
10
10
  // Code generated by Oracle. DO NOT EDIT.
11
11
 
12
- import { color, label, telem, zod } from "@synnaxlabs/x";
12
+ import { color, telem, zod } from "@synnaxlabs/x";
13
13
  import { z } from "zod";
14
14
 
15
+ import { label } from "@/label";
15
16
  import { ontology } from "@/ontology";
16
17
 
17
18
  export const keyZ = z.uuid();
18
19
  export type Key = z.infer<typeof keyZ>;
19
20
 
20
21
  /**
21
- * Base is a user-defined region of time in the Synnax cluster. Ranges act as a
22
- * method for labeling and categorizing telemetry data within specific time
23
- * periods.
22
+ * Payload is a user-defined region of time in the Synnax cluster. Ranges act as a
23
+ * method for labeling and categorizing telemetry data within specific time periods.
24
24
  */
25
- export const baseZ = z.object({
25
+ export const payloadZ = z.object({
26
26
  /** key is the unique identifier for this range. */
27
27
  key: keyZ,
28
28
  /** name is a human-readable name for the range. */
@@ -31,35 +31,33 @@ export const baseZ = z.object({
31
31
  * timeRange is the temporal extent of the range, defining its start and end
32
32
  * timestamps.
33
33
  */
34
- timeRange: telem.timeRangeZ,
34
+ timeRange: telem.timeRangeBoundedZ,
35
35
  /**
36
- * color is an optional display color for visual identification of the range
37
- * in user interfaces.
36
+ * color is an optional display color for visual identification of the range in user
37
+ * interfaces.
38
38
  */
39
39
  color: color.colorZ.optional(),
40
- });
41
- export interface Base extends z.infer<typeof baseZ> {}
42
-
43
- export const apiRangeZ = baseZ.extend({
44
- labels: zod.nullToUndefined(label.labelZ.array()),
45
- get parent(): z.ZodOptional<typeof apiRangeZ> {
46
- return apiRangeZ.optional();
47
- },
48
- });
49
- export interface APIRange extends z.infer<typeof apiRangeZ> {}
50
-
51
- export const payloadZ = baseZ.omit({ timeRange: true }).extend({
40
+ /**
41
+ * labels contains optional labels attached to this range for categorization and
42
+ * filtering.
43
+ */
52
44
  labels: zod.nullToUndefined(label.labelZ.array()),
45
+ /**
46
+ * parent is an optional parent range for hierarchical organization. Ranges can be
47
+ * nested within other ranges.
48
+ */
53
49
  get parent(): z.ZodOptional<typeof payloadZ> {
54
50
  return payloadZ.optional();
55
51
  },
56
- timeRange: telem.timeRangeBoundedZ,
57
52
  });
58
53
  export interface Payload extends z.infer<typeof payloadZ> {}
59
54
 
60
55
  export const newZ = payloadZ
61
- .omit({ parent: true, labels: true })
62
- .partial({ key: true });
56
+ .omit({ labels: true, parent: true })
57
+ .partial({ key: true })
58
+ .extend({
59
+ parent: payloadZ.pick({ key: true }).optional(),
60
+ });
63
61
  export interface New extends z.input<typeof newZ> {}
64
62
 
65
63
  export const ontologyID = ontology.createIDFactory<Key>("range");
@@ -10,23 +10,19 @@
10
10
  import { type UnaryClient } from "@synnaxlabs/freighter";
11
11
  import { z } from "zod";
12
12
 
13
- import { ontology } from "@/ontology";
14
13
  import { nameZ } from "@/ranger/payload";
15
14
  import { keyZ, type New, newZ, type Payload, payloadZ } from "@/ranger/types.gen";
16
15
 
16
+ const createReqZ = z.object({ ranges: newZ.array() });
17
17
  const createResZ = z.object({ ranges: payloadZ.array() });
18
18
 
19
- const createReqZ = z.object({ parent: ontology.idZ.optional(), ranges: newZ.array() });
20
-
21
- interface CreateRequest extends z.infer<typeof createReqZ> {}
22
- export interface CreateOptions extends Pick<CreateRequest, "parent"> {}
23
-
24
19
  const deleteReqZ = z.object({ keys: keyZ.array() });
25
20
  const deleteResZ = z.object({});
26
21
 
27
22
  const renameReqZ = z.object({ key: keyZ, name: nameZ });
28
23
  const renameResZ = z.object({});
29
24
 
25
+ /** Creates, renames, and deletes ranges. Reach it through `client.ranges`. */
30
26
  export class Writer {
31
27
  client: UnaryClient;
32
28
 
@@ -38,10 +34,10 @@ export class Writer {
38
34
  await this.client.send("/range/rename", { key, name }, renameReqZ, renameResZ);
39
35
  }
40
36
 
41
- async create(ranges: New[], options?: CreateOptions): Promise<Payload[]> {
37
+ async create(ranges: New[]): Promise<Payload[]> {
42
38
  const res = await this.client.send(
43
39
  "/range/create",
44
- { ranges, ...options },
40
+ { ranges },
45
41
  createReqZ,
46
42
  createResZ,
47
43
  );
@@ -13,7 +13,17 @@ import { type Draft } from "immer";
13
13
  import { z } from "zod";
14
14
 
15
15
  import { actions } from "@/actions";
16
- import { edgeZ, keyZ, nodeZ, type Schematic } from "@/schematic/types.gen";
16
+ import { edgeZ, keyZ, nodeZ, type Schematic, schematicZ } from "@/schematic/types.gen";
17
+
18
+ /**
19
+ * Create replaces the document with the given created state. Emitted by the Core on
20
+ * create so remote caches ingest new documents; clients never dispatch it.
21
+ */
22
+ export const createPayloadZ = z.object({
23
+ schematic: schematicZ,
24
+ });
25
+
26
+ export type CreatePayload = z.infer<typeof createPayloadZ>;
17
27
 
18
28
  /** Rename renames the schematic. */
19
29
  export const renamePayloadZ = z.object({
@@ -31,21 +41,9 @@ export const setNodePositionPayloadZ = z.object({
31
41
  export type SetNodePositionPayload = z.infer<typeof setNodePositionPayloadZ>;
32
42
 
33
43
  /**
34
- * SetNodeMeasured updates the rendered pixel size of a node. Emitted by the
35
- * renderer after measuring the mounted node and stored on the
36
- * node so diagram measurements stay consistent across re-renders.
37
- */
38
- export const setNodeMeasuredPayloadZ = z.object({
39
- key: z.string(),
40
- measured: spatial.dimensionsZ,
41
- });
42
-
43
- export type SetNodeMeasuredPayload = z.infer<typeof setNodeMeasuredPayloadZ>;
44
-
45
- /**
46
- * SetNode inserts the node if no node with the same key exists, otherwise
47
- * replaces the existing node in place. If config is non-empty it is
48
- * stored under the node's key in the schematic configs map.
44
+ * SetNode inserts the node if no node with the same key exists, otherwise replaces the
45
+ * existing node in place. If config is non-empty it is stored under the node's key in
46
+ * the schematic configs map.
49
47
  */
50
48
  export const setNodePayloadZ = z.object({
51
49
  node: nodeZ,
@@ -62,8 +60,8 @@ export const removeNodePayloadZ = z.object({
62
60
  export type RemoveNodePayload = z.infer<typeof removeNodePayloadZ>;
63
61
 
64
62
  /**
65
- * AddEdge appends the edge to the schematic. No-op when an edge with the
66
- * same key already exists.
63
+ * AddEdge appends the edge to the schematic. No-op when an edge with the same key
64
+ * already exists.
67
65
  */
68
66
  export const addEdgePayloadZ = z.object({
69
67
  edge: edgeZ,
@@ -79,30 +77,26 @@ export const removeEdgePayloadZ = z.object({
79
77
  export type RemoveEdgePayload = z.infer<typeof removeEdgePayloadZ>;
80
78
 
81
79
  /**
82
- * SetConfig merges the given config fields into the existing config entry for
83
- * the given node or edge key. Top-level fields present in the payload
84
- * overwrite existing fields; fields absent from the payload are
85
- * preserved. When no entry exists yet and the key matches an edge
86
- * whose source node carries a color, the source color overrides
80
+ * SetConfig merges the given config fields into the existing config entry for the given
81
+ * node or edge key. Top-level fields present in the payload overwrite existing fields;
82
+ * fields absent from the payload are preserved. When no entry exists yet and the key
83
+ * matches an edge whose source node carries a color, the source color overrides
87
84
  * whatever color (if any) was in the payload.
88
85
  */
89
86
  export const setConfigPayloadZ = z.object({
90
87
  key: z.string(),
91
- config: caseconv.preserveCase(record.nullishToEmpty()),
88
+ config: caseconv.preserveCase(record.unknownZ().default(() => ({}))),
92
89
  });
93
90
 
94
91
  export type SetConfigPayload = z.infer<typeof setConfigPayloadZ>;
95
92
 
96
93
  export const actionZ = z.discriminatedUnion("type", [
94
+ z.object({ type: z.literal("create"), create: createPayloadZ }),
97
95
  z.object({ type: z.literal("rename"), rename: renamePayloadZ }),
98
96
  z.object({
99
97
  type: z.literal("set_node_position"),
100
98
  setNodePosition: setNodePositionPayloadZ,
101
99
  }),
102
- z.object({
103
- type: z.literal("set_node_measured"),
104
- setNodeMeasured: setNodeMeasuredPayloadZ,
105
- }),
106
100
  z.object({ type: z.literal("set_node"), setNode: setNodePayloadZ }),
107
101
  z.object({ type: z.literal("remove_node"), removeNode: removeNodePayloadZ }),
108
102
  z.object({ type: z.literal("add_edge"), addEdge: addEdgePayloadZ }),
@@ -112,44 +106,62 @@ export const actionZ = z.discriminatedUnion("type", [
112
106
 
113
107
  export type Action = z.infer<typeof actionZ>;
114
108
 
115
- export const rename = (payload: RenamePayload): Action => ({
116
- type: "rename",
117
- rename: payload,
109
+ export const create = (payload: z.input<typeof createPayloadZ>): Action => ({
110
+ type: "create",
111
+ create: zod.parse(createPayloadZ, payload, {
112
+ label: "schematic create action payload",
113
+ }),
118
114
  });
119
115
 
120
- export const setNodePosition = (payload: SetNodePositionPayload): Action => ({
121
- type: "set_node_position",
122
- setNodePosition: payload,
116
+ export const rename = (payload: z.input<typeof renamePayloadZ>): Action => ({
117
+ type: "rename",
118
+ rename: zod.parse(renamePayloadZ, payload, {
119
+ label: "schematic rename action payload",
120
+ }),
123
121
  });
124
122
 
125
- export const setNodeMeasured = (payload: SetNodeMeasuredPayload): Action => ({
126
- type: "set_node_measured",
127
- setNodeMeasured: payload,
123
+ export const setNodePosition = (
124
+ payload: z.input<typeof setNodePositionPayloadZ>,
125
+ ): Action => ({
126
+ type: "set_node_position",
127
+ setNodePosition: zod.parse(setNodePositionPayloadZ, payload, {
128
+ label: "schematic set_node_position action payload",
129
+ }),
128
130
  });
129
131
 
130
- export const setNode = (payload: SetNodePayload): Action => ({
132
+ export const setNode = (payload: z.input<typeof setNodePayloadZ>): Action => ({
131
133
  type: "set_node",
132
- setNode: payload,
134
+ setNode: zod.parse(setNodePayloadZ, payload, {
135
+ label: "schematic set_node action payload",
136
+ }),
133
137
  });
134
138
 
135
- export const removeNode = (payload: RemoveNodePayload): Action => ({
139
+ export const removeNode = (payload: z.input<typeof removeNodePayloadZ>): Action => ({
136
140
  type: "remove_node",
137
- removeNode: payload,
141
+ removeNode: zod.parse(removeNodePayloadZ, payload, {
142
+ label: "schematic remove_node action payload",
143
+ }),
138
144
  });
139
145
 
140
- export const addEdge = (payload: AddEdgePayload): Action => ({
146
+ export const addEdge = (payload: z.input<typeof addEdgePayloadZ>): Action => ({
141
147
  type: "add_edge",
142
- addEdge: payload,
148
+ addEdge: zod.parse(addEdgePayloadZ, payload, {
149
+ label: "schematic add_edge action payload",
150
+ }),
143
151
  });
144
152
 
145
- export const removeEdge = (payload: RemoveEdgePayload): Action => ({
153
+ export const removeEdge = (payload: z.input<typeof removeEdgePayloadZ>): Action => ({
146
154
  type: "remove_edge",
147
- removeEdge: payload,
155
+ removeEdge: zod.parse(removeEdgePayloadZ, payload, {
156
+ label: "schematic remove_edge action payload",
157
+ }),
148
158
  });
149
159
 
150
- export const setConfig = (payload: SetConfigPayload): Action => ({
160
+ export const setConfig = (payload: z.input<typeof setConfigPayloadZ>): Action => ({
151
161
  type: "set_config",
152
- setConfig: payload,
162
+ setConfig: zod.parse(setConfigPayloadZ, payload, {
163
+ label: "schematic set_config action payload",
164
+ }),
153
165
  });
154
166
 
155
167
  export type HandlerResult = actions.HandlerResult<Action>;
@@ -157,15 +169,12 @@ export type HandlerResult = actions.HandlerResult<Action>;
157
169
  export type ReduceAllResult = actions.ReduceAllResult<Schematic, Action>;
158
170
 
159
171
  export interface Handlers {
172
+ create: (state: Draft<Schematic>, payload: CreatePayload) => HandlerResult;
160
173
  rename: (state: Draft<Schematic>, payload: RenamePayload) => HandlerResult;
161
174
  setNodePosition: (
162
175
  state: Draft<Schematic>,
163
176
  payload: SetNodePositionPayload,
164
177
  ) => HandlerResult;
165
- setNodeMeasured: (
166
- state: Draft<Schematic>,
167
- payload: SetNodeMeasuredPayload,
168
- ) => HandlerResult;
169
178
  setNode: (state: Draft<Schematic>, payload: SetNodePayload) => HandlerResult;
170
179
  removeNode: (state: Draft<Schematic>, payload: RemoveNodePayload) => HandlerResult;
171
180
  addEdge: (state: Draft<Schematic>, payload: AddEdgePayload) => HandlerResult;
@@ -176,12 +185,12 @@ export interface Handlers {
176
185
  export const createReduceAll = (handlers: Handlers) =>
177
186
  actions.createReduceAll<Schematic, Action>((state, action) => {
178
187
  switch (action.type) {
188
+ case "create":
189
+ return handlers.create(state, action.create);
179
190
  case "rename":
180
191
  return handlers.rename(state, action.rename);
181
192
  case "set_node_position":
182
193
  return handlers.setNodePosition(state, action.setNodePosition);
183
- case "set_node_measured":
184
- return handlers.setNodeMeasured(state, action.setNodeMeasured);
185
194
  case "set_node":
186
195
  return handlers.setNode(state, action.setNode);
187
196
  case "remove_node":
@@ -8,13 +8,12 @@
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
10
  import { color, type record } from "@synnaxlabs/x";
11
- import { current, type Draft, isDraft } from "immer";
12
11
 
12
+ import { actions } from "@/actions";
13
13
  import {
14
14
  type Action,
15
15
  addEdge,
16
16
  createReduceAll,
17
- type HandlerResult,
18
17
  type Handlers,
19
18
  removeEdge,
20
19
  removeNode,
@@ -24,16 +23,12 @@ import {
24
23
  setNodePosition,
25
24
  } from "@/schematic/actions.gen";
26
25
 
27
- const NO_OP: HandlerResult = { inverse: [], targets: [] };
28
-
29
- // Snapshots a value out of an Immer draft so the result is safe to embed in an
30
- // action stored on the undo stack. When reduceAll applies multiple actions in
31
- // one produce(), an earlier action's wholesale assignment (e.g. state.configs[k]
32
- // = {...existing, ...payload.config}) leaves the slot as a plain object — the
33
- // next action would crash if it called current() unconditionally.
34
- const snapshot = <T>(v: T): T => (isDraft(v) ? current(v as Draft<T>) : v);
35
-
36
26
  const handlers: Handlers = {
27
+ create: (state, payload) => {
28
+ Object.assign(state, payload.schematic);
29
+ return { inverse: [], targets: [payload.schematic.key] };
30
+ },
31
+
37
32
  rename: (state, payload) => {
38
33
  const oldName = state.name;
39
34
  state.name = payload.name;
@@ -44,7 +39,7 @@ const handlers: Handlers = {
44
39
  },
45
40
  setNodePosition: (state, payload) => {
46
41
  const node = state.nodes.find((n) => n.key === payload.key);
47
- if (node == null) return NO_OP;
42
+ if (node == null) return actions.NO_OP_RESULT;
48
43
  const oldPosition = { x: node.position.x, y: node.position.y };
49
44
  node.position = payload.position;
50
45
  return {
@@ -52,17 +47,6 @@ const handlers: Handlers = {
52
47
  targets: [payload.key],
53
48
  };
54
49
  },
55
-
56
- // set_node_measured carries layout-derived dimensions, not user intent.
57
- // Both the inverse and the target list are empty so it neither contributes
58
- // to the undo stack nor invalidates undoables targeting the same node when
59
- // a remote session emits it.
60
- setNodeMeasured: (state, payload) => {
61
- const node = state.nodes.find((n) => n.key === payload.key);
62
- if (node == null) return NO_OP;
63
- node.measured = payload.measured;
64
- return { inverse: [], targets: [] };
65
- },
66
50
  setNode: (state, payload) => {
67
51
  const idx = state.nodes.findIndex((n) => n.key === payload.node.key);
68
52
  if (idx === -1) {
@@ -73,9 +57,10 @@ const handlers: Handlers = {
73
57
  targets: [payload.node.key],
74
58
  };
75
59
  }
76
- const oldNode = snapshot(state.nodes[idx]);
60
+ const oldNode = actions.snapshotDraft(state.nodes[idx]);
77
61
  const oldConfigRaw = state.configs[payload.node.key];
78
- const oldConfig = oldConfigRaw != null ? snapshot(oldConfigRaw) : undefined;
62
+ const oldConfig =
63
+ oldConfigRaw != null ? actions.snapshotDraft(oldConfigRaw) : undefined;
79
64
  state.nodes[idx] = payload.node;
80
65
  if (payload.config != null) state.configs[payload.node.key] = payload.config;
81
66
  return {
@@ -91,10 +76,11 @@ const handlers: Handlers = {
91
76
  },
92
77
  removeNode: (state, payload) => {
93
78
  const idx = state.nodes.findIndex((n) => n.key === payload.key);
94
- if (idx === -1) return NO_OP;
95
- const oldNode = snapshot(state.nodes[idx]);
79
+ if (idx === -1) return actions.NO_OP_RESULT;
80
+ const oldNode = actions.snapshotDraft(state.nodes[idx]);
96
81
  const oldConfigRaw = state.configs[payload.key];
97
- const oldConfig = oldConfigRaw != null ? snapshot(oldConfigRaw) : undefined;
82
+ const oldConfig =
83
+ oldConfigRaw != null ? actions.snapshotDraft(oldConfigRaw) : undefined;
98
84
  state.nodes.splice(idx, 1);
99
85
  delete state.configs[payload.key];
100
86
  return {
@@ -109,7 +95,8 @@ const handlers: Handlers = {
109
95
  };
110
96
  },
111
97
  addEdge: (state, payload) => {
112
- if (state.edges.some((e) => e.key === payload.edge.key)) return NO_OP;
98
+ if (state.edges.some((e) => e.key === payload.edge.key))
99
+ return actions.NO_OP_RESULT;
113
100
  state.edges.push(payload.edge);
114
101
  return {
115
102
  inverse: [removeEdge({ key: payload.edge.key })],
@@ -119,24 +106,23 @@ const handlers: Handlers = {
119
106
 
120
107
  removeEdge: (state, payload) => {
121
108
  const idx = state.edges.findIndex((e) => e.key === payload.key);
122
- if (idx === -1) return NO_OP;
123
- const oldEdge = snapshot(state.edges[idx]);
109
+ if (idx === -1) return actions.NO_OP_RESULT;
110
+ const oldEdge = actions.snapshotDraft(state.edges[idx]);
124
111
  state.edges.splice(idx, 1);
125
112
  return {
126
113
  inverse: [addEdge({ edge: oldEdge })],
127
114
  targets: [payload.key],
128
115
  };
129
116
  },
130
- // The inverse of SetConfig is imperfect for keys the action newly
131
- // introduces: SetConfig only merges, so it cannot remove keys that did not
132
- // previously exist. The inverse here restores values for keys that DID
133
- // exist before the merge; keys added by the action remain on undo as
134
- // phantom fields. A future ReplaceConfig action can close the gap by
135
- // enabling wholesale replacement.
117
+ // The inverse of SetConfig is imperfect for keys the action newly introduces:
118
+ // SetConfig only merges, so it cannot remove keys that did not previously exist. The
119
+ // inverse here restores values for keys that DID exist before the merge; keys added
120
+ // by the action remain on undo as phantom fields. A future ReplaceConfig action can
121
+ // close the gap by enabling wholesale replacement.
136
122
  setConfig: (state, payload) => {
137
123
  const existingRaw = state.configs[payload.key];
138
124
  if (existingRaw != null) {
139
- const existing = snapshot(existingRaw);
125
+ const existing = actions.snapshotDraft(existingRaw);
140
126
  const restoreFields: record.Unknown = {};
141
127
  for (const k of Object.keys(payload.config))
142
128
  if (existing[k] !== undefined) restoreFields[k] = existing[k];
@@ -152,8 +138,7 @@ const handlers: Handlers = {
152
138
  const edge = state.edges.find((e) => e.key === payload.key);
153
139
  if (edge != null) {
154
140
  const srcCfg = state.configs[edge.source.node] as
155
- | { color?: color.Crude }
156
- | undefined;
141
+ { color?: color.Crude } | undefined;
157
142
  if (srcCfg?.color != null && !color.isZero(srcCfg.color))
158
143
  cfg = { ...cfg, color: srcCfg.color };
159
144
  }
@@ -164,5 +149,22 @@ const handlers: Handlers = {
164
149
 
165
150
  export const reduceAll = createReduceAll(handlers);
166
151
 
167
- export const isUndoable = (action: Action): boolean =>
168
- action.type !== "set_node_measured";
152
+ // createOf hands the dispatch controller the document carried by a create
153
+ // action so frames for never-cached documents ingest instead of drop.
154
+ export const createOf = (action: Action) =>
155
+ action.type === "create" ? action.create.schematic : undefined;
156
+
157
+ export const kindOf = (actions: Action[]): string => {
158
+ if (actions.length === 0) return "default";
159
+ // A drag dispatches a stream of `set_node_position` per frame, plus `set_config`
160
+ // companions synthesized by augmentWithEdgeSegments for any affected edges. Both
161
+ // shapes are part of one user gesture and must coalesce together; classify them all
162
+ // as "move" so the per-kind coalesce window collapses them into a single undoable.
163
+ const hasMove = actions.some((a) => a.type === "set_node_position");
164
+ const onlyMoveOrSegment = actions.every(
165
+ (a) => a.type === "set_node_position" || a.type === "set_config",
166
+ );
167
+ if (hasMove && onlyMoveOrSegment) return "move";
168
+ if (actions.length === 1) return actions[0].type;
169
+ return "transaction";
170
+ };