@camstack/addon-osd-manager 0.1.40 → 0.1.42

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 (18) hide show
  1. package/dist/{MotionZonesSettings-BTOqeXRd.mjs → MotionZonesSettings-CdyvFlWR.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-BgmE0tQu.mjs → PrivacyMaskSettings-CUfurhy1.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-D4oig7v9.mjs → SceneMonitorEditor-E_PU8Px7.mjs} +3 -3
  4. package/dist/_stub.js +2208 -2209
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C4iHNnmw.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BmuIjiOx.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BI_yNGG4.mjs +26 -0
  7. package/dist/{hostInit-DzLQY4CO.mjs → hostInit-Bf1t6pHC.mjs} +3 -3
  8. package/dist/index.js +359 -1
  9. package/dist/index.mjs +359 -1
  10. package/dist/{player-overlays-DaucHym7.mjs → player-overlays-9-h959au.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-DC2YNF2r.mjs → responsive-DuPMoboD.mjs} +1 -1
  13. package/dist/{square-DuMw_5RG.mjs → square-CbixHwGb.mjs} +1 -1
  14. package/dist/{trash-2-C54qifas.mjs → trash-2---I9LVPc.mjs} +1 -1
  15. package/dist/{use-device-snapshot-BVTu9rWV.mjs → use-device-snapshot-DtmjvvAg.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-B-XuFKdU.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-B5mIR9KJ.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Blhr4EyN.mjs +0 -26
package/dist/index.mjs CHANGED
@@ -8113,6 +8113,20 @@ var RelocateJobSchema = object({
8113
8113
  * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
8114
8114
  */
8115
8115
  rowsReconciled: number().int().nonnegative().optional(),
8116
+ /**
8117
+ * Rows this run FORGOT because the file they name is not on disk.
8118
+ *
8119
+ * The mover derived the path from the row's own fields and `stat`ed it; an
8120
+ * ENOENT there is a per-path confirmation that the segment is gone (D296),
8121
+ * and the durable row is dropped through the same channel eviction uses. It
8122
+ * is reported for the same reason `rowsReconciled` is: this is a durable
8123
+ * mutation nobody asked for, and a migration that quietly erases hour rows is
8124
+ * the same failure as one that quietly skips them (D295).
8125
+ *
8126
+ * The production drain of 2026-08-30 would have reported 11 074 here — the
8127
+ * ledger claimed 5.65 GB of footage that no longer existed.
8128
+ */
8129
+ rowsForgotten: number().int().nonnegative().optional(),
8116
8130
  startedAt: number(),
8117
8131
  finishedAt: number().nullable(),
8118
8132
  error: string().nullable()
@@ -8476,6 +8490,91 @@ var RelocateResidueSchema = object({
8476
8490
  segments: number().int().nonnegative(),
8477
8491
  bytes: number().int().nonnegative()
8478
8492
  }).nullable();
8493
+ /**
8494
+ * Ask one location whether its durable hour rows describe the disk — the walk
8495
+ * (D319).
8496
+ *
8497
+ * `apply` DEFAULTS TO FALSE and that default is the product: the operator's
8498
+ * missing tool is the question, and the dry run is how they sanity-check the
8499
+ * destructive run before authorising it.
8500
+ */
8501
+ var LedgerWalkInputSchema = object({
8502
+ locationId: string().min(1),
8503
+ /** Forget the confirmed-absent rows, rather than only counting them. */
8504
+ apply: boolean().optional(),
8505
+ /** Narrow to one camera. */
8506
+ deviceId: number().int().positive().optional(),
8507
+ /** Narrow to these recording profiles; empty/absent = every profile. */
8508
+ profiles: array(string().min(1)).optional()
8509
+ });
8510
+ /** Why a whole walk did nothing. Every one leaves the ledger untouched. */
8511
+ var LedgerWalkRefusalSchema = _enum([
8512
+ "location-unknown",
8513
+ "source-writable",
8514
+ "no-ledger",
8515
+ "archive-unreadable",
8516
+ "anchor-absent",
8517
+ "anchor-unreadable",
8518
+ "anchor-moved"
8519
+ ]);
8520
+ _enum([
8521
+ "live-tail",
8522
+ "listing-error",
8523
+ "path-mismatch",
8524
+ "durable-refused"
8525
+ ]);
8526
+ /** Every skip reason, always present, always a number — so a reason that never
8527
+ * fired reports as zero rather than absent and the report shape is constant
8528
+ * between passes. Spelled out rather than `z.record` for exactly that. */
8529
+ var LedgerWalkSkipCountsSchema = object({
8530
+ "live-tail": number().int().nonnegative(),
8531
+ "listing-error": number().int().nonnegative(),
8532
+ "path-mismatch": number().int().nonnegative(),
8533
+ "durable-refused": number().int().nonnegative()
8534
+ });
8535
+ /** One camera's share of a walk, so a report names cameras and not rows. */
8536
+ var LedgerWalkDeviceReportSchema = object({
8537
+ deviceId: number().int(),
8538
+ hoursWalked: number().int().nonnegative(),
8539
+ hoursMissing: number().int().nonnegative(),
8540
+ ghostSegments: number().int().nonnegative(),
8541
+ ghostBytes: number().int().nonnegative(),
8542
+ forgottenSegments: number().int().nonnegative(),
8543
+ orphanFiles: number().int().nonnegative()
8544
+ });
8545
+ /**
8546
+ * What one walk claimed, listed, found and (only when armed) forgot.
8547
+ *
8548
+ * `archiveSegments` is the **M** and `segmentsClaimed` the **N** (D295), so a
8549
+ * walk that saw a fraction of the location is visible in its own report rather
8550
+ * than in the absence of one.
8551
+ */
8552
+ var LedgerWalkReportSchema = object({
8553
+ locationId: string(),
8554
+ applied: boolean(),
8555
+ refused: LedgerWalkRefusalSchema.nullable(),
8556
+ archiveSegments: number().int().nonnegative().nullable(),
8557
+ archiveBytes: number().int().nonnegative().nullable(),
8558
+ hoursClaimed: number().int().nonnegative(),
8559
+ hoursWalked: number().int().nonnegative(),
8560
+ hoursMissing: number().int().nonnegative(),
8561
+ /** `readdir` calls issued — the cost, stated in the unit that is paid. */
8562
+ listings: number().int().nonnegative(),
8563
+ segmentsClaimed: number().int().nonnegative(),
8564
+ ghostSegments: number().int().nonnegative(),
8565
+ ghostBytes: number().int().nonnegative(),
8566
+ ghostHoursWhole: number().int().nonnegative(),
8567
+ forgottenSegments: number().int().nonnegative(),
8568
+ forgottenBytes: number().int().nonnegative(),
8569
+ /** Files under a claimed hour that no durable row names. Never deleted. */
8570
+ orphanFiles: number().int().nonnegative(),
8571
+ orphanSample: array(string()).readonly(),
8572
+ hoursSkipped: number().int().nonnegative(),
8573
+ skippedByReason: LedgerWalkSkipCountsSchema,
8574
+ /** The walk stopped at its per-pass hour bound with claims unwalked. */
8575
+ bounded: boolean(),
8576
+ byDevice: array(LedgerWalkDeviceReportSchema).readonly()
8577
+ });
8479
8578
  /** How many rows a media pass would still act on against a given target — the
8480
8579
  * media lane's denominator AND its residue, from ONE derivation so the two can
8481
8580
  * never disagree. `null` = the count could not be taken. */
@@ -21612,13 +21711,15 @@ var ListGroupsPageSchema = object({
21612
21711
  groups: array(AnalyticsGroupRecordSchema).readonly(),
21613
21712
  nextCursor: string().nullable()
21614
21713
  });
21714
+ var KEY_EVENTS_DEFAULT_LIMIT = 50;
21715
+ var KEY_EVENTS_MAX_LIMIT = 200;
21615
21716
  var KeyEventQueryInput = object({
21616
21717
  deviceId: number(),
21617
21718
  /** Window lower bound (track firstSeen ≥ since). */
21618
21719
  since: number(),
21619
21720
  /** Window upper bound (track firstSeen ≤ until). */
21620
21721
  until: number(),
21621
- limit: number().int().min(1).max(200).default(50),
21722
+ limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
21622
21723
  /** Drop tracks scoring below this importance. */
21623
21724
  minImportance: number().min(0).max(1).optional(),
21624
21725
  /** Restrict to a single class (e.g. 'person'). */
@@ -21640,6 +21741,32 @@ var KeyEventSchema = object({
21640
21741
  ...TrackFlagFields,
21641
21742
  ...TrackRetrainFields
21642
21743
  });
21744
+ /** `getKeyEvents`' window and filters, asked of a SET of cameras at once. */
21745
+ var KeyEventBatchQueryInput = object({
21746
+ deviceIds: array(number()).min(1).max(200),
21747
+ since: number(),
21748
+ until: number(),
21749
+ /** Applied PER CAMERA, exactly as `getKeyEvents.limit` is — never a total
21750
+ * across the set, which would let a busy camera starve a quiet one of its
21751
+ * rows and change what the merged feed contains. */
21752
+ limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
21753
+ minImportance: number().min(0).max(1).optional(),
21754
+ classFilter: string().optional()
21755
+ });
21756
+ /**
21757
+ * One camera's key events in a batch answer.
21758
+ *
21759
+ * The row exists for every requested id. `getKeyEvents` degrades to `[]` on
21760
+ * error rather than throwing, so a camera whose store read failed and one with
21761
+ * no events in the window were ALREADY indistinguishable per camera — the
21762
+ * batch does not make that worse, and the row keeps the deviceId the single
21763
+ * method's output never carried (the caller used to stamp it from the fan-out
21764
+ * key, which only worked because there was one query per camera).
21765
+ */
21766
+ var KeyEventsForDeviceSchema = object({
21767
+ deviceId: number(),
21768
+ events: array(KeyEventSchema).readonly()
21769
+ });
21643
21770
  object({
21644
21771
  trackId: string(),
21645
21772
  className: string(),
@@ -21711,6 +21838,50 @@ var EventStoreFootprintSchema = object({
21711
21838
  totalBytes: number().int(),
21712
21839
  devices: array(EventStoreDeviceFootprintSchema).readonly()
21713
21840
  });
21841
+ /** Event-media footprint for one {@link MediaFileKind}. */
21842
+ var EventMediaKindFootprintSchema = object({
21843
+ kind: MediaFileKindEnum,
21844
+ /** Media rows of this kind. */
21845
+ rows: number().int(),
21846
+ /** Bytes on disk held by those rows. */
21847
+ bytes: number().int()
21848
+ });
21849
+ /**
21850
+ * The media footprint broken down by KIND — the axis a deletion decision
21851
+ * actually turns on.
21852
+ *
21853
+ * A byte total says how much there is; it cannot say what is safe to remove.
21854
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
21855
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
21856
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
21857
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
21858
+ * nothing else, so sizing a deletion means summing per kind.
21859
+ *
21860
+ * ## Why `unaccounted*` exists
21861
+ *
21862
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
21863
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
21864
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
21865
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
21866
+ * retired code path, or by a version that knew a kind this one does not) would
21867
+ * otherwise vanish from the total silently, and an operator would delete
21868
+ * against a denominator smaller than the disk.
21869
+ *
21870
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
21871
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
21872
+ */
21873
+ var EventMediaKindBreakdownSchema = object({
21874
+ /** Every media row in scope, from one unfiltered aggregate. */
21875
+ totalRows: number().int(),
21876
+ /** Every media byte in scope, from that same aggregate. */
21877
+ totalBytes: number().int(),
21878
+ /** Per-kind footprint, ordered by bytes descending. */
21879
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
21880
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
21881
+ unaccountedRows: number().int(),
21882
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
21883
+ unaccountedBytes: number().int()
21884
+ });
21714
21885
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
21715
21886
  var EventPruneCountsSchema = object({
21716
21887
  motion: number().int(),
@@ -21944,6 +22115,21 @@ var pipelineAnalyticsCapability = {
21944
22115
  * scored on-read (no write). Degrades to `[]` on error.
21945
22116
  */
21946
22117
  getKeyEvents: method(KeyEventQueryInput, array(KeyEventSchema).readonly()),
22118
+ /**
22119
+ * The same ranking, for a SET of cameras, in one round trip.
22120
+ *
22121
+ * The Detection Intelligence events feed asks this of every selected
22122
+ * camera and re-asks on a 30s timer. Fanned out client-side that is N
22123
+ * round trips — browser → hub → post-analysis — for N independent,
22124
+ * already-indexed store queries. Batched, the queries are unchanged and
22125
+ * run concurrently INSIDE the owner; only the transport collapses.
22126
+ *
22127
+ * Deliberately per-device rather than pre-merged: `limit` stays per
22128
+ * camera (a total would let a busy camera starve a quiet one), and a
22129
+ * caller that renders one camera's lane needs to know which camera a row
22130
+ * came from. `getKeyEvents` stays for single-device callers.
22131
+ */
22132
+ getKeyEventsBatch: method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()),
21947
22133
  /** Server-side bucketed event counts for the 24-hour timeline.
21948
22134
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
21949
22135
  getEventDensity: method(object({
@@ -22092,6 +22278,22 @@ var pipelineAnalyticsCapability = {
22092
22278
  auth: "admin"
22093
22279
  }),
22094
22280
  /**
22281
+ * The same media footprint, broken down by {@link MediaFileKind} instead of
22282
+ * by camera — fleet-wide, or for one camera with `deviceId`.
22283
+ *
22284
+ * Separate from {@link getEventStoreFootprint} rather than a field on it:
22285
+ * the two answer different questions on different axes, the per-camera one
22286
+ * is what the management table renders on every open, and nothing should
22287
+ * pay for a per-kind pass to draw it. See
22288
+ * {@link EventMediaKindBreakdownSchema} for why `unaccounted*` exists —
22289
+ * `kinds` is enumerated, `totalBytes` is not, and the gap must be visible
22290
+ * to anyone sizing a deletion against it.
22291
+ */
22292
+ getEventMediaFootprintByKind: method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
22293
+ kind: "query",
22294
+ auth: "admin"
22295
+ }),
22296
+ /**
22095
22297
  * Cluster-wide prune of events older than `olderThanMs` (exclusive) across
22096
22298
  * every camera, deleting each event's media in lockstep. Logged to the
22097
22299
  * events ops-log with `reason` (default `'retention'`). Returns the summed
@@ -25037,6 +25239,20 @@ var storageCapability = {
25037
25239
  listProviders: method(_void(), array(ProviderListEntrySchema).readonly()),
25038
25240
  testConfig: method(object({
25039
25241
  providerId: string(),
25242
+ /**
25243
+ * The location this config is an UNSAVED edit of, when there is one.
25244
+ *
25245
+ * `listLocations` replaces every declared secret with the redaction
25246
+ * sentinel, so the edit modal's form state holds the sentinel for any
25247
+ * credential the operator did not retype — and posting that here
25248
+ * without a way to resolve it makes the provider try to authenticate
25249
+ * as `__camstack_redacted__` and report the operator's own working
25250
+ * password as wrong. Given this id, the orchestrator restores each
25251
+ * sentinel from the stored config (same rule as `upsertLocation`)
25252
+ * before dispatching. Omitted by the "Add location" wizard, where
25253
+ * every value was typed just now and nothing is stored yet.
25254
+ */
25255
+ locationId: string().optional(),
25040
25256
  config: record(string(), unknown())
25041
25257
  }), object({
25042
25258
  ok: boolean(),
@@ -33618,6 +33834,23 @@ var recordingCapability = {
33618
33834
  kind: "query",
33619
33835
  auth: "admin"
33620
33836
  }),
33837
+ /**
33838
+ * Does this location's LEDGER tell the truth about its disk? (D319)
33839
+ *
33840
+ * One `readdir` per claimed hour, diffed both ways: durable rows whose file
33841
+ * is not there, and files no durable row names. `apply` defaults to FALSE —
33842
+ * the report is the product, and the dry run is how an operator
33843
+ * sanity-checks the destructive run before authorising it.
33844
+ *
33845
+ * REFUSES a source that is still a write target: a listing of a live
33846
+ * location is a lower bound, which is not the strong evidence that lets
33847
+ * this pass forget without a budget. A live location is reconciled by the
33848
+ * mover, under D318's bound.
33849
+ */
33850
+ reconcileLedgerAgainstDisk: method(LedgerWalkInputSchema, LedgerWalkReportSchema, {
33851
+ kind: "mutation",
33852
+ auth: "admin"
33853
+ }),
33621
33854
  /** Cancel a running or queued relocate job. A queued job never runs. */
33622
33855
  cancelRelocateJob: method(object({ jobId: string() }), object({ cancelled: boolean() }), {
33623
33856
  kind: "mutation",
@@ -34052,6 +34285,25 @@ var SceneMonitorStatusSchema = object({
34052
34285
  monitors: array(SceneMonitorSchema),
34053
34286
  lastFetchedAt: number()
34054
34287
  });
34288
+ /**
34289
+ * One camera's row in a `listScenesBatch` answer.
34290
+ *
34291
+ * `status` is NULLABLE and the nullability is the whole point. `scene-monitor`
34292
+ * is a `defaultActive` wrapper, so every camera is asked; a camera whose
34293
+ * provider is absent (pipeline-analytics not deployed, the post-processing node
34294
+ * down) cannot answer, and that is not the same fact as a camera with no scenes
34295
+ * configured. Fanned out per camera the difference was visible — one query
34296
+ * errored while the others resolved — and a batch that returned only the rows
34297
+ * it managed would have destroyed it, silently, by making an unreachable camera
34298
+ * indistinguishable from one that answered `monitors: []`.
34299
+ *
34300
+ * So: EVERY requested deviceId gets a row. `status: null` means "this camera
34301
+ * could not be read"; `status.monitors: []` means "read, and it has none".
34302
+ */
34303
+ var SceneMonitorStatusForDeviceSchema = object({
34304
+ deviceId: number(),
34305
+ status: SceneMonitorStatusSchema.nullable()
34306
+ });
34055
34307
  var sceneMonitorCapability = {
34056
34308
  name: "scene-monitor",
34057
34309
  scope: "device",
@@ -34061,6 +34313,22 @@ var sceneMonitorCapability = {
34061
34313
  deviceTypes: [DeviceType.Camera],
34062
34314
  methods: {
34063
34315
  listScenes: method(object({ deviceId: number() }), SceneMonitorStatusSchema),
34316
+ /**
34317
+ * The same answer, for a SET of cameras, in one round trip.
34318
+ *
34319
+ * `/scenes` renders every camera and re-reads them on a 30s safety-net
34320
+ * poll behind the push slice. Fanned out client-side that was one query
34321
+ * per camera — 29 round trips through the browser, the hub and the
34322
+ * post-analysis runner every 30 seconds to read an in-memory map the
34323
+ * owner had already merged. The work is unchanged (`statusFor` per
34324
+ * device, all in-process at the owner); what collapses is the transport.
34325
+ *
34326
+ * A camera that cannot answer still gets a row, with `status: null` —
34327
+ * see {@link SceneMonitorStatusForDeviceSchema}. Never fewer rows than
34328
+ * ids: a caller that asked for twenty-nine and got twenty-seven cannot
34329
+ * tell which two are missing, or that any are.
34330
+ */
34331
+ listScenesBatch: method(object({ deviceIds: array(number()).min(1).max(200) }), array(SceneMonitorStatusForDeviceSchema).readonly()),
34064
34332
  createScene: method(object({
34065
34333
  deviceId: number(),
34066
34334
  label: string(),
@@ -36047,6 +36315,27 @@ var CameraOccupancySnapshotSchema = object({
36047
36315
  stationaryObjects: array(StationaryObjectSchema).readonly().optional()
36048
36316
  });
36049
36317
  /**
36318
+ * One camera's row in a `getCurrentSnapshotBatch` answer.
36319
+ *
36320
+ * THREE outcomes, and the single-camera method could only express two of them
36321
+ * because `snapshot: null` was already spoken for:
36322
+ *
36323
+ * - `read: 'read'`, `snapshot` present — the live occupancy reading.
36324
+ * - `read: 'read'`, `snapshot: null` — read, and this camera has no reading
36325
+ * yet: no frame since boot, and no parked-object registry to hydrate from.
36326
+ * - `read: 'unreadable'` — the owner could not answer for this
36327
+ * camera. `snapshot` is null, and it does NOT mean "nothing parked here".
36328
+ *
36329
+ * Collapsing the last two is the failure this field exists to prevent: a
36330
+ * hydration that threw would otherwise render as an empty Stationary section,
36331
+ * which is a definite claim about a camera nobody could read.
36332
+ */
36333
+ var CameraOccupancySnapshotForDeviceSchema = object({
36334
+ deviceId: number(),
36335
+ read: _enum(["read", "unreadable"]),
36336
+ snapshot: CameraOccupancySnapshotSchema.nullable()
36337
+ });
36338
+ /**
36050
36339
  * Time-series resolution. The history methods return one bucket per
36051
36340
  * step over the requested range. Smaller resolutions cost more
36052
36341
  * memory + bandwidth; bound to discrete steps so caller cannot ask
@@ -36103,6 +36392,20 @@ var zoneAnalyticsCapability = {
36103
36392
  * (no inference result emitted since boot or since binding was
36104
36393
  * activated). */
36105
36394
  getCurrentSnapshot: method(object({ deviceId: number() }), CameraOccupancySnapshotSchema.nullable()),
36395
+ /**
36396
+ * The same snapshot, for a SET of cameras, in one round trip.
36397
+ *
36398
+ * The Events page's Stationary section polls this every 15s for every
36399
+ * selected camera. Fanned out client-side that is one query per camera to
36400
+ * read a `Map.get` at the owner — the answer costs nothing, the round trip
36401
+ * costs everything. Batched, N transports become one and the per-device
36402
+ * work is unchanged.
36403
+ *
36404
+ * Every requested deviceId gets a row, tagged `read` — see
36405
+ * {@link CameraOccupancySnapshotForDeviceSchema}. A camera the owner could
36406
+ * not answer for is `'unreadable'`, never an empty reading.
36407
+ */
36408
+ getCurrentSnapshotBatch: method(object({ deviceIds: array(number()).min(1).max(200) }), array(CameraOccupancySnapshotForDeviceSchema).readonly()),
36106
36409
  /** Time-series object count inside one zone. `className` optional —
36107
36410
  * omit to count every class in the zone. */
36108
36411
  getZoneHistory: method(object({
@@ -39680,6 +39983,12 @@ Object.freeze({
39680
39983
  addonId: null,
39681
39984
  access: "view"
39682
39985
  },
39986
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
39987
+ capName: "pipeline-analytics",
39988
+ capScope: "device",
39989
+ addonId: null,
39990
+ access: "view"
39991
+ },
39683
39992
  "pipelineAnalytics.getEventStoreFootprint": {
39684
39993
  capName: "pipeline-analytics",
39685
39994
  capScope: "device",
@@ -39698,6 +40007,12 @@ Object.freeze({
39698
40007
  addonId: null,
39699
40008
  access: "view"
39700
40009
  },
40010
+ "pipelineAnalytics.getKeyEventsBatch": {
40011
+ capName: "pipeline-analytics",
40012
+ capScope: "device",
40013
+ addonId: null,
40014
+ access: "view"
40015
+ },
39701
40016
  "pipelineAnalytics.getMotionEvents": {
39702
40017
  capName: "pipeline-analytics",
39703
40018
  capScope: "device",
@@ -40874,6 +41189,12 @@ Object.freeze({
40874
41189
  addonId: null,
40875
41190
  access: "view"
40876
41191
  },
41192
+ "recording.reconcileLedgerAgainstDisk": {
41193
+ capName: "recording",
41194
+ capScope: "system",
41195
+ addonId: null,
41196
+ access: "create"
41197
+ },
40877
41198
  "recording.refreshStorageLocationsForMigration": {
40878
41199
  capName: "recording",
40879
41200
  capScope: "system",
@@ -41000,6 +41321,12 @@ Object.freeze({
41000
41321
  addonId: null,
41001
41322
  access: "view"
41002
41323
  },
41324
+ "sceneMonitor.listScenesBatch": {
41325
+ capName: "scene-monitor",
41326
+ capScope: "device",
41327
+ addonId: null,
41328
+ access: "view"
41329
+ },
41003
41330
  "sceneMonitor.recheckNow": {
41004
41331
  capName: "scene-monitor",
41005
41332
  capScope: "device",
@@ -42356,6 +42683,12 @@ Object.freeze({
42356
42683
  addonId: null,
42357
42684
  access: "view"
42358
42685
  },
42686
+ "zoneAnalytics.getCurrentSnapshotBatch": {
42687
+ capName: "zone-analytics",
42688
+ capScope: "device",
42689
+ addonId: null,
42690
+ access: "view"
42691
+ },
42359
42692
  "zoneAnalytics.getUnzonedHistory": {
42360
42693
  capName: "zone-analytics",
42361
42694
  capScope: "device",
@@ -43345,6 +43678,11 @@ Object.freeze({
43345
43678
  form: "single",
43346
43679
  optional: false
43347
43680
  }],
43681
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
43682
+ name: "deviceId",
43683
+ form: "single",
43684
+ optional: true
43685
+ }],
43348
43686
  "pipelineAnalytics.getGroup": [{
43349
43687
  name: "deviceId",
43350
43688
  form: "single",
@@ -43355,6 +43693,11 @@ Object.freeze({
43355
43693
  form: "single",
43356
43694
  optional: false
43357
43695
  }],
43696
+ "pipelineAnalytics.getKeyEventsBatch": [{
43697
+ name: "deviceIds",
43698
+ form: "array",
43699
+ optional: false
43700
+ }],
43358
43701
  "pipelineAnalytics.getMotionEvents": [{
43359
43702
  name: "deviceId",
43360
43703
  form: "single",
@@ -43795,6 +44138,11 @@ Object.freeze({
43795
44138
  form: "single",
43796
44139
  optional: false
43797
44140
  }],
44141
+ "recording.reconcileLedgerAgainstDisk": [{
44142
+ name: "deviceId",
44143
+ form: "single",
44144
+ optional: true
44145
+ }],
43798
44146
  "recording.relocateFootage": [{
43799
44147
  name: "deviceId",
43800
44148
  form: "single",
@@ -43860,6 +44208,11 @@ Object.freeze({
43860
44208
  form: "single",
43861
44209
  optional: false
43862
44210
  }],
44211
+ "sceneMonitor.listScenesBatch": [{
44212
+ name: "deviceIds",
44213
+ form: "array",
44214
+ optional: false
44215
+ }],
43863
44216
  "sceneMonitor.recheckNow": [{
43864
44217
  name: "deviceId",
43865
44218
  form: "single",
@@ -44121,6 +44474,11 @@ Object.freeze({
44121
44474
  form: "single",
44122
44475
  optional: false
44123
44476
  }],
44477
+ "zoneAnalytics.getCurrentSnapshotBatch": [{
44478
+ name: "deviceIds",
44479
+ form: "array",
44480
+ optional: false
44481
+ }],
44124
44482
  "zoneAnalytics.getUnzonedHistory": [{
44125
44483
  name: "deviceId",
44126
44484
  form: "single",
@@ -1,5 +1,5 @@
1
1
  import { h as e, l as t, u as n, y as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
- import { o as i, s as a } from "./responsive-DC2YNF2r.mjs";
2
+ import { o as i, s as a } from "./responsive-DuPMoboD.mjs";
3
3
  import { n as o, r as s, t as c } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
4
4
  var l = a("chevron-down", [["path", {
5
5
  d: "m6 9 6 6 6-6",
@@ -1,2 +1,2 @@
1
- import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-B-XuFKdU.mjs";
1
+ import { n as e, t } from "./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_osd_manager_page__remoteEntry_js-B5mIR9KJ.mjs";
2
2
  export { t as get, e as init };
@@ -1,6 +1,6 @@
1
1
  import { c as e, g as t, h as n, l as r, n as i, p as a, r as o, t as s, u as c, y as l } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
2
  import "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-DalfdIDw.mjs";
3
- import { n as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Blhr4EyN.mjs";
3
+ import { n as u } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BI_yNGG4.mjs";
4
4
  //#region ../ui-library/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.js
5
5
  l();
6
6
  var d = (...e) => e.filter((e, t, n) => !!e && e.trim() !== "" && n.indexOf(e) === t).join(" ").trim(), f = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), p = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), m = (e) => {
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-DC2YNF2r.mjs";
1
+ import { s as e } from "./responsive-DuPMoboD.mjs";
2
2
  var t = e("eye-off", [
3
3
  ["path", {
4
4
  d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
@@ -1,4 +1,4 @@
1
- import { s as e } from "./responsive-DC2YNF2r.mjs";
1
+ import { s as e } from "./responsive-DuPMoboD.mjs";
2
2
  var t = e("trash-2", [
3
3
  ["path", {
4
4
  d: "M10 11v6",
@@ -1,5 +1,5 @@
1
1
  import { c as e, h as t, p as n, y as r } from "./_virtual_mf___mfe_internal__addon_osd_manager_page__loadShare__react__loadShare__.js-Bs1t18EM.mjs";
2
- import { s as i } from "./responsive-DC2YNF2r.mjs";
2
+ import { s as i } from "./responsive-DuPMoboD.mjs";
3
3
  var a = i("camera", [["path", {
4
4
  d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
5
5
  key: "18u6gg"
@@ -2753,7 +2753,7 @@ async function rr(e) {
2753
2753
  }
2754
2754
  }
2755
2755
  async function ir() {
2756
- return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-C4iHNnmw.mjs")).catch((e) => {
2756
+ return tr ||= rr(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_osd_manager_page-BmuIjiOx.mjs")).catch((e) => {
2757
2757
  throw tr = void 0, e;
2758
2758
  }), tr;
2759
2759
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-osd-manager",
3
- "version": "0.1.40",
3
+ "version": "0.1.42",
4
4
  "description": "Binds camera on-screen-display slots to live state and recognitions",
5
5
  "keywords": [
6
6
  "camstack",