@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
@@ -7308,7 +7308,7 @@ function method(input, output, options) {
7308
7308
  input,
7309
7309
  output,
7310
7310
  kind: options?.kind ?? "query",
7311
- auth: options?.auth ?? "protected",
7311
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
7312
7312
  ...options?.access !== void 0 ? { access: options.access } : {},
7313
7313
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
7314
7314
  timeoutMs: options?.timeoutMs
@@ -7328,7 +7328,7 @@ function systemMethod(input, output, options) {
7328
7328
  }
7329
7329
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
7330
7330
  var VersionOutputSchema$1 = object({ version: string() });
7331
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
7331
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
7332
7332
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
7333
7333
  DeviceType["Camera"] = "camera";
7334
7334
  DeviceType["Hub"] = "hub";
@@ -7649,7 +7649,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
7649
7649
  }({});
7650
7650
  var StaticDirOutputSchema = object({ staticDir: string() });
7651
7651
  var VersionOutputSchema = object({ version: string() });
7652
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
7652
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
7653
7653
  /**
7654
7654
  * device-ops — device-scoped cap that unifies the per-IDevice operations
7655
7655
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -8263,24 +8263,6 @@ var RecordingRetentionSchema = object({
8263
8263
  maxSizeGb: number().min(0).optional()
8264
8264
  });
8265
8265
  /**
8266
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
8267
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
8268
- * previews at. Five graduated steps; absent on a config = `standard` (the
8269
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
8270
- *
8271
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
8272
- * Each window's index sidecar carries its own tile dims, so a camera whose
8273
- * preset changed over time renders every historical window at the dims it was
8274
- * written with.
8275
- */
8276
- var ScrubThumbnailPresetSchema = _enum([
8277
- "minimal",
8278
- "low",
8279
- "standard",
8280
- "high",
8281
- "max"
8282
- ]);
8283
- /**
8284
8266
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
8285
8267
  *
8286
8268
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -8288,7 +8270,11 @@ var ScrubThumbnailPresetSchema = _enum([
8288
8270
  * other field is a storage knob (profiles, segment length, retention, scrub).
8289
8271
  *
8290
8272
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
8291
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
8273
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
8274
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
8275
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
8276
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
8277
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
8292
8278
  * A stale caller must fail loudly — silently stripping its legacy intent would
8293
8279
  * persist a band-less config, i.e. silently stop recording the camera.
8294
8280
  */
@@ -8311,14 +8297,7 @@ var RecordingConfigSchema = object({
8311
8297
  * "off" is the absence of a covering band, never a band value.
8312
8298
  */
8313
8299
  bands: array(RecordingBandSchema).default([]),
8314
- retention: RecordingRetentionSchema.optional(),
8315
- /**
8316
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
8317
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
8318
- * windows only — existing sheets are immutable, and each window's index
8319
- * carries its own tile dims so mixed-preset history renders correctly.
8320
- */
8321
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
8300
+ retention: RecordingRetentionSchema.optional()
8322
8301
  }).strict();
8323
8302
  /**
8324
8303
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -8394,10 +8373,11 @@ var RelocateFootageInputSchema = object({
8394
8373
  * `RecordingConfig.enabled` or camera wrapper bindings. */
