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