@camstack/types 1.2.211 → 1.2.213

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/addon.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-OPlow2a9.js");
2
+ const require_sleep = require("./sleep-VlZxDyXq.js");
3
3
  const require_event_category = require("./event-category-BVfsrBYA.js");
4
4
  const require_err_msg = require("./err-msg-COpsHMw2.js");
5
5
  //#region src/generated/cap-input-defaults.ts
package/dist/addon.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as DeviceType, Et as normalizeAddonInitResult, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, K as ReadinessTimeoutError, S as DEVICE_CHILDREN_BATCH_MAX, St as DATAPLANE_SECRET_HEADER, T as describeCustomActions, Tt as BaseAddon, U as readNodePin, Y as scopeKey, a as asJsonObject, b as deviceOpsCapability, d as BOOT_RECOVERY_BACKOFF_MS, f as DEVICE_SCOPED_CAPS, h as createEventBusSliceSource, j as adminUiCapability, kt as emitReadiness, m as createDeviceProxy, p as isDeviceScopedCap, s as asString, t as sleep, u as parseJsonUnknown, wt as DisposerChain, x as viewerUiCapability } from "./sleep-Bs3xPtSh.mjs";
1
+ import { A as DeviceType, Et as normalizeAddonInitResult, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, K as ReadinessTimeoutError, S as DEVICE_CHILDREN_BATCH_MAX, St as DATAPLANE_SECRET_HEADER, T as describeCustomActions, Tt as BaseAddon, U as readNodePin, Y as scopeKey, a as asJsonObject, b as deviceOpsCapability, d as BOOT_RECOVERY_BACKOFF_MS, f as DEVICE_SCOPED_CAPS, h as createEventBusSliceSource, j as adminUiCapability, kt as emitReadiness, m as createDeviceProxy, p as isDeviceScopedCap, s as asString, t as sleep, u as parseJsonUnknown, wt as DisposerChain, x as viewerUiCapability } from "./sleep-GU_us3DG.mjs";
2
2
  import { t as EventCategory } from "./event-category-BVDXG4tB.mjs";
