@synnaxlabs/client 0.56.2 → 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.
- package/dist/client-B08VDLSA.js +14463 -0
- package/dist/client-B08VDLSA.js.map +1 -0
- package/dist/client.js +1128 -14876
- package/dist/client.js.map +1 -0
- package/dist/src/access/client.d.ts +10 -1
- package/dist/src/access/client.d.ts.map +1 -1
- package/dist/src/access/enforce.d.ts.map +1 -1
- package/dist/src/access/external.d.ts +1 -0
- package/dist/src/access/external.d.ts.map +1 -1
- package/dist/src/access/granted.d.ts +39 -0
- package/dist/src/access/granted.d.ts.map +1 -0
- package/dist/src/access/policy/client.d.ts +136 -147
- package/dist/src/access/policy/client.d.ts.map +1 -1
- package/dist/src/access/policy/types.gen.d.ts +15 -68
- package/dist/src/access/policy/types.gen.d.ts.map +1 -1
- package/dist/src/access/role/client.d.ts +77 -58
- package/dist/src/access/role/client.d.ts.map +1 -1
- package/dist/src/access/role/types.gen.d.ts +8 -14
- package/dist/src/access/role/types.gen.d.ts.map +1 -1
- package/dist/src/actions/actions.d.ts +5 -6
- package/dist/src/actions/actions.d.ts.map +1 -1
- package/dist/src/actions/controller.d.ts +194 -0
- package/dist/src/actions/controller.d.ts.map +1 -0
- package/dist/src/actions/external.d.ts +1 -0
- package/dist/src/actions/external.d.ts.map +1 -1
- package/dist/src/arc/actions.d.ts +575 -0
- package/dist/src/arc/actions.d.ts.map +1 -0
- package/dist/src/arc/actions.gen.d.ts +1439 -0
- package/dist/src/arc/actions.gen.d.ts.map +1 -0
- package/dist/src/arc/client.d.ts +97 -13
- package/dist/src/arc/client.d.ts.map +1 -1
- package/dist/src/arc/compiler/types.gen.d.ts +3 -3
- package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
- package/dist/src/arc/external.d.ts +2 -0
- package/dist/src/arc/external.d.ts.map +1 -1
- package/dist/src/arc/graph/types.gen.d.ts +45 -597
- package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
- package/dist/src/arc/ir/index.d.ts +1 -1
- package/dist/src/arc/ir/index.d.ts.map +1 -1
- package/dist/src/arc/ir/ir.d.ts +2 -0
- package/dist/src/arc/ir/ir.d.ts.map +1 -0
- package/dist/src/arc/ir/types.gen.d.ts +58 -2807
- package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
- package/dist/src/arc/module/types.gen.d.ts +18 -1090
- package/dist/src/arc/module/types.gen.d.ts.map +1 -1
- package/dist/src/arc/program/types.gen.d.ts +18 -1090
- package/dist/src/arc/program/types.gen.d.ts.map +1 -1
- package/dist/src/arc/text/types.gen.d.ts +54 -1
- package/dist/src/arc/text/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types/types.gen.d.ts +35 -153
- package/dist/src/arc/types/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types.gen.d.ts +98 -2278
- package/dist/src/arc/types.gen.d.ts.map +1 -1
- package/dist/src/auth/auth.d.ts +14 -2
- package/dist/src/auth/auth.d.ts.map +1 -1
- package/dist/src/channel/client.d.ts +113 -75
- package/dist/src/channel/client.d.ts.map +1 -1
- package/dist/src/channel/external.d.ts +0 -1
- package/dist/src/channel/external.d.ts.map +1 -1
- package/dist/src/channel/payload.d.ts +65 -56
- package/dist/src/channel/payload.d.ts.map +1 -1
- package/dist/src/channel/types.gen.d.ts +26 -73
- package/dist/src/channel/types.gen.d.ts.map +1 -1
- package/dist/src/channel/writer.d.ts +1 -3
- package/dist/src/channel/writer.d.ts.map +1 -1
- package/dist/src/client.d.ts +55 -27
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/connection/client.d.ts +146 -0
- package/dist/src/connection/client.d.ts.map +1 -0
- package/dist/src/connection/external.d.ts +3 -0
- package/dist/src/connection/external.d.ts.map +1 -0
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/status.d.ts +252 -0
- package/dist/src/connection/status.d.ts.map +1 -0
- package/dist/src/control/client.d.ts +31 -7
- package/dist/src/control/client.d.ts.map +1 -1
- package/dist/src/control/state.d.ts +47 -16
- package/dist/src/control/state.d.ts.map +1 -1
- package/dist/src/device/client.d.ts +59 -17
- package/dist/src/device/client.d.ts.map +1 -1
- package/dist/src/device/types.gen.d.ts +17 -67
- package/dist/src/device/types.gen.d.ts.map +1 -1
- package/dist/src/errors.d.ts +17 -20
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/ethercat/external.d.ts +2 -0
- package/dist/src/ethercat/external.d.ts.map +1 -0
- package/dist/src/ethercat/index.d.ts +2 -0
- package/dist/src/ethercat/index.d.ts.map +1 -0
- package/dist/src/ethercat/types.gen.d.ts +243 -0
- package/dist/src/ethercat/types.gen.d.ts.map +1 -0
- package/dist/src/framer/adapter.d.ts +8 -5
- package/dist/src/framer/adapter.d.ts.map +1 -1
- package/dist/src/framer/benchutil.d.ts +19 -0
- package/dist/src/framer/benchutil.d.ts.map +1 -0
- package/dist/src/framer/cache/cache.d.ts +38 -0
- package/dist/src/framer/cache/cache.d.ts.map +1 -0
- package/dist/src/framer/cache/dynamic.d.ts +71 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +43 -0
- package/dist/src/framer/cache/reader.d.ts.map +1 -0
- package/dist/src/framer/cache/static.d.ts +66 -0
- package/dist/src/framer/cache/static.d.ts.map +1 -0
- package/dist/src/framer/cache/streamer.d.ts +86 -0
- package/dist/src/framer/cache/streamer.d.ts.map +1 -0
- package/dist/src/framer/cache/transform.d.ts +18 -0
- package/dist/src/framer/cache/transform.d.ts.map +1 -0
- package/dist/src/framer/cache/unary.d.ts +37 -0
- package/dist/src/framer/cache/unary.d.ts.map +1 -0
- package/dist/src/framer/client.d.ts +35 -14
- package/dist/src/framer/client.d.ts.map +1 -1
- package/dist/src/framer/codec.d.ts.map +1 -1
- package/dist/src/framer/deleter.d.ts +3 -2
- package/dist/src/framer/deleter.d.ts.map +1 -1
- package/dist/src/framer/external.d.ts +6 -0
- package/dist/src/framer/external.d.ts.map +1 -1
- package/dist/src/framer/feed.d.ts +40 -0
- package/dist/src/framer/feed.d.ts.map +1 -0
- package/dist/src/framer/frame.d.ts +16 -20
- package/dist/src/framer/frame.d.ts.map +1 -1
- package/dist/src/framer/hardened.d.ts +70 -0
- package/dist/src/framer/hardened.d.ts.map +1 -0
- package/dist/src/framer/iterator.d.ts +36 -43
- package/dist/src/framer/iterator.d.ts.map +1 -1
- package/dist/src/framer/reader.d.ts +3 -2
- package/dist/src/framer/reader.d.ts.map +1 -1
- package/dist/src/framer/streamer.d.ts +132 -205
- package/dist/src/framer/streamer.d.ts.map +1 -1
- package/dist/src/framer/writer.d.ts +130 -161
- package/dist/src/framer/writer.d.ts.map +1 -1
- package/dist/src/group/client.d.ts +66 -9
- package/dist/src/group/client.d.ts.map +1 -1
- package/dist/src/group/types.gen.d.ts +2 -2
- package/dist/src/http/external.d.ts +2 -0
- package/dist/src/http/external.d.ts.map +1 -0
- package/dist/src/http/index.d.ts +2 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/types.gen.d.ts +451 -0
- package/dist/src/http/types.gen.d.ts.map +1 -0
- package/dist/src/imex/client.d.ts +88 -0
- package/dist/src/imex/client.d.ts.map +1 -0
- package/dist/src/imex/index.d.ts +2 -0
- package/dist/src/imex/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +18 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/label/client.d.ts +55 -36
- package/dist/src/label/client.d.ts.map +1 -1
- package/dist/src/label/external.d.ts +2 -0
- package/dist/src/label/external.d.ts.map +1 -1
- package/dist/src/label/payload.d.ts +4 -46
- package/dist/src/label/payload.d.ts.map +1 -1
- package/dist/src/label/store.d.ts +8 -0
- package/dist/src/label/store.d.ts.map +1 -0
- package/dist/src/label/types.gen.d.ts +45 -0
- package/dist/src/label/types.gen.d.ts.map +1 -0
- package/dist/src/labjack/external.d.ts +2 -0
- package/dist/src/labjack/external.d.ts.map +1 -0
- package/dist/src/labjack/index.d.ts +2 -0
- package/dist/src/labjack/index.d.ts.map +1 -0
- package/dist/src/labjack/types.gen.d.ts +442 -0
- package/dist/src/labjack/types.gen.d.ts.map +1 -0
- package/dist/src/lineplot/actions.d.ts +914 -0
- package/dist/src/lineplot/actions.d.ts.map +1 -0
- package/dist/src/lineplot/actions.gen.d.ts +4208 -0
- package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
- package/dist/src/lineplot/client.d.ts +66 -16
- package/dist/src/lineplot/client.d.ts.map +1 -1
- package/dist/src/lineplot/external.d.ts +3 -0
- package/dist/src/lineplot/external.d.ts.map +1 -1
- package/dist/src/lineplot/line.d.ts +16 -0
- package/dist/src/lineplot/line.d.ts.map +1 -0
- package/dist/src/lineplot/types.gen.d.ts +837 -14
- package/dist/src/lineplot/types.gen.d.ts.map +1 -1
- package/dist/src/log/actions.d.ts +271 -0
- package/dist/src/log/actions.d.ts.map +1 -0
- package/dist/src/log/actions.gen.d.ts +1529 -0
- package/dist/src/log/actions.gen.d.ts.map +1 -0
- package/dist/src/log/client.d.ts +66 -16
- package/dist/src/log/client.d.ts.map +1 -1
- package/dist/src/log/external.d.ts +2 -0
- package/dist/src/log/external.d.ts.map +1 -1
- package/dist/src/log/types.gen.d.ts +139 -14
- package/dist/src/log/types.gen.d.ts.map +1 -1
- package/dist/src/modbus/external.d.ts +2 -0
- package/dist/src/modbus/external.d.ts.map +1 -0
- package/dist/src/modbus/index.d.ts +2 -0
- package/dist/src/modbus/index.d.ts.map +1 -0
- package/dist/src/modbus/types.gen.d.ts +280 -0
- package/dist/src/modbus/types.gen.d.ts.map +1 -0
- package/dist/src/ni/external.d.ts +2 -0
- package/dist/src/ni/external.d.ts.map +1 -0
- package/dist/src/ni/index.d.ts +2 -0
- package/dist/src/ni/index.d.ts.map +1 -0
- package/dist/src/ni/types.gen.d.ts +21029 -0
- package/dist/src/ni/types.gen.d.ts.map +1 -0
- package/dist/src/node/index.d.ts +2 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/types.gen.d.ts +4 -0
- package/dist/src/node/types.gen.d.ts.map +1 -0
- package/dist/src/ontology/client.d.ts +314 -67
- package/dist/src/ontology/client.d.ts.map +1 -1
- package/dist/src/ontology/external.d.ts +1 -0
- package/dist/src/ontology/external.d.ts.map +1 -1
- package/dist/src/ontology/payload.d.ts +60 -18
- package/dist/src/ontology/payload.d.ts.map +1 -1
- package/dist/src/ontology/store.d.ts +32 -0
- package/dist/src/ontology/store.d.ts.map +1 -0
- package/dist/src/ontology/types.gen.d.ts +3 -2
- package/dist/src/ontology/types.gen.d.ts.map +1 -1
- package/dist/src/ontology/writer.d.ts +16 -10
- package/dist/src/ontology/writer.d.ts.map +1 -1
- package/dist/src/opcua/external.d.ts +2 -0
- package/dist/src/opcua/external.d.ts.map +1 -0
- package/dist/src/opcua/index.d.ts +2 -0
- package/dist/src/opcua/index.d.ts.map +1 -0
- package/dist/src/opcua/types.gen.d.ts +82 -0
- package/dist/src/opcua/types.gen.d.ts.map +1 -0
- package/dist/src/pagerduty/external.d.ts +2 -0
- package/dist/src/pagerduty/external.d.ts.map +1 -0
- package/dist/src/pagerduty/index.d.ts +2 -0
- package/dist/src/pagerduty/index.d.ts.map +1 -0
- package/dist/src/pagerduty/types.gen.d.ts +30 -0
- package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
- package/dist/src/panel/actions.d.ts +273 -0
- package/dist/src/panel/actions.d.ts.map +1 -0
- package/dist/src/panel/actions.gen.d.ts +1255 -0
- package/dist/src/panel/actions.gen.d.ts.map +1 -0
- package/dist/src/panel/client.d.ts +148 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/external.d.ts +6 -0
- package/dist/src/panel/external.d.ts.map +1 -0
- package/dist/src/panel/index.d.ts +2 -0
- package/dist/src/panel/index.d.ts.map +1 -0
- package/dist/src/panel/tree.d.ts +50 -0
- package/dist/src/panel/tree.d.ts.map +1 -0
- package/dist/src/panel/types.gen.d.ts +370 -0
- package/dist/src/panel/types.gen.d.ts.map +1 -0
- package/dist/src/project/client.d.ts +89 -0
- package/dist/src/project/client.d.ts.map +1 -0
- package/dist/src/project/external.d.ts.map +1 -0
- package/dist/src/project/index.d.ts +2 -0
- package/dist/src/project/index.d.ts.map +1 -0
- package/dist/src/project/types.gen.d.ts +27 -0
- package/dist/src/project/types.gen.d.ts.map +1 -0
- package/dist/src/query/cache.d.ts +132 -0
- package/dist/src/query/cache.d.ts.map +1 -0
- package/dist/src/query/deleted.d.ts +20 -0
- package/dist/src/query/deleted.d.ts.map +1 -0
- package/dist/src/query/derived.d.ts +33 -0
- package/dist/src/query/derived.d.ts.map +1 -0
- package/dist/src/query/external.d.ts +10 -0
- package/dist/src/query/external.d.ts.map +1 -0
- package/dist/src/query/index.d.ts +2 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/query.d.ts +235 -0
- package/dist/src/query/query.d.ts.map +1 -0
- package/dist/src/query/retriever.d.ts +135 -0
- package/dist/src/query/retriever.d.ts.map +1 -0
- package/dist/src/query/streamer.d.ts +67 -0
- package/dist/src/query/streamer.d.ts.map +1 -0
- package/dist/src/query/table.d.ts +219 -0
- package/dist/src/query/table.d.ts.map +1 -0
- package/dist/src/query/types.d.ts +35 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/write.d.ts +21 -0
- package/dist/src/query/write.d.ts.map +1 -0
- package/dist/src/rack/client.d.ts +58 -20
- package/dist/src/rack/client.d.ts.map +1 -1
- package/dist/src/rack/types.gen.d.ts +11 -12
- package/dist/src/rack/types.gen.d.ts.map +1 -1
- package/dist/src/range/alias/types.gen.d.ts +2 -3
- package/dist/src/range/alias/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/client.d.ts +138 -27
- package/dist/src/ranger/client.d.ts.map +1 -1
- package/dist/src/ranger/kv/client.d.ts +7 -4
- package/dist/src/ranger/kv/client.d.ts.map +1 -1
- package/dist/src/ranger/payload.d.ts +3 -0
- package/dist/src/ranger/payload.d.ts.map +1 -1
- package/dist/src/ranger/types.gen.d.ts +45 -101
- package/dist/src/ranger/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/writer.d.ts +2 -74
- package/dist/src/ranger/writer.d.ts.map +1 -1
- package/dist/src/schematic/actions.d.ts +90 -33
- package/dist/src/schematic/actions.d.ts.map +1 -1
- package/dist/src/schematic/actions.gen.d.ts +207 -114
- package/dist/src/schematic/actions.gen.d.ts.map +1 -1
- package/dist/src/schematic/client.d.ts +70 -68
- package/dist/src/schematic/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/client.d.ts +133 -27
- package/dist/src/schematic/symbol/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
- package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
- package/dist/src/schematic/types.gen.d.ts +17 -96
- package/dist/src/schematic/types.gen.d.ts.map +1 -1
- package/dist/src/status/client.d.ts +69 -14
- package/dist/src/status/client.d.ts.map +1 -1
- package/dist/src/status/external.d.ts +2 -0
- package/dist/src/status/external.d.ts.map +1 -1
- package/dist/src/status/payload.d.ts +2 -36
- package/dist/src/status/payload.d.ts.map +1 -1
- package/dist/src/status/status.d.ts +65 -0
- package/dist/src/status/status.d.ts.map +1 -0
- package/dist/src/status/types.gen.d.ts +58 -0
- package/dist/src/status/types.gen.d.ts.map +1 -0
- package/dist/src/table/actions.d.ts +72 -13
- package/dist/src/table/actions.d.ts.map +1 -1
- package/dist/src/table/actions.gen.d.ts +221 -137
- package/dist/src/table/actions.gen.d.ts.map +1 -1
- package/dist/src/table/client.d.ts +64 -40
- package/dist/src/table/client.d.ts.map +1 -1
- package/dist/src/table/types.gen.d.ts +20 -55
- package/dist/src/table/types.gen.d.ts.map +1 -1
- package/dist/src/task/client.d.ts +149 -28
- package/dist/src/task/client.d.ts.map +1 -1
- package/dist/src/task/types.gen.d.ts +71 -89
- package/dist/src/task/types.gen.d.ts.map +1 -1
- package/dist/src/testutil/access.d.ts +27 -1
- package/dist/src/testutil/access.d.ts.map +1 -1
- package/dist/src/testutil/channels.d.ts +2 -0
- package/dist/src/testutil/channels.d.ts.map +1 -1
- package/dist/src/testutil/client.d.ts +5 -0
- package/dist/src/testutil/client.d.ts.map +1 -1
- package/dist/src/testutil/connection.d.ts +10 -0
- package/dist/src/testutil/connection.d.ts.map +1 -0
- package/dist/src/testutil/index.d.ts +9 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/panels.d.ts +8 -0
- package/dist/src/testutil/panels.d.ts.map +1 -0
- package/dist/src/testutil/proxy.d.ts +29 -0
- package/dist/src/testutil/proxy.d.ts.map +1 -0
- package/dist/src/testutil/query.d.ts +7 -0
- package/dist/src/testutil/query.d.ts.map +1 -0
- package/dist/src/testutil/telem.d.ts +4 -0
- package/dist/src/testutil/telem.d.ts.map +1 -1
- package/dist/src/transport.d.ts +10 -4
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/user/client.d.ts +29 -28
- package/dist/src/user/client.d.ts.map +1 -1
- package/dist/src/user/external.d.ts +1 -1
- package/dist/src/user/external.d.ts.map +1 -1
- package/dist/src/user/types.gen.d.ts +4 -4
- package/dist/src/util/retrieve.d.ts +2 -2
- package/dist/src/util/retrieve.d.ts.map +1 -1
- package/dist/src/util/telem.d.ts.map +1 -1
- package/dist/src/view/client.d.ts +30 -14
- package/dist/src/view/client.d.ts.map +1 -1
- package/dist/src/view/types.gen.d.ts +7 -15
- package/dist/src/view/types.gen.d.ts.map +1 -1
- package/dist/testutil.js +189 -0
- package/dist/testutil.js.map +1 -0
- package/package.json +40 -17
- package/src/access/client.ts +14 -3
- package/src/access/enforce.ts +0 -3
- package/src/access/external.ts +1 -0
- package/src/access/granted.ts +114 -0
- package/src/access/policy/client.ts +135 -43
- package/src/access/policy/types.gen.ts +9 -11
- package/src/access/role/client.ts +160 -38
- package/src/access/role/types.gen.ts +8 -12
- package/src/actions/actions.ts +5 -6
- package/src/actions/controller.ts +626 -0
- package/src/actions/external.ts +11 -0
- package/src/arc/actions.gen.ts +313 -0
- package/src/arc/actions.ts +192 -0
- package/src/arc/client.ts +424 -41
- package/src/arc/compiler/types.gen.ts +5 -6
- package/src/arc/external.ts +2 -0
- package/src/arc/graph/types.gen.ts +24 -22
- package/src/arc/ir/index.ts +1 -1
- package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
- package/src/arc/ir/types.gen.ts +42 -41
- package/src/arc/text/types.gen.ts +21 -2
- package/src/arc/types/types.gen.ts +40 -32
- package/src/arc/types.gen.ts +31 -29
- package/src/auth/auth.ts +40 -8
- package/src/channel/client.ts +529 -132
- package/src/channel/external.ts +0 -1
- package/src/channel/payload.ts +30 -3
- package/src/channel/types.gen.ts +37 -48
- package/src/channel/writer.ts +2 -11
- package/src/client.ts +215 -91
- package/src/connection/client.ts +495 -0
- package/src/connection/external.ts +34 -0
- package/src/connection/index.ts +1 -1
- package/src/connection/status.ts +442 -0
- package/src/control/client.ts +84 -12
- package/src/control/state.ts +17 -36
- package/src/device/client.ts +293 -41
- package/src/device/types.gen.ts +15 -26
- package/src/errors.ts +45 -22
- package/src/{workspace → ethercat}/external.ts +1 -2
- package/src/{workspace → ethercat}/index.ts +1 -1
- package/src/ethercat/types.gen.ts +151 -0
- package/src/framer/adapter.ts +60 -37
- package/src/framer/benchutil.ts +67 -0
- package/src/framer/cache/cache.ts +115 -0
- package/src/framer/cache/dynamic.ts +279 -0
- package/src/framer/cache/reader.ts +160 -0
- package/src/framer/cache/static.ts +215 -0
- package/src/framer/cache/streamer.ts +391 -0
- package/src/framer/cache/transform.ts +31 -0
- package/src/framer/cache/unary.ts +104 -0
- package/src/framer/client.ts +71 -43
- package/src/framer/codec.ts +55 -18
- package/src/framer/deleter.ts +4 -6
- package/src/framer/external.ts +10 -0
- package/src/framer/feed.ts +108 -0
- package/src/framer/frame.ts +13 -23
- package/src/framer/hardened.ts +283 -0
- package/src/framer/iterator.ts +31 -42
- package/src/framer/reader.ts +11 -11
- package/src/framer/streamer.ts +18 -178
- package/src/framer/writer.ts +39 -59
- package/src/group/client.ts +158 -23
- package/src/http/external.ts +10 -0
- package/src/{cluster → http}/index.ts +1 -1
- package/src/http/types.gen.ts +245 -0
- package/src/imex/client.ts +125 -0
- package/src/imex/index.ts +10 -0
- package/src/index.ts +18 -6
- package/src/label/client.ts +193 -54
- package/src/label/external.ts +2 -0
- package/src/label/payload.ts +4 -9
- package/src/label/store.ts +28 -0
- package/src/label/types.gen.ts +31 -0
- package/src/labjack/external.ts +10 -0
- package/src/labjack/index.ts +10 -0
- package/src/labjack/types.gen.ts +251 -0
- package/src/lineplot/actions.gen.ts +880 -0
- package/src/lineplot/actions.ts +535 -0
- package/src/lineplot/client.ts +224 -52
- package/src/lineplot/external.ts +3 -0
- package/src/lineplot/line.ts +80 -0
- package/src/lineplot/types.gen.ts +225 -12
- package/src/log/actions.gen.ts +474 -0
- package/src/log/actions.ts +242 -0
- package/src/log/client.ts +223 -52
- package/src/log/external.ts +2 -0
- package/src/log/types.gen.ts +45 -14
- package/src/modbus/external.ts +10 -0
- package/src/modbus/index.ts +10 -0
- package/src/modbus/types.gen.ts +185 -0
- package/src/ni/external.ts +10 -0
- package/src/ni/index.ts +10 -0
- package/src/ni/types.gen.ts +1632 -0
- package/src/node/index.ts +10 -0
- package/src/{cluster → node}/types.gen.ts +2 -2
- package/src/ontology/client.ts +408 -99
- package/src/ontology/external.ts +7 -0
- package/src/ontology/payload.ts +48 -7
- package/src/ontology/store.ts +83 -0
- package/src/ontology/types.gen.ts +2 -1
- package/src/ontology/writer.ts +1 -0
- package/src/opcua/external.ts +10 -0
- package/src/opcua/index.ts +10 -0
- package/src/opcua/types.gen.ts +65 -0
- package/src/pagerduty/external.ts +10 -0
- package/src/pagerduty/index.ts +10 -0
- package/src/pagerduty/types.gen.ts +41 -0
- package/src/panel/actions.gen.ts +267 -0
- package/src/panel/actions.ts +357 -0
- package/src/panel/client.ts +327 -0
- package/src/panel/external.ts +14 -0
- package/src/panel/index.ts +10 -0
- package/src/panel/tree.ts +163 -0
- package/src/panel/types.gen.ts +164 -0
- package/src/project/client.ts +273 -0
- package/src/project/external.ts +11 -0
- package/src/project/index.ts +10 -0
- package/src/project/types.gen.ts +40 -0
- package/src/query/cache.ts +326 -0
- package/src/query/deleted.ts +38 -0
- package/src/query/derived.ts +101 -0
- package/src/query/external.ts +51 -0
- package/src/query/index.ts +10 -0
- package/src/query/query.ts +865 -0
- package/src/query/retriever.ts +308 -0
- package/src/query/streamer.ts +207 -0
- package/src/query/table.ts +625 -0
- package/src/query/types.ts +54 -0
- package/src/query/write.ts +42 -0
- package/src/rack/client.ts +233 -45
- package/src/rack/types.gen.ts +15 -16
- package/src/range/alias/types.gen.ts +2 -3
- package/src/ranger/client.ts +581 -70
- package/src/ranger/kv/client.ts +52 -21
- package/src/ranger/payload.ts +3 -0
- package/src/ranger/types.gen.ts +21 -23
- package/src/ranger/writer.ts +4 -8
- package/src/schematic/actions.gen.ts +62 -53
- package/src/schematic/actions.ts +44 -42
- package/src/schematic/client.ts +226 -70
- package/src/schematic/symbol/client.ts +277 -48
- package/src/schematic/symbol/types.gen.ts +22 -34
- package/src/schematic/types.gen.ts +22 -29
- package/src/status/client.ts +321 -44
- package/src/status/external.ts +2 -0
- package/src/status/payload.ts +1 -23
- package/src/status/status.ts +241 -0
- package/src/status/types.gen.ts +108 -0
- package/src/table/actions.gen.ts +96 -63
- package/src/table/actions.ts +44 -19
- package/src/table/client.ts +220 -56
- package/src/table/types.gen.ts +24 -31
- package/src/task/client.ts +580 -101
- package/src/task/types.gen.ts +68 -75
- package/src/testutil/access.ts +102 -6
- package/src/testutil/channels.ts +29 -0
- package/src/testutil/client.ts +27 -2
- package/src/testutil/connection.ts +47 -0
- package/src/testutil/index.ts +17 -0
- package/src/testutil/panels.ts +26 -0
- package/src/testutil/proxy.ts +106 -0
- package/src/testutil/query.ts +28 -0
- package/src/testutil/telem.ts +17 -1
- package/src/transport.ts +18 -7
- package/src/user/client.ts +165 -64
- package/src/user/external.ts +1 -1
- package/src/user/types.gen.ts +5 -5
- package/src/util/retrieve.ts +4 -4
- package/src/util/telem.ts +0 -1
- package/src/view/client.ts +120 -37
- package/src/view/types.gen.ts +8 -11
- package/.turbo/turbo-build.log +0 -20
- package/.vscode/settings.json +0 -3
- package/CONTRIBUTING.md +0 -47
- package/dist/client.cjs +0 -118
- package/dist/eslint.config.d.ts +0 -4
- package/dist/eslint.config.d.ts.map +0 -1
- package/dist/src/access/enforce.spec.d.ts +0 -2
- package/dist/src/access/enforce.spec.d.ts.map +0 -1
- package/dist/src/access/policy/access.spec.d.ts +0 -2
- package/dist/src/access/policy/access.spec.d.ts.map +0 -1
- package/dist/src/access/role/role.spec.d.ts +0 -2
- package/dist/src/access/role/role.spec.d.ts.map +0 -1
- package/dist/src/actions/actions.spec.d.ts +0 -2
- package/dist/src/actions/actions.spec.d.ts.map +0 -1
- package/dist/src/arc/access.spec.d.ts +0 -2
- package/dist/src/arc/access.spec.d.ts.map +0 -1
- package/dist/src/arc/arc.spec.d.ts +0 -2
- package/dist/src/arc/arc.spec.d.ts.map +0 -1
- package/dist/src/arc/lsp.spec.d.ts +0 -2
- package/dist/src/arc/lsp.spec.d.ts.map +0 -1
- package/dist/src/auth/auth.spec.d.ts +0 -2
- package/dist/src/auth/auth.spec.d.ts.map +0 -1
- package/dist/src/channel/access.spec.d.ts +0 -2
- package/dist/src/channel/access.spec.d.ts.map +0 -1
- package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
- package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
- package/dist/src/channel/channel.spec.d.ts +0 -2
- package/dist/src/channel/channel.spec.d.ts.map +0 -1
- package/dist/src/channel/payload.spec.d.ts +0 -2
- package/dist/src/channel/payload.spec.d.ts.map +0 -1
- package/dist/src/channel/retriever.d.ts +0 -64
- package/dist/src/channel/retriever.d.ts.map +0 -1
- package/dist/src/cluster/index.d.ts +0 -2
- package/dist/src/cluster/index.d.ts.map +0 -1
- package/dist/src/cluster/types.gen.d.ts +0 -4
- package/dist/src/cluster/types.gen.d.ts.map +0 -1
- package/dist/src/connection/checker.d.ts +0 -86
- package/dist/src/connection/checker.d.ts.map +0 -1
- package/dist/src/connection/connection.spec.d.ts +0 -2
- package/dist/src/connection/connection.spec.d.ts.map +0 -1
- package/dist/src/connection.spec.d.ts +0 -2
- package/dist/src/connection.spec.d.ts.map +0 -1
- package/dist/src/control/state.spec.d.ts +0 -2
- package/dist/src/control/state.spec.d.ts.map +0 -1
- package/dist/src/device/access.spec.d.ts +0 -2
- package/dist/src/device/access.spec.d.ts.map +0 -1
- package/dist/src/device/device.spec.d.ts +0 -2
- package/dist/src/device/device.spec.d.ts.map +0 -1
- package/dist/src/device/payload.spec.d.ts +0 -2
- package/dist/src/device/payload.spec.d.ts.map +0 -1
- package/dist/src/errors.spec.d.ts +0 -2
- package/dist/src/errors.spec.d.ts.map +0 -1
- package/dist/src/framer/adapter.spec.d.ts +0 -2
- package/dist/src/framer/adapter.spec.d.ts.map +0 -1
- package/dist/src/framer/client.spec.d.ts +0 -2
- package/dist/src/framer/client.spec.d.ts.map +0 -1
- package/dist/src/framer/codec.spec.d.ts +0 -2
- package/dist/src/framer/codec.spec.d.ts.map +0 -1
- package/dist/src/framer/deleter.spec.d.ts +0 -2
- package/dist/src/framer/deleter.spec.d.ts.map +0 -1
- package/dist/src/framer/frame.spec.d.ts +0 -2
- package/dist/src/framer/frame.spec.d.ts.map +0 -1
- package/dist/src/framer/iterator.spec.d.ts +0 -2
- package/dist/src/framer/iterator.spec.d.ts.map +0 -1
- package/dist/src/framer/reader.spec.d.ts +0 -2
- package/dist/src/framer/reader.spec.d.ts.map +0 -1
- package/dist/src/framer/streamer.spec.d.ts +0 -2
- package/dist/src/framer/streamer.spec.d.ts.map +0 -1
- package/dist/src/framer/writer.spec.d.ts +0 -2
- package/dist/src/framer/writer.spec.d.ts.map +0 -1
- package/dist/src/group/access.spec.d.ts +0 -2
- package/dist/src/group/access.spec.d.ts.map +0 -1
- package/dist/src/group/group.spec.d.ts +0 -2
- package/dist/src/group/group.spec.d.ts.map +0 -1
- package/dist/src/label/access.spec.d.ts +0 -2
- package/dist/src/label/access.spec.d.ts.map +0 -1
- package/dist/src/label/label.spec.d.ts +0 -2
- package/dist/src/label/label.spec.d.ts.map +0 -1
- package/dist/src/lineplot/access.spec.d.ts +0 -2
- package/dist/src/lineplot/access.spec.d.ts.map +0 -1
- package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
- package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
- package/dist/src/log/access.spec.d.ts +0 -2
- package/dist/src/log/access.spec.d.ts.map +0 -1
- package/dist/src/log/log.spec.d.ts +0 -2
- package/dist/src/log/log.spec.d.ts.map +0 -1
- package/dist/src/ontology/ontology.spec.d.ts +0 -2
- package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
- package/dist/src/rack/access.spec.d.ts +0 -2
- package/dist/src/rack/access.spec.d.ts.map +0 -1
- package/dist/src/rack/rack.spec.d.ts +0 -2
- package/dist/src/rack/rack.spec.d.ts.map +0 -1
- package/dist/src/ranger/access.spec.d.ts +0 -2
- package/dist/src/ranger/access.spec.d.ts.map +0 -1
- package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
- package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
- package/dist/src/ranger/ranger.spec.d.ts +0 -2
- package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
- package/dist/src/schematic/access.spec.d.ts +0 -2
- package/dist/src/schematic/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/actions.spec.d.ts +0 -2
- package/dist/src/schematic/actions.spec.d.ts.map +0 -1
- package/dist/src/schematic/schematic.spec.d.ts +0 -2
- package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
- package/dist/src/status/access.spec.d.ts +0 -2
- package/dist/src/status/access.spec.d.ts.map +0 -1
- package/dist/src/status/status.spec.d.ts +0 -2
- package/dist/src/status/status.spec.d.ts.map +0 -1
- package/dist/src/table/access.spec.d.ts +0 -2
- package/dist/src/table/access.spec.d.ts.map +0 -1
- package/dist/src/table/table.spec.d.ts +0 -2
- package/dist/src/table/table.spec.d.ts.map +0 -1
- package/dist/src/task/access.spec.d.ts +0 -2
- package/dist/src/task/access.spec.d.ts.map +0 -1
- package/dist/src/task/payload.spec.d.ts +0 -2
- package/dist/src/task/payload.spec.d.ts.map +0 -1
- package/dist/src/task/task.spec.d.ts +0 -2
- package/dist/src/task/task.spec.d.ts.map +0 -1
- package/dist/src/user/access.spec.d.ts +0 -2
- package/dist/src/user/access.spec.d.ts.map +0 -1
- package/dist/src/user/user.spec.d.ts +0 -2
- package/dist/src/user/user.spec.d.ts.map +0 -1
- package/dist/src/util/retrieve.spec.d.ts +0 -2
- package/dist/src/util/retrieve.spec.d.ts.map +0 -1
- package/dist/src/view/view.spec.d.ts +0 -2
- package/dist/src/view/view.spec.d.ts.map +0 -1
- package/dist/src/workspace/access.spec.d.ts +0 -2
- package/dist/src/workspace/access.spec.d.ts.map +0 -1
- package/dist/src/workspace/client.d.ts +0 -36
- package/dist/src/workspace/client.d.ts.map +0 -1
- package/dist/src/workspace/external.d.ts.map +0 -1
- package/dist/src/workspace/index.d.ts +0 -2
- package/dist/src/workspace/index.d.ts.map +0 -1
- package/dist/src/workspace/types.gen.d.ts +0 -34
- package/dist/src/workspace/types.gen.d.ts.map +0 -1
- package/dist/src/workspace/workspace.spec.d.ts +0 -2
- package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
- package/examples/node/basicReadWrite.js +0 -86
- package/examples/node/createChannels.js +0 -50
- package/examples/node/createRange.js +0 -67
- package/examples/node/package-lock.json +0 -133
- package/examples/node/package.json +0 -17
- package/examples/node/readLatest.js +0 -76
- package/examples/node/seriesAndFrames.js +0 -173
- package/examples/node/streamRead.js +0 -50
- package/examples/node/streamWrite.js +0 -87
- package/src/access/enforce.spec.ts +0 -188
- package/src/access/policy/access.spec.ts +0 -147
- package/src/access/role/role.spec.ts +0 -95
- package/src/actions/actions.spec.ts +0 -229
- package/src/arc/access.spec.ts +0 -149
- package/src/arc/arc.spec.ts +0 -44
- package/src/arc/lsp.spec.ts +0 -717
- package/src/auth/auth.spec.ts +0 -101
- package/src/channel/access.spec.ts +0 -116
- package/src/channel/batchRetriever.spec.ts +0 -115
- package/src/channel/channel.spec.ts +0 -352
- package/src/channel/payload.spec.ts +0 -117
- package/src/channel/retriever.ts +0 -252
- package/src/connection/checker.ts +0 -203
- package/src/connection/connection.spec.ts +0 -152
- package/src/connection.spec.ts +0 -145
- package/src/control/state.spec.ts +0 -22
- package/src/device/access.spec.ts +0 -159
- package/src/device/device.spec.ts +0 -461
- package/src/device/payload.spec.ts +0 -142
- package/src/errors.spec.ts +0 -71
- package/src/framer/adapter.spec.ts +0 -620
- package/src/framer/client.spec.ts +0 -180
- package/src/framer/codec.spec.ts +0 -383
- package/src/framer/deleter.spec.ts +0 -103
- package/src/framer/frame.spec.ts +0 -973
- package/src/framer/iterator.spec.ts +0 -169
- package/src/framer/reader.spec.ts +0 -865
- package/src/framer/streamer.spec.ts +0 -871
- package/src/framer/writer.spec.ts +0 -486
- package/src/group/access.spec.ts +0 -77
- package/src/group/group.spec.ts +0 -65
- package/src/label/access.spec.ts +0 -109
- package/src/label/label.spec.ts +0 -83
- package/src/lineplot/access.spec.ts +0 -134
- package/src/lineplot/lineplot.spec.ts +0 -120
- package/src/log/access.spec.ts +0 -132
- package/src/log/log.spec.ts +0 -106
- package/src/ontology/ontology.spec.ts +0 -521
- package/src/rack/access.spec.ts +0 -102
- package/src/rack/rack.spec.ts +0 -171
- package/src/ranger/access.spec.ts +0 -115
- package/src/ranger/alias/payload.spec.ts +0 -52
- package/src/ranger/ranger.spec.ts +0 -343
- package/src/schematic/access.spec.ts +0 -134
- package/src/schematic/actions.spec.ts +0 -699
- package/src/schematic/schematic.spec.ts +0 -340
- package/src/schematic/symbol/access.spec.ts +0 -172
- package/src/schematic/symbol/client.spec.ts +0 -160
- package/src/status/access.spec.ts +0 -129
- package/src/status/status.spec.ts +0 -448
- package/src/table/access.spec.ts +0 -128
- package/src/table/table.spec.ts +0 -651
- package/src/task/access.spec.ts +0 -131
- package/src/task/payload.spec.ts +0 -113
- package/src/task/task.spec.ts +0 -657
- package/src/user/access.spec.ts +0 -107
- package/src/user/user.spec.ts +0 -290
- package/src/util/retrieve.spec.ts +0 -49
- package/src/view/view.spec.ts +0 -165
- package/src/workspace/access.spec.ts +0 -108
- package/src/workspace/client.ts +0 -112
- package/src/workspace/types.gen.ts +0 -46
- package/src/workspace/workspace.spec.ts +0 -111
- package/tsconfig.json +0 -5
- package/tsconfig.vite.json +0 -4
- package/vite.config.ts +0 -29
- /package/dist/src/{workspace → project}/external.d.ts +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// Copyright 2026 Synnax Labs, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Use of this software is governed by the Business Source License included in the file
|
|
4
|
+
// licenses/BSL.txt.
|
|
5
|
+
//
|
|
6
|
+
// As of the Change Date specified in that file, in accordance with the Business Source
|
|
7
|
+
// License, use of this software will be governed by the Apache License, Version 2.0,
|
|
8
|
+
// included in the file licenses/APL.txt.
|
|
9
|
+
|
|
10
|
+
// Code generated by Oracle. DO NOT EDIT.
|
|
11
|
+
import { spatial, zod } from "@synnaxlabs/x";
|
|
12
|
+
import { type Draft } from "immer";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
|
|
15
|
+
import { actions } from "@/actions";
|
|
16
|
+
import { ontology } from "@/ontology";
|
|
17
|
+
import { keyZ, type Panel, panelZ, tabKeyZ, tabZ, viewZ } from "@/panel/types.gen";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Create replaces the document with the given created state. Emitted by the Core on
|
|
21
|
+
* create so remote caches ingest new documents; clients never dispatch it.
|
|
22
|
+
*/
|
|
23
|
+
export const createPayloadZ = z.object({
|
|
24
|
+
panel: panelZ,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export type CreatePayload = z.infer<typeof createPayloadZ>;
|
|
28
|
+
|
|
29
|
+
/** Rename renames the panel. */
|
|
30
|
+
export const renamePayloadZ = z.object({
|
|
31
|
+
name: z.string(),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
export type RenamePayload = z.infer<typeof renamePayloadZ>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* InsertTabs inserts tabs into a leaf in order, starting at the given index and
|
|
38
|
+
* appending when index is absent or past the leaf's end. The destination leaf is
|
|
39
|
+
* resolved from target_tab (the leaf holding that tab) when set, otherwise from the
|
|
40
|
+
* target_leaf path-derived key, otherwise the first leaf in traversal order. Both are
|
|
41
|
+
* hints: a target that no longer resolves to a leaf falls back to the first leaf
|
|
42
|
+
* instead of failing, so a placement invalidated between the gesture and the dispatch
|
|
43
|
+
* still opens the tabs. The fallback drops location too, leaving a leaf the caller
|
|
44
|
+
* never pointed at unsplit. When location is an edge, the resolved leaf is split once
|
|
45
|
+
* at that location and every tab is inserted into the new empty leaf; a center location
|
|
46
|
+
* places the tabs directly in the resolved leaf, equivalent to absent. The split is
|
|
47
|
+
* deferred to the first tab that lands, so a batch whose every tab is skipped leaves no
|
|
48
|
+
* empty pane behind. A tab whose key is already in the tree has its content refreshed
|
|
49
|
+
* and keeps its position unless the payload carries an explicit placement, in which
|
|
50
|
+
* case it is relocated with the rest. Inserting a resource tab whose resource already
|
|
51
|
+
* backs a different tab is skipped, as is a view tab of a type already backing a tab
|
|
52
|
+
* when singleton is set: each may back at most one tab per panel, and callers select
|
|
53
|
+
* the existing tab instead. Skipping one tab does not stop the others.
|
|
54
|
+
*/
|
|
55
|
+
export const insertTabsPayloadZ = z.object({
|
|
56
|
+
tabs: tabZ.array().default(() => []),
|
|
57
|
+
targetLeaf: z.int32().optional(),
|
|
58
|
+
targetTab: tabKeyZ.optional(),
|
|
59
|
+
index: z.int32().optional(),
|
|
60
|
+
location: spatial.locationZ.optional(),
|
|
61
|
+
singleton: z.boolean().optional(),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
export type InsertTabsPayload = z.infer<typeof insertTabsPayloadZ>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* RemoveTab removes the tab with the given key. If the containing leaf becomes empty
|
|
68
|
+
* and has a sibling, the reducer collapses the parent split.
|
|
69
|
+
*/
|
|
70
|
+
export const removeTabPayloadZ = z.object({
|
|
71
|
+
key: tabKeyZ,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export type RemoveTabPayload = z.infer<typeof removeTabPayloadZ>;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* MoveTab moves a tab to a position within the panel. When location is an edge, the
|
|
78
|
+
* target leaf is first split at that location and the tab moves into the new empty
|
|
79
|
+
* leaf; moving a leaf's only tab to an edge of its own leaf is a no-op. A center
|
|
80
|
+
* location places the tab directly in the target leaf, equivalent to absent.
|
|
81
|
+
* Cross-panel moves are RemoveTab on the source plus InsertTabs on the destination (two
|
|
82
|
+
* dispatches; not atomic).
|
|
83
|
+
*/
|
|
84
|
+
export const moveTabPayloadZ = z.object({
|
|
85
|
+
key: tabKeyZ,
|
|
86
|
+
targetLeaf: z.int32(),
|
|
87
|
+
index: z.int32().optional(),
|
|
88
|
+
location: spatial.locationZ.optional(),
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
export type MoveTabPayload = z.infer<typeof moveTabPayloadZ>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* SplitTab splits the tab with the given key off its leaf into a new sibling pane,
|
|
95
|
+
* moving the tab into it. direction x places the new pane to the right, y to the
|
|
96
|
+
* bottom. The tab must share its leaf with at least one other tab; splitting the only
|
|
97
|
+
* tab in a leaf is a no-op.
|
|
98
|
+
*/
|
|
99
|
+
export const splitTabPayloadZ = z.object({
|
|
100
|
+
key: tabKeyZ,
|
|
101
|
+
direction: spatial.directionZ,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
export type SplitTabPayload = z.infer<typeof splitTabPayloadZ>;
|
|
105
|
+
|
|
106
|
+
/** ResizeSplit adjusts the size ratio of a split node. size in [0, 1]. */
|
|
107
|
+
export const resizeSplitPayloadZ = z.object({
|
|
108
|
+
split: z.int32(),
|
|
109
|
+
size: spatial.decimalZ,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
export type ResizeSplitPayload = z.infer<typeof resizeSplitPayloadZ>;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* SetTabResource sets the visualization resource displayed by the tab with the given
|
|
116
|
+
* key, swapping it in place without changing the tab's identity or position. Clears any
|
|
117
|
+
* view set on the tab. A no-op when the resource already backs another tab in the
|
|
118
|
+
* panel. Used to fill a freshly inserted selector tab once the user picks a
|
|
119
|
+
* visualization.
|
|
120
|
+
*/
|
|
121
|
+
export const setTabResourcePayloadZ = z.object({
|
|
122
|
+
key: tabKeyZ,
|
|
123
|
+
resource: ontology.idZ,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
export type SetTabResourcePayload = z.infer<typeof setTabResourcePayloadZ>;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* SetTabView sets the inline view displayed by the tab with the given key, swapping it
|
|
130
|
+
* in place without changing the tab's identity or position. Clears any resource set on
|
|
131
|
+
* the tab.
|
|
132
|
+
*/
|
|
133
|
+
export const setTabViewPayloadZ = z.object({
|
|
134
|
+
key: tabKeyZ,
|
|
135
|
+
view: viewZ,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
export type SetTabViewPayload = z.infer<typeof setTabViewPayloadZ>;
|
|
139
|
+
|
|
140
|
+
export const actionZ = z.discriminatedUnion("type", [
|
|
141
|
+
z.object({ type: z.literal("create"), create: createPayloadZ }),
|
|
142
|
+
z.object({ type: z.literal("rename"), rename: renamePayloadZ }),
|
|
143
|
+
z.object({ type: z.literal("insert_tabs"), insertTabs: insertTabsPayloadZ }),
|
|
144
|
+
z.object({ type: z.literal("remove_tab"), removeTab: removeTabPayloadZ }),
|
|
145
|
+
z.object({ type: z.literal("move_tab"), moveTab: moveTabPayloadZ }),
|
|
146
|
+
z.object({ type: z.literal("split_tab"), splitTab: splitTabPayloadZ }),
|
|
147
|
+
z.object({ type: z.literal("resize_split"), resizeSplit: resizeSplitPayloadZ }),
|
|
148
|
+
z.object({
|
|
149
|
+
type: z.literal("set_tab_resource"),
|
|
150
|
+
setTabResource: setTabResourcePayloadZ,
|
|
151
|
+
}),
|
|
152
|
+
z.object({ type: z.literal("set_tab_view"), setTabView: setTabViewPayloadZ }),
|
|
153
|
+
]);
|
|
154
|
+
|
|
155
|
+
export type Action = z.infer<typeof actionZ>;
|
|
156
|
+
|
|
157
|
+
export const create = (payload: z.input<typeof createPayloadZ>): Action => ({
|
|
158
|
+
type: "create",
|
|
159
|
+
create: zod.parse(createPayloadZ, payload, {
|
|
160
|
+
label: "panel create action payload",
|
|
161
|
+
}),
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
export const rename = (payload: z.input<typeof renamePayloadZ>): Action => ({
|
|
165
|
+
type: "rename",
|
|
166
|
+
rename: zod.parse(renamePayloadZ, payload, {
|
|
167
|
+
label: "panel rename action payload",
|
|
168
|
+
}),
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
export const insertTabs = (payload: z.input<typeof insertTabsPayloadZ>): Action => ({
|
|
172
|
+
type: "insert_tabs",
|
|
173
|
+
insertTabs: zod.parse(insertTabsPayloadZ, payload, {
|
|
174
|
+
label: "panel insert_tabs action payload",
|
|
175
|
+
}),
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
export const removeTab = (payload: z.input<typeof removeTabPayloadZ>): Action => ({
|
|
179
|
+
type: "remove_tab",
|
|
180
|
+
removeTab: zod.parse(removeTabPayloadZ, payload, {
|
|
181
|
+
label: "panel remove_tab action payload",
|
|
182
|
+
}),
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
export const moveTab = (payload: z.input<typeof moveTabPayloadZ>): Action => ({
|
|
186
|
+
type: "move_tab",
|
|
187
|
+
moveTab: zod.parse(moveTabPayloadZ, payload, {
|
|
188
|
+
label: "panel move_tab action payload",
|
|
189
|
+
}),
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
export const splitTab = (payload: z.input<typeof splitTabPayloadZ>): Action => ({
|
|
193
|
+
type: "split_tab",
|
|
194
|
+
splitTab: zod.parse(splitTabPayloadZ, payload, {
|
|
195
|
+
label: "panel split_tab action payload",
|
|
196
|
+
}),
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
export const resizeSplit = (payload: z.input<typeof resizeSplitPayloadZ>): Action => ({
|
|
200
|
+
type: "resize_split",
|
|
201
|
+
resizeSplit: zod.parse(resizeSplitPayloadZ, payload, {
|
|
202
|
+
label: "panel resize_split action payload",
|
|
203
|
+
}),
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
export const setTabResource = (
|
|
207
|
+
payload: z.input<typeof setTabResourcePayloadZ>,
|
|
208
|
+
): Action => ({
|
|
209
|
+
type: "set_tab_resource",
|
|
210
|
+
setTabResource: zod.parse(setTabResourcePayloadZ, payload, {
|
|
211
|
+
label: "panel set_tab_resource action payload",
|
|
212
|
+
}),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
export const setTabView = (payload: z.input<typeof setTabViewPayloadZ>): Action => ({
|
|
216
|
+
type: "set_tab_view",
|
|
217
|
+
setTabView: zod.parse(setTabViewPayloadZ, payload, {
|
|
218
|
+
label: "panel set_tab_view action payload",
|
|
219
|
+
}),
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
export type HandlerResult = actions.HandlerResult<Action>;
|
|
223
|
+
|
|
224
|
+
export type ReduceAllResult = actions.ReduceAllResult<Panel, Action>;
|
|
225
|
+
|
|
226
|
+
export interface Handlers {
|
|
227
|
+
create: (state: Draft<Panel>, payload: CreatePayload) => HandlerResult;
|
|
228
|
+
rename: (state: Draft<Panel>, payload: RenamePayload) => HandlerResult;
|
|
229
|
+
insertTabs: (state: Draft<Panel>, payload: InsertTabsPayload) => HandlerResult;
|
|
230
|
+
removeTab: (state: Draft<Panel>, payload: RemoveTabPayload) => HandlerResult;
|
|
231
|
+
moveTab: (state: Draft<Panel>, payload: MoveTabPayload) => HandlerResult;
|
|
232
|
+
splitTab: (state: Draft<Panel>, payload: SplitTabPayload) => HandlerResult;
|
|
233
|
+
resizeSplit: (state: Draft<Panel>, payload: ResizeSplitPayload) => HandlerResult;
|
|
234
|
+
setTabResource: (
|
|
235
|
+
state: Draft<Panel>,
|
|
236
|
+
payload: SetTabResourcePayload,
|
|
237
|
+
) => HandlerResult;
|
|
238
|
+
setTabView: (state: Draft<Panel>, payload: SetTabViewPayload) => HandlerResult;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export const createReduceAll = (handlers: Handlers) =>
|
|
242
|
+
actions.createReduceAll<Panel, Action>((state, action) => {
|
|
243
|
+
switch (action.type) {
|
|
244
|
+
case "create":
|
|
245
|
+
return handlers.create(state, action.create);
|
|
246
|
+
case "rename":
|
|
247
|
+
return handlers.rename(state, action.rename);
|
|
248
|
+
case "insert_tabs":
|
|
249
|
+
return handlers.insertTabs(state, action.insertTabs);
|
|
250
|
+
case "remove_tab":
|
|
251
|
+
return handlers.removeTab(state, action.removeTab);
|
|
252
|
+
case "move_tab":
|
|
253
|
+
return handlers.moveTab(state, action.moveTab);
|
|
254
|
+
case "split_tab":
|
|
255
|
+
return handlers.splitTab(state, action.splitTab);
|
|
256
|
+
case "resize_split":
|
|
257
|
+
return handlers.resizeSplit(state, action.resizeSplit);
|
|
258
|
+
case "set_tab_resource":
|
|
259
|
+
return handlers.setTabResource(state, action.setTabResource);
|
|
260
|
+
case "set_tab_view":
|
|
261
|
+
return handlers.setTabView(state, action.setTabView);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
export const scopedActionZ = actions.scopedZ(keyZ, actionZ);
|
|
266
|
+
|
|
267
|
+
export const dispatchReqZ = actions.dispatchReqZ(keyZ, actionZ);
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// Copyright 2026 Synnax Labs, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Use of this software is governed by the Business Source License included in the file
|
|
4
|
+
// licenses/BSL.txt.
|
|
5
|
+
//
|
|
6
|
+
// As of the Change Date specified in that file, in accordance with the Business Source
|
|
7
|
+
// License, use of this software will be governed by the Apache License, Version 2.0,
|
|
8
|
+
// included in the file licenses/APL.txt.
|
|
9
|
+
|
|
10
|
+
import { type spatial } from "@synnaxlabs/x";
|
|
11
|
+
import { type Draft } from "immer";
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
type Action,
|
|
15
|
+
createReduceAll,
|
|
16
|
+
type HandlerResult,
|
|
17
|
+
type Handlers,
|
|
18
|
+
type InsertTabsPayload,
|
|
19
|
+
} from "@/panel/actions.gen";
|
|
20
|
+
import {
|
|
21
|
+
findNode,
|
|
22
|
+
findTab,
|
|
23
|
+
findTabByResource,
|
|
24
|
+
findTabByType,
|
|
25
|
+
firstLeafPath,
|
|
26
|
+
ROOT_NODE_KEY,
|
|
27
|
+
tabLeafPath,
|
|
28
|
+
} from "@/panel/tree";
|
|
29
|
+
import { type LeafNode, type Node, type Panel, type Tab } from "@/panel/types.gen";
|
|
30
|
+
|
|
31
|
+
const NO_OP: HandlerResult = { inverse: [], targets: [] };
|
|
32
|
+
|
|
33
|
+
const walkLeaf = (root: Draft<Node>, pathKey: number): Draft<LeafNode> | null => {
|
|
34
|
+
const n = findNode(root, pathKey);
|
|
35
|
+
if (n == null || n.variant !== "leaf") return null;
|
|
36
|
+
return n;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// replaceNodeAt swaps the node at the given path key for next, assigning through
|
|
40
|
+
// the parent split (or the panel root for ROOT_PATH). Returns false when the
|
|
41
|
+
// path does not resolve to a node.
|
|
42
|
+
const replaceNodeAt = (state: Draft<Panel>, pathKey: number, next: Node): boolean => {
|
|
43
|
+
if (pathKey === ROOT_NODE_KEY) {
|
|
44
|
+
state.root = next;
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
const parent = findNode(state.root, pathKey >> 1);
|
|
48
|
+
if (parent == null || parent.variant !== "split") return false;
|
|
49
|
+
if ((pathKey & 1) === 1) parent.last = next;
|
|
50
|
+
else parent.first = next;
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// removeTab mirrors removeTab in core/pkg/service/panel/tree.go, removing a tab
|
|
55
|
+
// and leaving any emptied leaf in place. Collapsing empty leaves is the caller's
|
|
56
|
+
// responsibility (collapseEmptyLeaves), deferred so that a split-then-move
|
|
57
|
+
// sequence (MoveTab with an edge location, or SplitTab) can target the freshly
|
|
58
|
+
// created empty sibling before the tree is tidied.
|
|
59
|
+
const removeTab = (n: Draft<Node>, key: string): Tab | null => {
|
|
60
|
+
if (n.variant === "leaf") {
|
|
61
|
+
const idx = n.tabs.findIndex((t) => t.key === key);
|
|
62
|
+
if (idx < 0) return null;
|
|
63
|
+
const [removed] = n.tabs.splice(idx, 1);
|
|
64
|
+
return removed ?? null;
|
|
65
|
+
}
|
|
66
|
+
return removeTab(n.first, key) ?? removeTab(n.last, key);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const isEmptyLeaf = (n: Draft<Node>): boolean =>
|
|
70
|
+
n.variant === "leaf" && n.tabs.length === 0;
|
|
71
|
+
|
|
72
|
+
// collapseEmptyLeaves mirrors collapseEmptyLeaves in core/pkg/service/panel/tree.go,
|
|
73
|
+
// rewriting the tree bottom-up: every split with exactly one empty-leaf side is
|
|
74
|
+
// replaced by its surviving sibling subtree.
|
|
75
|
+
const collapseEmptyLeaves = (state: Draft<Panel>): void => {
|
|
76
|
+
state.root = collapseNode(state.root);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const collapseNode = (n: Draft<Node>): Draft<Node> => {
|
|
80
|
+
if (n.variant !== "split") return n;
|
|
81
|
+
n.first = collapseNode(n.first);
|
|
82
|
+
n.last = collapseNode(n.last);
|
|
83
|
+
const firstEmpty = isEmptyLeaf(n.first);
|
|
84
|
+
const lastEmpty = isEmptyLeaf(n.last);
|
|
85
|
+
if (firstEmpty && !lastEmpty) return n.last;
|
|
86
|
+
if (lastEmpty && !firstEmpty) return n.first;
|
|
87
|
+
return n;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// directionAndSideForLocation maps a spatial.Location onto the (direction, side)
|
|
91
|
+
// pair that places a new empty leaf on that side of the original. Returns null
|
|
92
|
+
// for locations that do not divide the area in two (e.g., "center").
|
|
93
|
+
const directionAndSideForLocation = (
|
|
94
|
+
loc: spatial.Location,
|
|
95
|
+
): { direction: spatial.Direction; side: spatial.Order } | null => {
|
|
96
|
+
switch (loc) {
|
|
97
|
+
case "left":
|
|
98
|
+
return { direction: "x", side: "first" };
|
|
99
|
+
case "right":
|
|
100
|
+
return { direction: "x", side: "last" };
|
|
101
|
+
case "top":
|
|
102
|
+
return { direction: "y", side: "first" };
|
|
103
|
+
case "bottom":
|
|
104
|
+
return { direction: "y", side: "last" };
|
|
105
|
+
default:
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
// splitLeafAt mirrors splitLeafAt + splitLeafForPlacement in
|
|
111
|
+
// core/pkg/service/panel/tree.go, replacing the leaf at the given path with a
|
|
112
|
+
// split holding the original leaf and a new empty sibling on the given side.
|
|
113
|
+
// Returns the path key of the new empty leaf, or null when the path does not
|
|
114
|
+
// resolve to a leaf or the location cannot produce a split.
|
|
115
|
+
const splitLeafAt = (
|
|
116
|
+
state: Draft<Panel>,
|
|
117
|
+
leafPath: number,
|
|
118
|
+
loc: spatial.Location,
|
|
119
|
+
size: number,
|
|
120
|
+
): number | null => {
|
|
121
|
+
const node = findNode(state.root, leafPath);
|
|
122
|
+
if (node == null || node.variant !== "leaf") return null;
|
|
123
|
+
const ds = directionAndSideForLocation(loc);
|
|
124
|
+
if (ds == null) return null;
|
|
125
|
+
const empty: Node = { variant: "leaf", tabs: [] };
|
|
126
|
+
const split: Node = {
|
|
127
|
+
variant: "split",
|
|
128
|
+
direction: ds.direction,
|
|
129
|
+
size,
|
|
130
|
+
first: ds.side === "first" ? empty : node,
|
|
131
|
+
last: ds.side === "first" ? node : empty,
|
|
132
|
+
};
|
|
133
|
+
if (!replaceNodeAt(state, leafPath, split)) return null;
|
|
134
|
+
return ds.side === "first" ? leafPath * 2 : leafPath * 2 + 1;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// replaceTab swaps the tab with the given key for next in place, keeping its
|
|
138
|
+
// position within its leaf. Returns false when no tab matches the key.
|
|
139
|
+
const replaceTab = (n: Draft<Node>, key: string, next: Tab): boolean => {
|
|
140
|
+
if (n.variant === "leaf") {
|
|
141
|
+
const idx = n.tabs.findIndex((t) => t.key === key);
|
|
142
|
+
if (idx < 0) return false;
|
|
143
|
+
n.tabs[idx] = next;
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
return replaceTab(n.first, key, next) || replaceTab(n.last, key, next);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
// resolveTargetLeaf resolves the destination leaf from the payload's addressing
|
|
150
|
+
// hints, in priority order: the leaf holding targetTab, the targetLeaf path key,
|
|
151
|
+
// then the first leaf in traversal order. `stale` reports that a hint was given and
|
|
152
|
+
// no longer resolves, which drops the location along with it: the tabs still land,
|
|
153
|
+
// but a leaf the caller never pointed at is not split.
|
|
154
|
+
const resolveTargetLeaf = (
|
|
155
|
+
root: Draft<Node>,
|
|
156
|
+
payload: InsertTabsPayload,
|
|
157
|
+
): { leaf: number | undefined; stale: boolean } => {
|
|
158
|
+
const { targetTab, targetLeaf } = payload;
|
|
159
|
+
if (targetTab != null) {
|
|
160
|
+
const path = tabLeafPath(root, targetTab);
|
|
161
|
+
if (path != null) return { leaf: path, stale: false };
|
|
162
|
+
}
|
|
163
|
+
if (targetLeaf != null && findNode(root, targetLeaf)?.variant === "leaf")
|
|
164
|
+
return { leaf: targetLeaf, stale: false };
|
|
165
|
+
return {
|
|
166
|
+
leaf: firstLeafPath(root),
|
|
167
|
+
stale: targetTab != null || targetLeaf != null,
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const handlers: Handlers = {
|
|
172
|
+
create: (state, payload) => {
|
|
173
|
+
Object.assign(state, payload.panel);
|
|
174
|
+
return { inverse: [], targets: [payload.panel.key] };
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
rename: (state, payload) => {
|
|
178
|
+
state.name = payload.name;
|
|
179
|
+
return { inverse: [], targets: [state.key] };
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
// insertTabs upserts each tab in order into one destination leaf. A tab whose key is
|
|
183
|
+
// already in the tree always has its content refreshed; it keeps its current position
|
|
184
|
+
// unless the caller gives an explicit placement (targetTab, targetLeaf, location, or
|
|
185
|
+
// index), in which case it is relocated with the rest. A tab that would put a second
|
|
186
|
+
// tab behind the same resource, or a second singleton view behind the same type, is
|
|
187
|
+
// skipped; the rest of the batch still lands, and callers select the existing tab
|
|
188
|
+
// instead. Mirrors InsertTabsPayload.Handle in core/pkg/service/panel/actions.go.
|
|
189
|
+
insertTabs: (state, payload) => {
|
|
190
|
+
const placementGiven =
|
|
191
|
+
payload.targetTab != null ||
|
|
192
|
+
payload.targetLeaf != null ||
|
|
193
|
+
payload.location != null ||
|
|
194
|
+
payload.index != null;
|
|
195
|
+
const resolved = resolveTargetLeaf(state.root, payload);
|
|
196
|
+
let targetLeaf = resolved.leaf;
|
|
197
|
+
if (targetLeaf == null) return NO_OP;
|
|
198
|
+
// The edge split is deferred to the first tab that actually lands, so a batch
|
|
199
|
+
// whose every tab is a duplicate leaves no empty pane behind.
|
|
200
|
+
let pendingSplit =
|
|
201
|
+
!resolved.stale && payload.location != null && payload.location !== "center"
|
|
202
|
+
? payload.location
|
|
203
|
+
: undefined;
|
|
204
|
+
let index = payload.index;
|
|
205
|
+
const targets: string[] = [];
|
|
206
|
+
for (const tab of payload.tabs) {
|
|
207
|
+
if (tab.variant === "resource") {
|
|
208
|
+
const existing = findTabByResource(state.root, tab.resource);
|
|
209
|
+
if (existing != null && existing.key !== tab.key) continue;
|
|
210
|
+
}
|
|
211
|
+
if (payload.singleton && tab.variant === "view") {
|
|
212
|
+
const existing = findTabByType(state.root, tab.type);
|
|
213
|
+
if (existing != null && existing.key !== tab.key) continue;
|
|
214
|
+
}
|
|
215
|
+
const exists = findTab(state.root, tab.key) != null;
|
|
216
|
+
if (exists && !placementGiven) {
|
|
217
|
+
replaceTab(state.root, tab.key, tab);
|
|
218
|
+
targets.push(tab.key);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (pendingSplit != null) {
|
|
222
|
+
targetLeaf = splitLeafAt(state, targetLeaf, pendingSplit, 0.5) ?? targetLeaf;
|
|
223
|
+
pendingSplit = undefined;
|
|
224
|
+
}
|
|
225
|
+
const leaf = walkLeaf(state.root, targetLeaf);
|
|
226
|
+
if (leaf == null) break;
|
|
227
|
+
if (exists) removeTab(state.root, tab.key);
|
|
228
|
+
// An index past the leaf's end is a drop position invalidated between the
|
|
229
|
+
// gesture and the dispatch. It clamps to the end, as moveTab does.
|
|
230
|
+
const at =
|
|
231
|
+
index != null && index >= 0 && index <= leaf.tabs.length
|
|
232
|
+
? index
|
|
233
|
+
: leaf.tabs.length;
|
|
234
|
+
leaf.tabs.splice(at, 0, tab);
|
|
235
|
+
if (index != null) index = at + 1;
|
|
236
|
+
targets.push(tab.key);
|
|
237
|
+
}
|
|
238
|
+
if (targets.length === 0) return NO_OP;
|
|
239
|
+
collapseEmptyLeaves(state);
|
|
240
|
+
return { inverse: [], targets };
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
removeTab: (state, payload) => {
|
|
244
|
+
const removed = removeTab(state.root, payload.key);
|
|
245
|
+
if (removed == null) return NO_OP;
|
|
246
|
+
collapseEmptyLeaves(state);
|
|
247
|
+
return { inverse: [], targets: [payload.key] };
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
// The target leaf is resolved before the remove, and empty-leaf collapse is
|
|
251
|
+
// deferred until after the insert, so the destination may be a leaf the
|
|
252
|
+
// source's removal would otherwise collapse away (e.g. the empty sibling
|
|
253
|
+
// created by the preceding edge split).
|
|
254
|
+
moveTab: (state, payload) => {
|
|
255
|
+
const srcLeaf = tabLeafPath(state.root, payload.key);
|
|
256
|
+
const srcNode = srcLeaf != null ? findNode(state.root, srcLeaf) : undefined;
|
|
257
|
+
const srcIdx =
|
|
258
|
+
srcNode?.variant === "leaf"
|
|
259
|
+
? srcNode.tabs.findIndex((t) => t.key === payload.key)
|
|
260
|
+
: -1;
|
|
261
|
+
let targetLeaf = payload.targetLeaf;
|
|
262
|
+
if (payload.location != null && payload.location !== "center") {
|
|
263
|
+
const current = walkLeaf(state.root, targetLeaf);
|
|
264
|
+
if (current == null) return NO_OP;
|
|
265
|
+
// Moving a leaf's only tab to an edge of its own leaf is degenerate: the
|
|
266
|
+
// result would be the tab beside an empty pane.
|
|
267
|
+
if (current.tabs.length === 1 && current.tabs[0].key === payload.key)
|
|
268
|
+
return NO_OP;
|
|
269
|
+
const placed = splitLeafAt(state, targetLeaf, payload.location, 0.5);
|
|
270
|
+
if (placed == null) return NO_OP;
|
|
271
|
+
targetLeaf = placed;
|
|
272
|
+
}
|
|
273
|
+
const target = walkLeaf(state.root, targetLeaf);
|
|
274
|
+
if (target == null) return NO_OP;
|
|
275
|
+
const removed = removeTab(state.root, payload.key);
|
|
276
|
+
if (removed == null) return NO_OP;
|
|
277
|
+
let idx = payload.index ?? target.tabs.length;
|
|
278
|
+
// The index counts the moved tab as still present, so a same-leaf move
|
|
279
|
+
// decrements it past the tab's own slot to stay valid after the remove.
|
|
280
|
+
if (payload.index != null && srcLeaf === targetLeaf && srcIdx < idx) idx--;
|
|
281
|
+
if (idx < 0 || idx > target.tabs.length) target.tabs.push(removed);
|
|
282
|
+
else target.tabs.splice(idx, 0, removed);
|
|
283
|
+
collapseEmptyLeaves(state);
|
|
284
|
+
return { inverse: [], targets: [payload.key] };
|
|
285
|
+
},
|
|
286
|
+
|
|
287
|
+
// splitTab resolves the tab's own leaf, splits it on the direction-mapped edge (x ->
|
|
288
|
+
// right, y -> bottom), and moves the tab into the new sibling pane. A leaf holding a
|
|
289
|
+
// single tab is a no-op (the result would be the tab beside an empty pane).
|
|
290
|
+
splitTab: (state, payload) => {
|
|
291
|
+
const leafPath = tabLeafPath(state.root, payload.key);
|
|
292
|
+
if (leafPath == null) return NO_OP;
|
|
293
|
+
const source = walkLeaf(state.root, leafPath);
|
|
294
|
+
if (source == null || source.tabs.length < 2) return NO_OP;
|
|
295
|
+
const location = payload.direction === "y" ? "bottom" : "right";
|
|
296
|
+
const placed = splitLeafAt(state, leafPath, location, 0.5);
|
|
297
|
+
if (placed == null) return NO_OP;
|
|
298
|
+
const removed = removeTab(state.root, payload.key);
|
|
299
|
+
if (removed == null) return NO_OP;
|
|
300
|
+
const target = walkLeaf(state.root, placed);
|
|
301
|
+
if (target == null) return NO_OP;
|
|
302
|
+
target.tabs.splice(0, 0, removed);
|
|
303
|
+
collapseEmptyLeaves(state);
|
|
304
|
+
return { inverse: [], targets: [payload.key] };
|
|
305
|
+
},
|
|
306
|
+
|
|
307
|
+
resizeSplit: (state, payload) => {
|
|
308
|
+
const node = findNode(state.root, payload.split);
|
|
309
|
+
if (node == null || node.variant !== "split") return NO_OP;
|
|
310
|
+
// An equal size must not touch the draft: the dispatch substrate detects
|
|
311
|
+
// no-op vectors by reference equality and skips the server send.
|
|
312
|
+
if (node.size === payload.size) return NO_OP;
|
|
313
|
+
node.size = payload.size;
|
|
314
|
+
return { inverse: [], targets: [String(payload.split)] };
|
|
315
|
+
},
|
|
316
|
+
|
|
317
|
+
// setTabResource swaps the tab's content to the resource in place, clearing any view.
|
|
318
|
+
// A no-op when the resource already backs a different tab: a resource may back at
|
|
319
|
+
// most one tab per panel, and callers select the existing tab instead.
|
|
320
|
+
setTabResource: (state, payload) => {
|
|
321
|
+
const existing = findTabByResource(state.root, payload.resource);
|
|
322
|
+
if (existing != null && existing.key !== payload.key) return NO_OP;
|
|
323
|
+
const next: Tab = {
|
|
324
|
+
variant: "resource",
|
|
325
|
+
key: payload.key,
|
|
326
|
+
resource: payload.resource,
|
|
327
|
+
};
|
|
328
|
+
if (!replaceTab(state.root, payload.key, next)) return NO_OP;
|
|
329
|
+
return { inverse: [], targets: [payload.key] };
|
|
330
|
+
},
|
|
331
|
+
|
|
332
|
+
// setTabView swaps the tab's content to the inline view in place, clearing
|
|
333
|
+
// any resource.
|
|
334
|
+
setTabView: (state, payload) => {
|
|
335
|
+
const next: Tab = { variant: "view", key: payload.key, ...payload.view };
|
|
336
|
+
if (!replaceTab(state.root, payload.key, next)) return NO_OP;
|
|
337
|
+
return { inverse: [], targets: [payload.key] };
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
export const reduceAll = createReduceAll(handlers);
|
|
342
|
+
|
|
343
|
+
// createOf hands the dispatch controller the document carried by a create
|
|
344
|
+
// action so frames for never-cached documents ingest instead of drop.
|
|
345
|
+
export const createOf = (action: Action) =>
|
|
346
|
+
action.type === "create" ? action.create.panel : undefined;
|
|
347
|
+
|
|
348
|
+
export const kindOf = (actions: Action[]): string => {
|
|
349
|
+
if (actions.length === 0) return "default";
|
|
350
|
+
// Drag-resize streams ResizeSplit; coalesce them into a single undoable per
|
|
351
|
+
// gesture so one ⌘Z reverses the entire drag.
|
|
352
|
+
if (actions.every((a) => a.type === "resize_split")) return "resize";
|
|
353
|
+
// Same for cross-leaf drags that produce a stream of MoveTab.
|
|
354
|
+
if (actions.every((a) => a.type === "move_tab")) return "move";
|
|
355
|
+
if (actions.length === 1) return actions[0].type;
|
|
356
|
+
return "transaction";
|
|
357
|
+
};
|