@camstack/addon-admin-ui 1.2.98 → 1.2.100

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 (117) hide show
  1. package/dist/assets/{AddLocationWizard-BH8qzKUS.js → AddLocationWizard-ww2FaZ1E.js} +1 -1
  2. package/dist/assets/{AddonCollectionPage-DBot-bgj.js → AddonCollectionPage-2an6cPDR.js} +1 -1
  3. package/dist/assets/Addons-Dnc-RXgM.js +1 -0
  4. package/dist/assets/{AdminTabs-Dk1eLBgE.js → AdminTabs-Bp6VWjqO.js} +1 -1
  5. package/dist/assets/AiProfiles-DpS2g7XY.js +3 -0
  6. package/dist/assets/{BrokerForm-GsfCv1ks.js → BrokerForm-MO0zLICQ.js} +1 -1
  7. package/dist/assets/{Build-D3dp29Pc.js → Build-C6grDXZj.js} +3 -3
  8. package/dist/assets/Capabilities-C1oKrOiJ.js +1 -0
  9. package/dist/assets/{CapabilityBadges-DGA5_XiI.js → CapabilityBadges-CQ8iNKjJ.js} +1 -1
  10. package/dist/assets/{Cluster-DV1zGnLF.js → Cluster-BlBr9mrc.js} +1 -1
  11. package/dist/assets/{Data-zSfgUsc7.js → Data-CbSER22j.js} +1 -1
  12. package/dist/assets/DetectionIntelligence-CZyeSCJf.js +1 -0
  13. package/dist/assets/{DeviceAggregateSection-BSMvAqDX.js → DeviceAggregateSection-DJUAmzyp.js} +1 -1
  14. package/dist/assets/{DeviceDetail-DH0vN28R.js → DeviceDetail-DmgBCV4a.js} +2 -2
  15. package/dist/assets/{Devices-BYXPSPMY.js → Devices-BrElFvY3.js} +1 -1
  16. package/dist/assets/{EmbedPlayerPage-Chq0wty0.js → EmbedPlayerPage-4Ay_8z3U.js} +1 -1
  17. package/dist/assets/Events-KnLsawMq.js +1 -0
  18. package/dist/assets/FormBuilder-CEw554z0.js +1 -0
  19. package/dist/assets/{Identity-CQZ5NPpO.js → Identity-bGGI1QWE.js} +1 -1
  20. package/dist/assets/IntegrationDetail-eQjr_VZf.js +1 -0
  21. package/dist/assets/Integrations-CDOiRBS9.js +1 -0
  22. package/dist/assets/{Integrations-Defjpzw9.js → Integrations-R6vGB8m2.js} +1 -1
  23. package/dist/assets/{Logs-DvLobSoL.js → Logs-It8Tm5s9.js} +1 -1
  24. package/dist/assets/{MotionZonesSettings-B_MAiEkW.js → MotionZonesSettings-DwzHsRPk.js} +1 -1
  25. package/dist/assets/MyAccess-Bo811JUn.js +2 -0
  26. package/dist/assets/Network-B6zVgaCe.js +1 -0
  27. package/dist/assets/{NodeAddonsSettingsPanel-kZjm-up8.js → NodeAddonsSettingsPanel-hGBeOFYH.js} +1 -1
  28. package/dist/assets/{NodeInferenceDevices-CW1MDnBG.js → NodeInferenceDevices-BCmCXC5y.js} +1 -1
  29. package/dist/assets/Notifications-DSAFFXJr.js +1 -0
  30. package/dist/assets/{Pipeline-BBVvpBCd.js → Pipeline-BbnF9Ozb.js} +1 -1
  31. package/dist/assets/Plates-Ck6zc0jT.js +1 -0
  32. package/dist/assets/{PrivacyMaskSettings-axbq_wSU.js → PrivacyMaskSettings-B_z0irSV.js} +1 -1
  33. package/dist/assets/{ProviderIcon-DllNEady.js → ProviderIcon-DupRG1e9.js} +1 -1
  34. package/dist/assets/Recordings-BmEupF3w.js +1 -0
  35. package/dist/assets/{ScanNetworkModal-CW0yYE5R.js → ScanNetworkModal-D0r0hQ_h.js} +1 -1
  36. package/dist/assets/{SceneMonitorEditor-Cq2t8wbg.js → SceneMonitorEditor-CGXIUSVs.js} +1 -1
  37. package/dist/assets/{Scenes-Xn6O5H7e.js → Scenes-BNeqc2nK.js} +1 -1
  38. package/dist/assets/{Settings-D9Vlv2hw.js → Settings-Bh1XKvEL.js} +1 -1
  39. package/dist/assets/{Showroom-Bp6aCuMd.js → Showroom-BzVgVZC7.js} +1 -1
  40. package/dist/assets/{Terminal-7vWKE2zb.js → Terminal-B58p5WIp.js} +4 -4
  41. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DrOgR36u.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-TBqHL73f.js} +1 -1
  42. package/dist/assets/{bell-ring-D4Iz5fKj.js → bell-ring-DTczejZ4.js} +1 -1
  43. package/dist/assets/{boxes-BFsuQuon.js → boxes-C985Wrl0.js} +1 -1
  44. package/dist/assets/{build-cluster-graph-Cl_uvOCR.js → build-cluster-graph-CipaA_oB.js} +2 -2
  45. package/dist/assets/circle-check-big-Bj2tv0Uy.js +1 -0
  46. package/dist/assets/{circle-x-y_k7wCKw.js → circle-x-CDQw-Oki.js} +1 -1
  47. package/dist/assets/clock-BcKuptwD.js +1 -0
  48. package/dist/assets/{copy-BrVxemF7.js → copy-CAOXjD5r.js} +1 -1
  49. package/dist/assets/{debounced-invalidate-CNZ2w-7t.js → debounced-invalidate-DpIEFwPp.js} +1 -1
  50. package/dist/assets/dist-BHaLZy2_.js +349 -0
  51. package/dist/assets/{dist-C7L1HtAB.js → dist-CI4L7l-2.js} +1 -1
  52. package/dist/assets/{download-DPw0c0lm.js → download-CAJNFrAB.js} +1 -1
  53. package/dist/assets/face-bbox-BFgt9EZy.js +1 -0
  54. package/dist/assets/{hostInit-D5R1Qfsh.js → hostInit-CAD--nfI.js} +1 -1
  55. package/dist/assets/index-9YoL1cUW.css +2 -0
  56. package/dist/assets/index-KHEomj2t.js +4 -0
  57. package/dist/assets/{key-round-fO7JDI-O.js → key-round-D_sH_q8V.js} +1 -1
  58. package/dist/assets/{mf-entry-bootstrap-0-f566460e.js → mf-entry-bootstrap-0-c4e36f72.js} +2 -2
  59. package/dist/assets/{pencil-B4i0ErRE.js → pencil-CqqsHO49.js} +1 -1
  60. package/dist/assets/play-I3HZudQM.js +1 -0
  61. package/dist/assets/{player-overlays-DLbOIwJR.js → player-overlays-bbH94q-C.js} +1 -1
  62. package/dist/assets/plus-CJqabi49.js +1 -0
  63. package/dist/assets/power-txJcg2ZI.js +1 -0
  64. package/dist/assets/{radio-CxioeWPp.js → radio-Cug4imoO.js} +1 -1
  65. package/dist/assets/{refresh-cw-B8ABC_pB.js → refresh-cw-BGCphjMn.js} +1 -1
  66. package/dist/assets/remoteEntry-BG1pNM_r.js +1 -0
  67. package/dist/assets/rotate-ccw-h1d3r46-.js +1 -0
  68. package/dist/assets/rotate-cw-Bfa_vcNi.js +1 -0
  69. package/dist/assets/{send-BqmuTM7o.js → send-C5aDTEjJ.js} +1 -1
  70. package/dist/assets/{server-D9l8GGnn.js → server-3wNyeBU4.js} +1 -1
  71. package/dist/assets/{shield-B_7hlY3B.js → shield-DplCqcL2.js} +1 -1
  72. package/dist/assets/square-BTe4gnO3.js +1 -0
  73. package/dist/assets/{square-check-big-B8iw67nQ.js → square-check-big-DH3-Pa_W.js} +1 -1
  74. package/dist/assets/src-CEeJOwlR.js +349 -0
  75. package/dist/assets/src-D7V1-vUs.js +67 -0
  76. package/dist/assets/{star-BTw7N-6p.js → star-Y4-10BmL.js} +1 -1
  77. package/dist/assets/{undo-2-DG5MLTW-.js → undo-2-DEYHOb0E.js} +1 -1
  78. package/dist/assets/{upload-DAJfnCVB.js → upload-BtP3VBCU.js} +1 -1
  79. package/dist/assets/{use-scenes-feed-B6yeT27i.js → use-scenes-feed-BXzv1F4x.js} +1 -1
  80. package/dist/assets/useEventInvalidation-Bzw3MDRD.js +1 -0
  81. package/dist/assets/{video-D4j_U5zK.js → video-CXx7eETO.js} +1 -1
  82. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-Di4hPkeF.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-DyH01HQs.js} +2 -2
  83. package/dist/assets/{wifi-BW00qcYq.js → wifi-ClKydJp-.js} +1 -1
  84. package/dist/assets/{zap-BSOiEhX4.js → zap-Dnj7qxTO.js} +1 -1
  85. package/dist/index.html +6 -6
  86. package/dist/server/addon.js +234 -77
  87. package/package.json +1 -1
  88. package/dist/assets/Addons-D9EFNHE1.js +0 -1
  89. package/dist/assets/AiProfiles-BQ_3LDPD.js +0 -3
  90. package/dist/assets/Capabilities-CoYla6oL.js +0 -1
  91. package/dist/assets/DetectionIntelligence-aHCL16Cy.js +0 -1
  92. package/dist/assets/Events-EROtLWJf.js +0 -1
  93. package/dist/assets/FormBuilder-C7GWtsAC.js +0 -1
  94. package/dist/assets/IntegrationDetail-CWL7rGIm.js +0 -1
  95. package/dist/assets/Integrations-DAIDYD8x.js +0 -1
  96. package/dist/assets/MyAccess-Ci2ZSSm5.js +0 -2
  97. package/dist/assets/Network-BovHq3wO.js +0 -1
  98. package/dist/assets/Notifications-C8I3Vz31.js +0 -1
  99. package/dist/assets/Plates-qD8BtBqF.js +0 -1
  100. package/dist/assets/Recordings-CzEDQqtj.js +0 -1
  101. package/dist/assets/circle-check-big-HrHc_ipL.js +0 -1
  102. package/dist/assets/clock-D2qlcgwd.js +0 -1
  103. package/dist/assets/dist-JjXjac1y.js +0 -349
  104. package/dist/assets/face-bbox-d1aWGz2s.js +0 -1
  105. package/dist/assets/index-DM8saR4E.css +0 -2
  106. package/dist/assets/index-iNi1Y7nh.js +0 -4
  107. package/dist/assets/play-BxkaaFOu.js +0 -1
  108. package/dist/assets/plus-DE5rskj6.js +0 -1
  109. package/dist/assets/power-CzV5Z-a_.js +0 -1
  110. package/dist/assets/remoteEntry-DXwp0vbz.js +0 -1
  111. package/dist/assets/rotate-ccw-CD3wu9ON.js +0 -1
  112. package/dist/assets/rotate-cw-8vMRQVny.js +0 -1
  113. package/dist/assets/search-Dia6mspm.js +0 -1
  114. package/dist/assets/square-Cj45Ro71.js +0 -1
  115. package/dist/assets/src-CQrwlltP.js +0 -349
  116. package/dist/assets/src-UiaZA05p.js +0 -67
  117. package/dist/assets/useEventInvalidation-D7ElHW62.js +0 -1