8395
8374
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
8396
8375
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
8397
- var StorageMigrationMediaMoveInputSchema = object({
8376
+ var RelocateMediaInputSchema = object({
8398
8377
  toLocationId: string(),
8399
8378
  throttleMbps: number().min(1).max(1e3).optional()
8400
- }).extend({ leaseId: string().min(1) });
8379
+ });
8380
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
8401
8381
  /** The independently selectable logical storage classes. `recordings`
8402
8382
  * encompasses the high and mid segment profiles; `recordingsLow` is low
8403
8383
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8692,7 +8672,26 @@ var LabelDefinitionSchema = object({
8692
8672
  description: string().optional(),
8693
8673
  icon: string().optional()
8694
8674
  });
8695
- var ClassMapDefinitionSchema = object({
8675
+ /**
8676
+ * Wire schema for a per-model CATALOG classMap override
8677
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8678
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8679
+ * detection pipeline executor actually routes.
8680
+ *
8681
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8682
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8683
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8684
+ * enum) — the two used to share the name `ClassMapDefinition`/
8685
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8686
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8687
+ * are not: it is two different concepts colliding on a name. Keep this type
8688
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8689
+ * would either narrow every `ClassMapDefinition` consumer to the four
8690
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8691
+ * schema exists for (see the "rejects a classMap whose target is not a
8692
+ * detection macro" test in `model-catalog-schema.test.ts`).
8693
+ */
8694
+ var DetectionCatalogClassMapSchema = object({
8696
8695
  mapping: record(string(), _enum([
8697
8696
  "person",
8698
8697
  "vehicle",
@@ -8897,7 +8896,7 @@ var ModelCatalogEntrySchema = object({
8897
8896
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8898
8897
  * labels already ARE the CamStack macros (Scrypted identity map).
8899
8898
  */
8900
- classMap: ClassMapDefinitionSchema.optional()
8899
+ classMap: DetectionCatalogClassMapSchema.optional()
8901
8900
  });
8902
8901
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8903
8902
  format: literal("openvino"),
@@ -8927,7 +8926,7 @@ var ModelConvertMetadataSchema = object({
8927
8926
  "segmentation"
8928
8927
  ]),
8929
8928
  faceAlignment: boolean().optional(),
8930
- classMap: ClassMapDefinitionSchema.optional()
8929
+ classMap: DetectionCatalogClassMapSchema.optional()
8931
8930
  });
8932
8931
  var ConvertArtifactSchema = object({
8933
8932
  format: _enum(MODEL_FORMATS),
@@ -9796,7 +9795,18 @@ var addonPagesSourceCapability = {
9796
9795
  scope: "system",
9797
9796
  mode: "collection",
9798
9797
  internal: true,
9799
- methods: { listPages: method(_void(), array(AddonPageDeclarationSchema).readonly()) }
9798
+ methods: {
9799
+ /**
9800
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
9801
+ * `data-store-provider`) — this was reachable on the AppRouter by ANY
9802
+ * authenticated session at the default `auth: 'protected'`. The only
9803
+ * consumer, the `addon-pages-aggregator` builtin, reads it via
9804
+ * `ctx.capabilities.getCollection('addon-pages-source')` — LOCAL-PROCESS
9805
+ * only, never tRPC (per `ctx.capabilities` seeing only the local
9806
+ * process). The public, enriched listing admin-ui actually consumes is
9807
+ * the separate `addon-pages` cap, unaffected by this change.
9808
+ */
9809
+ listPages: method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" }) }
9800
9810
  };
9801
9811
  var AddonHttpRouteSchema = object({
9802
9812
  method: _enum([
@@ -10032,7 +10042,7 @@ var WidgetMetadataSchema = object({
10032
10042
  defaultColumns: number().int().min(1).max(12).default(6),
10033
10043
  defaultRows: number().int().min(1).max(12).default(1)
10034
10044
  });
10035
- method(_void(), array(WidgetMetadataSchema).readonly());
10045
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
10036
10046
  /**
10037
10047
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
10038
10048
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -11581,7 +11591,17 @@ var customModelRegistryCapability = {
11581
11591
  scope: "system",
11582
11592
  mode: "collection",
11583
11593
  internal: true,
11584
- methods: { listModels: method(_void(), array(CustomModelDescriptorSchema).readonly()) }
11594
+ methods: {
11595
+ /**
11596
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
11597
+ * `data-store-provider`) — this was reachable on the AppRouter by ANY
11598
+ * authenticated session at the default `auth: 'protected'`. The only
11599
+ * consumer, the detection-pipeline's model resolution
11600
+ * (`addon-pipeline/src/detection-pipeline/provider.ts`), calls
11601
+ * `ctx.api.customModelRegistry.listModels.query()` — UDS/Moleculer,
11602
+ * never tRPC — so `auth: 'admin'` costs it nothing.
11603
+ */
11604
+ listModels: method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" }) }
11585
11605
  };
11586
11606
  /**
11587
11607
  * Query filter for settings-store collections.
@@ -11669,7 +11689,8 @@ method(object({
11669
11689
  }), _void(), { kind: "mutation" }), method(object({
11670
11690
  namespace: string().optional(),
11671
11691
  collection: string(),
11672
- filter: QueryFilterSchema.optional()
11692
+ filter: QueryFilterSchema.optional(),
11693
+ columns: array(string()).readonly().optional()
11673
11694
  }), array(SettingsRecordSchema).readonly()), method(object({
11674
11695
  namespace: string().optional(),
11675
11696
  collection: string(),
@@ -11732,46 +11753,87 @@ var EngineInfoSchema = object({
11732
11753
  kind: _enum(["relational", "vector"]),
11733
11754
  displayName: string()
11734
11755
  });
11735
- method(_void(), EngineInfoSchema), method(object({
11756
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11736
11757
  namespace: string().optional(),
11737
11758
  collection: string(),
11738
11759
  key: string()
11739
- }), unknown()), method(object({
11760
+ }), unknown(), { auth: "admin" }), method(object({
11740
11761
  namespace: string().optional(),
11741
11762
  collection: string(),
11742
11763
  key: string(),
11743
11764
  value: unknown()
11744
- }), _void(), { kind: "mutation" }), method(object({
11765
+ }), _void(), {
11766
+ kind: "mutation",
11767
+ auth: "admin"
11768
+ }), method(object({
11745
11769
  namespace: string().optional(),
11746
11770
  collection: string(),
11747
- filter: QueryFilterSchema.optional()
11748
- }), array(SettingsRecordSchema).readonly()), method(object({
11771
+ filter: QueryFilterSchema.optional(),
11772
+ /**
11773
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11774
+ *
11775
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11776
+ * was wrong — corrected 2026-08-26 after the hop map
11777
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11778
+ * There is **no Zod parse at all** between the door and the engine: the
11779
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11780
+ * field declared here reaches `SqliteSettingsBackend` either way.
11781
+ *
11782
+ * What actually lost `columns` was the THIRD declaration of this shape:
11783
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11784
+ * interface the engine destructures from. The field existed on both
11785
+ * schemas and the engine still never read it, because nothing checks a
11786
+ * registered provider against `InferProvider<cap>` —
11787
+ * `ProviderRegistration.provider` is typed `object`.
11788
+ *
11789
+ * It is declared here anyway, and must stay in step with
11790
+ * `settings-store.query`: a caller reading only the cap definitions has
11791
+ * to be able to see that this call carries a projection.
11792
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11793
+ */
11794
+ columns: array(string()).readonly().optional()
11795
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11749
11796
  namespace: string().optional(),
11750
11797
  collection: string(),
11751
11798
  record: SettingsRecordSchema
11752
- }), _void(), { kind: "mutation" }), method(object({
11799
+ }), _void(), {
11800
+ kind: "mutation",
11801
+ auth: "admin"
11802
+ }), method(object({
11753
11803
  namespace: string().optional(),
11754
11804
  collection: string(),
11755
11805
  id: string(),
11756
11806
  data: record(string(), unknown())
11757
- }), _void(), { kind: "mutation" }), method(object({
11807
+ }), _void(), {
11808
+ kind: "mutation",
11809
+ auth: "admin"
11810
+ }), method(object({
11758
11811
  namespace: string().optional(),
11759
11812
  collection: string(),
11760
11813
  key: string()
11761
- }), _void(), { kind: "mutation" }), method(object({
11814
+ }), _void(), {
11815
+ kind: "mutation",
11816
+ auth: "admin"
11817
+ }), method(object({
11762
11818
  namespace: string().optional(),
11763
11819
  collection: string(),
11764
11820
  filter: MutationFilterSchema
11765
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11821
+ }), object({ deleted: number().int() }), {
11822
+ kind: "mutation",
11823
+ auth: "admin"
11824
+ }), method(object({
11766
11825
  namespace: string().optional(),
11767
11826
  collection: string(),
11768
11827
  filter: MutationFilterSchema,
11769
11828
  data: record(string(), unknown())
11770
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11829
+ }), object({ updated: number().int() }), {
11830
+ kind: "mutation",
11831
+ auth: "admin"
11832
+ }), method(object({
11771
11833
  namespace: string().optional(),
11772
11834
  collection: string(),
11773
11835
  filter: QueryFilterSchema.optional()
11774
- }), number()), method(object({
11836
+ }), number(), { auth: "admin" }), method(object({
11775
11837
  namespace: string().optional(),
11776
11838
  collection: string(),
11777
11839
  field: string(),
@@ -11781,15 +11843,18 @@ method(_void(), EngineInfoSchema), method(object({
11781
11843
  }), array(object({
11782
11844
  bucket: number().int(),
11783
11845
  count: number().int()
11784
- })).readonly()), method(object({
11846
+ })).readonly(), { auth: "admin" }), method(object({
11785
11847
  namespace: string().optional(),
11786
11848
  collection: string()
11787
- }), boolean()), method(object({
11849
+ }), boolean(), { auth: "admin" }), method(object({
11788
11850
  namespace: string().optional(),
11789
11851
  collection: string(),
11790
11852
  columns: array(CollectionColumnSchema).readonly(),
11791
11853
  indexes: array(CollectionIndexSchema).readonly().optional()
11792
- }), _void(), { kind: "mutation" });
11854
+ }), _void(), {
11855
+ kind: "mutation",
11856
+ auth: "admin"
11857
+ });
11793
11858
  /**
11794
11859
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11795
11860
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12917,7 +12982,7 @@ method(object({
12917
12982
  crop: _instanceof(Uint8Array),
12918
12983
  width: number(),
12919
12984
  height: number()
12920
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12985
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12921
12986
  /**
12922
12987
  * filesystem-browse — per-node capability for browsing the node's local
12923
12988
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -13210,19 +13275,22 @@ method(LlmGenerateBaseInputSchema.extend({
13210
13275
  runtime: ManagedRuntimeConfigSchema,
13211
13276
  /** The managed profile's timeout, threaded by the hub provider. */
13212
13277
  timeoutMs: number().int().positive().optional()
13213
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13278
+ }), LlmGenerateResultSchema, {
13279
+ kind: "mutation",
13280
+ auth: "admin"
13281
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
13214
13282
  kind: "mutation",
13215
13283
  auth: "admin"
13216
13284
  }), method(object({}), _void(), {
13217
13285
  kind: "mutation",
13218
13286
  auth: "admin"
13219
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
13287
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
13220
13288
  kind: "mutation",
13221
13289
  auth: "admin"
13222
13290
  }), method(object({ file: string() }), _void(), {
13223
13291
  kind: "mutation",
13224
13292
  auth: "admin"
13225
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
13293
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
13226
13294
  /**
13227
13295
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
13228
13296
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16701,7 +16769,7 @@ var OauthIntegrationDescriptorSchema = object({
16701
16769
  */
16702
16770
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16703
16771
  });
16704
- method(_void(), OauthIntegrationDescriptorSchema);
16772
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16705
16773
  /**
16706
16774
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16707
16775
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17896,6 +17964,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17896
17964
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17897
17965
  kind: "mutation",
17898
17966
  auth: "admin"
17967
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17968
+ kind: "mutation",
17969
+ auth: "admin"
17970
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17971
+ kind: "query",
17972
+ auth: "admin"
17973
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17974
+ kind: "mutation",
17975
+ auth: "admin"
17899
17976
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17900
17977
  kind: "query",
17901
17978
  auth: "admin"
@@ -18050,6 +18127,11 @@ object({
18050
18127
  "jpeg"
18051
18128
  ])
18052
18129
  });
18130
+ /**
18131
+ * Process-local frame identity. It is serializable so it can ride an in-process
18132
+ * capability call, but `registryId` deliberately prevents resolution in any
18133
+ * other process or execution group.
18134
+ */
18053
18135
  var FrameRefSchema = object({
18054
18136
  registryId: string().min(1),
18055
18137
  id: string().min(1),
@@ -20215,7 +20297,7 @@ method(object({
20215
20297
  * linking rather than produce an eternal token.
20216
20298
  */
20217
20299
  ttlSec: union([number().int().positive(), literal("never")]).optional()
20218
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
20300
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
20219
20301
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
20220
20302
  providerId: string().min(1),
20221
20303
  displayName: string().min(1),
@@ -20310,10 +20392,13 @@ var EvictResultSchema = object({
20310
20392
  /** True when the provider has nothing left it is willing to drop on this location. */
20311
20393
  exhausted: boolean()
20312
20394
  });
20313
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
20395
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
20314
20396
  locationId: string(),
20315
20397
  targetBytes: number().int().positive()
20316
- }), EvictResultSchema, { kind: "mutation" });
20398
+ }), EvictResultSchema, {
20399
+ kind: "mutation",
20400
+ auth: "admin"
20401
+ });
20317
20402
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
20318
20403
  kind: "mutation",
20319
20404
  auth: "admin"
@@ -20373,26 +20458,50 @@ var ReadChunkInputSchema = object({
20373
20458
  length: number()
20374
20459
  });
20375
20460
  var EndDownloadInputSchema = object({ downloadId: string() });
20376
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20461
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
20377
20462
  location: StorageLocationSchema,
20378
20463
  relativePath: string()
20379
- }), string()), method(object({
20464
+ }), string(), { auth: "admin" }), method(object({
20380
20465
  location: StorageLocationSchema,
20381
20466
  relativePath: string(),
20382
20467
  data: _instanceof(Uint8Array)
20383
- }), _void(), { kind: "mutation" }), method(object({
20468
+ }), _void(), {
20469
+ kind: "mutation",
20470
+ auth: "admin"
20471
+ }), method(object({
20384
20472
  location: StorageLocationSchema,
20385
20473
  relativePath: string()
20386
- }), _instanceof(Uint8Array)), method(object({
20474
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
20387
20475
  location: StorageLocationSchema,
20388
20476
  relativePath: string()
20389
- }), boolean()), method(object({
20477
+ }), boolean(), { auth: "admin" }), method(object({
20390
20478
  location: StorageLocationSchema,
20391
20479
  prefix: string().optional()
20392
- }), array(string()).readonly()), method(object({
20480
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
20393
20481
  location: StorageLocationSchema,
20394
20482
  relativePath: string()
20395
- }), _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" });
20483
+ }), _void(), {
20484
+ kind: "mutation",
20485
+ auth: "admin"
20486
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
20487
+ kind: "mutation",
20488
+ auth: "admin"
20489
+ }), method(WriteChunkInputSchema, _void(), {
20490
+ kind: "mutation",
20491
+ auth: "admin"
20492
+ }), method(FinalizeUploadInputSchema, _void(), {
20493
+ kind: "mutation",
20494
+ auth: "admin"
20495
+ }), method(AbortUploadInputSchema, _void(), {
20496
+ kind: "mutation",
20497
+ auth: "admin"
20498
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
20499
+ kind: "mutation",
20500
+ auth: "admin"
20501
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
20502
+ kind: "mutation",
20503
+ auth: "admin"
20504
+ });
20396
20505
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
20397
20506
  var ProfileSettingsSchemaBridge = unknown().nullable();
