@camstack/types 1.2.234 → 1.2.235
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 +1 -1
- package/dist/addon.mjs +1 -1
- package/dist/capabilities/videoclips.cap.d.ts +32 -13
- package/dist/index.js +48 -19
- package/dist/index.mjs +48 -19
- package/dist/interfaces/config-ui.d.ts +1 -1
- package/dist/interfaces/kernel-abstractions.d.ts +0 -14
- package/dist/{sleep-CopaBJss.mjs → sleep-7AN_Txmu.mjs} +0 -6
- package/dist/{sleep-DImve4HM.js → sleep-CsgPITp-.js} +0 -6
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_sleep = require("./sleep-
|
|
2
|
+
const require_sleep = require("./sleep-CsgPITp-.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, At as emitReadiness, Ct as DATAPLANE_SECRET_HEADER, Dt as normalizeAddonInitResult, Et as BaseAddon, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, K as ReadinessTimeoutError, S as DEVICE_CHILDREN_BATCH_MAX, T as describeCustomActions, Tt as DisposerChain, 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, m as createDeviceProxy, p as isDeviceScopedCap, s as asString, t as sleep, u as parseJsonUnknown, x as viewerUiCapability } from "./sleep-
|
|
1
|
+
import { A as DeviceType, At as emitReadiness, Ct as DATAPLANE_SECRET_HEADER, Dt as normalizeAddonInitResult, Et as BaseAddon, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, K as ReadinessTimeoutError, S as DEVICE_CHILDREN_BATCH_MAX, T as describeCustomActions, Tt as DisposerChain, 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, m as createDeviceProxy, p as isDeviceScopedCap, s as asString, t as sleep, u as parseJsonUnknown, x as viewerUiCapability } from "./sleep-7AN_Txmu.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
|
|
@@ -13,13 +13,18 @@ import { type InferProvider } from './capability-definition.js';
|
|
|
13
13
|
* exposes NATIVE onboard clips (Reolink SD card, a hub's storage, HKSV) adds
|
|
14
14
|
* its own catalog ALONGSIDE that one.
|
|
15
15
|
*
|
|
16
|
-
* The mount stays per-device (`resolveCapMount` → `device-scoped`)
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
16
|
+
* The mount stays per-device (`resolveCapMount` → `device-scoped`), and a
|
|
17
|
+
* device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
|
|
18
|
+
* what says a provider serves this camera, never the set of addons that
|
|
19
|
+
* happen to have registered the capability somewhere in the cluster. That is
|
|
20
|
+
* what stopped one addon appearing three times on 592 — as the device's
|
|
21
|
+
* native provider, as the hub-local registration and as
|
|
22
|
+
* `pipeline-analytics@little-unraid` (D554 amended 2026-09-20).
|
|
23
|
+
*
|
|
24
|
+
* `listClips` is asked of ONE provider at a time
|
|
25
|
+
* ({@link videoclipsCapability.methods.listClips} `provider`), defaulting to
|
|
26
|
+
* the bound one, which is CamStack on every camera today. It is NOT a union
|
|
27
|
+
* over everything a camera has: *"l'utilizzatore è uno solo"*.
|
|
23
28
|
* {@link videoclipsCapability.methods.getClipPlayback} dispatches by the
|
|
24
29
|
* source namespace inside the clip id, which is why ids are self-contained.
|
|
25
30
|
*
|
|
@@ -174,18 +179,32 @@ export declare const videoclipsCapability: {
|
|
|
174
179
|
* `device-config-widget-wrapped-binding.spec.ts` pins that a `kind:'wrapped'`
|
|
175
180
|
* binding entry derives the same section a native one does.
|
|
176
181
|
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
182
|
+
* **It is a SECTION of the Recording tab, at the end of it — not a tab of
|
|
183
|
+
* its own.** It shipped as a `clips` top-tab and the operator rejected the
|
|
184
|
+
* placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
|
|
185
|
+
* necessario, una nuova sezione alla fine per le clips"*. The Recording tab
|
|
186
|
+
* already holds the recorder's panel, the schedule bands and the unified
|
|
187
|
+
* retention policy; footage the camera itself holds is the same question,
|
|
188
|
+
* asked of a different store. `order: 100` puts it after all of them with
|
|
189
|
+
* room left in front. The `clips` entry in `WELL_KNOWN_TABS` went with it —
|
|
190
|
+
* a well-known id nobody declares is an invitation to mint the tab again.
|
|
191
|
+
*
|
|
192
|
+
* `topTab` stays: the browser owns a pane (a day's tiles, a source list and
|
|
193
|
+
* a player) and the Config tab's inner bar has no room for one. The widget
|
|
194
|
+
* itself is `host/clips-browser` in ui-library's `HOST_WIDGETS`, and because
|
|
195
|
+
* the admin Recordings page renders every `location:'top-tab'` +
|
|
196
|
+
* `tab:'recording'` section behind its camera picker
|
|
197
|
+
* (`CameraRecordingSettingsSection`), this declaration lands the section on
|
|
198
|
+
* BOTH surfaces with no second wiring.
|
|
180
199
|
*/
|
|
181
200
|
readonly deviceConfig: {
|
|
182
201
|
readonly ui: {
|
|
183
202
|
readonly kind: "widget";
|
|
184
203
|
readonly widgetId: "host/clips-browser";
|
|
185
|
-
readonly tab: "
|
|
204
|
+
readonly tab: "recording";
|
|
186
205
|
readonly topTab: true;
|
|
187
206
|
readonly label: "Clips";
|
|
188
|
-
readonly order:
|
|
207
|
+
readonly order: 100;
|
|
189
208
|
};
|
|
190
209
|
};
|
|
191
210
|
readonly methods: {
|
|
@@ -194,7 +213,7 @@ export declare const videoclipsCapability: {
|
|
|
194
213
|
since: z.ZodNumber;
|
|
195
214
|
until: z.ZodNumber;
|
|
196
215
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
197
|
-
|
|
216
|
+
provider: z.ZodOptional<z.ZodString>;
|
|
198
217
|
}, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
199
218
|
id: z.ZodString;
|
|
200
219
|
source: z.ZodString;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_sleep = require("./sleep-
|
|
2
|
+
const require_sleep = require("./sleep-CsgPITp-.js");
|
|
3
3
|
const require_event_category = require("./event-category-BVfsrBYA.js");
|
|
4
4
|
const require_canonical_hash = require("./canonical-hash-CSE4ioRi.js");
|
|
5
5
|
const require_enums = require("./enums.js");
|
|
@@ -27128,13 +27128,18 @@ var vectorStoreCapability = {
|
|
|
27128
27128
|
* exposes NATIVE onboard clips (Reolink SD card, a hub's storage, HKSV) adds
|
|
27129
27129
|
* its own catalog ALONGSIDE that one.
|
|
27130
27130
|
*
|
|
27131
|
-
* The mount stays per-device (`resolveCapMount` → `device-scoped`)
|
|
27132
|
-
*
|
|
27133
|
-
*
|
|
27134
|
-
*
|
|
27135
|
-
*
|
|
27136
|
-
*
|
|
27137
|
-
*
|
|
27131
|
+
* The mount stays per-device (`resolveCapMount` → `device-scoped`), and a
|
|
27132
|
+
* device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
|
|
27133
|
+
* what says a provider serves this camera, never the set of addons that
|
|
27134
|
+
* happen to have registered the capability somewhere in the cluster. That is
|
|
27135
|
+
* what stopped one addon appearing three times on 592 — as the device's
|
|
27136
|
+
* native provider, as the hub-local registration and as
|
|
27137
|
+
* `pipeline-analytics@little-unraid` (D554 amended 2026-09-20).
|
|
27138
|
+
*
|
|
27139
|
+
* `listClips` is asked of ONE provider at a time
|
|
27140
|
+
* ({@link videoclipsCapability.methods.listClips} `provider`), defaulting to
|
|
27141
|
+
* the bound one, which is CamStack on every camera today. It is NOT a union
|
|
27142
|
+
* over everything a camera has: *"l'utilizzatore è uno solo"*.
|
|
27138
27143
|
* {@link videoclipsCapability.methods.getClipPlayback} dispatches by the
|
|
27139
27144
|
* source namespace inside the clip id, which is why ids are self-contained.
|
|
27140
27145
|
*
|
|
@@ -27455,17 +27460,31 @@ var videoclipsCapability = {
|
|
|
27455
27460
|
* `device-config-widget-wrapped-binding.spec.ts` pins that a `kind:'wrapped'`
|
|
27456
27461
|
* binding entry derives the same section a native one does.
|
|
27457
27462
|
*
|
|
27458
|
-
*
|
|
27459
|
-
*
|
|
27460
|
-
*
|
|
27463
|
+
* **It is a SECTION of the Recording tab, at the end of it — not a tab of
|
|
27464
|
+
* its own.** It shipped as a `clips` top-tab and the operator rejected the
|
|
27465
|
+
* placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
|
|
27466
|
+
* necessario, una nuova sezione alla fine per le clips"*. The Recording tab
|
|
27467
|
+
* already holds the recorder's panel, the schedule bands and the unified
|
|
27468
|
+
* retention policy; footage the camera itself holds is the same question,
|
|
27469
|
+
* asked of a different store. `order: 100` puts it after all of them with
|
|
27470
|
+
* room left in front. The `clips` entry in `WELL_KNOWN_TABS` went with it —
|
|
27471
|
+
* a well-known id nobody declares is an invitation to mint the tab again.
|
|
27472
|
+
*
|
|
27473
|
+
* `topTab` stays: the browser owns a pane (a day's tiles, a source list and
|
|
27474
|
+
* a player) and the Config tab's inner bar has no room for one. The widget
|
|
27475
|
+
* itself is `host/clips-browser` in ui-library's `HOST_WIDGETS`, and because
|
|
27476
|
+
* the admin Recordings page renders every `location:'top-tab'` +
|
|
27477
|
+
* `tab:'recording'` section behind its camera picker
|
|
27478
|
+
* (`CameraRecordingSettingsSection`), this declaration lands the section on
|
|
27479
|
+
* BOTH surfaces with no second wiring.
|
|
27461
27480
|
*/
|
|
27462
27481
|
deviceConfig: { ui: {
|
|
27463
27482
|
kind: "widget",
|
|
27464
27483
|
widgetId: "host/clips-browser",
|
|
27465
|
-
tab: "
|
|
27484
|
+
tab: "recording",
|
|
27466
27485
|
topTab: true,
|
|
27467
27486
|
label: "Clips",
|
|
27468
|
-
order:
|
|
27487
|
+
order: 100
|
|
27469
27488
|
} },
|
|
27470
27489
|
methods: {
|
|
27471
27490
|
listClips: require_sleep.method(zod.z.object({
|
|
@@ -27474,13 +27493,23 @@ var videoclipsCapability = {
|
|
|
27474
27493
|
until: zod.z.number(),
|
|
27475
27494
|
limit: zod.z.number().int().positive().optional(),
|
|
27476
27495
|
/**
|
|
27477
|
-
*
|
|
27478
|
-
*
|
|
27479
|
-
*
|
|
27480
|
-
*
|
|
27481
|
-
*
|
|
27496
|
+
* WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
|
|
27497
|
+
* carries, never a source id and never a list.
|
|
27498
|
+
*
|
|
27499
|
+
* Absent means the device's BOUND provider, which is CamStack on every
|
|
27500
|
+
* camera today because that is what `deviceManager.getBindings`
|
|
27501
|
+
* answers with. A provider the device is not bound to is refused by
|
|
27502
|
+
* name rather than answered by another one (D552's
|
|
27503
|
+
* `rejectUnresolvedAddonPin` rule).
|
|
27504
|
+
*
|
|
27505
|
+
* It replaced `sources?: string[]`, a VIEW filter over source ids that
|
|
27506
|
+
* assumed the answer was a fan-out over everything a camera has. The
|
|
27507
|
+
* operator settled otherwise on 2026-09-20 — *"il get videoclips
|
|
27508
|
+
* prendere un provider opzionale, di default va su camstack"*,
|
|
27509
|
+
* *"l'utilizzatore è uno solo"* — so the list is asked of one provider
|
|
27510
|
+
* at a time and there is nothing to filter out of it.
|
|
27482
27511
|
*/
|
|
27483
|
-
|
|
27512
|
+
provider: zod.z.string().optional()
|
|
27484
27513
|
}), zod.z.array(ClipSchema).readonly(), {
|
|
27485
27514
|
kind: "query",
|
|
27486
27515
|
auth: "protected"
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as BrokerStatusSchema, A as DeviceType, At as emitReadiness, B as systemMethod, Bt as expandAudioChunkToF32le, C as customAction, Ct as DATAPLANE_SECRET_HEADER, D as ChargingStatus, Dt as normalizeAddonInitResult, E as deviceCustomAction, Et as BaseAddon, F as event, Ft as collectHydratedFieldValues, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, It as hydrateSchema, J as readinessKey, K as ReadinessTimeoutError, L as isDeviceConfigCap, Lt as resolveHydratedFieldValue, M as DEFAULT_RUNTIME_STATE_DURABILITY, Mt as WELL_KNOWN_TABS, N as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Nt as WELL_KNOWN_TAB_MAP, O as DeviceFeature, Ot as createDurableState, P as DEVICE_STATUS_METHOD, Pt as collectHydratedFieldEntries, Q as BrokerStatsSchema, R as method, Rt as AUDIO_CHUNK_FORMATS, S as DEVICE_CHILDREN_BATCH_MAX, St as selectAssignedProfileSlots, T as describeCustomActions, Tt as DisposerChain, U as readNodePin, V as CAP_NODE_PIN_CONTEXT_KEY, Vt as isAudioChunkFormat, W as toNodeId, X as AudioChunkFormatSchema, Y as scopeKey, Z as AudioStreamPickSchema, _ as createMirrorSource, _t as SubscribeFramesInputSchema, a as asJsonObject, at as DecodedAudioChunkSchema, b as deviceOpsCapability, bt as makeSourceBrokerId, c as parseJsonArray, ct as FrameHandleFormatSchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as ProfileSlotSchema, et as CAM_PROFILE_ORDER, f as DEVICE_SCOPED_CAPS, ft as ProfileSlotStatusSchema, g as createLazyTrpcSource, gt as SubscribeAudioChunksResultSchema, h as createEventBusSliceSource, ht as SubscribeAudioChunksInputSchema, i as asJsonArray, it as CameraStreamSchema, j as adminUiCapability, jt as isEvent, k as DeviceRole, kt as createEvent, l as parseJsonObject, lt as FrameHandleSchema, m as createDeviceProxy, mt as StreamSourceSchema, n as sleepCancellable, nt as CamStreamKindSchema, o as asNumber, ot as DecodedFrameSchema, p as isDeviceScopedCap, pt as StreamSourceEntrySchema, q as emitDownForOwnedCaps, r as asBoolean, rt as CamStreamResolutionSchema, s as asString, st as EncodedPacketSchema, t as sleep, tt as CamProfileSchema, u as parseJsonUnknown, ut as ProfileRtspEntrySchema, v as createSliceHandle, vt as SubscribeFramesResultSchema, w as defineCustomActions, wt as SHARE_VIEW_KINDS, x as viewerUiCapability, xt as parseProfileBrokerId, y as RawStateResultSchema, yt as makeProfileBrokerId, z as resolveCapMount, zt as audioChunkBytesPerSample } from "./sleep-
|
|
1
|
+
import { $ as BrokerStatusSchema, A as DeviceType, At as emitReadiness, B as systemMethod, Bt as expandAudioChunkToF32le, C as customAction, Ct as DATAPLANE_SECRET_HEADER, D as ChargingStatus, Dt as normalizeAddonInitResult, E as deviceCustomAction, Et as BaseAddon, F as event, Ft as collectHydratedFieldValues, G as ReadinessRegistry, H as nodePin, I as expandCapMethods, It as hydrateSchema, J as readinessKey, K as ReadinessTimeoutError, L as isDeviceConfigCap, Lt as resolveHydratedFieldValue, M as DEFAULT_RUNTIME_STATE_DURABILITY, Mt as WELL_KNOWN_TABS, N as DEVICE_SETTINGS_CONTRIBUTION_METHODS, Nt as WELL_KNOWN_TAB_MAP, O as DeviceFeature, Ot as createDurableState, P as DEVICE_STATUS_METHOD, Pt as collectHydratedFieldEntries, Q as BrokerStatsSchema, R as method, Rt as AUDIO_CHUNK_FORMATS, S as DEVICE_CHILDREN_BATCH_MAX, St as selectAssignedProfileSlots, T as describeCustomActions, Tt as DisposerChain, U as readNodePin, V as CAP_NODE_PIN_CONTEXT_KEY, Vt as isAudioChunkFormat, W as toNodeId, X as AudioChunkFormatSchema, Y as scopeKey, Z as AudioStreamPickSchema, _ as createMirrorSource, _t as SubscribeFramesInputSchema, a as asJsonObject, at as DecodedAudioChunkSchema, b as deviceOpsCapability, bt as makeSourceBrokerId, c as parseJsonArray, ct as FrameHandleFormatSchema, d as BOOT_RECOVERY_BACKOFF_MS, dt as ProfileSlotSchema, et as CAM_PROFILE_ORDER, f as DEVICE_SCOPED_CAPS, ft as ProfileSlotStatusSchema, g as createLazyTrpcSource, gt as SubscribeAudioChunksResultSchema, h as createEventBusSliceSource, ht as SubscribeAudioChunksInputSchema, i as asJsonArray, it as CameraStreamSchema, j as adminUiCapability, jt as isEvent, k as DeviceRole, kt as createEvent, l as parseJsonObject, lt as FrameHandleSchema, m as createDeviceProxy, mt as StreamSourceSchema, n as sleepCancellable, nt as CamStreamKindSchema, o as asNumber, ot as DecodedFrameSchema, p as isDeviceScopedCap, pt as StreamSourceEntrySchema, q as emitDownForOwnedCaps, r as asBoolean, rt as CamStreamResolutionSchema, s as asString, st as EncodedPacketSchema, t as sleep, tt as CamProfileSchema, u as parseJsonUnknown, ut as ProfileRtspEntrySchema, v as createSliceHandle, vt as SubscribeFramesResultSchema, w as defineCustomActions, wt as SHARE_VIEW_KINDS, x as viewerUiCapability, xt as parseProfileBrokerId, y as RawStateResultSchema, yt as makeProfileBrokerId, z as resolveCapMount, zt as audioChunkBytesPerSample } from "./sleep-7AN_Txmu.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-CPK2Dy60.mjs";
|
|
4
4
|
import { EventSourceType } from "./enums.mjs";
|
|
@@ -27127,13 +27127,18 @@ var vectorStoreCapability = {
|
|
|
27127
27127
|
* exposes NATIVE onboard clips (Reolink SD card, a hub's storage, HKSV) adds
|
|
27128
27128
|
* its own catalog ALONGSIDE that one.
|
|
27129
27129
|
*
|
|
27130
|
-
* The mount stays per-device (`resolveCapMount` → `device-scoped`)
|
|
27131
|
-
*
|
|
27132
|
-
*
|
|
27133
|
-
*
|
|
27134
|
-
*
|
|
27135
|
-
*
|
|
27136
|
-
*
|
|
27130
|
+
* The mount stays per-device (`resolveCapMount` → `device-scoped`), and a
|
|
27131
|
+
* device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
|
|
27132
|
+
* what says a provider serves this camera, never the set of addons that
|
|
27133
|
+
* happen to have registered the capability somewhere in the cluster. That is
|
|
27134
|
+
* what stopped one addon appearing three times on 592 — as the device's
|
|
27135
|
+
* native provider, as the hub-local registration and as
|
|
27136
|
+
* `pipeline-analytics@little-unraid` (D554 amended 2026-09-20).
|
|
27137
|
+
*
|
|
27138
|
+
* `listClips` is asked of ONE provider at a time
|
|
27139
|
+
* ({@link videoclipsCapability.methods.listClips} `provider`), defaulting to
|
|
27140
|
+
* the bound one, which is CamStack on every camera today. It is NOT a union
|
|
27141
|
+
* over everything a camera has: *"l'utilizzatore è uno solo"*.
|
|
27137
27142
|
* {@link videoclipsCapability.methods.getClipPlayback} dispatches by the
|
|
27138
27143
|
* source namespace inside the clip id, which is why ids are self-contained.
|
|
27139
27144
|
*
|
|
@@ -27454,17 +27459,31 @@ var videoclipsCapability = {
|
|
|
27454
27459
|
* `device-config-widget-wrapped-binding.spec.ts` pins that a `kind:'wrapped'`
|
|
27455
27460
|
* binding entry derives the same section a native one does.
|
|
27456
27461
|
*
|
|
27457
|
-
*
|
|
27458
|
-
*
|
|
27459
|
-
*
|
|
27462
|
+
* **It is a SECTION of the Recording tab, at the end of it — not a tab of
|
|
27463
|
+
* its own.** It shipped as a `clips` top-tab and the operator rejected the
|
|
27464
|
+
* placement: *"utilizzerei la stessa tab recordings, lì abbiamo già tutto il
|
|
27465
|
+
* necessario, una nuova sezione alla fine per le clips"*. The Recording tab
|
|
27466
|
+
* already holds the recorder's panel, the schedule bands and the unified
|
|
27467
|
+
* retention policy; footage the camera itself holds is the same question,
|
|
27468
|
+
* asked of a different store. `order: 100` puts it after all of them with
|
|
27469
|
+
* room left in front. The `clips` entry in `WELL_KNOWN_TABS` went with it —
|
|
27470
|
+
* a well-known id nobody declares is an invitation to mint the tab again.
|
|
27471
|
+
*
|
|
27472
|
+
* `topTab` stays: the browser owns a pane (a day's tiles, a source list and
|
|
27473
|
+
* a player) and the Config tab's inner bar has no room for one. The widget
|
|
27474
|
+
* itself is `host/clips-browser` in ui-library's `HOST_WIDGETS`, and because
|
|
27475
|
+
* the admin Recordings page renders every `location:'top-tab'` +
|
|
27476
|
+
* `tab:'recording'` section behind its camera picker
|
|
27477
|
+
* (`CameraRecordingSettingsSection`), this declaration lands the section on
|
|
27478
|
+
* BOTH surfaces with no second wiring.
|
|
27460
27479
|
*/
|
|
27461
27480
|
deviceConfig: { ui: {
|
|
27462
27481
|
kind: "widget",
|
|
27463
27482
|
widgetId: "host/clips-browser",
|
|
27464
|
-
tab: "
|
|
27483
|
+
tab: "recording",
|
|
27465
27484
|
topTab: true,
|
|
27466
27485
|
label: "Clips",
|
|
27467
|
-
order:
|
|
27486
|
+
order: 100
|
|
27468
27487
|
} },
|
|
27469
27488
|
methods: {
|
|
27470
27489
|
listClips: method(z.object({
|
|
@@ -27473,13 +27492,23 @@ var videoclipsCapability = {
|
|
|
27473
27492
|
until: z.number(),
|
|
27474
27493
|
limit: z.number().int().positive().optional(),
|
|
27475
27494
|
/**
|
|
27476
|
-
*
|
|
27477
|
-
*
|
|
27478
|
-
*
|
|
27479
|
-
*
|
|
27480
|
-
*
|
|
27495
|
+
* WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
|
|
27496
|
+
* carries, never a source id and never a list.
|
|
27497
|
+
*
|
|
27498
|
+
* Absent means the device's BOUND provider, which is CamStack on every
|
|
27499
|
+
* camera today because that is what `deviceManager.getBindings`
|
|
27500
|
+
* answers with. A provider the device is not bound to is refused by
|
|
27501
|
+
* name rather than answered by another one (D552's
|
|
27502
|
+
* `rejectUnresolvedAddonPin` rule).
|
|
27503
|
+
*
|
|
27504
|
+
* It replaced `sources?: string[]`, a VIEW filter over source ids that
|
|
27505
|
+
* assumed the answer was a fan-out over everything a camera has. The
|
|
27506
|
+
* operator settled otherwise on 2026-09-20 — *"il get videoclips
|
|
27507
|
+
* prendere un provider opzionale, di default va su camstack"*,
|
|
27508
|
+
* *"l'utilizzatore è uno solo"* — so the list is asked of one provider
|
|
27509
|
+
* at a time and there is nothing to filter out of it.
|
|
27481
27510
|
*/
|
|
27482
|
-
|
|
27511
|
+
provider: z.string().optional()
|
|
27483
27512
|
}), z.array(ClipSchema).readonly(), {
|
|
27484
27513
|
kind: "query",
|
|
27485
27514
|
auth: "protected"
|
|
@@ -9,7 +9,7 @@ import type { CustomModelMetadata, ModelCatalogEntry, ModelFormat, ModelOutputFo
|
|
|
9
9
|
* Multiple addons can contribute sections to the same tab.
|
|
10
10
|
*/
|
|
11
11
|
/** Predefined tab identifiers that addons reference by ID. */
|
|
12
|
-
export type WellKnownTabId = 'overview' | 'general' | 'image' | 'light' | 'motion' | 'audio' | 'snapshot' | 'osd' | 'alarms' | 'pipeline' | 'detection-pipeline' | 'stream-broker' | 'streaming' | 'ptz' | 'navigation' | 'consumables' | 'zones' | 'analytics' | 'live-stats' | 'recording' | '
|
|
12
|
+
export type WellKnownTabId = 'overview' | 'general' | 'image' | 'light' | 'motion' | 'audio' | 'snapshot' | 'osd' | 'alarms' | 'pipeline' | 'detection-pipeline' | 'stream-broker' | 'streaming' | 'ptz' | 'navigation' | 'consumables' | 'zones' | 'analytics' | 'live-stats' | 'recording' | 'notifications' | 'network' | 'storage' | 'engine' | 'scheduler' | 'decoder' | 'advanced';
|
|
13
13
|
export interface WellKnownTab {
|
|
14
14
|
readonly id: WellKnownTabId;
|
|
15
15
|
readonly label: string;
|
|
@@ -62,20 +62,6 @@ export interface ICapabilityRegistry {
|
|
|
62
62
|
}>;
|
|
63
63
|
/** List device-scoped capability names that apply to a device type. */
|
|
64
64
|
listDeviceScopedCapsForType(deviceType: string): readonly string[];
|
|
65
|
-
/**
|
|
66
|
-
* Mirror one device's persisted SOURCE deactivations for a collection cap
|
|
67
|
-
* onto the resolution path (D556).
|
|
68
|
-
*
|
|
69
|
-
* The registry holds only the PROJECTION: the authority is the
|
|
70
|
-
* device-manager's persisted wrapper activation, and
|
|
71
|
-
* `device-source-activation.ts` is the only writer. An empty list means
|
|
72
|
-
* every source — never "none".
|
|
73
|
-
*/
|
|
74
|
-
setDeviceDisabledSources(deviceId: string, capability: string, addonIds: readonly string[]): void;
|
|
75
|
-
/** The addon ids switched OFF as sources of this device. Empty = every source. */
|
|
76
|
-
getDeviceDisabledSources(deviceId: string, capability: string): readonly string[];
|
|
77
|
-
/** Is `addonId` switched off as a source of this device for `capability`? */
|
|
78
|
-
isDeviceSourceDisabled(deviceId: string, capability: string, addonId: string): boolean;
|
|
79
65
|
}
|
|
80
66
|
/** An engine instance returned by IEngineManager — typed interface instead of raw ICamstackAddon */
|
|
81
67
|
export interface IEngineInstance {
|