@@ -6631,7 +6631,7 @@ function method(input, output, options) {
6631
6631
  input,
6632
6632
  output,
6633
6633
  kind: options?.kind ?? "query",
6634
- auth: options?.auth ?? "protected",
6634
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6635
6635
  ...options?.access !== void 0 ? { access: options.access } : {},
6636
6636
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6637
6637
  timeoutMs: options?.timeoutMs
@@ -6657,8 +6657,17 @@ var adminUiCapability = {
6657
6657
  mode: "singleton",
6658
6658
  internal: true,
6659
6659
  methods: {
6660
- getStaticDir: method(_void(), StaticDirOutputSchema$1),
6661
- getVersion: method(_void(), VersionOutputSchema$1)
6660
+ /**
6661
+ * `internal: true` did not gate the mount (see the 2026-08-26 note on
6662
+ * `data-store-provider`) — both methods were reachable on the AppRouter
6663
+ * by ANY authenticated session at the default `auth: 'protected'`, and
6664
+ * `getStaticDir` leaks a hub filesystem path. The only caller is
6665
+ * `main.ts`'s static-file bootstrap, via `capRegistry.getSingletonForNode`
6666
+ * — never tRPC — so `auth: 'admin'` costs it nothing. The actual admin-ui
6667
+ * SPA assets are served as plain static files, unaffected by this gate.
6668
+ */
6669
+ getStaticDir: method(_void(), StaticDirOutputSchema$1, { auth: "admin" }),
6670
+ getVersion: method(_void(), VersionOutputSchema$1, { auth: "admin" })
6662
6671
  }
6663
6672
  };
6664
6673
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
@@ -6981,7 +6990,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6981
6990
  }({});