3
3
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
4
4
  //#region src/generated/cap-input-defaults.ts
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { DeviceType } from '../device/device-type.js';
3
- import { type InferNativeProvider } from './capability-definition.js';
3
+ import { type InferNativeProvider, type InferProvider } from './capability-definition.js';
4
4
  /**
5
5
  * camera-grid-layout — the geometry of a COMPOSITE camera, on the camera's own
6
6
  * page.
@@ -17,11 +17,15 @@ import { type InferNativeProvider } from './capability-definition.js';
17
17
  *
18
18
  * Adding a fifth name to that list would have been the wrong fix twice over:
19
19
  * that page is per-camera DETECTION tuning, and a grid's geometry belongs
20
- * beside PTZ and motion zones on the camera itself — which is exactly where the
21
- * framework already puts a widget, when the widget is declared on a CAPABILITY.
22
- * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
23
- * all use it): the framework emits the structural section and the widget
24
- * self-persists through the cap's own mutations.
20
+ * beside PTZ and motion zones on the camera itself. The device page is
21
+ * BINDING-driven (D12), so the way in is a capability bound to the device —
22
+ * and this cap carries its section the way `recording` does, by RETURNING it
23
+ * from `getDeviceSettingsContribution`.
24
+ *
25
+ * Seven other widgets are still declared the other way, through a
26
+ * `deviceConfig.ui` block the framework derives a section from. That route
27
+ * gives the addon no say in where its own panel lands and no way to decline
28
+ * for a device the panel does not suit, which is why this one does not use it.
25
29
  *
26
30
  * ## Why one addon may implement it
27
31
  *
@@ -151,15 +155,24 @@ export declare const cameraGridLayoutCapability: {
151
155
  readonly deviceNative: true;
152
156
  readonly mode: "singleton";
153
157
  readonly deviceTypes: readonly [DeviceType.Camera];
154
- readonly deviceConfig: {
155
- readonly ui: {
156
- readonly kind: "widget";
157
- readonly widgetId: "host/camera-grid-layout";
158
- readonly tab: "streaming";
159
- readonly label: "Grid layout";
160
- readonly order: 20;
161
- };
162
- };
158
+ /**
159
+ * The section is built by the ADDON and returned from
160
+ * `getDeviceSettingsContribution`, not derived by the framework from a
161
+ * `deviceConfig.ui` block.
162
+ *
163
+ * Both mechanisms render the same widget. This one hands the addon two
164
+ * things the framework-derived route cannot give it:
165
+ *
166
+ * - it chooses its own section, `tab`, `location` and `order`, the way any
167
+ * other setting does, instead of receiving them from a cap declaration;
168
+ * - it can DECLINE per device. A camera that is not a grid gets no section
169
+ * at all, rather than a widget that renders its own "not a grid" state.
170
+ *
171
+ * `recording` is the precedent (`recorder/recording-device-settings.ts`): it
172
+ * returns `null` for anything that is not a camera, so the Recording tab
173
+ * never appears there.
174
+ */
175
+ readonly exposesDeviceSettings: true;
163
176
  readonly methods: {
164
177
  /**
165
178
  * The grid behind this device.
@@ -258,5 +271,21 @@ export declare const cameraGridLayoutCapability: {
258
271
  }, z.core.$strip>, "mutation">;
259
272
  };
260
273
  };
274
+ /**
275
+ * The DEVICE's provider: the data methods only.
276
+ *
277
+ * `InferNativeProvider` deliberately omits the device-settings contribution —
278
+ * the framework expects a native provider to hold the data and a WRAPPER to
279
+ * describe the UI, which is why `getProviderByAddon` (not
280
+ * `getProviderForDevice`) is what the aggregation resolves with.
281
+ */
261
282
  export type ICameraGridLayoutProvider = InferNativeProvider<typeof cameraGridLayoutCapability>;
283
+ /**
284
+ * The ADDON's provider: the same methods plus the contribution surface that
285
+ * `exposesDeviceSettings` adds. This is the one that carries the section, and
286
+ * the one that can decline for a device that is not a grid.
287
+ *
288
+ * Two types for two roles, the same split `doorbell` and `snapshot` use.
289
+ */
290
+ export type ICameraGridLayoutSettingsProvider = InferProvider<typeof cameraGridLayoutCapability>;
262
291
  export {};
@@ -169,7 +169,7 @@ export { type IMediaPlayerProvider, type MediaInfo, type MediaPlayerRepeat, Medi
169
169
  export { type IMeshNetworkProvider, type MeshEndpoint, type MeshPeer, MeshPeerSchema, type MeshStatus, MeshStatusSchema, meshNetworkCapability, } from './mesh-network.cap.js';
170
170
  export { type IMotionProvider, MOTION_CLOSE_AFTER_MS, type MotionOnMotionChangedData, MotionOnMotionChangedDataSchema, type MotionStatus, MotionStatusSchema, motionCapability, } from './motion.cap.js';
171
171
  export { type IMotionTriggerProvider, type MotionTriggerRuntimeState, MotionTriggerRuntimeStateSchema, type MotionTriggerStatus, MotionTriggerStatusSchema, motionTriggerCapability, } from './motion-trigger.cap.js';
172
- export { type GridLayoutCell, type GridLayoutPatch, GridLayoutPatchSchema, type GridNormalizedRect, type GridProfileOffer, type GridLayoutView, GridLayoutViewSchema, type ICameraGridLayoutProvider, cameraGridLayoutCapability, } from './camera-grid-layout.cap.js';
172
+ export { type GridLayoutCell, type GridLayoutPatch, GridLayoutPatchSchema, type GridNormalizedRect, type GridProfileOffer, type GridLayoutView, GridLayoutViewSchema, type ICameraGridLayoutProvider, type ICameraGridLayoutSettingsProvider, cameraGridLayoutCapability, } from './camera-grid-layout.cap.js';
173
173
  export { type IMotionZonesProvider, type MotionZoneOptions, MotionZoneOptionsSchema, type MotionZonePatch, MotionZonePatchSchema, type MotionZoneRegion, MotionZoneRegionSchema, type MotionZoneStatus, MotionZoneStatusSchema, motionZonesCapability, } from './motion-zones.cap.js';
174
174
  export { type INativeObjectDetectionProvider, type NativeDetection, NativeDetectionSchema, type NativeObjectClass, NativeObjectClassEnum, type NativeObjectDetectionOptions, NativeObjectDetectionOptionsSchema, type NativeObjectDetectionRuntimeState, NativeObjectDetectionRuntimeStateSchema, type NativeObjectDetectionSettingsPatch, NativeObjectDetectionSettingsPatchSchema, type NativeObjectDetectionStatus, NativeObjectDetectionStatusSchema, type NativeObjectGeometry, NativeObjectGeometryEnum, nativeObjectDetectionCapability, } from './native-object-detection.cap.js';
175
175
  export { type INavigationProvider, NAVIGATION_ACTION_CATALOG, NAVIGATION_LIGHT_LEVEL_MAX, NAVIGATION_LIGHT_LEVEL_MIN, type NavigationActionEntry, NavigationActionEntrySchema, type NavigationActionId, NavigationActionIdSchema, type NavigationEntryKind, NavigationEntryKindSchema, type NavigationFeatures, NavigationFeaturesSchema, type NavigationLightMode, NavigationLightModeSchema, type NavigationMode, NavigationModeSchema, type NavigationMoveCommand, NavigationMoveCommandSchema, type NavigationPoint, NavigationPointSchema, type NavigationRuntimeState, NavigationRuntimeStateSchema, type NavigationStatus, NavigationStatusSchema, navigationCapability, } from './navigation.cap.js';
@@ -210,9 +210,22 @@ export interface FfmpegFmp4Sink {
210
210
  export type FfmpegSink = {
211
211
  readonly kind: 'rtsp-listen';
212
212
  readonly url: string;
213
- } | {
213
+ }
214
+ /**
215
+ * A container written to stdout.
216
+ *
217
+ * `flv` exists for a producer whose consumer is the broker's ffmpeg source
218
+ * reader: that reader re-muxes with `-c copy -f mpegts`, and the bundled
219
+ * ffmpeg 7.0.2 static SEGFAULTS on an MPEG-TS input on that path — measured
220
+ * on the hub 2026-09-17, on a synthetic three-second stream as readily as on
221
+ * a real one, while RTSP→TS and FLV→TS copy both exit 0. A producer that
222
+ * hands the broker MPEG-TS therefore hands it a crash; FLV is the format the
223
+ * broker already documents as "always ingested through the ffmpeg source
224
+ * reader" (`pull-flv`).
225
+ */
226
+ | {
214
227
  readonly kind: 'stdout';
215
- readonly container: 'h264' | 'hevc' | 'mpegts';
228
+ readonly container: 'h264' | 'hevc' | 'mpegts' | 'flv';
216
229
  } | FfmpegFmp4Sink
217
230
  /**
218
231
  * Two independent mapped RTP outputs. Generic ffmpeg RTP vocabulary — the
@@ -1199,6 +1199,27 @@ export type AppRouter = TrpcCoreRouter<{
1199
1199
  errorShape: AugmentedErrorShape;
1200
1200
  transformer: true;
1201
1201
  }, TRPCDecorateCreateRouterOptions<{
1202
+ getDeviceSettingsContribution: TRPCQueryProcedure<{
1203
+ input: {
1204
+ [x: string]: unknown;
1205
+ } & z.input<typeof DEVICE_SETTINGS_CONTRIBUTION_METHODS.getDeviceSettingsContribution.input>;
1206
+ output: z.infer<typeof DEVICE_SETTINGS_CONTRIBUTION_METHODS.getDeviceSettingsContribution.output>;
1207
+ meta: object;
1208
+ }>;
1209
+ getDeviceLiveContribution: TRPCQueryProcedure<{
1210
+ input: {
1211
+ [x: string]: unknown;
1212
+ } & z.input<typeof DEVICE_SETTINGS_CONTRIBUTION_METHODS.getDeviceLiveContribution.input>;
1213
+ output: z.infer<typeof DEVICE_SETTINGS_CONTRIBUTION_METHODS.getDeviceLiveContribution.output>;
1214
+ meta: object;
1215
+ }>;
1216
+ applyDeviceSettingsPatch: TRPCMutationProcedure<{
1217
+ input: {
1218
+ [x: string]: unknown;
1219
+ } & z.input<typeof DEVICE_SETTINGS_CONTRIBUTION_METHODS.applyDeviceSettingsPatch.input>;
1220
+ output: z.infer<typeof DEVICE_SETTINGS_CONTRIBUTION_METHODS.applyDeviceSettingsPatch.output>;
1221
+ meta: object;
1222
+ }>;
1202
1223
  getLayout: TRPCQueryProcedure<{
1203
1224
  input: {
1204
1225
  [x: string]: unknown;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-OPlow2a9.js");
2
+ const require_sleep = require("./sleep-VlZxDyXq.js");
3
3
  const require_event_category = require("./event-category-BVfsrBYA.js");
4
4
  const require_canonical_hash = require("./canonical-hash-CZ2JqJc3.js");
5
5
  const require_enums = require("./enums.js");
@@ -32455,11 +32455,15 @@ var motionTriggerCapability = {
32455
32455
  *
32456
32456
  * Adding a fifth name to that list would have been the wrong fix twice over:
32457
32457
  * that page is per-camera DETECTION tuning, and a grid's geometry belongs
32458
- * beside PTZ and motion zones on the camera itself — which is exactly where the
32459
- * framework already puts a widget, when the widget is declared on a CAPABILITY.
32460
- * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
32461
- * all use it): the framework emits the structural section and the widget
32462
- * self-persists through the cap's own mutations.
32458
+ * beside PTZ and motion zones on the camera itself. The device page is
32459
+ * BINDING-driven (D12), so the way in is a capability bound to the device —
32460
+ * and this cap carries its section the way `recording` does, by RETURNING it
32461
+ * from `getDeviceSettingsContribution`.
32462
+ *
32463
+ * Seven other widgets are still declared the other way, through a
32464
+ * `deviceConfig.ui` block the framework derives a section from. That route
32465
+ * gives the addon no say in where its own panel lands and no way to decline
32466
+ * for a device the panel does not suit, which is why this one does not use it.
32463
32467
  *
32464
32468
  * ## Why one addon may implement it
32465
32469
  *
@@ -32549,13 +32553,24 @@ var cameraGridLayoutCapability = {
32549
32553
  deviceNative: true,
32550
32554
  mode: "singleton",
32551
32555
  deviceTypes: [require_sleep.DeviceType.Camera],
32552
- deviceConfig: { ui: {
32553
- kind: "widget",
32554
- widgetId: "host/camera-grid-layout",
32555
- tab: "streaming",
32556
- label: "Grid layout",
32557
- order: 20
32558
- } },
32556
+ /**
32557
+ * The section is built by the ADDON and returned from
32558
+ * `getDeviceSettingsContribution`, not derived by the framework from a
32559
+ * `deviceConfig.ui` block.
32560
+ *
32561
+ * Both mechanisms render the same widget. This one hands the addon two
32562
+ * things the framework-derived route cannot give it:
32563
+ *
32564
+ * - it chooses its own section, `tab`, `location` and `order`, the way any
32565
+ * other setting does, instead of receiving them from a cap declaration;
32566
+ * - it can DECLINE per device. A camera that is not a grid gets no section
32567
+ * at all, rather than a widget that renders its own "not a grid" state.
32568
+ *
32569
+ * `recording` is the precedent (`recorder/recording-device-settings.ts`): it
32570
+ * returns `null` for anything that is not a camera, so the Recording tab
32571
+ * never appears there.
32572
+ */
32573
+ exposesDeviceSettings: true,
32559
32574
  methods: {
32560
32575
  /**
32561
32576
  * The grid behind this device.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as CAM_PROFILE_ORDER, A as DeviceType, At as isEvent, B as systemMethod, Bt as isAudioChunkFormat, C as customAction, Ct as SHARE_VIEW_KINDS, D as ChargingStatus, Dt as createDurableState, E as deviceCustomAction, Et as normalizeAddonInitResult, F as event, Ft as hydrateSchema, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, It as resolveHydratedFieldValue, J as readinessKey, K as ReadinessTimeoutError, L as isDeviceConfigCap, Lt as AUDIO_CHUNK_FORMATS, M as DEFAULT_RUNTIME_STATE_DURABILITY, Mt as WELL_KNOWN_TAB_MAP, N as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Nt as collectHydratedFieldEntries, O as DeviceFeature, Ot as createEvent, P as DEVICE_STATUS_METHOD, Pt as collectHydratedFieldValues, Q as BrokerStatusSchema, R as method, Rt as audioChunkBytesPerSample, S as DEVICE_CHILDREN_BATCH_MAX, St as DATAPLANE_SECRET_HEADER, T as describeCustomActions, Tt as BaseAddon, U as readNodePin, V as CAP_NODE_PIN_CONTEXT_KEY, W as toNodeId, X as AudioChunkFormatSchema, Y as scopeKey, Z as BrokerStatsSchema, _ as createMirrorSource, _t as SubscribeFramesResultSchema, a as asJsonObject, at as DecodedFrameSchema, b as deviceOpsCapability, bt as parseProfileBrokerId, c as parseJsonArray, ct as FrameHandleSchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as ProfileSlotStatusSchema, et as CamProfileSchema, f as DEVICE_SCOPED_CAPS, ft as StreamSourceEntrySchema, g as createLazyTrpcSource, gt as SubscribeFramesInputSchema, h as createEventBusSliceSource, ht as SubscribeAudioChunksResultSchema, i as asJsonArray, it as DecodedAudioChunkSchema, j as adminUiCapability, jt as WELL_KNOWN_TABS, k as DeviceRole, kt as emitReadiness, l as parseJsonObject, lt as ProfileRtspEntrySchema, m as createDeviceProxy, mt as SubscribeAudioChunksInputSchema, n as sleepCancellable, nt as CamStreamResolutionSchema, o as asNumber, ot as EncodedPacketSchema, p as isDeviceScopedCap, pt as StreamSourceSchema, q as emitDownForOwnedCaps, r as asBoolean, rt as CameraStreamSchema, s as asString, st as FrameHandleFormatSchema, t as sleep, tt as CamStreamKindSchema, u as parseJsonUnknown, ut as ProfileSlotSchema, v as createSliceHandle, vt as makeProfileBrokerId, w as defineCustomActions, wt as DisposerChain, x as viewerUiCapability, xt as selectAssignedProfileSlots, y as RawStateResultSchema, yt as makeSourceBrokerId, z as resolveCapMount, zt as expandAudioChunkToF32le } from "./sleep-Bs3xPtSh.mjs";
1
+ import { $ as CAM_PROFILE_ORDER, A as DeviceType, At as isEvent, B as systemMethod, Bt as isAudioChunkFormat, C as customAction, Ct as SHARE_VIEW_KINDS, D as ChargingStatus, Dt as createDurableState, E as deviceCustomAction, Et as normalizeAddonInitResult, F as event, Ft as hydrateSchema, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, It as resolveHydratedFieldValue, J as readinessKey, K as ReadinessTimeoutError, L as isDeviceConfigCap, Lt as AUDIO_CHUNK_FORMATS, M as DEFAULT_RUNTIME_STATE_DURABILITY, Mt as WELL_KNOWN_TAB_MAP, N as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Nt as collectHydratedFieldEntries, O as DeviceFeature, Ot as createEvent, P as DEVICE_STATUS_METHOD, Pt as collectHydratedFieldValues, Q as BrokerStatusSchema, R as method, Rt as audioChunkBytesPerSample, S as DEVICE_CHILDREN_BATCH_MAX, St as DATAPLANE_SECRET_HEADER, T as describeCustomActions, Tt as BaseAddon, U as readNodePin, V as CAP_NODE_PIN_CONTEXT_KEY, W as toNodeId, X as AudioChunkFormatSchema, Y as scopeKey, Z as BrokerStatsSchema, _ as createMirrorSource, _t as SubscribeFramesResultSchema, a as asJsonObject, at as DecodedFrameSchema, b as deviceOpsCapability, bt as parseProfileBrokerId, c as parseJsonArray, ct as FrameHandleSchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as ProfileSlotStatusSchema, et as CamProfileSchema, f as DEVICE_SCOPED_CAPS, ft as StreamSourceEntrySchema, g as createLazyTrpcSource, gt as SubscribeFramesInputSchema, h as createEventBusSliceSource, ht as SubscribeAudioChunksResultSchema, i as asJsonArray, it as DecodedAudioChunkSchema, j as adminUiCapability, jt as WELL_KNOWN_TABS, k as DeviceRole, kt as emitReadiness, l as parseJsonObject, lt as ProfileRtspEntrySchema, m as createDeviceProxy, mt as SubscribeAudioChunksInputSchema, n as sleepCancellable, nt as CamStreamResolutionSchema, o as asNumber, ot as EncodedPacketSchema, p as isDeviceScopedCap, pt as StreamSourceSchema, q as emitDownForOwnedCaps, r as asBoolean, rt as CameraStreamSchema, s as asString, st as FrameHandleFormatSchema, t as sleep, tt as CamStreamKindSchema, u as parseJsonUnknown, ut as ProfileSlotSchema, v as createSliceHandle, vt as makeProfileBrokerId, w as defineCustomActions, wt as DisposerChain, x as viewerUiCapability, xt as selectAssignedProfileSlots, y as RawStateResultSchema, yt as makeSourceBrokerId, z as resolveCapMount, zt as expandAudioChunkToF32le } from "./sleep-GU_us3DG.mjs";
2
2
  import { t as EventCategory } from "./event-category-BVDXG4tB.mjs";
3
3
  import { a as buildAudioArgs, c as buildVideoArgs, d as logBannerArgs, f as pickVideoEncoder, i as audioPlanFromEncodeProfile, l as invocationFromEncodeProfile, n as Fmp4BoxSplitter, o as buildFfmpegArgs, p as resolveStreamMaps, r as AUDIO_PRESETS, s as buildInputArgs, t as canonicalHash, u as isSoftwareDecode } from "./canonical-hash-DBkl8q6V.mjs";
4
4
  import { EventSourceType } from "./enums.mjs";
@@ -32454,11 +32454,15 @@ var motionTriggerCapability = {
32454
32454
  *
32455
32455
  * Adding a fifth name to that list would have been the wrong fix twice over:
32456
32456
  * that page is per-camera DETECTION tuning, and a grid's geometry belongs
32457
- * beside PTZ and motion zones on the camera itself — which is exactly where the
32458
- * framework already puts a widget, when the widget is declared on a CAPABILITY.
32459
- * `deviceConfig.ui` is the mechanism (`motion-zones`, `ptz`, `ptz-autotrack`
32460
- * all use it): the framework emits the structural section and the widget
32461
- * self-persists through the cap's own mutations.
32457
+ * beside PTZ and motion zones on the camera itself. The device page is
32458
+ * BINDING-driven (D12), so the way in is a capability bound to the device —
32459
+ * and this cap carries its section the way `recording` does, by RETURNING it
32460
+ * from `getDeviceSettingsContribution`.
32461
+ *
32462
+ * Seven other widgets are still declared the other way, through a
32463
+ * `deviceConfig.ui` block the framework derives a section from. That route
32464
+ * gives the addon no say in where its own panel lands and no way to decline
32465
+ * for a device the panel does not suit, which is why this one does not use it.
32462
32466
  *
32463
32467
  * ## Why one addon may implement it
32464
32468
  *
@@ -32548,13 +32552,24 @@ var cameraGridLayoutCapability = {
32548
32552
  deviceNative: true,
32549
32553
  mode: "singleton",
32550
32554
  deviceTypes: [DeviceType.Camera],
32551
- deviceConfig: { ui: {
32552
- kind: "widget",
32553
- widgetId: "host/camera-grid-layout",
32554
- tab: "streaming",
32555
- label: "Grid layout",
32556
- order: 20
32557
- } },
32555
+ /**
32556
+ * The section is built by the ADDON and returned from
32557
+ * `getDeviceSettingsContribution`, not derived by the framework from a
32558
+ * `deviceConfig.ui` block.
32559
+ *
32560
+ * Both mechanisms render the same widget. This one hands the addon two
32561
+ * things the framework-derived route cannot give it:
32562
+ *
32563
+ * - it chooses its own section, `tab`, `location` and `order`, the way any
32564
+ * other setting does, instead of receiving them from a cap declaration;
32565
+ * - it can DECLINE per device. A camera that is not a grid gets no section
32566
+ * at all, rather than a widget that renders its own "not a grid" state.
32567
+ *
32568
+ * `recording` is the precedent (`recorder/recording-device-settings.ts`): it
32569
+ * returns `null` for anything that is not a camera, so the Recording tab
32570
+ * never appears there.
32571
+ */
32572
+ exposesDeviceSettings: true,
32558
32573
  methods: {
32559
32574
  /**
32560
32575
  * The grid behind this device.
@@ -3459,7 +3459,10 @@ function createDeviceProxy(api, binding, opts) {
3459
3459
  },
3460
3460
  cameraGridLayout: {
3461
3461
  getLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getLayout", "query", input),
3462
- saveLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "saveLayout", "mutation", input)
3462
+ saveLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "saveLayout", "mutation", input),
3463
+ getDeviceSettingsContribution: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getDeviceSettingsContribution", "query", input),
3464
+ getDeviceLiveContribution: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getDeviceLiveContribution", "query", input),
3465
+ applyDeviceSettingsPatch: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "applyDeviceSettingsPatch", "mutation", input)
3463
3466
  },
3464
3467
  cameraStreams: {
3465
3468
  getCameraStreams: (input) => dispatch("camera-streams", "cameraStreams", "getCameraStreams", "query", input),
@@ -3459,7 +3459,10 @@ function createDeviceProxy(api, binding, opts) {
3459
3459
  },
3460
3460
  cameraGridLayout: {
3461
3461
  getLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getLayout", "query", input),
3462
- saveLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "saveLayout", "mutation", input)
3462
+ saveLayout: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "saveLayout", "mutation", input),
3463
+ getDeviceSettingsContribution: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getDeviceSettingsContribution", "query", input),
3464
+ getDeviceLiveContribution: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "getDeviceLiveContribution", "query", input),
3465
+ applyDeviceSettingsPatch: (input) => dispatch("camera-grid-layout", "cameraGridLayout", "applyDeviceSettingsPatch", "mutation", input)
3463
3466
  },
3464
3467
  cameraStreams: {
3465
3468
  getCameraStreams: (input) => dispatch("camera-streams", "cameraStreams", "getCameraStreams", "query", input),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.211",
3
+ "version": "1.2.213",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",