@camstack/types 1.2.104 → 1.2.106
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/capabilities/addons.cap.d.ts +4 -4
- package/dist/capabilities/battery.cap.d.ts +4 -4
- package/dist/capabilities/control.cap.d.ts +4 -4
- package/dist/capabilities/core-blocks.cap.d.ts +8 -8
- package/dist/capabilities/custom-model-registry.cap.d.ts +4 -4
- package/dist/capabilities/data-store-provider.cap.d.ts +1 -0
- package/dist/capabilities/device-manager.cap.d.ts +1 -1
- package/dist/capabilities/face-gallery.cap.d.ts +3 -1
- package/dist/capabilities/llm-runtime.cap.d.ts +3 -3
- package/dist/capabilities/llm.cap.d.ts +4 -4
- package/dist/capabilities/model-convert.cap.d.ts +6 -6
- package/dist/capabilities/model-distributor.cap.d.ts +4 -4
- package/dist/capabilities/native-object-detection.cap.d.ts +15 -15
- package/dist/capabilities/notification-output.cap.d.ts +18 -18
- package/dist/capabilities/notification-rules.cap.d.ts +26 -26
- package/dist/capabilities/oauth-integration.cap.d.ts +2 -2
- package/dist/capabilities/osd-manager.cap.d.ts +14 -14
- package/dist/capabilities/pipeline-analytics.cap.d.ts +53 -53
- package/dist/capabilities/pipeline-executor.cap.d.ts +7 -7
- package/dist/capabilities/pipeline-orchestrator.cap.d.ts +19 -19
- package/dist/capabilities/plate-gallery.cap.d.ts +5 -1
- package/dist/capabilities/platform-probe.cap.d.ts +2 -2
- package/dist/capabilities/recording-export.cap.d.ts +7 -7
- package/dist/capabilities/recording.cap.d.ts +9 -30
- package/dist/capabilities/scene-monitor.cap.d.ts +8 -8
- package/dist/capabilities/settings-store.cap.d.ts +17 -2
- package/dist/capabilities/sso-bridge.cap.d.ts +3 -3
- package/dist/capabilities/storage-migration.cap.d.ts +1 -1
- package/dist/capabilities/stream-broker.cap.d.ts +6 -6
- package/dist/capabilities/user-management.cap.d.ts +20 -20
- package/dist/capabilities/vacuum-control.cap.d.ts +13 -13
- package/dist/encode-profile.d.ts +2 -2
- package/dist/generated/addon-api.d.ts +2 -6
- package/dist/health/wiring-health.d.ts +8 -8
- package/dist/index.js +88 -101
- package/dist/index.mjs +89 -96
- package/dist/interfaces/addon.d.ts +29 -7
- package/dist/interfaces/adoption-job.d.ts +2 -2
- package/dist/interfaces/ops-log.d.ts +2 -2
- package/dist/interfaces/recording-config.d.ts +7 -57
- package/dist/interfaces/relocate.d.ts +4 -4
- package/dist/interfaces/storage.d.ts +23 -0
- package/dist/lifecycle/job.d.ts +4 -4
- package/dist/schemas/auth-records.d.ts +4 -4
- package/dist/types/models.d.ts +7 -7
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1578,83 +1578,6 @@ var RecordingRetentionSchema = zod.z.object({
|
|
|
1578
1578
|
maxSizeGb: zod.z.number().min(0).optional()
|
|
1579
1579
|
});
|
|
1580
1580
|
/**
|
|
1581
|
-
* Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
|
|
1582
|
-
* sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
|
|
1583
|
-
* previews at. Five graduated steps; absent on a config = `standard` (the
|
|
1584
|
-
* shipped default, matching `sheet-geometry`/`sheet-composer`).
|
|
1585
|
-
*
|
|
1586
|
-
* Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
|
|
1587
|
-
* Each window's index sidecar carries its own tile dims, so a camera whose
|
|
1588
|
-
* preset changed over time renders every historical window at the dims it was
|
|
1589
|
-
* written with.
|
|
1590
|
-
*/
|
|
1591
|
-
var ScrubThumbnailPresetSchema = zod.z.enum([
|
|
1592
|
-
"minimal",
|
|
1593
|
-
"low",
|
|
1594
|
-
"standard",
|
|
1595
|
-
"high",
|
|
1596
|
-
"max"
|
|
1597
|
-
]);
|
|
1598
|
-
/** The default preset when a config omits `scrubThumbnails`. */
|
|
1599
|
-
var DEFAULT_SCRUB_THUMBNAIL_PRESET = "standard";
|
|
1600
|
-
/**
|
|
1601
|
-
* Preset → tile geometry + JPEG quality. Every step is 16:9; the graduated
|
|
1602
|
-
* ladder trades sheet size (and remote fetch cost) for scrub crispness.
|
|
1603
|
-
* `standard` matches the shipped `sheet-geometry`/`sheet-composer` defaults
|
|
1604
|
-
* (480×270 q72), so an unset config is byte-identical to today. The map is
|
|
1605
|
-
* strictly monotone in resolution AND quality across the ordered steps.
|
|
1606
|
-
*/
|
|
1607
|
-
var SCRUB_THUMBNAIL_PRESETS = {
|
|
1608
|
-
minimal: {
|
|
1609
|
-
tileWidth: 240,
|
|
1610
|
-
tileHeight: 135,
|
|
1611
|
-
quality: 55
|
|
1612
|
-
},
|
|
1613
|
-
low: {
|
|
1614
|
-
tileWidth: 320,
|
|
1615
|
-
tileHeight: 180,
|
|
1616
|
-
quality: 60
|
|
1617
|
-
},
|
|
1618
|
-
standard: {
|
|
1619
|
-
tileWidth: 480,
|
|
1620
|
-
tileHeight: 270,
|
|
1621
|
-
quality: 72
|
|
1622
|
-
},
|
|
1623
|
-
high: {
|
|
1624
|
-
tileWidth: 640,
|
|
1625
|
-
tileHeight: 360,
|
|
1626
|
-
quality: 80
|
|
1627
|
-
},
|
|
1628
|
-
max: {
|
|
1629
|
-
tileWidth: 960,
|
|
1630
|
-
tileHeight: 540,
|
|
1631
|
-
quality: 85
|
|
1632
|
-
}
|
|
1633
|
-
};
|
|
1634
|
-
/** Human labels for each preset (resolution-tagged), for settings UIs. */
|
|
1635
|
-
var SCRUB_THUMBNAIL_PRESET_LABELS = {
|
|
1636
|
-
minimal: "Minimal (240p)",
|
|
1637
|
-
low: "Low (320p)",
|
|
1638
|
-
standard: "Standard (480p)",
|
|
1639
|
-
high: "High (640p)",
|
|
1640
|
-
max: "Max (960p)"
|
|
1641
|
-
};
|
|
1642
|
-
/** Ordered low→high so a UI can render the ladder in graduated order. */
|
|
1643
|
-
var SCRUB_THUMBNAIL_PRESET_ORDER = [
|
|
1644
|
-
"minimal",
|
|
1645
|
-
"low",
|
|
1646
|
-
"standard",
|
|
1647
|
-
"high",
|
|
1648
|
-
"max"
|
|
1649
|
-
];
|
|
1650
|
-
/**
|
|
1651
|
-
* Resolve the geometry for a recording config's scrub-thumbnail preset,
|
|
1652
|
-
* defaulting to `standard` when unset. Pure — no I/O.
|
|
1653
|
-
*/
|
|
1654
|
-
function resolveScrubThumbnailGeometry(preset) {
|
|
1655
|
-
return SCRUB_THUMBNAIL_PRESETS[preset ?? "standard"];
|
|
1656
|
-
}
|
|
1657
|
-
/**
|
|
1658
1581
|
* The full per-camera recording intent — the wire shape of a RecordingTarget.
|
|
1659
1582
|
*
|
|
1660
1583
|
* `bands` is the ONLY authored recording intent: what to record, when, and on
|
|
@@ -1662,7 +1585,11 @@ function resolveScrubThumbnailGeometry(preset) {
|
|
|
1662
1585
|
* other field is a storage knob (profiles, segment length, retention, scrub).
|
|
1663
1586
|
*
|
|
1664
1587
|
* STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
|
|
1665
|
-
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30
|
|
1588
|
+
* `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
|
|
1589
|
+
* and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
|
|
1590
|
+
* deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
|
|
1591
|
+
* (D62: a switch that writes a store nobody reads is worse than no switch).
|
|
1592
|
+
* Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
|
|
1666
1593
|
* A stale caller must fail loudly — silently stripping its legacy intent would
|
|
1667
1594
|
* persist a band-less config, i.e. silently stop recording the camera.
|
|
1668
1595
|
*/
|
|
@@ -1685,14 +1612,7 @@ var RecordingConfigSchema = zod.z.object({
|
|
|
1685
1612
|
* "off" is the absence of a covering band, never a band value.
|
|
1686
1613
|
*/
|
|
1687
1614
|
bands: zod.z.array(RecordingBandSchema).default([]),
|
|
1688
|
-
retention: RecordingRetentionSchema.optional()
|
|
1689
|
-
/**
|
|
1690
|
-
* Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
|
|
1691
|
-
* timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
|
|
1692
|
-
* windows only — existing sheets are immutable, and each window's index
|
|
1693
|
-
* carries its own tile dims so mixed-preset history renders correctly.
|
|
1694
|
-
*/
|
|
1695
|
-
scrubThumbnails: ScrubThumbnailPresetSchema.optional()
|
|
1615
|
+
retention: RecordingRetentionSchema.optional()
|
|
1696
1616
|
}).strict();
|
|
1697
1617
|
/**
|
|
1698
1618
|
* Derive the {@link RecordingStorageModeSchema} summary from the authoritative
|
|
@@ -7307,11 +7227,26 @@ var settingsStoreCapability = {
|
|
|
7307
7227
|
key: zod.z.string(),
|
|
7308
7228
|
value: zod.z.unknown()
|
|
7309
7229
|
}), zod.z.void(), { kind: "mutation" }),
|
|
7310
|
-
/**
|
|
7230
|
+
/**
|
|
7231
|
+
* Rows matching a filter.
|
|
7232
|
+
*
|
|
7233
|
+
* `columns` is a SQL-level projection: the engine SELECTs only those
|
|
7234
|
+
* columns (plus the primary key) instead of the whole row. It is the only
|
|
7235
|
+
* way to stop paying disk for a column that is discarded — a heavy JSON
|
|
7236
|
+
* column dominates the row, and dropping it in JS after the read pays every
|
|
7237
|
+
* byte first. Measured on the live `pipeline-analytics:tracks` table: a
|
|
7238
|
+
* 501-row page is 4.6 MB whole and 0.11 MB projected, same index, same
|
|
7239
|
+
* plan.
|
|
7240
|
+
*
|
|
7241
|
+
* The engine REFUSES a column it cannot serve rather than omitting it —
|
|
7242
|
+
* see `SettingsQueryInput.columns` for why a projection may not be
|
|
7243
|
+
* forgiving the way a predicate is.
|
|
7244
|
+
*/
|
|
7311
7245
|
query: require_sleep.method(zod.z.object({
|
|
7312
7246
|
namespace: zod.z.string().optional(),
|
|
7313
7247
|
collection: zod.z.string(),
|
|
7314
|
-
filter: QueryFilterSchema.optional()
|
|
7248
|
+
filter: QueryFilterSchema.optional(),
|
|
7249
|
+
columns: zod.z.array(zod.z.string()).readonly().optional()
|
|
7315
7250
|
}), zod.z.array(SettingsRecordSchema).readonly()),
|
|
7316
7251
|
/** Insert a new record. */
|
|
7317
7252
|
insert: require_sleep.method(zod.z.object({
|
|
@@ -7478,7 +7413,17 @@ var dataStoreProviderCapability = {
|
|
|
7478
7413
|
query: require_sleep.method(zod.z.object({
|
|
7479
7414
|
namespace: zod.z.string().optional(),
|
|
7480
7415
|
collection: zod.z.string(),
|
|
7481
|
-
filter: QueryFilterSchema.optional()
|
|
7416
|
+
filter: QueryFilterSchema.optional(),
|
|
7417
|
+
/**
|
|
7418
|
+
* SQL-level column projection — MUST mirror `settings-store.query`.
|
|
7419
|
+
*
|
|
7420
|
+
* This is the second schema the same call passes through, and Zod
|
|
7421
|
+
* objects STRIP what they do not declare: a field present on the door
|
|
7422
|
+
* and absent here does not error, it silently disappears one hop before
|
|
7423
|
+
* the engine, and the caller concludes the projection does nothing.
|
|
7424
|
+
* `data-door-schema-parity.spec.ts` is what keeps the two in step.
|
|
7425
|
+
*/
|
|
7426
|
+
columns: zod.z.array(zod.z.string()).readonly().optional()
|
|
7482
7427
|
}), zod.z.array(SettingsRecordSchema).readonly()),
|
|
7483
7428
|
/** Insert a new record. */
|
|
7484
7429
|
insert: require_sleep.method(zod.z.object({
|
|
@@ -23600,7 +23545,27 @@ var faceGalleryCapability = {
|
|
|
23600
23545
|
scope: "system",
|
|
23601
23546
|
mode: "singleton",
|
|
23602
23547
|
methods: {
|
|
23603
|
-
listIdentities: require_sleep.method(zod.z.
|
|
23548
|
+
listIdentities: require_sleep.method(zod.z.object({
|
|
23549
|
+
/**
|
|
23550
|
+
* Inline {@link IdentitySchema.coverBase64} on every row.
|
|
23551
|
+
*
|
|
23552
|
+
* Default `false`, the same inversion `listRecentFaces` and
|
|
23553
|
+
* `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
|
|
23554
|
+
* why the burden belongs on the caller that WANTS the bytes). Measured
|
|
23555
|
+
* on the live hub the same day: four identities cost 40,979 B with the
|
|
23556
|
+
* covers inline, ~10 KB of base64 per row, on a query this UI mounts
|
|
23557
|
+
* four times and the viewer holds at `staleTime: 30_000`.
|
|
23558
|
+
*
|
|
23559
|
+
* Nothing loses its avatar: `coverMediaKey` is already on every row and
|
|
23560
|
+
* the `event-media` plane serves that key `immutable` with an ETag.
|
|
23561
|
+
*
|
|
23562
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
23563
|
+
* next train** — the hub router validates cap inputs against its own
|
|
23564
|
+
* compiled Zod and strips a key it does not know. Until then the
|
|
23565
|
+
* provider sees `undefined`, which resolves to `false`: the cheap shape
|
|
23566
|
+
* is what ships, and the opt-in becomes reachable when the train lands.
|
|
23567
|
+
*/
|
|
23568
|
+
includeCrops: zod.z.boolean().optional() }).optional(), zod.z.array(IdentitySchema).readonly()),
|
|
23604
23569
|
createIdentity: require_sleep.method(zod.z.object({ name: zod.z.string().min(1) }), IdentitySchema, {
|
|
23605
23570
|
kind: "mutation",
|
|
23606
23571
|
auth: "admin"
|
|
@@ -26961,8 +26926,10 @@ var PlateInfoSchema = zod.z.object({
|
|
|
26961
26926
|
keyFrameMediaKey: zod.z.string().optional(),
|
|
26962
26927
|
base64: zod.z.string().optional(),
|
|
26963
26928
|
/**
|
|
26964
|
-
* Same crop as a data-plane URL
|
|
26965
|
-
* never inlines JPEG; `listPlates`
|
|
26929
|
+
* Same crop as a data-plane URL, always present when the plate has a stored
|
|
26930
|
+
* crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
|
|
26931
|
+
* and `searchPlates` inline the crop only when their `includeCrops` input is
|
|
26932
|
+
* left at its `true` default.
|
|
26966
26933
|
*/
|
|
26967
26934
|
cropUrl: zod.z.string().optional()
|
|
26968
26935
|
});
|
|
@@ -26995,7 +26962,25 @@ var plateGalleryCapability = {
|
|
|
26995
26962
|
methods: {
|
|
26996
26963
|
listPlates: require_sleep.method(zod.z.object({
|
|
26997
26964
|
deviceId: zod.z.number().int().optional(),
|
|
26998
|
-
limit: zod.z.number().int().positive().optional()
|
|
26965
|
+
limit: zod.z.number().int().positive().optional(),
|
|
26966
|
+
/**
|
|
26967
|
+
* Inline the base64 crop on every row. Default `true` — the existing
|
|
26968
|
+
* behaviour, kept so no caller breaks.
|
|
26969
|
+
*
|
|
26970
|
+
* Set `false` once the caller renders {@link PlateInfo.cropUrl}.
|
|
26971
|
+
* Measured on the live hub at the 500 rows the Plates view asks for:
|
|
26972
|
+
* 879,403 B and 27.7 s with the crops inline, against a few KiB of
|
|
26973
|
+
* metadata without them — and the browser then caches the images.
|
|
26974
|
+
*
|
|
26975
|
+
* This is the plate twin of `faceGallery.listRecentFaces`'s option;
|
|
26976
|
+
* plates were the one gallery list left without it.
|
|
26977
|
+
*
|
|
26978
|
+
* **This is an INPUT field, so it does not reach the addon until the
|
|
26979
|
+
* next train.** The hub router validates cap inputs against its own
|
|
26980
|
+
* compiled Zod and strips a key it does not know. Until the train
|
|
26981
|
+
* ships, sending `false` is harmless and keeps the crops inline.
|
|
26982
|
+
*/
|
|
26983
|
+
includeCrops: zod.z.boolean().optional()
|
|
26999
26984
|
}).optional(), zod.z.array(PlateInfoSchema).readonly()),
|
|
27000
26985
|
getPlateByTrack: require_sleep.method(zod.z.object({
|
|
27001
26986
|
deviceId: zod.z.number().int(),
|
|
@@ -27006,7 +26991,9 @@ var plateGalleryCapability = {
|
|
|
27006
26991
|
searchPlates: require_sleep.method(zod.z.object({
|
|
27007
26992
|
text: zod.z.string().min(1),
|
|
27008
26993
|
maxDistance: zod.z.number().int().min(0).optional(),
|
|
27009
|
-
limit: zod.z.number().int().positive().optional()
|
|
26994
|
+
limit: zod.z.number().int().positive().optional(),
|
|
26995
|
+
/** See `listPlates.includeCrops`. Default `true`. */
|
|
26996
|
+
includeCrops: zod.z.boolean().optional()
|
|
27010
26997
|
}), zod.z.array(PlateInfoSchema).readonly()),
|
|
27011
26998
|
/** Suggest groups of near-identical reads (same physical plate) for review/merge. */
|
|
27012
26999
|
suggestPlateClusters: require_sleep.method(zod.z.object({
|
|
@@ -27026,7 +27013,13 @@ var plateGalleryCapability = {
|
|
|
27026
27013
|
kind: "mutation",
|
|
27027
27014
|
auth: "admin"
|
|
27028
27015
|
}),
|
|
27029
|
-
listVehicles: require_sleep.method(zod.z.
|
|
27016
|
+
listVehicles: require_sleep.method(zod.z.object({
|
|
27017
|
+
/** Inline {@link VehicleSchema.coverBase64} on every row. Default
|
|
27018
|
+
* `false` — the vehicle twin of `faceGallery.listIdentities`'s
|
|
27019
|
+
* option; `coverMediaKey` + the `event-media` plane carry the picture.
|
|
27020
|
+
* INPUT field: stripped by the hub router until the train ships, which
|
|
27021
|
+
* resolves to `false` and is exactly the intended default. */
|
|
27022
|
+
includeCrops: zod.z.boolean().optional() }).optional(), zod.z.array(VehicleSchema).readonly()),
|
|
27030
27023
|
createVehicle: require_sleep.method(zod.z.object({ name: zod.z.string().min(1) }), VehicleSchema, {
|
|
27031
27024
|
kind: "mutation",
|
|
27032
27025
|
auth: "admin"
|
|
@@ -47838,7 +47831,6 @@ exports.DEFAULT_POOL_MEMORY_POLICY = DEFAULT_POOL_MEMORY_POLICY;
|
|
|
47838
47831
|
exports.DEFAULT_RECORDING_PROFILES = DEFAULT_RECORDING_PROFILES;
|
|
47839
47832
|
exports.DEFAULT_RETENTION = DEFAULT_RETENTION;
|
|
47840
47833
|
exports.DEFAULT_RUNTIME_STATE_DURABILITY = require_sleep.DEFAULT_RUNTIME_STATE_DURABILITY;
|
|
47841
|
-
exports.DEFAULT_SCRUB_THUMBNAIL_PRESET = DEFAULT_SCRUB_THUMBNAIL_PRESET;
|
|
47842
47834
|
exports.DEFAULT_TIMELAPSE_PREVIEW_TEXT = DEFAULT_TIMELAPSE_PREVIEW_TEXT;
|
|
47843
47835
|
exports.DETAIL_CROP_PADDING_FIELD = DETAIL_CROP_PADDING_FIELD;
|
|
47844
47836
|
exports.DETAIL_CROP_PADDING_KEY = DETAIL_CROP_PADDING_KEY;
|
|
@@ -48362,9 +48354,6 @@ exports.SCENE_DEFAULT_UNCOVERED_POLICY = SCENE_DEFAULT_UNCOVERED_POLICY;
|
|
|
48362
48354
|
exports.SCENE_DIVERGED = SCENE_DIVERGED;
|
|
48363
48355
|
exports.SCENE_RESET_RECAPTURES = SCENE_RESET_RECAPTURES;
|
|
48364
48356
|
exports.SCOPE_PRESETS = SCOPE_PRESETS;
|
|
48365
|
-
exports.SCRUB_THUMBNAIL_PRESETS = SCRUB_THUMBNAIL_PRESETS;
|
|
48366
|
-
exports.SCRUB_THUMBNAIL_PRESET_LABELS = SCRUB_THUMBNAIL_PRESET_LABELS;
|
|
48367
|
-
exports.SCRUB_THUMBNAIL_PRESET_ORDER = SCRUB_THUMBNAIL_PRESET_ORDER;
|
|
48368
48357
|
exports.SENSOR_FEATURES = SENSOR_FEATURES;
|
|
48369
48358
|
exports.SENSOR_MAP = SENSOR_MAP;
|
|
48370
48359
|
exports.SOURCE_INFO_METADATA_KEY = SOURCE_INFO_METADATA_KEY;
|
|
@@ -48387,7 +48376,6 @@ exports.ScopedTokenSchema = ScopedTokenSchema;
|
|
|
48387
48376
|
exports.ScopedTokenSummarySchema = ScopedTokenSummarySchema;
|
|
48388
48377
|
exports.ScoredObjectEventSchema = ScoredObjectEventSchema;
|
|
48389
48378
|
exports.ScriptRunnerStatusSchema = ScriptRunnerStatusSchema;
|
|
48390
|
-
exports.ScrubThumbnailPresetSchema = ScrubThumbnailPresetSchema;
|
|
48391
48379
|
exports.SearchResultSchema = SearchResultSchema;
|
|
48392
48380
|
exports.SendEmailInputSchema = SendEmailInputSchema;
|
|
48393
48381
|
exports.SendEmailResultSchema = SendEmailResultSchema;
|
|
@@ -48885,7 +48873,6 @@ exports.resolveMutate = resolveMutate;
|
|
|
48885
48873
|
exports.resolvePoolMemoryPolicy = resolvePoolMemoryPolicy;
|
|
48886
48874
|
exports.resolveRecordingProfiles = resolveRecordingProfiles;
|
|
48887
48875
|
exports.resolveRunnerId = resolveRunnerId;
|
|
48888
|
-
exports.resolveScrubThumbnailGeometry = resolveScrubThumbnailGeometry;
|
|
48889
48876
|
exports.resolveVariantModelId = resolveVariantModelId;
|
|
48890
48877
|
exports.resolveViewableDeviceIds = resolveViewableDeviceIds;
|
|
48891
48878
|
exports.roleSpec = roleSpec;
|