6982
6991
  var StaticDirOutputSchema = object({ staticDir: string() });
6983
6992
  var VersionOutputSchema = object({ version: string() });
6984
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6993
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6985
6994
  /**
6986
6995
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6987
6996
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7595,24 +7604,6 @@ var RecordingRetentionSchema = object({
7595
7604
  maxSizeGb: number().min(0).optional()
7596
7605
  });
7597
7606
  /**
7598
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7599
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7600
- * previews at. Five graduated steps; absent on a config = `standard` (the
7601
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7602
- *
7603
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7604
- * Each window's index sidecar carries its own tile dims, so a camera whose
7605
- * preset changed over time renders every historical window at the dims it was
7606
- * written with.
7607
- */
7608
- var ScrubThumbnailPresetSchema = _enum([
7609
- "minimal",
7610
- "low",
7611
- "standard",
7612
- "high",
7613
- "max"
7614
- ]);
7615
- /**
7616
7607
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7617
7608
  *
7618
7609
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7620,7 +7611,11 @@ var ScrubThumbnailPresetSchema = _enum([
7620
7611
  * other field is a storage knob (profiles, segment length, retention, scrub).
7621
7612
  *
7622
7613
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7623
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7614
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7615
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7616
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7617
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7618
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7624
7619
  * A stale caller must fail loudly — silently stripping its legacy intent would
7625
7620
  * persist a band-less config, i.e. silently stop recording the camera.
7626
7621
  */
