@camstack/addon-model-studio 1.1.41 → 1.1.43

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.
Files changed (22) hide show
  1. package/dist/{MotionZonesSettings-CjuAU9G1.mjs → MotionZonesSettings-BQmeOC6s.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-DGgoakvb.mjs → PrivacyMaskSettings-MznS24IR.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-BbhGQMS0.mjs → SceneMonitorEditor-slpx5RVW.mjs} +3 -3
  4. package/dist/_stub.js +3721 -3354
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-C6iWEfrD.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-Dvg3AwY0.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Dz7eB41h.mjs +26 -0
  7. package/dist/{hostInit-DiT_J3FN.mjs → hostInit-9uaH_tWZ.mjs} +3 -3
  8. package/dist/model-studio.addon.js +304 -100
  9. package/dist/model-studio.addon.mjs +304 -100
  10. package/dist/{player-overlays-DxUZLAfW.mjs → player-overlays-ZV106hch.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-CTOSHDQc.mjs → responsive-BWcJ76VI.mjs} +1 -1
  13. package/dist/{square-xdu1CBwb.mjs → square-DK5dno3H.mjs} +1 -1
  14. package/dist/{trash-2-Dhb8HSyo.mjs → trash-2-B9ZCrm5O.mjs} +1 -1
  15. package/dist/{use-device-snapshot-B5bRXvO7.mjs → use-device-snapshot-_PNv-X_c.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CJdZ-nWm.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-DQmO25Hm.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/python/__pycache__/convert.cpython-314.pyc +0 -0
  19. package/python/__pycache__/convert_lib.cpython-312.pyc +0 -0
  20. package/python/__pycache__/convert_lib.cpython-314.pyc +0 -0
  21. package/python/__tests__/__pycache__/test_convert_lib.cpython-314.pyc +0 -0
  22. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-4Obpn8FN.mjs +0 -26
@@ -7285,7 +7285,7 @@ function method(input, output, options) {
7285
7285
  input,
7286
7286
  output,
7287
7287
  kind: options?.kind ?? "query",
7288
- auth: options?.auth ?? "protected",
7288
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
7289
7289
  ...options?.access !== void 0 ? { access: options.access } : {},
7290
7290
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
7291
7291
  timeoutMs: options?.timeoutMs
@@ -7305,7 +7305,7 @@ function systemMethod(input, output, options) {
7305
7305
  }
7306
7306
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
7307
7307
  var VersionOutputSchema$1 = object({ version: string() });
7308
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
7308
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
7309
7309
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
7310
7310
  DeviceType["Camera"] = "camera";
7311
7311
  DeviceType["Hub"] = "hub";
@@ -7626,7 +7626,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7626
7626
  }({});
7627
7627
  var StaticDirOutputSchema = object({ staticDir: string() });
7628
7628
  var VersionOutputSchema = object({ version: string() });
7629
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7629
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7630
7630
  /**
7631
7631
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7632
7632
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -8240,24 +8240,6 @@ var RecordingRetentionSchema = object({
8240
8240
  maxSizeGb: number().min(0).optional()
8241
8241
  });
8242
8242
  /**
8243
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
8244
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
8245
- * previews at. Five graduated steps; absent on a config = `standard` (the
8246
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
8247
- *
8248
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
8249
- * Each window's index sidecar carries its own tile dims, so a camera whose
8250
- * preset changed over time renders every historical window at the dims it was
8251
- * written with.
8252
- */
8253
- var ScrubThumbnailPresetSchema = _enum([
8254
- "minimal",
8255
- "low",
8256
- "standard",
8257
- "high",
8258
- "max"
8259
- ]);
8260
- /**
8261
8243
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
8262
8244
  *
8263
8245
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -8265,7 +8247,11 @@ var ScrubThumbnailPresetSchema = _enum([
8265
8247
  * other field is a storage knob (profiles, segment length, retention, scrub).
8266
8248
  *
8267
8249
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
8268
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
8250
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
8251
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
8252
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
8253
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
8254
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
8269
8255
  * A stale caller must fail loudly — silently stripping its legacy intent would
8270
8256
  * persist a band-less config, i.e. silently stop recording the camera.
8271
8257
  */
@@ -8288,14 +8274,7 @@ var RecordingConfigSchema = object({
8288
8274
  * "off" is the absence of a covering band, never a band value.
8289
8275
  */
8290
8276
  bands: array(RecordingBandSchema).default([]),
8291
- retention: RecordingRetentionSchema.optional(),
8292
- /**
8293
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
8294
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
8295
- * windows only — existing sheets are immutable, and each window's index
8296
- * carries its own tile dims so mixed-preset history renders correctly.
8297
- */
8298
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
8277
+ retention: RecordingRetentionSchema.optional()
8299
8278
  }).strict();
8300
8279
  /**
8301
8280
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -8371,10 +8350,11 @@ var RelocateFootageInputSchema = object({
8371
8350
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8372
8351
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8373
8352
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8374
- var StorageMigrationMediaMoveInputSchema = object({
8353
+ var RelocateMediaInputSchema = object({
8375
8354
  toLocationId: string(),
8376
8355
  throttleMbps: number().min(1).max(1e3).optional()
8377
- }).extend({ leaseId: string().min(1) });
8356
+ });
8357
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8378
8358
  /** The independently selectable logical storage classes. `recordings`
8379
8359
  * encompasses the high and mid segment profiles; `recordingsLow` is low
8380
8360
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8669,7 +8649,26 @@ var LabelDefinitionSchema = object({
8669
8649
  description: string().optional(),
8670
8650
  icon: string().optional()
8671
8651
  });
8672
- var ClassMapDefinitionSchema = object({
8652
+ /**
8653
+ * Wire schema for a per-model CATALOG classMap override
8654
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8655
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8656
+ * detection pipeline executor actually routes.
8657
+ *
8658
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8659
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8660
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8661
+ * enum) — the two used to share the name `ClassMapDefinition`/
8662
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8663
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8664
+ * are not: it is two different concepts colliding on a name. Keep this type
8665
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8666
+ * would either narrow every `ClassMapDefinition` consumer to the four
8667
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8668
+ * schema exists for (see the "rejects a classMap whose target is not a
8669
+ * detection macro" test in `model-catalog-schema.test.ts`).
8670
+ */
8671
+ var DetectionCatalogClassMapSchema = object({
8673
8672
  mapping: record(string(), _enum([
8674
8673
  "person",
8675
8674
  "vehicle",
@@ -8874,7 +8873,7 @@ var ModelCatalogEntrySchema = object({
8874
8873
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8875
8874
  * labels already ARE the CamStack macros (Scrypted identity map).
8876
8875
  */
8877
- classMap: ClassMapDefinitionSchema.optional()
8876
+ classMap: DetectionCatalogClassMapSchema.optional()
8878
8877
  });
8879
8878
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8880
8879
  format: literal("openvino"),
@@ -8904,7 +8903,7 @@ var ModelConvertMetadataSchema = object({
8904
8903
  "segmentation"
8905
8904
  ]),
8906
8905
  faceAlignment: boolean().optional(),
8907
- classMap: ClassMapDefinitionSchema.optional()
8906
+ classMap: DetectionCatalogClassMapSchema.optional()
8908
8907
  });
8909
8908
  var ConvertArtifactSchema = object({
8910
8909
  format: _enum(MODEL_FORMATS),
@@ -9773,7 +9772,18 @@ var addonPagesSourceCapability = {
9773
9772
  scope: "system",
9774
9773
  mode: "collection",
9775
9774
  internal: true,
9776
- methods: { listPages: method(_void(), array(AddonPageDeclarationSchema).readonly()) }
9775
+ methods: {
9776
+ /**
9777
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
9778
+ * `data-store-provider`) — this was reachable on the AppRouter by ANY
9779
+ * authenticated session at the default `auth: 'protected'`. The only
9780
+ * consumer, the `addon-pages-aggregator` builtin, reads it via
9781
+ * `ctx.capabilities.getCollection('addon-pages-source')` — LOCAL-PROCESS
9782
+ * only, never tRPC (per `ctx.capabilities` seeing only the local
9783
+ * process). The public, enriched listing admin-ui actually consumes is
9784
+ * the separate `addon-pages` cap, unaffected by this change.
9785
+ */
9786
+ listPages: method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" }) }
9777
9787
  };
9778
9788
  var AddonHttpRouteSchema = object({
9779
9789
  method: _enum([
@@ -10009,7 +10019,7 @@ var WidgetMetadataSchema = object({
10009
10019
  defaultColumns: number().int().min(1).max(12).default(6),
10010
10020
  defaultRows: number().int().min(1).max(12).default(1)
10011
10021
  });
10012
- method(_void(), array(WidgetMetadataSchema).readonly());
10022
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
10013
10023
  /**
10014
10024
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
10015
10025
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11558,7 +11568,17 @@ var customModelRegistryCapability = {
11558
11568
  scope: "system",
11559
11569
  mode: "collection",
11560
11570
  internal: true,
11561
- methods: { listModels: method(_void(), array(CustomModelDescriptorSchema).readonly()) }
11571
+ methods: {
11572
+ /**
11573
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
11574
+ * `data-store-provider`) — this was reachable on the AppRouter by ANY
11575
+ * authenticated session at the default `auth: 'protected'`. The only
11576
+ * consumer, the detection-pipeline's model resolution
11577
+ * (`addon-pipeline/src/detection-pipeline/provider.ts`), calls
11578
+ * `ctx.api.customModelRegistry.listModels.query()` — UDS/Moleculer,
11579
+ * never tRPC — so `auth: 'admin'` costs it nothing.
11580
+ */
11581
+ listModels: method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" }) }
11562
11582
  };
11563
11583
  /**
11564
11584
  * Query filter for settings-store collections.
@@ -11646,7 +11666,8 @@ method(object({
11646
11666
  }), _void(), { kind: "mutation" }), method(object({
11647
11667
  namespace: string().optional(),
11648
11668
  collection: string(),
11649
- filter: QueryFilterSchema.optional()
11669
+ filter: QueryFilterSchema.optional(),
11670
+ columns: array(string()).readonly().optional()
11650
11671
  }), array(SettingsRecordSchema).readonly()), method(object({
11651
11672
  namespace: string().optional(),
11652
11673
  collection: string(),
@@ -11709,46 +11730,87 @@ var EngineInfoSchema = object({
11709
11730
  kind: _enum(["relational", "vector"]),
11710
11731
  displayName: string()
11711
11732
  });
11712
- method(_void(), EngineInfoSchema), method(object({
11733
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11713
11734
  namespace: string().optional(),
11714
11735
  collection: string(),
11715
11736
  key: string()
11716
- }), unknown()), method(object({
11737
+ }), unknown(), { auth: "admin" }), method(object({
11717
11738
  namespace: string().optional(),
11718
11739
  collection: string(),
11719
11740
  key: string(),
11720
11741
  value: unknown()
11721
- }), _void(), { kind: "mutation" }), method(object({
11742
+ }), _void(), {
11743
+ kind: "mutation",
11744
+ auth: "admin"
11745
+ }), method(object({
11722
11746
  namespace: string().optional(),
11723
11747
  collection: string(),
11724
- filter: QueryFilterSchema.optional()
11725
- }), array(SettingsRecordSchema).readonly()), method(object({
11748
+ filter: QueryFilterSchema.optional(),
11749
+ /**
11750
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11751
+ *
11752
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11753
+ * was wrong — corrected 2026-08-26 after the hop map
11754
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11755
+ * There is **no Zod parse at all** between the door and the engine: the
11756
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11757
+ * field declared here reaches `SqliteSettingsBackend` either way.
11758
+ *
11759
+ * What actually lost `columns` was the THIRD declaration of this shape:
11760
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11761
+ * interface the engine destructures from. The field existed on both
11762
+ * schemas and the engine still never read it, because nothing checks a
11763
+ * registered provider against `InferProvider<cap>` —
11764
+ * `ProviderRegistration.provider` is typed `object`.
11765
+ *
11766
+ * It is declared here anyway, and must stay in step with
11767
+ * `settings-store.query`: a caller reading only the cap definitions has
11768
+ * to be able to see that this call carries a projection.
11769
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11770
+ */
11771
+ columns: array(string()).readonly().optional()
11772
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11726
11773
  namespace: string().optional(),
11727
11774
  collection: string(),
11728
11775
  record: SettingsRecordSchema
11729
- }), _void(), { kind: "mutation" }), method(object({
11776
+ }), _void(), {
11777
+ kind: "mutation",
11778
+ auth: "admin"
11779
+ }), method(object({
11730
11780
  namespace: string().optional(),
11731
11781
  collection: string(),
11732
11782
  id: string(),
11733
11783
  data: record(string(), unknown())
11734
- }), _void(), { kind: "mutation" }), method(object({
11784
+ }), _void(), {
11785
+ kind: "mutation",
11786
+ auth: "admin"
11787
+ }), method(object({
11735
11788
  namespace: string().optional(),
11736
11789
  collection: string(),
11737
11790
  key: string()
11738
- }), _void(), { kind: "mutation" }), method(object({
11791
+ }), _void(), {
11792
+ kind: "mutation",
11793
+ auth: "admin"
11794
+ }), method(object({
11739
11795
  namespace: string().optional(),
11740
11796
  collection: string(),
11741
11797
  filter: MutationFilterSchema
11742
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11798
+ }), object({ deleted: number().int() }), {
11799
+ kind: "mutation",
11800
+ auth: "admin"
11801
+ }), method(object({
11743
11802
  namespace: string().optional(),
11744
11803
  collection: string(),
11745
11804
  filter: MutationFilterSchema,
11746
11805
  data: record(string(), unknown())
11747
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11806
+ }), object({ updated: number().int() }), {
11807
+ kind: "mutation",
11808
+ auth: "admin"
11809
+ }), method(object({
11748
11810
  namespace: string().optional(),
11749
11811
  collection: string(),
11750
11812
  filter: QueryFilterSchema.optional()
11751
- }), number()), method(object({
11813
+ }), number(), { auth: "admin" }), method(object({
11752
11814
  namespace: string().optional(),
11753
11815
  collection: string(),
11754
11816
  field: string(),
@@ -11758,15 +11820,18 @@ method(_void(), EngineInfoSchema), method(object({
11758
11820
  }), array(object({
11759
11821
  bucket: number().int(),
11760
11822
  count: number().int()
11761
- })).readonly()), method(object({
11823
+ })).readonly(), { auth: "admin" }), method(object({
11762
11824
  namespace: string().optional(),
11763
11825
  collection: string()
11764
- }), boolean()), method(object({
11826
+ }), boolean(), { auth: "admin" }), method(object({
11765
11827
  namespace: string().optional(),
11766
11828
  collection: string(),
11767
11829
  columns: array(CollectionColumnSchema).readonly(),
11768
11830
  indexes: array(CollectionIndexSchema).readonly().optional()
11769
- }), _void(), { kind: "mutation" });
11831
+ }), _void(), {
11832
+ kind: "mutation",
11833
+ auth: "admin"
11834
+ });
11770
11835
  /**
11771
11836
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11772
11837
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12894,7 +12959,7 @@ method(object({
12894
12959
  crop: _instanceof(Uint8Array),
12895
12960
  width: number(),
12896
12961
  height: number()
12897
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12962
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12898
12963
  /**
12899
12964
  * filesystem-browse — per-node capability for browsing the node's local
12900
12965
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13187,19 +13252,22 @@ method(LlmGenerateBaseInputSchema.extend({
13187
13252
  runtime: ManagedRuntimeConfigSchema,
13188
13253
  /** The managed profile's timeout, threaded by the hub provider. */
13189
13254
  timeoutMs: number().int().positive().optional()
13190
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13255
+ }), LlmGenerateResultSchema, {
13256
+ kind: "mutation",
13257
+ auth: "admin"
13258
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13191
13259
  kind: "mutation",
13192
13260
  auth: "admin"
13193
13261
  }), method(object({}), _void(), {
13194
13262
  kind: "mutation",
13195
13263
  auth: "admin"
13196
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13264
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13197
13265
  kind: "mutation",
13198
13266
  auth: "admin"
13199
13267
  }), method(object({ file: string() }), _void(), {
13200
13268
  kind: "mutation",
13201
13269
  auth: "admin"
13202
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13270
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13203
13271
  /**
13204
13272
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13205
13273
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16678,7 +16746,7 @@ var OauthIntegrationDescriptorSchema = object({
16678
16746
  */
16679
16747
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16680
16748
  });
16681
- method(_void(), OauthIntegrationDescriptorSchema);
16749
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16682
16750
  /**
16683
16751
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16684
16752
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17873,6 +17941,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17873
17941
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17874
17942
  kind: "mutation",
17875
17943
  auth: "admin"
17944
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17945
+ kind: "mutation",
17946
+ auth: "admin"
17947
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17948
+ kind: "query",
17949
+ auth: "admin"
17950
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17951
+ kind: "mutation",
17952
+ auth: "admin"
17876
17953
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17877
17954
  kind: "query",
17878
17955
  auth: "admin"
@@ -18027,6 +18104,11 @@ object({
18027
18104
  "jpeg"
18028
18105
  ])
18029
18106
  });
18107
+ /**
18108
+ * Process-local frame identity. It is serializable so it can ride an in-process
18109
+ * capability call, but `registryId` deliberately prevents resolution in any
18110
+ * other process or execution group.
18111
+ */
18030
18112
  var FrameRefSchema = object({
18031
18113
  registryId: string().min(1),
18032
18114
  id: string().min(1),
@@ -20192,7 +20274,7 @@ method(object({
20192
20274
  * linking rather than produce an eternal token.
20193
20275
  */
20194
20276
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20195
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20277
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20196
20278
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20197
20279
  providerId: string().min(1),
20198
20280
  displayName: string().min(1),
@@ -20287,10 +20369,13 @@ var EvictResultSchema = object({
20287
20369
  /** True when the provider has nothing left it is willing to drop on this location. */
20288
20370
  exhausted: boolean()
20289
20371
  });
20290
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20372
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20291
20373
  locationId: string(),
20292
20374
  targetBytes: number().int().positive()
20293
- }), EvictResultSchema, { kind: "mutation" });
20375
+ }), EvictResultSchema, {
20376
+ kind: "mutation",
20377
+ auth: "admin"
20378
+ });
20294
20379
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20295
20380
  kind: "mutation",
20296
20381
  auth: "admin"
@@ -20350,26 +20435,50 @@ var ReadChunkInputSchema = object({
20350
20435
  length: number()
20351
20436
  });
20352
20437
  var EndDownloadInputSchema = object({ downloadId: string() });
20353
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20438
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20354
20439
  location: StorageLocationSchema,
20355
20440
  relativePath: string()
20356
- }), string()), method(object({
20441
+ }), string(), { auth: "admin" }), method(object({
20357
20442
  location: StorageLocationSchema,
20358
20443
  relativePath: string(),
20359
20444
  data: _instanceof(Uint8Array)
20360
- }), _void(), { kind: "mutation" }), method(object({
20445
+ }), _void(), {
20446
+ kind: "mutation",
20447
+ auth: "admin"
20448
+ }), method(object({
20361
20449
  location: StorageLocationSchema,
20362
20450
  relativePath: string()
20363
- }), _instanceof(Uint8Array)), method(object({
20451
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20364
20452
  location: StorageLocationSchema,
20365
20453
  relativePath: string()
20366
- }), boolean()), method(object({
20454
+ }), boolean(), { auth: "admin" }), method(object({
20367
20455
  location: StorageLocationSchema,
20368
20456
  prefix: string().optional()
20369
- }), array(string()).readonly()), method(object({
20457
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20370
20458
  location: StorageLocationSchema,
20371
20459
  relativePath: string()
20372
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
20460
+ }), _void(), {
20461
+ kind: "mutation",
20462
+ auth: "admin"
20463
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20464
+ kind: "mutation",
20465
+ auth: "admin"
20466
+ }), method(WriteChunkInputSchema, _void(), {
20467
+ kind: "mutation",
20468
+ auth: "admin"
20469
+ }), method(FinalizeUploadInputSchema, _void(), {
20470
+ kind: "mutation",
20471
+ auth: "admin"
20472
+ }), method(AbortUploadInputSchema, _void(), {
20473
+ kind: "mutation",
20474
+ auth: "admin"
20475
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20476
+ kind: "mutation",
20477
+ auth: "admin"
20478
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20479
+ kind: "mutation",
20480
+ auth: "admin"
20481
+ });
20373
20482
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20374
20483
  var ProfileSettingsSchemaBridge = unknown().nullable();
