@camstack/types 1.2.236 → 1.2.237

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.
@@ -6,13 +6,14 @@ import { type InferProvider } from './capability-definition.js';
6
6
  *
7
7
  * A device-scoped wrapper COLLECTION (D549 decision 2, D554): every provider a
8
8
  * camera has is a SOURCE, and they are listed beside each other — never one
9
- * substituted for another. The DEFAULT provider (`analytics`, registered by
10
- * the RECORDER — the addon that owns the footage, D560 — `defaultActive: true`)
11
- * composes the analytics event log (markers + thumbnails, read over `ctx.api`)
12
- * with the recorder's own `getPlaybackManifest` — a clip is a time-WINDOW over
13
- * existing footage, never a separate file. A camera that exposes NATIVE onboard
14
- * clips (Reolink SD card, a hub's storage, HKSV) adds its own catalog
15
- * ALONGSIDE that one.
9
+ * substituted for another, and none of them privileged by name. One source,
10
+ * `analytics`, is registered by the RECORDER — the addon that owns the
11
+ * footage, D560 — and composes the analytics event log (markers + thumbnails,
12
+ * read over `ctx.api`) with the recorder's own `getPlaybackManifest`: a clip
13
+ * is a time-WINDOW over existing footage, never a separate file. A camera that
14
+ * exposes NATIVE onboard clips (Reolink SD card, a hub's storage, HKSV) adds
15
+ * its own catalog ALONGSIDE that one. (`defaultActive` above is the CAP's
16
+ * auto-bind to cameras, not a ranking among these sources — there is none.)
16
17
  *
17
18
  * The mount stays per-device (`resolveCapMount` → `device-scoped`), and a
18
19
  * device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
@@ -22,10 +23,17 @@ import { type InferProvider } from './capability-definition.js';
22
23
  * native provider, as the hub-local registration and as an
23
24
  * `<addonId>@<nodeId>` one (D554 amended 2026-09-20).
24
25
  *
25
- * `listClips` is asked of ONE provider at a time
26
- * ({@link videoclipsCapability.methods.listClips} `provider`), defaulting to
27
- * the bound one, which is CamStack on every camera today. It is NOT a union
28
- * over everything a camera has: *"l'utilizzatore è uno solo"*.
26
+ * `listClips` is asked of ONE provider at a time, and NAMING it is REQUIRED
27
+ * ({@link videoclipsCapability.methods.listClips} `provider`, D554 amended). It is not
28
+ * a union over everything a camera has: *"l'utilizzatore è uno solo"*. There
29
+ * is no default, because a collection cap's binding set is DERIVED and PLURAL
30
+ * (D554 amended, `getBindings` step 0) — "the bound one" does not exist to
31
+ * resolve to, and the one thing that could take its place is a second
32
+ * authority naming a provider per camera, which D554 decision 3 rejected.
33
+ * The pick is a SURFACE's to make, from the {@link ClipSourceSchema} rows it
34
+ * already holds, and it says which one it made (D569 § 1–3).
35
+ * {@link videoclipsCapability.methods.listSources} is the method that fans out
36
+ * — one row per source, by construction.
29
37
  * {@link videoclipsCapability.methods.getClipPlayback} dispatches by the
30
38
  * source namespace inside the clip id, which is why ids are self-contained.
31
39
  *
@@ -259,7 +267,7 @@ export declare const videoclipsCapability: {
259
267
  since: z.ZodNumber;
260
268
  until: z.ZodNumber;
261
269
  limit: z.ZodOptional<z.ZodNumber>;
262
- provider: z.ZodOptional<z.ZodString>;
270
+ provider: z.ZodString;
263
271
  }, z.core.$strip>, z.ZodReadonly<z.ZodArray<z.ZodObject<{
264
272
  id: z.ZodString;
265
273
  source: z.ZodString;
package/dist/index.js CHANGED
@@ -27164,13 +27164,14 @@ var vectorStoreCapability = {
27164
27164
  *
27165
27165
  * A device-scoped wrapper COLLECTION (D549 decision 2, D554): every provider a
27166
27166
  * camera has is a SOURCE, and they are listed beside each other — never one
27167
- * substituted for another. The DEFAULT provider (`analytics`, registered by
27168
- * the RECORDER — the addon that owns the footage, D560 — `defaultActive: true`)
27169
- * composes the analytics event log (markers + thumbnails, read over `ctx.api`)
27170
- * with the recorder's own `getPlaybackManifest` — a clip is a time-WINDOW over
27171
- * existing footage, never a separate file. A camera that exposes NATIVE onboard
27172
- * clips (Reolink SD card, a hub's storage, HKSV) adds its own catalog
27173
- * ALONGSIDE that one.
27167
+ * substituted for another, and none of them privileged by name. One source,
27168
+ * `analytics`, is registered by the RECORDER — the addon that owns the
27169
+ * footage, D560 — and composes the analytics event log (markers + thumbnails,
27170
+ * read over `ctx.api`) with the recorder's own `getPlaybackManifest`: a clip
27171
+ * is a time-WINDOW over existing footage, never a separate file. A camera that
27172
+ * exposes NATIVE onboard clips (Reolink SD card, a hub's storage, HKSV) adds
27173
+ * its own catalog ALONGSIDE that one. (`defaultActive` above is the CAP's
27174
+ * auto-bind to cameras, not a ranking among these sources — there is none.)
27174
27175
  *
27175
27176
  * The mount stays per-device (`resolveCapMount` → `device-scoped`), and a
27176
27177
  * device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
@@ -27180,10 +27181,17 @@ var vectorStoreCapability = {
27180
27181
  * native provider, as the hub-local registration and as an
27181
27182
  * `<addonId>@<nodeId>` one (D554 amended 2026-09-20).
27182
27183
  *
27183
- * `listClips` is asked of ONE provider at a time
27184
- * ({@link videoclipsCapability.methods.listClips} `provider`), defaulting to
27185
- * the bound one, which is CamStack on every camera today. It is NOT a union
27186
- * over everything a camera has: *"l'utilizzatore è uno solo"*.
27184
+ * `listClips` is asked of ONE provider at a time, and NAMING it is REQUIRED
27185
+ * ({@link videoclipsCapability.methods.listClips} `provider`, D554 amended). It is not
27186
+ * a union over everything a camera has: *"l'utilizzatore è uno solo"*. There
27187
+ * is no default, because a collection cap's binding set is DERIVED and PLURAL
27188
+ * (D554 amended, `getBindings` step 0) — "the bound one" does not exist to
27189
+ * resolve to, and the one thing that could take its place is a second
27190
+ * authority naming a provider per camera, which D554 decision 3 rejected.
27191
+ * The pick is a SURFACE's to make, from the {@link ClipSourceSchema} rows it
27192
+ * already holds, and it says which one it made (D569 § 1–3).
27193
+ * {@link videoclipsCapability.methods.listSources} is the method that fans out
27194
+ * — one row per source, by construction.
27187
27195
  * {@link videoclipsCapability.methods.getClipPlayback} dispatches by the
27188
27196
  * source namespace inside the clip id, which is why ids are self-contained.
27189
27197
  *
@@ -27555,22 +27563,40 @@ var videoclipsCapability = {
27555
27563
  limit: zod.z.number().int().positive().optional(),
27556
27564
  /**
27557
27565
  * WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
27558
- * carries, never a source id and never a list.
27566
+ * carries, never a source id and never a list. **Required** (D554 amended).
27559
27567
  *
27560
- * Absent means the device's BOUND provider, which is CamStack on every
27561
- * camera today because that is what `deviceManager.getBindings`
27562
- * answers with. A provider the device is not bound to is refused by
27563
- * name rather than answered by another one (D552's
27564
- * `rejectUnresolvedAddonPin` rule).
27568
+ * A provider the device is not bound to is refused by name rather than
27569
+ * answered by another one (D552's `rejectUnresolvedAddonPin` rule).
27570
+ *
27571
+ * It was optional, documented as "absent means the device's BOUND
27572
+ * provider, which is CamStack on every camera". No code implemented
27573
+ * that. Measured on the live hub 2026-09-20 — device 592, bound to
27574
+ * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
27575
+ * answered SIX rows, three from each source, merged newest-first:
27576
+ * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
27577
+ * so absence bought the union this method exists not to be, and
27578
+ * `limit` meant `limit × sources`.
27579
+ *
27580
+ * There is nothing to restore the default to. `getBindings` answers a
27581
+ * collection cap with a DERIVED, PLURAL set (D554 amended, step 0);
27582
+ * `setWrapperActive` — the singleton authority that could name one —
27583
+ * throws for a collection cap by design. Naming CamStack here instead
27584
+ * would privilege one addon by id inside a surface whose premise is
27585
+ * that sources are peers, and would be wrong on the first camera with
27586
+ * no recorder binding. So absence is REFUSED, in the schema, where the
27587
+ * generated types make it unomittable rather than merely discouraged.
27588
+ *
27589
+ * The default belongs to the SURFACE, which has the `listSources` rows
27590
+ * and can say which one it picked (D569 § 1–3; the viewer already
27591
+ * always sends this).
27565
27592
  *
27566
27593
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
27567
27594
  * assumed the answer was a fan-out over everything a camera has. The
27568
- * operator settled otherwise on 2026-09-20 — *"il get videoclips
27569
- * prendere un provider opzionale, di default va su camstack"*,
27570
- * *"l'utilizzatore è uno solo"* — so the list is asked of one provider
27571
- * at a time and there is nothing to filter out of it.
27595
+ * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
27596
+ * solo"* — so the list is asked of one provider at a time and there is
27597
+ * nothing to filter out of it.
27572
27598
  */
27573
- provider: zod.z.string().optional()
27599
+ provider: zod.z.string().min(1)
27574
27600
  }), zod.z.array(ClipSchema).readonly(), {
27575
27601
  kind: "query",
27576
27602
  auth: "protected"
package/dist/index.mjs CHANGED
@@ -27163,13 +27163,14 @@ var vectorStoreCapability = {
27163
27163
  *
27164
27164
  * A device-scoped wrapper COLLECTION (D549 decision 2, D554): every provider a
27165
27165
  * camera has is a SOURCE, and they are listed beside each other — never one
27166
- * substituted for another. The DEFAULT provider (`analytics`, registered by
27167
- * the RECORDER — the addon that owns the footage, D560 — `defaultActive: true`)
27168
- * composes the analytics event log (markers + thumbnails, read over `ctx.api`)
27169
- * with the recorder's own `getPlaybackManifest` — a clip is a time-WINDOW over
27170
- * existing footage, never a separate file. A camera that exposes NATIVE onboard
27171
- * clips (Reolink SD card, a hub's storage, HKSV) adds its own catalog
27172
- * ALONGSIDE that one.
27166
+ * substituted for another, and none of them privileged by name. One source,
27167
+ * `analytics`, is registered by the RECORDER — the addon that owns the
27168
+ * footage, D560 — and composes the analytics event log (markers + thumbnails,
27169
+ * read over `ctx.api`) with the recorder's own `getPlaybackManifest`: a clip
27170
+ * is a time-WINDOW over existing footage, never a separate file. A camera that
27171
+ * exposes NATIVE onboard clips (Reolink SD card, a hub's storage, HKSV) adds
27172
+ * its own catalog ALONGSIDE that one. (`defaultActive` above is the CAP's
27173
+ * auto-bind to cameras, not a ranking among these sources — there is none.)
27173
27174
  *
27174
27175
  * The mount stays per-device (`resolveCapMount` → `device-scoped`), and a
27175
27176
  * device's SOURCES are its BINDINGS: `deviceManager.getBindings(deviceId)` is
@@ -27179,10 +27180,17 @@ var vectorStoreCapability = {
27179
27180
  * native provider, as the hub-local registration and as an
27180
27181
  * `<addonId>@<nodeId>` one (D554 amended 2026-09-20).
27181
27182
  *
27182
- * `listClips` is asked of ONE provider at a time
27183
- * ({@link videoclipsCapability.methods.listClips} `provider`), defaulting to
27184
- * the bound one, which is CamStack on every camera today. It is NOT a union
27185
- * over everything a camera has: *"l'utilizzatore è uno solo"*.
27183
+ * `listClips` is asked of ONE provider at a time, and NAMING it is REQUIRED
27184
+ * ({@link videoclipsCapability.methods.listClips} `provider`, D554 amended). It is not
27185
+ * a union over everything a camera has: *"l'utilizzatore è uno solo"*. There
27186
+ * is no default, because a collection cap's binding set is DERIVED and PLURAL
27187
+ * (D554 amended, `getBindings` step 0) — "the bound one" does not exist to
27188
+ * resolve to, and the one thing that could take its place is a second
27189
+ * authority naming a provider per camera, which D554 decision 3 rejected.
27190
+ * The pick is a SURFACE's to make, from the {@link ClipSourceSchema} rows it
27191
+ * already holds, and it says which one it made (D569 § 1–3).
27192
+ * {@link videoclipsCapability.methods.listSources} is the method that fans out
27193
+ * — one row per source, by construction.
27186
27194
  * {@link videoclipsCapability.methods.getClipPlayback} dispatches by the
27187
27195
  * source namespace inside the clip id, which is why ids are self-contained.
27188
27196
  *
@@ -27554,22 +27562,40 @@ var videoclipsCapability = {
27554
27562
  limit: z.number().int().positive().optional(),
27555
27563
  /**
27556
27564
  * WHICH provider to ask — the `addonId` a {@link ClipSourceSchema} row
27557
- * carries, never a source id and never a list.
27565
+ * carries, never a source id and never a list. **Required** (D554 amended).
27558
27566
  *
27559
- * Absent means the device's BOUND provider, which is CamStack on every
27560
- * camera today because that is what `deviceManager.getBindings`
27561
- * answers with. A provider the device is not bound to is refused by
27562
- * name rather than answered by another one (D552's
27563
- * `rejectUnresolvedAddonPin` rule).
27567
+ * A provider the device is not bound to is refused by name rather than
27568
+ * answered by another one (D552's `rejectUnresolvedAddonPin` rule).
27569
+ *
27570
+ * It was optional, documented as "absent means the device's BOUND
27571
+ * provider, which is CamStack on every camera". No code implemented
27572
+ * that. Measured on the live hub 2026-09-20 — device 592, bound to
27573
+ * `recorder` AND `provider-reolink` — a bare call with `limit: 3`
27574
+ * answered SIX rows, three from each source, merged newest-first:
27575
+ * `device-collection-dispatch.ts` simply left the fan-out un-narrowed,
27576
+ * so absence bought the union this method exists not to be, and
27577
+ * `limit` meant `limit × sources`.
27578
+ *
27579
+ * There is nothing to restore the default to. `getBindings` answers a
27580
+ * collection cap with a DERIVED, PLURAL set (D554 amended, step 0);
27581
+ * `setWrapperActive` — the singleton authority that could name one —
27582
+ * throws for a collection cap by design. Naming CamStack here instead
27583
+ * would privilege one addon by id inside a surface whose premise is
27584
+ * that sources are peers, and would be wrong on the first camera with
27585
+ * no recorder binding. So absence is REFUSED, in the schema, where the
27586
+ * generated types make it unomittable rather than merely discouraged.
27587
+ *
27588
+ * The default belongs to the SURFACE, which has the `listSources` rows
27589
+ * and can say which one it picked (D569 § 1–3; the viewer already
27590
+ * always sends this).
27564
27591
  *
27565
27592
  * It replaced `sources?: string[]`, a VIEW filter over source ids that
27566
27593
  * assumed the answer was a fan-out over everything a camera has. The
27567
- * operator settled otherwise on 2026-09-20 — *"il get videoclips
27568
- * prendere un provider opzionale, di default va su camstack"*,
27569
- * *"l'utilizzatore è uno solo"* — so the list is asked of one provider
27570
- * at a time and there is nothing to filter out of it.
27594
+ * operator settled otherwise on 2026-09-20 — *"l'utilizzatore è uno
27595
+ * solo"* — so the list is asked of one provider at a time and there is
27596
+ * nothing to filter out of it.
27571
27597
  */
27572
- provider: z.string().optional()
27598
+ provider: z.string().min(1)
27573
27599
  }), z.array(ClipSchema).readonly(), {
27574
27600
  kind: "query",
27575
27601
  auth: "protected"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.236",
3
+ "version": "1.2.237",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",