@@ -7643,14 +7638,7 @@ var RecordingConfigSchema = object({
7643
7638
  * "off" is the absence of a covering band, never a band value.
7644
7639
  */
7645
7640
  bands: array(RecordingBandSchema).default([]),
7646
- retention: RecordingRetentionSchema.optional(),
7647
- /**
7648
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7649
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7650
- * windows only — existing sheets are immutable, and each window's index
7651
- * carries its own tile dims so mixed-preset history renders correctly.
7652
- */
7653
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7641
+ retention: RecordingRetentionSchema.optional()
7654
7642
  }).strict();
7655
7643
  /**
7656
7644
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7726,10 +7714,11 @@ var RelocateFootageInputSchema = object({
7726
7714
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7727
7715
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7728
7716
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7729
- var StorageMigrationMediaMoveInputSchema = object({
7717
+ var RelocateMediaInputSchema = object({
7730
7718
  toLocationId: string(),
7731
7719
  throttleMbps: number().min(1).max(1e3).optional()
7732
- }).extend({ leaseId: string().min(1) });
7720
+ });
7721
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7733
7722
  /** The independently selectable logical storage classes. `recordings`
7734
7723
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7735
7724
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8024,7 +8013,26 @@ var LabelDefinitionSchema = object({
8024
8013
  description: string().optional(),
8025
8014
  icon: string().optional()
8026
8015
  });
8027
- var ClassMapDefinitionSchema = object({
8016
+ /**
8017
+ * Wire schema for a per-model CATALOG classMap override
8018
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8019
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8020
+ * detection pipeline executor actually routes.
8021
+ *
8022
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8023
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8024
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8025
+ * enum) — the two used to share the name `ClassMapDefinition`/
8026
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8027
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8028
+ * are not: it is two different concepts colliding on a name. Keep this type
8029
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8030
+ * would either narrow every `ClassMapDefinition` consumer to the four
8031
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8032
+ * schema exists for (see the "rejects a classMap whose target is not a
8033
+ * detection macro" test in `model-catalog-schema.test.ts`).
8034
+ */
8035
+ var DetectionCatalogClassMapSchema = object({
8028
8036
  mapping: record(string(), _enum([
8029
8037
  "person",
8030
8038
  "vehicle",
@@ -8229,7 +8237,7 @@ var ModelCatalogEntrySchema = object({
8229
8237
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8230
8238
  * labels already ARE the CamStack macros (Scrypted identity map).
8231
8239
  */
8232
- classMap: ClassMapDefinitionSchema.optional()
8240
+ classMap: DetectionCatalogClassMapSchema.optional()
8233
8241
  });
8234
8242
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8235
8243
  format: literal("openvino"),
@@ -8259,7 +8267,7 @@ var ModelConvertMetadataSchema = object({
8259
8267
  "segmentation"
8260
8268
  ]),
8261
8269
  faceAlignment: boolean().optional(),
8262
- classMap: ClassMapDefinitionSchema.optional()
8270
+ classMap: DetectionCatalogClassMapSchema.optional()
8263
8271
  });
8264
8272
  var ConvertResultSchema = object({
8265
8273
  entry: ModelCatalogEntrySchema,
@@ -9122,7 +9130,7 @@ var AddonPageDeclarationSchema = object({
9122
9130
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9123
9131
  sectionLabel: string().optional()
9124
9132
  });
9125
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9133
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9126
9134
  var AddonHttpRouteSchema = object({
9127
9135
  method: _enum([
9128
9136
  "GET",
@@ -9357,7 +9365,7 @@ var WidgetMetadataSchema = object({
9357
9365
  defaultColumns: number().int().min(1).max(12).default(6),
9358
9366
  defaultRows: number().int().min(1).max(12).default(1)
9359
9367
  });
9360
- method(_void(), array(WidgetMetadataSchema).readonly());
9368
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9361
9369
  /**
9362
9370
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9363
9371
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10879,7 +10887,7 @@ var CustomModelDescriptorSchema = object({
10879
10887
  stepId: string(),
10880
10888
  entry: ModelCatalogEntrySchema
10881
10889
  });
10882
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10890
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10883
10891
  /**
10884
10892
  * Query filter for settings-store collections.
10885
10893
  */
@@ -10966,7 +10974,8 @@ method(object({
10966
10974
  }), _void(), { kind: "mutation" }), method(object({
10967
10975
  namespace: string().optional(),
10968
10976
  collection: string(),
10969
- filter: QueryFilterSchema.optional()
10977
+ filter: QueryFilterSchema.optional(),
10978
+ columns: array(string()).readonly().optional()
10970
10979
  }), array(SettingsRecordSchema).readonly()), method(object({
10971
10980
  namespace: string().optional(),
10972
10981
  collection: string(),
@@ -11029,46 +11038,87 @@ var EngineInfoSchema = object({
11029
11038
  kind: _enum(["relational", "vector"]),
11030
11039
  displayName: string()
11031
11040
  });
11032
- method(_void(), EngineInfoSchema), method(object({
11041
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11033
11042
  namespace: string().optional(),
11034
11043
  collection: string(),
11035
11044
  key: string()
11036
- }), unknown()), method(object({
11045
+ }), unknown(), { auth: "admin" }), method(object({
11037
11046
  namespace: string().optional(),
11038
11047
  collection: string(),
11039
11048
  key: string(),
11040
11049
  value: unknown()
11041
- }), _void(), { kind: "mutation" }), method(object({
11050
+ }), _void(), {
11051
+ kind: "mutation",
11052
+ auth: "admin"
11053
+ }), method(object({
11042
11054
  namespace: string().optional(),
11043
11055
  collection: string(),
11044
- filter: QueryFilterSchema.optional()
11045
- }), array(SettingsRecordSchema).readonly()), method(object({
11056
+ filter: QueryFilterSchema.optional(),
11057
+ /**
11058
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11059
+ *
11060
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11061
+ * was wrong — corrected 2026-08-26 after the hop map
11062
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11063
+ * There is **no Zod parse at all** between the door and the engine: the
11064
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11065
+ * field declared here reaches `SqliteSettingsBackend` either way.
11066
+ *
11067
+ * What actually lost `columns` was the THIRD declaration of this shape:
11068
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11069
+ * interface the engine destructures from. The field existed on both
11070
+ * schemas and the engine still never read it, because nothing checks a
11071
+ * registered provider against `InferProvider<cap>` —
11072
+ * `ProviderRegistration.provider` is typed `object`.
11073
+ *
11074
+ * It is declared here anyway, and must stay in step with
11075
+ * `settings-store.query`: a caller reading only the cap definitions has
11076
+ * to be able to see that this call carries a projection.
11077
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11078
+ */
11079
+ columns: array(string()).readonly().optional()
11080
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11046
11081
  namespace: string().optional(),
11047
11082
  collection: string(),
11048
11083
  record: SettingsRecordSchema
11049
- }), _void(), { kind: "mutation" }), method(object({
11084
+ }), _void(), {
11085
+ kind: "mutation",
11086
+ auth: "admin"
11087
+ }), method(object({
11050
11088
  namespace: string().optional(),
11051
11089
  collection: string(),
11052
11090
  id: string(),
11053
11091
  data: record(string(), unknown())
11054
- }), _void(), { kind: "mutation" }), method(object({
11092
+ }), _void(), {
11093
+ kind: "mutation",
11094
+ auth: "admin"
11095
+ }), method(object({
11055
11096
  namespace: string().optional(),
11056
11097
  collection: string(),
11057
11098
  key: string()
11058
- }), _void(), { kind: "mutation" }), method(object({
11099
+ }), _void(), {
11100
+ kind: "mutation",
11101
+ auth: "admin"
11102
+ }), method(object({
11059
11103
  namespace: string().optional(),
11060
11104
  collection: string(),
11061
11105
  filter: MutationFilterSchema
11062
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11106
+ }), object({ deleted: number().int() }), {
11107
+ kind: "mutation",
11108
+ auth: "admin"
11109
+ }), method(object({
11063
11110
  namespace: string().optional(),
11064
11111
  collection: string(),
11065
11112
  filter: MutationFilterSchema,
11066
11113
  data: record(string(), unknown())
11067
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11114
+ }), object({ updated: number().int() }), {
11115
+ kind: "mutation",
11116
+ auth: "admin"
11117
+ }), method(object({
11068
11118
  namespace: string().optional(),
11069
11119
  collection: string(),
11070
11120
  filter: QueryFilterSchema.optional()
11071
- }), number()), method(object({
11121
+ }), number(), { auth: "admin" }), method(object({
11072
11122
  namespace: string().optional(),
11073
11123
  collection: string(),
11074
11124
  field: string(),
@@ -11078,15 +11128,18 @@ method(_void(), EngineInfoSchema), method(object({
11078
11128
  }), array(object({
11079
11129
  bucket: number().int(),
11080
11130
  count: number().int()
11081
- })).readonly()), method(object({
11131
+ })).readonly(), { auth: "admin" }), method(object({
11082
11132
  namespace: string().optional(),
11083
11133
  collection: string()
11084
- }), boolean()), method(object({
11134
+ }), boolean(), { auth: "admin" }), method(object({
11085
11135
  namespace: string().optional(),
11086
11136
  collection: string(),
11087
11137
  columns: array(CollectionColumnSchema).readonly(),
11088
11138
  indexes: array(CollectionIndexSchema).readonly().optional()
11089
- }), _void(), { kind: "mutation" });
11139
+ }), _void(), {
11140
+ kind: "mutation",
11141
+ auth: "admin"
11142
+ });
11090
11143
  /**
11091
11144
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11092
11145
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12214,7 +12267,7 @@ method(object({
12214
12267
  crop: _instanceof(Uint8Array),
12215
12268
  width: number(),
12216
12269
  height: number()
12217
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12270
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12218
12271
  /**
12219
12272
  * filesystem-browse — per-node capability for browsing the node's local
12220
12273
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12507,19 +12560,22 @@ method(LlmGenerateBaseInputSchema.extend({
12507
12560
  runtime: ManagedRuntimeConfigSchema,
12508
12561
  /** The managed profile's timeout, threaded by the hub provider. */
12509
12562
  timeoutMs: number().int().positive().optional()
12510
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12563
+ }), LlmGenerateResultSchema, {
12564
+ kind: "mutation",
12565
+ auth: "admin"
12566
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12511
12567
  kind: "mutation",
12512
12568
  auth: "admin"
12513
12569
  }), method(object({}), _void(), {
12514
12570
  kind: "mutation",
12515
12571
  auth: "admin"
12516
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12572
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12517
12573
  kind: "mutation",
12518
12574
  auth: "admin"
12519
12575
  }), method(object({ file: string() }), _void(), {
12520
12576
  kind: "mutation",
12521
12577
  auth: "admin"
12522
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12578
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12523
12579
  /**
12524
12580
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12525
12581
  * methods concat-fan across providers; single-row methods route to ONE
@@ -15992,7 +16048,7 @@ var OauthIntegrationDescriptorSchema = object({
15992
16048
  */
15993
16049
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
15994
16050
  });
15995
- method(_void(), OauthIntegrationDescriptorSchema);
16051
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
15996
16052
  /**
15997
16053
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
15998
16054
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17187,6 +17243,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17187
17243
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17188
17244
  kind: "mutation",
17189
17245
  auth: "admin"
17246
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17247
+ kind: "mutation",
17248
+ auth: "admin"
17249
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17250
+ kind: "query",
17251
+ auth: "admin"
17252
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17253
+ kind: "mutation",
17254
+ auth: "admin"
17190
17255
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17191
17256
  kind: "query",
17192
17257
  auth: "admin"
@@ -17341,6 +17406,11 @@ object({
17341
17406
  "jpeg"
17342
17407
  ])
17343
17408
  });
17409
+ /**
17410
+ * Process-local frame identity. It is serializable so it can ride an in-process
17411
+ * capability call, but `registryId` deliberately prevents resolution in any
17412
+ * other process or execution group.
17413
+ */
17344
17414
  var FrameRefSchema = object({
17345
17415
  registryId: string().min(1),
17346
17416
  id: string().min(1),
@@ -19506,7 +19576,7 @@ method(object({
19506
19576
  * linking rather than produce an eternal token.
19507
19577
  */
19508
19578
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19509
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19579
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19510
19580
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19511
19581
  providerId: string().min(1),
19512
19582
  displayName: string().min(1),
@@ -19601,10 +19671,13 @@ var EvictResultSchema = object({
19601
19671
  /** True when the provider has nothing left it is willing to drop on this location. */
19602
19672
  exhausted: boolean()
19603
19673
  });
19604
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19674
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19605
19675
  locationId: string(),
19606
19676
  targetBytes: number().int().positive()
19607
- }), EvictResultSchema, { kind: "mutation" });
19677
+ }), EvictResultSchema, {
19678
+ kind: "mutation",
19679
+ auth: "admin"
19680
+ });
19608
19681
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19609
19682
  kind: "mutation",
19610
19683
  auth: "admin"
@@ -19664,26 +19737,50 @@ var ReadChunkInputSchema = object({
19664
19737
  length: number()
19665
19738
  });
19666
19739
  var EndDownloadInputSchema = object({ downloadId: string() });
19667
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19740
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19668
19741
  location: StorageLocationSchema,
19669
19742
  relativePath: string()
19670
- }), string()), method(object({
19743
+ }), string(), { auth: "admin" }), method(object({
19671
19744
  location: StorageLocationSchema,
19672
19745
  relativePath: string(),
19673
19746
  data: _instanceof(Uint8Array)
19674
- }), _void(), { kind: "mutation" }), method(object({
19747
+ }), _void(), {
19748
+ kind: "mutation",
19749
+ auth: "admin"
19750
+ }), method(object({
19675
19751
  location: StorageLocationSchema,
19676
19752
  relativePath: string()
19677
- }), _instanceof(Uint8Array)), method(object({
19753
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19678
19754
  location: StorageLocationSchema,
19679
19755
  relativePath: string()
19680
- }), boolean()), method(object({
19756
+ }), boolean(), { auth: "admin" }), method(object({
19681
19757
  location: StorageLocationSchema,
19682
19758
  prefix: string().optional()
19683
- }), array(string()).readonly()), method(object({
19759
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19684
19760
  location: StorageLocationSchema,
19685
19761
  relativePath: string()
19686
- }), _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" });
19762
+ }), _void(), {
19763
+ kind: "mutation",
19764
+ auth: "admin"
19765
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19766
+ kind: "mutation",
19767
+ auth: "admin"
19768
+ }), method(WriteChunkInputSchema, _void(), {
19769
+ kind: "mutation",
19770
+ auth: "admin"
19771
+ }), method(FinalizeUploadInputSchema, _void(), {
19772
+ kind: "mutation",
19773
+ auth: "admin"
19774
+ }), method(AbortUploadInputSchema, _void(), {
19775
+ kind: "mutation",
19776
+ auth: "admin"
19777
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19778
+ kind: "mutation",
19779
+ auth: "admin"
19780
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19781
+ kind: "mutation",
19782
+ auth: "admin"
19783
+ });
19687
19784
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19688
19785
  var ProfileSettingsSchemaBridge = unknown().nullable();
19689
19786
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -19941,7 +20038,8 @@ method(object({
19941
20038
  access: "create"
19942
20039
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
19943
20040
  kind: "mutation",
19944
- access: "view"
20041
+ access: "view",
20042
+ auth: "admin"
19945
20043
  }), method(object({
19946
20044
  /** Required — the user the assertion belongs to (verified). */
19947
20045
  userId: string(),
@@ -19949,10 +20047,12 @@ method(object({
19949
20047
  response: record(string(), unknown())
19950
20048
  }), object({ verified: boolean() }), {
19951
20049
  kind: "mutation",
19952
- access: "view"
20050
+ access: "view",
20051
+ auth: "admin"
19953
20052
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
19954
20053
  kind: "mutation",
19955
- access: "view"
20054
+ access: "view",
20055
+ auth: "admin"
19956
20056
  }), method(object({
19957
20057
  /** AuthenticationResponseJSON from the browser. */
19958
20058
  response: record(string(), unknown()) }), object({
@@ -19960,7 +20060,8 @@ response: record(string(), unknown()) }), object({
19960
20060
  userId: string().nullable()
19961
20061
  }), {
19962
20062
  kind: "mutation",
19963
- access: "view"
20063
+ access: "view",
20064
+ auth: "admin"
19964
20065
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
19965
20066
  userId: string(),
19966
20067
  credentialId: string()
@@ -20132,7 +20233,19 @@ var VectorStatsResultSchema = object({
20132
20233
  /** False when the backend ranks approximately. */
20133
20234
  exact: boolean()
20134
20235
  });
20135
- 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);
20236
+ method(VectorDeclareIndexInputSchema, _void(), {
20237
+ kind: "mutation",
20238
+ auth: "admin"
20239
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20240
+ kind: "mutation",
20241
+ auth: "admin"
20242
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20243
+ kind: "mutation",
20244
+ auth: "admin"
20245
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20246
+ kind: "mutation",
20247
+ auth: "admin"
20248
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20136
20249
  var ClipSchema = object({
20137
20250
  /** Opaque, provider-namespaced id. The default provider encodes the time
20138
20251
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21855,7 +21968,27 @@ var MediaFileLiteSchema$1 = object({
21855
21968
  sizeBytes: number(),
21856
21969
  timestamp: number()
21857
21970
  });
21858
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21971
+ method(object({
21972
+ /**
21973
+ * Inline {@link IdentitySchema.coverBase64} on every row.
21974
+ *
21975
+ * Default `false`, the same inversion `listRecentFaces` and
21976
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
21977
+ * why the burden belongs on the caller that WANTS the bytes). Measured
21978
+ * on the live hub the same day: four identities cost 40,979 B with the
21979
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
21980
+ * four times and the viewer holds at `staleTime: 30_000`.
21981
+ *
21982
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
21983
+ * the `event-media` plane serves that key `immutable` with an ETag.
21984
+ *
21985
+ * **This is an INPUT field, so it does not reach the addon until the
21986
+ * next train** — the hub router validates cap inputs against its own
21987
+ * compiled Zod and strips a key it does not know. Until then the
21988
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
21989
+ * is what ships, and the opt-in becomes reachable when the train lands.
21990
+ */
21991
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21859
21992
  kind: "mutation",
21860
21993
  auth: "admin"
21861
21994
  }), method(object({
@@ -24066,7 +24199,13 @@ method(object({
24066
24199
  }), method(object({ plateId: string() }), _void(), {
24067
24200
  kind: "mutation",
24068
24201
  auth: "admin"
24069
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24202
+ }), method(object({
24203
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24204
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24205
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24206
+ * INPUT field: stripped by the hub router until the train ships, which
24207
+ * resolves to `false` and is exactly the intended default. */
24208
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24070
24209
  kind: "mutation",
24071
24210
  auth: "admin"
24072
24211
  }), method(object({
@@ -29443,6 +29582,12 @@ Object.freeze({
29443
29582
  addonId: null,
29444
29583
  access: "create"
29445
29584
  },
29585
+ "pipelineAnalytics.cancelRelocateMedia": {
29586
+ capName: "pipeline-analytics",
29587
+ capScope: "device",
29588
+ addonId: null,
29589
+ access: "create"
29590
+ },
29446
29591
  "pipelineAnalytics.cancelStorageMigrationMove": {
29447
29592
  capName: "pipeline-analytics",
29448
29593
  capScope: "device",
@@ -29617,6 +29762,12 @@ Object.freeze({
29617
29762
  addonId: null,
29618
29763
  access: "view"
29619
29764
  },
29765
+ "pipelineAnalytics.listRelocateMediaJobs": {
29766
+ capName: "pipeline-analytics",
29767
+ capScope: "device",
29768
+ addonId: null,
29769
+ access: "view"
29770
+ },
29620
29771
  "pipelineAnalytics.listRetrainAnnotations": {
29621
29772
  capName: "pipeline-analytics",
29622
29773
  capScope: "device",
@@ -29695,6 +29846,12 @@ Object.freeze({
29695
29846
  addonId: null,
29696
29847
  access: "create"
29697
29848
  },
29849
+ "pipelineAnalytics.relocateMedia": {
29850
+ capName: "pipeline-analytics",
29851
+ capScope: "device",
29852
+ addonId: null,
29853
+ access: "create"
29854
+ },
29698
29855
  "pipelineAnalytics.restageRetrainTrack": {
29699
29856
  capName: "pipeline-analytics",
29700
29857
  capScope: "device",
@@ -34318,7 +34475,7 @@ var AdminUIAddon = class extends BaseAddon {
34318
34475
  capability: adminUiCapability,
34319
34476
  provider: {
34320
34477
  getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
34321
- getVersion: async () => ({ version: "1.2.98" })
34478
+ getVersion: async () => ({ version: "1.2.100" })
34322
34479
  }
34323
34480
  }];
34324
34481
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-admin-ui",
3
- "version": "1.2.98",
3
+ "version": "1.2.100",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Admin UI — Vite frontend build and server-side addon",