20398
20507
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -20650,7 +20759,8 @@ method(object({
20650
20759
  access: "create"
20651
20760
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
20652
20761
  kind: "mutation",
20653
- access: "view"
20762
+ access: "view",
20763
+ auth: "admin"
20654
20764
  }), method(object({
20655
20765
  /** Required — the user the assertion belongs to (verified). */
20656
20766
  userId: string(),
@@ -20658,10 +20768,12 @@ method(object({
20658
20768
  response: record(string(), unknown())
20659
20769
  }), object({ verified: boolean() }), {
20660
20770
  kind: "mutation",
20661
- access: "view"
20771
+ access: "view",
20772
+ auth: "admin"
20662
20773
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
20663
20774
  kind: "mutation",
20664
- access: "view"
20775
+ access: "view",
20776
+ auth: "admin"
20665
20777
  }), method(object({
20666
20778
  /** AuthenticationResponseJSON from the browser. */
20667
20779
  response: record(string(), unknown()) }), object({
@@ -20669,7 +20781,8 @@ response: record(string(), unknown()) }), object({
20669
20781
  userId: string().nullable()
20670
20782
  }), {
20671
20783
  kind: "mutation",
20672
- access: "view"
20784
+ access: "view",
20785
+ auth: "admin"
20673
20786
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20674
20787
  userId: string(),
20675
20788
  credentialId: string()
@@ -20841,7 +20954,19 @@ var VectorStatsResultSchema = object({
20841
20954
  /** False when the backend ranks approximately. */
20842
20955
  exact: boolean()
20843
20956
  });
20844
- 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);
20957
+ method(VectorDeclareIndexInputSchema, _void(), {
20958
+ kind: "mutation",
20959
+ auth: "admin"
20960
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20961
+ kind: "mutation",
20962
+ auth: "admin"
20963
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20964
+ kind: "mutation",
20965
+ auth: "admin"
20966
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20967
+ kind: "mutation",
20968
+ auth: "admin"
20969
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20845
20970
  var ClipSchema = object({
20846
20971
  /** Opaque, provider-namespaced id. The default provider encodes the time
20847
20972
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -22564,7 +22689,27 @@ var MediaFileLiteSchema$1 = object({
22564
22689
  sizeBytes: number(),
22565
22690
  timestamp: number()
22566
22691
  });
22567
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22692
+ method(object({
22693
+ /**
22694
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22695
+ *
22696
+ * Default `false`, the same inversion `listRecentFaces` and
22697
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22698
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22699
+ * on the live hub the same day: four identities cost 40,979 B with the
22700
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22701
+ * four times and the viewer holds at `staleTime: 30_000`.
22702
+ *
22703
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22704
+ * the `event-media` plane serves that key `immutable` with an ETag.
22705
+ *
22706
+ * **This is an INPUT field, so it does not reach the addon until the
22707
+ * next train** — the hub router validates cap inputs against its own
22708
+ * compiled Zod and strips a key it does not know. Until then the
22709
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22710
+ * is what ships, and the opt-in becomes reachable when the train lands.
22711
+ */
22712
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22568
22713
  kind: "mutation",
22569
22714
  auth: "admin"
22570
22715
  }), method(object({
@@ -24711,8 +24856,10 @@ var PlateInfoSchema = object({
24711
24856
  keyFrameMediaKey: string().optional(),
24712
24857
  base64: string().optional(),
24713
24858
  /**
24714
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24715
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24859
+ * Same crop as a data-plane URL, always present when the plate has a stored
24860
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24861
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24862
+ * left at its `true` default.
24716
24863
  */
24717
24864
  cropUrl: string().optional()
24718
24865
  });
@@ -24732,14 +24879,34 @@ var PlateClusterSchema = object({
24732
24879
  });
24733
24880
  method(object({
24734
24881
  deviceId: number().int().optional(),
24735
- limit: number().int().positive().optional()
24882
+ limit: number().int().positive().optional(),
24883
+ /**
24884
+ * Inline the base64 crop on every row. Default `true` — the existing
24885
+ * behaviour, kept so no caller breaks.
24886
+ *
24887
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24888
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24889
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24890
+ * metadata without them — and the browser then caches the images.
24891
+ *
24892
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24893
+ * plates were the one gallery list left without it.
24894
+ *
24895
+ * **This is an INPUT field, so it does not reach the addon until the
24896
+ * next train.** The hub router validates cap inputs against its own
24897
+ * compiled Zod and strips a key it does not know. Until the train
24898
+ * ships, sending `false` is harmless and keeps the crops inline.
24899
+ */
24900
+ includeCrops: boolean().optional()
24736
24901
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24737
24902
  deviceId: number().int(),
24738
24903
  trackId: string()
24739
24904
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24740
24905
  text: string().min(1),
24741
24906
  maxDistance: number().int().min(0).optional(),
24742
- limit: number().int().positive().optional()
24907
+ limit: number().int().positive().optional(),
24908
+ /** See `listPlates.includeCrops`. Default `true`. */
24909
+ includeCrops: boolean().optional()
24743
24910
  }), array(PlateInfoSchema).readonly()), method(object({
24744
24911
  maxDistance: number().int().min(0).optional(),
24745
24912
  minClusterSize: number().int().min(2).optional(),
@@ -24753,7 +24920,13 @@ method(object({
24753
24920
  }), method(object({ plateId: string() }), _void(), {
24754
24921
  kind: "mutation",
24755
24922
  auth: "admin"
24756
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24923
+ }), method(object({
24924
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24925
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24926
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24927
+ * INPUT field: stripped by the hub router until the train ships, which
24928
+ * resolves to `false` and is exactly the intended default. */
24929
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24757
24930
  kind: "mutation",
24758
24931
  auth: "admin"
24759
24932
  }), method(object({
@@ -30130,6 +30303,12 @@ Object.freeze({
30130
30303
  addonId: null,
30131
30304
  access: "create"
30132
30305
  },
30306
+ "pipelineAnalytics.cancelRelocateMedia": {
30307
+ capName: "pipeline-analytics",
30308
+ capScope: "device",
30309
+ addonId: null,
30310
+ access: "create"
30311
+ },
30133
30312
  "pipelineAnalytics.cancelStorageMigrationMove": {
30134
30313
  capName: "pipeline-analytics",
30135
30314
  capScope: "device",
@@ -30304,6 +30483,12 @@ Object.freeze({
30304
30483
  addonId: null,
30305
30484
  access: "view"
30306
30485
  },
30486
+ "pipelineAnalytics.listRelocateMediaJobs": {
30487
+ capName: "pipeline-analytics",
30488
+ capScope: "device",
30489
+ addonId: null,
30490
+ access: "view"
30491
+ },
30307
30492
  "pipelineAnalytics.listRetrainAnnotations": {
30308
30493
  capName: "pipeline-analytics",
30309
30494
  capScope: "device",
@@ -30382,6 +30567,12 @@ Object.freeze({
30382
30567
  addonId: null,
30383
30568
  access: "create"
30384
30569
  },
30570
+ "pipelineAnalytics.relocateMedia": {
30571
+ capName: "pipeline-analytics",
30572
+ capScope: "device",
30573
+ addonId: null,
30574
+ access: "create"
30575
+ },
30385
30576
  "pipelineAnalytics.restageRetrainTrack": {
30386
30577
  capName: "pipeline-analytics",
30387
30578
  capScope: "device",
@@ -35682,6 +35873,38 @@ var ScryptedCatalogDriftSchema = object({
35682
35873
  ]),
35683
35874
  details: string().optional()
35684
35875
  });
35876
+ /**
35877
+ * Curated PUBLIC Frigate catalog entry (D214 addendum). Named + exported so
35878
+ * the UI's `listFrigateCatalog` result parses against the SAME schema this
35879
+ * action's output is declared with (see `modelStudioActions.listFrigateCatalog`
35880
+ * below) — one shape, not a hand-duplicated interface on the UI side.
35881
+ */
35882
+ var FrigateCatalogEntrySchema = object({
35883
+ id: string(),
35884
+ label: string(),
35885
+ format: _enum(MODEL_FORMATS),
35886
+ sizeMB: number(),
35887
+ inputSize: number(),
35888
+ notes: string()
35889
+ });
35890
+ /**
35891
+ * Frigate+ `/v1/model/list` entry (see `frigate-plus.ts`). `isBaseModel` is
35892
+ * the Base/Custom discriminator Frigate's own UI groups on. Named + exported
35893
+ * for the same reason as {@link FrigateCatalogEntrySchema}.
35894
+ */
35895
+ var FrigatePlusModelSchema = object({
35896
+ id: string(),
35897
+ name: string(),
35898
+ type: string(),
35899
+ isBaseModel: boolean(),
35900
+ baseModel: string(),
35901
+ supportedDetectors: array(string()).readonly(),
35902
+ trainDate: string(),
35903
+ hailoDevice: string().optional(),
35904
+ verifiedImages: number(),
35905
+ width: number().optional(),
35906
+ height: number().optional()
35907
+ });
35685
35908
  var modelStudioActions = defineCustomActions({
35686
35909
  registerCustomModel: customAction(CustomModelDescriptorSchema, object({ ok: literal(true) }), { kind: "mutation" }),
35687
35910
  removeCustomModel: customAction(object({ modelId: string() }), object({ removed: boolean() }), { kind: "mutation" }),
@@ -35730,14 +35953,7 @@ var modelStudioActions = defineCustomActions({
35730
35953
  * the hub's modelsDir and registers the descriptor with the public URL
35731
35954
  * (other nodes download on demand — no Distribute needed).
35732
35955
  */
35733
- listFrigateCatalog: customAction(_void(), array(object({
35734
- id: string(),
35735
- label: string(),
35736
- format: _enum(MODEL_FORMATS),
35737
- sizeMB: number(),
35738
- inputSize: number(),
35739
- notes: string()
35740
- })).readonly()),
35956
+ listFrigateCatalog: customAction(_void(), array(FrigateCatalogEntrySchema).readonly()),
35741
35957
  importFrigateCatalogModel: customAction(object({
35742
35958
  catalogId: string(),
35743
35959
  modelId: string().optional(),
@@ -35777,19 +35993,7 @@ var modelStudioActions = defineCustomActions({
35777
35993
  ok: boolean(),
35778
35994
  error: string().optional()
35779
35995
  }), { kind: "mutation" }),
35780
- frigatePlusListModels: customAction(_void(), array(object({
35781
- id: string(),
35782
- name: string(),
35783
- type: string(),
35784
- isBaseModel: boolean(),
35785
- baseModel: string(),
35786
- supportedDetectors: array(string()).readonly(),
35787
- trainDate: string(),
35788
- hailoDevice: string().optional(),
35789
- verifiedImages: number(),
35790
- width: number().optional(),
35791
- height: number().optional()
35792
- })).readonly()),
35996
+ frigatePlusListModels: customAction(_void(), array(FrigatePlusModelSchema).readonly()),
35793
35997
  importFrigatePlusModel: customAction(object({
35794
35998
  plusModelId: string(),
35795
35999
  modelId: string(),