20375
20484
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20627,7 +20736,8 @@ method(object({
20627
20736
  access: "create"
20628
20737
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20629
20738
  kind: "mutation",
20630
- access: "view"
20739
+ access: "view",
20740
+ auth: "admin"
20631
20741
  }), method(object({
20632
20742
  /** Required — the user the assertion belongs to (verified). */
20633
20743
  userId: string(),
@@ -20635,10 +20745,12 @@ method(object({
20635
20745
  response: record(string(), unknown())
20636
20746
  }), object({ verified: boolean() }), {
20637
20747
  kind: "mutation",
20638
- access: "view"
20748
+ access: "view",
20749
+ auth: "admin"
20639
20750
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20640
20751
  kind: "mutation",
20641
- access: "view"
20752
+ access: "view",
20753
+ auth: "admin"
20642
20754
  }), method(object({
20643
20755
  /** AuthenticationResponseJSON from the browser. */
20644
20756
  response: record(string(), unknown()) }), object({
@@ -20646,7 +20758,8 @@ response: record(string(), unknown()) }), object({
20646
20758
  userId: string().nullable()
20647
20759
  }), {
20648
20760
  kind: "mutation",
20649
- access: "view"
20761
+ access: "view",
20762
+ auth: "admin"
20650
20763
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20651
20764
  userId: string(),
20652
20765
  credentialId: string()
@@ -20818,7 +20931,19 @@ var VectorStatsResultSchema = object({
20818
20931
  /** False when the backend ranks approximately. */
20819
20932
  exact: boolean()
20820
20933
  });
20821
- method(VectorDeclareIndexInputSchema, _void(), { kind: "mutation" }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, { kind: "mutation" }), method(VectorQueryInputSchema, VectorQueryResultSchema), method(VectorGetInputSchema, VectorGetResultSchema), method(VectorDeleteInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorStatsInputSchema, VectorStatsResultSchema);
20934
+ method(VectorDeclareIndexInputSchema, _void(), {
20935
+ kind: "mutation",
20936
+ auth: "admin"
20937
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20938
+ kind: "mutation",
20939
+ auth: "admin"
20940
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20941
+ kind: "mutation",
20942
+ auth: "admin"
20943
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20944
+ kind: "mutation",
20945
+ auth: "admin"
20946
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20822
20947
  var ClipSchema = object({
20823
20948
  /** Opaque, provider-namespaced id. The default provider encodes the time
20824
20949
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22541,7 +22666,27 @@ var MediaFileLiteSchema$1 = object({
22541
22666
  sizeBytes: number(),
22542
22667
  timestamp: number()
22543
22668
  });
22544
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22669
+ method(object({
22670
+ /**
22671
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22672
+ *
22673
+ * Default `false`, the same inversion `listRecentFaces` and
22674
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22675
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22676
+ * on the live hub the same day: four identities cost 40,979 B with the
22677
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22678
+ * four times and the viewer holds at `staleTime: 30_000`.
22679
+ *
22680
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22681
+ * the `event-media` plane serves that key `immutable` with an ETag.
22682
+ *
22683
+ * **This is an INPUT field, so it does not reach the addon until the
22684
+ * next train** — the hub router validates cap inputs against its own
22685
+ * compiled Zod and strips a key it does not know. Until then the
22686
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22687
+ * is what ships, and the opt-in becomes reachable when the train lands.
22688
+ */
22689
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22545
22690
  kind: "mutation",
22546
22691
  auth: "admin"
22547
22692
  }), method(object({
@@ -24688,8 +24833,10 @@ var PlateInfoSchema = object({
24688
24833
  keyFrameMediaKey: string().optional(),
24689
24834
  base64: string().optional(),
24690
24835
  /**
24691
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24692
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24836
+ * Same crop as a data-plane URL, always present when the plate has a stored
24837
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24838
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24839
+ * left at its `true` default.
24693
24840
  */
24694
24841
  cropUrl: string().optional()
24695
24842
  });
@@ -24709,14 +24856,34 @@ var PlateClusterSchema = object({
24709
24856
  });
24710
24857
  method(object({
24711
24858
  deviceId: number().int().optional(),
24712
- limit: number().int().positive().optional()
24859
+ limit: number().int().positive().optional(),
24860
+ /**
24861
+ * Inline the base64 crop on every row. Default `true` — the existing
24862
+ * behaviour, kept so no caller breaks.
24863
+ *
24864
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24865
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24866
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24867
+ * metadata without them — and the browser then caches the images.
24868
+ *
24869
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24870
+ * plates were the one gallery list left without it.
24871
+ *
24872
+ * **This is an INPUT field, so it does not reach the addon until the
24873
+ * next train.** The hub router validates cap inputs against its own
24874
+ * compiled Zod and strips a key it does not know. Until the train
24875
+ * ships, sending `false` is harmless and keeps the crops inline.
24876
+ */
24877
+ includeCrops: boolean().optional()
24713
24878
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24714
24879
  deviceId: number().int(),
24715
24880
  trackId: string()
24716
24881
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24717
24882
  text: string().min(1),
24718
24883
  maxDistance: number().int().min(0).optional(),
24719
- limit: number().int().positive().optional()
24884
+ limit: number().int().positive().optional(),
24885
+ /** See `listPlates.includeCrops`. Default `true`. */
24886
+ includeCrops: boolean().optional()
24720
24887
  }), array(PlateInfoSchema).readonly()), method(object({
24721
24888
  maxDistance: number().int().min(0).optional(),
24722
24889
  minClusterSize: number().int().min(2).optional(),
@@ -24730,7 +24897,13 @@ method(object({
24730
24897
  }), method(object({ plateId: string() }), _void(), {
24731
24898
  kind: "mutation",
24732
24899
  auth: "admin"
24733
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24900
+ }), method(object({
24901
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24902
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24903
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24904
+ * INPUT field: stripped by the hub router until the train ships, which
24905
+ * resolves to `false` and is exactly the intended default. */
24906
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24734
24907
  kind: "mutation",
24735
24908
  auth: "admin"
24736
24909
  }), method(object({
@@ -30107,6 +30280,12 @@ Object.freeze({
30107
30280
  addonId: null,
30108
30281
  access: "create"
30109
30282
  },
30283
+ "pipelineAnalytics.cancelRelocateMedia": {
30284
+ capName: "pipeline-analytics",
30285
+ capScope: "device",
30286
+ addonId: null,
30287
+ access: "create"
30288
+ },
30110
30289
  "pipelineAnalytics.cancelStorageMigrationMove": {
30111
30290
  capName: "pipeline-analytics",
30112
30291
  capScope: "device",
@@ -30281,6 +30460,12 @@ Object.freeze({
30281
30460
  addonId: null,
30282
30461
  access: "view"
30283
30462
  },
30463
+ "pipelineAnalytics.listRelocateMediaJobs": {
30464
+ capName: "pipeline-analytics",
30465
+ capScope: "device",
30466
+ addonId: null,
30467
+ access: "view"
30468
+ },
30284
30469
  "pipelineAnalytics.listRetrainAnnotations": {
30285
30470
  capName: "pipeline-analytics",
30286
30471
  capScope: "device",
@@ -30359,6 +30544,12 @@ Object.freeze({
30359
30544
  addonId: null,
30360
30545
  access: "create"
30361
30546
  },
30547
+ "pipelineAnalytics.relocateMedia": {
30548
+ capName: "pipeline-analytics",
30549
+ capScope: "device",
30550
+ addonId: null,
30551
+ access: "create"
30552
+ },
30362
30553
  "pipelineAnalytics.restageRetrainTrack": {
30363
30554
  capName: "pipeline-analytics",
30364
30555
  capScope: "device",
@@ -35659,6 +35850,38 @@ var ScryptedCatalogDriftSchema = object({
35659
35850
  ]),
35660
35851
  details: string().optional()
35661
35852
  });
35853
+ /**
35854
+ * Curated PUBLIC Frigate catalog entry (D214 addendum). Named + exported so
35855
+ * the UI's `listFrigateCatalog` result parses against the SAME schema this
35856
+ * action's output is declared with (see `modelStudioActions.listFrigateCatalog`
35857
+ * below) — one shape, not a hand-duplicated interface on the UI side.
35858
+ */
35859
+ var FrigateCatalogEntrySchema = object({
35860
+ id: string(),
35861
+ label: string(),
35862
+ format: _enum(MODEL_FORMATS),
35863
+ sizeMB: number(),
35864
+ inputSize: number(),
35865
+ notes: string()
35866
+ });
35867
+ /**
35868
+ * Frigate+ `/v1/model/list` entry (see `frigate-plus.ts`). `isBaseModel` is
35869
+ * the Base/Custom discriminator Frigate's own UI groups on. Named + exported
35870
+ * for the same reason as {@link FrigateCatalogEntrySchema}.
35871
+ */
35872
+ var FrigatePlusModelSchema = object({
35873
+ id: string(),
35874
+ name: string(),
35875
+ type: string(),
35876
+ isBaseModel: boolean(),
35877
+ baseModel: string(),
35878
+ supportedDetectors: array(string()).readonly(),
35879
+ trainDate: string(),
35880
+ hailoDevice: string().optional(),
35881
+ verifiedImages: number(),
35882
+ width: number().optional(),
35883
+ height: number().optional()
35884
+ });
35662
35885
  var modelStudioActions = defineCustomActions({
35663
35886
  registerCustomModel: customAction(CustomModelDescriptorSchema, object({ ok: literal(true) }), { kind: "mutation" }),
35664
35887
  removeCustomModel: customAction(object({ modelId: string() }), object({ removed: boolean() }), { kind: "mutation" }),
@@ -35707,14 +35930,7 @@ var modelStudioActions = defineCustomActions({
35707
35930
  * the hub's modelsDir and registers the descriptor with the public URL
35708
35931
  * (other nodes download on demand — no Distribute needed).
35709
35932
  */
35710
- listFrigateCatalog: customAction(_void(), array(object({
35711
- id: string(),
35712
- label: string(),
35713
- format: _enum(MODEL_FORMATS),
35714
- sizeMB: number(),
35715
- inputSize: number(),
35716
- notes: string()
35717
- })).readonly()),
35933
+ listFrigateCatalog: customAction(_void(), array(FrigateCatalogEntrySchema).readonly()),
35718
35934
  importFrigateCatalogModel: customAction(object({
35719
35935
  catalogId: string(),
35720
35936
  modelId: string().optional(),
@@ -35754,19 +35970,7 @@ var modelStudioActions = defineCustomActions({
35754
35970
  ok: boolean(),
35755
35971
  error: string().optional()
35756
35972
  }), { kind: "mutation" }),
35757
- frigatePlusListModels: customAction(_void(), array(object({
35758
- id: string(),
35759
- name: string(),
35760
- type: string(),
35761
- isBaseModel: boolean(),
35762
- baseModel: string(),
35763
- supportedDetectors: array(string()).readonly(),
35764
- trainDate: string(),
35765
- hailoDevice: string().optional(),
35766
- verifiedImages: number(),
35767
- width: number().optional(),
35768
- height: number().optional()
35769
- })).readonly()),
35973
+ frigatePlusListModels: customAction(_void(), array(FrigatePlusModelSchema).readonly()),
35770
35974
  importFrigatePlusModel: customAction(object({
35771
35975
  plusModelId: string(),
35772
35976
  modelId: string(),