@camstack/ui-library 1.2.198 → 1.2.200

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.
package/dist/index.cjs CHANGED
@@ -7178,12 +7178,6 @@ var useDoorbellApplyDeviceSettingsPatch = trpc.doorbell.applyDeviceSettingsPatch
7178
7178
  var useEnumSensorGetStatus = trpc.enumSensor.getStatus.useQuery;
7179
7179
  /** Generated alias around `trpc.eventEmitter.getStatus.useQuery`. */
7180
7180
  var useEventEmitterGetStatus = trpc.eventEmitter.getStatus.useQuery;
7181
- /** Generated alias around `trpc.events.getEvents.useQuery`. */
7182
- var useEventsGetEvents = trpc.events.getEvents.useQuery;
7183
- /** Generated alias around `trpc.events.getEventThumbnail.useQuery`. */
7184
- var useEventsGetEventThumbnail = trpc.events.getEventThumbnail.useQuery;
7185
- /** Generated alias around `trpc.events.getEventClipUrl.useQuery`. */
7186
- var useEventsGetEventClipUrl = trpc.events.getEventClipUrl.useQuery;
7187
7181
  /** Generated alias around `trpc.faceGallery.listIdentities.useQuery`. */
7188
7182
  var useFaceGalleryListIdentities = trpc.faceGallery.listIdentities.useQuery;
7189
7183
  /** Generated alias around `trpc.faceGallery.createIdentity.useMutation`. */
@@ -7588,6 +7582,10 @@ var useNotificationRulesSetDeviceMuted = trpc.notificationRules.setDeviceMuted.u
7588
7582
  var useNotificationRulesTestRule = trpc.notificationRules.testRule.useMutation;
7589
7583
  /** Generated alias around `trpc.notificationRules.getConditionCatalog.useQuery`. */
7590
7584
  var useNotificationRulesGetConditionCatalog = trpc.notificationRules.getConditionCatalog.useQuery;
7585
+ /** Generated alias around `trpc.notificationRules.getTemplateCatalog.useQuery`. */
7586
+ var useNotificationRulesGetTemplateCatalog = trpc.notificationRules.getTemplateCatalog.useQuery;
7587
+ /** Generated alias around `trpc.notificationRules.previewTemplate.useMutation`. */
7588
+ var useNotificationRulesPreviewTemplate = trpc.notificationRules.previewTemplate.useMutation;
7591
7589
  /** Generated alias around `trpc.notificationRules.getHistory.useQuery`. */
7592
7590
  var useNotificationRulesGetHistory = trpc.notificationRules.getHistory.useQuery;
7593
7591
  /** Generated alias around `trpc.notificationRules.resolveArtifactUrl.useQuery`. */
@@ -8092,80 +8090,84 @@ var usePtzAutotrackGetSettings = trpc.ptzAutotrack.getSettings.useQuery;
8092
8090
  var usePtzAutotrackSetSettings = trpc.ptzAutotrack.setSettings.useMutation;
8093
8091
  /** Generated alias around `trpc.reboot.reboot.useMutation`. */
8094
8092
  var useRebootReboot = trpc.reboot.reboot.useMutation;
8093
+ /** Generated alias around `trpc.recording.listSources.useQuery`. */
8094
+ var useRecordingListSources = trpc.recording.listSources.useQuery;
8095
8095
  /** Generated alias around `trpc.recording.getAvailability.useQuery`. */
8096
8096
  var useRecordingGetAvailability = trpc.recording.getAvailability.useQuery;
8097
- /** Generated alias around `trpc.recording.getAvailabilityBatch.useQuery`. */
8098
- var useRecordingGetAvailabilityBatch = trpc.recording.getAvailabilityBatch.useQuery;
8099
8097
  /** Generated alias around `trpc.recording.getDaysWithRecordings.useQuery`. */
8100
8098
  var useRecordingGetDaysWithRecordings = trpc.recording.getDaysWithRecordings.useQuery;
8101
- /** Generated alias around `trpc.recording.getDaysWithRecordingsBatch.useQuery`. */
8102
- var useRecordingGetDaysWithRecordingsBatch = trpc.recording.getDaysWithRecordingsBatch.useQuery;
8103
- /** Generated alias around `trpc.recording.getPlaybackManifest.useQuery`. */
8104
- var useRecordingGetPlaybackManifest = trpc.recording.getPlaybackManifest.useQuery;
8105
- /** Generated alias around `trpc.recording.getStorageUsage.useQuery`. */
8106
- var useRecordingGetStorageUsage = trpc.recording.getStorageUsage.useQuery;
8107
- /** Generated alias around `trpc.recording.getDeviceConfig.useQuery`. */
8108
- var useRecordingGetDeviceConfig = trpc.recording.getDeviceConfig.useQuery;
8109
- /** Generated alias around `trpc.recording.locateSegment.useQuery`. */
8110
- var useRecordingLocateSegment = trpc.recording.locateSegment.useQuery;
8111
- /** Generated alias around `trpc.recording.readSegmentBytes.useQuery`. */
8112
- var useRecordingReadSegmentBytes = trpc.recording.readSegmentBytes.useQuery;
8113
- /** Generated alias around `trpc.recording.readGopBytes.useQuery`. */
8114
- var useRecordingReadGopBytes = trpc.recording.readGopBytes.useQuery;
8115
- /** Generated alias around `trpc.recording.readWindowBytes.useQuery`. */
8116
- var useRecordingReadWindowBytes = trpc.recording.readWindowBytes.useQuery;
8117
- /** Generated alias around `trpc.recording.setDeviceConfig.useMutation`. */
8118
- var useRecordingSetDeviceConfig = trpc.recording.setDeviceConfig.useMutation;
8119
- /** Generated alias around `trpc.recording.rescanStorage.useMutation`. */
8120
- var useRecordingRescanStorage = trpc.recording.rescanStorage.useMutation;
8121
- /** Generated alias around `trpc.recording.pruneFootage.useMutation`. */
8122
- var useRecordingPruneFootage = trpc.recording.pruneFootage.useMutation;
8123
- /** Generated alias around `trpc.recording.deleteFootprint.useMutation`. */
8124
- var useRecordingDeleteFootprint = trpc.recording.deleteFootprint.useMutation;
8125
- /** Generated alias around `trpc.recording.listOpsLog.useQuery`. */
8126
- var useRecordingListOpsLog = trpc.recording.listOpsLog.useQuery;
8127
- /** Generated alias around `trpc.recording.renderGif.useMutation`. */
8128
- var useRecordingRenderGif = trpc.recording.renderGif.useMutation;
8129
- /** Generated alias around `trpc.recording.renderClip.useMutation`. */
8130
- var useRecordingRenderClip = trpc.recording.renderClip.useMutation;
8131
- /** Generated alias around `trpc.recording.pauseForStorageMigration.useMutation`. */
8132
- var useRecordingPauseForStorageMigration = trpc.recording.pauseForStorageMigration.useMutation;
8133
- /** Generated alias around `trpc.recording.resumeForStorageMigration.useMutation`. */
8134
- var useRecordingResumeForStorageMigration = trpc.recording.resumeForStorageMigration.useMutation;
8135
- /** Generated alias around `trpc.recording.refreshStorageLocationsForMigration.useMutation`. */
8136
- var useRecordingRefreshStorageLocationsForMigration = trpc.recording.refreshStorageLocationsForMigration.useMutation;
8137
- /** Generated alias around `trpc.recording.startStorageMigrationMove.useMutation`. */
8138
- var useRecordingStartStorageMigrationMove = trpc.recording.startStorageMigrationMove.useMutation;
8139
- /** Generated alias around `trpc.recording.getStorageMigrationMoveStatus.useQuery`. */
8140
- var useRecordingGetStorageMigrationMoveStatus = trpc.recording.getStorageMigrationMoveStatus.useQuery;
8141
- /** Generated alias around `trpc.recording.cancelStorageMigrationMove.useMutation`. */
8142
- var useRecordingCancelStorageMigrationMove = trpc.recording.cancelStorageMigrationMove.useMutation;
8143
- /** Generated alias around `trpc.recording.relocateFootage.useMutation`. */
8144
- var useRecordingRelocateFootage = trpc.recording.relocateFootage.useMutation;
8145
- /** Generated alias around `trpc.recording.listRelocateJobs.useQuery`. */
8146
- var useRecordingListRelocateJobs = trpc.recording.listRelocateJobs.useQuery;
8147
- /** Generated alias around `trpc.recording.getRelocateResidue.useQuery`. */
8148
- var useRecordingGetRelocateResidue = trpc.recording.getRelocateResidue.useQuery;
8149
- /** Generated alias around `trpc.recording.reconcileLedgerAgainstDisk.useMutation`. */
8150
- var useRecordingReconcileLedgerAgainstDisk = trpc.recording.reconcileLedgerAgainstDisk.useMutation;
8151
- /** Generated alias around `trpc.recording.cancelRelocateJob.useMutation`. */
8152
- var useRecordingCancelRelocateJob = trpc.recording.cancelRelocateJob.useMutation;
8153
- /** Generated alias around `trpc.recording.planStorageRebalance.useQuery`. */
8154
- var useRecordingPlanStorageRebalance = trpc.recording.planStorageRebalance.useQuery;
8155
- /** Generated alias around `trpc.recording.startStorageRebalance.useMutation`. */
8156
- var useRecordingStartStorageRebalance = trpc.recording.startStorageRebalance.useMutation;
8157
- /** Generated alias around `trpc.recording.getPlacement.useQuery`. */
8158
- var useRecordingGetPlacement = trpc.recording.getPlacement.useQuery;
8159
- /** Generated alias around `trpc.recording.setDevicePlacement.useMutation`. */
8160
- var useRecordingSetDevicePlacement = trpc.recording.setDevicePlacement.useMutation;
8161
- /** Generated alias around `trpc.recording.getStatus.useQuery`. */
8162
- var useRecordingGetStatus = trpc.recording.getStatus.useQuery;
8163
- /** Generated alias around `trpc.recording.getDeviceSettingsContribution.useQuery`. */
8164
- var useRecordingGetDeviceSettingsContribution = trpc.recording.getDeviceSettingsContribution.useQuery;
8165
- /** Generated alias around `trpc.recording.getDeviceLiveContribution.useQuery`. */
8166
- var useRecordingGetDeviceLiveContribution = trpc.recording.getDeviceLiveContribution.useQuery;
8167
- /** Generated alias around `trpc.recording.applyDeviceSettingsPatch.useMutation`. */
8168
- var useRecordingApplyDeviceSettingsPatch = trpc.recording.applyDeviceSettingsPatch.useMutation;
8099
+ /** Generated alias around `trpc.recording.getPlayback.useQuery`. */
8100
+ var useRecordingGetPlayback = trpc.recording.getPlayback.useQuery;
8101
+ /** Generated alias around `trpc.recording.getPlaybackOptions.useQuery`. */
8102
+ var useRecordingGetPlaybackOptions = trpc.recording.getPlaybackOptions.useQuery;
8103
+ /** Generated alias around `trpc.recordingArchive.getAvailabilityBatch.useQuery`. */
8104
+ var useRecordingArchiveGetAvailabilityBatch = trpc.recordingArchive.getAvailabilityBatch.useQuery;
8105
+ /** Generated alias around `trpc.recordingArchive.getDaysWithRecordingsBatch.useQuery`. */
8106
+ var useRecordingArchiveGetDaysWithRecordingsBatch = trpc.recordingArchive.getDaysWithRecordingsBatch.useQuery;
8107
+ /** Generated alias around `trpc.recordingArchive.getStorageUsage.useQuery`. */
8108
+ var useRecordingArchiveGetStorageUsage = trpc.recordingArchive.getStorageUsage.useQuery;
8109
+ /** Generated alias around `trpc.recordingArchive.getDeviceConfig.useQuery`. */
8110
+ var useRecordingArchiveGetDeviceConfig = trpc.recordingArchive.getDeviceConfig.useQuery;
8111
+ /** Generated alias around `trpc.recordingArchive.locateSegment.useQuery`. */
8112
+ var useRecordingArchiveLocateSegment = trpc.recordingArchive.locateSegment.useQuery;
8113
+ /** Generated alias around `trpc.recordingArchive.readSegmentBytes.useQuery`. */
8114
+ var useRecordingArchiveReadSegmentBytes = trpc.recordingArchive.readSegmentBytes.useQuery;
8115
+ /** Generated alias around `trpc.recordingArchive.readGopBytes.useQuery`. */
8116
+ var useRecordingArchiveReadGopBytes = trpc.recordingArchive.readGopBytes.useQuery;
8117
+ /** Generated alias around `trpc.recordingArchive.readWindowBytes.useQuery`. */
8118
+ var useRecordingArchiveReadWindowBytes = trpc.recordingArchive.readWindowBytes.useQuery;
8119
+ /** Generated alias around `trpc.recordingArchive.setDeviceConfig.useMutation`. */
8120
+ var useRecordingArchiveSetDeviceConfig = trpc.recordingArchive.setDeviceConfig.useMutation;
8121
+ /** Generated alias around `trpc.recordingArchive.rescanStorage.useMutation`. */
8122
+ var useRecordingArchiveRescanStorage = trpc.recordingArchive.rescanStorage.useMutation;
8123
+ /** Generated alias around `trpc.recordingArchive.pruneFootage.useMutation`. */
8124
+ var useRecordingArchivePruneFootage = trpc.recordingArchive.pruneFootage.useMutation;
8125
+ /** Generated alias around `trpc.recordingArchive.deleteFootprint.useMutation`. */
8126
+ var useRecordingArchiveDeleteFootprint = trpc.recordingArchive.deleteFootprint.useMutation;
8127
+ /** Generated alias around `trpc.recordingArchive.listOpsLog.useQuery`. */
8128
+ var useRecordingArchiveListOpsLog = trpc.recordingArchive.listOpsLog.useQuery;
8129
+ /** Generated alias around `trpc.recordingArchive.renderGif.useMutation`. */
8130
+ var useRecordingArchiveRenderGif = trpc.recordingArchive.renderGif.useMutation;
8131
+ /** Generated alias around `trpc.recordingArchive.renderClip.useMutation`. */
8132
+ var useRecordingArchiveRenderClip = trpc.recordingArchive.renderClip.useMutation;
8133
+ /** Generated alias around `trpc.recordingArchive.pauseForStorageMigration.useMutation`. */
8134
+ var useRecordingArchivePauseForStorageMigration = trpc.recordingArchive.pauseForStorageMigration.useMutation;
8135
+ /** Generated alias around `trpc.recordingArchive.resumeForStorageMigration.useMutation`. */
8136
+ var useRecordingArchiveResumeForStorageMigration = trpc.recordingArchive.resumeForStorageMigration.useMutation;
8137
+ /** Generated alias around `trpc.recordingArchive.refreshStorageLocationsForMigration.useMutation`. */
8138
+ var useRecordingArchiveRefreshStorageLocationsForMigration = trpc.recordingArchive.refreshStorageLocationsForMigration.useMutation;
8139
+ /** Generated alias around `trpc.recordingArchive.startStorageMigrationMove.useMutation`. */
8140
+ var useRecordingArchiveStartStorageMigrationMove = trpc.recordingArchive.startStorageMigrationMove.useMutation;
8141
+ /** Generated alias around `trpc.recordingArchive.getStorageMigrationMoveStatus.useQuery`. */
8142
+ var useRecordingArchiveGetStorageMigrationMoveStatus = trpc.recordingArchive.getStorageMigrationMoveStatus.useQuery;
8143
+ /** Generated alias around `trpc.recordingArchive.cancelStorageMigrationMove.useMutation`. */
8144
+ var useRecordingArchiveCancelStorageMigrationMove = trpc.recordingArchive.cancelStorageMigrationMove.useMutation;
8145
+ /** Generated alias around `trpc.recordingArchive.relocateFootage.useMutation`. */
8146
+ var useRecordingArchiveRelocateFootage = trpc.recordingArchive.relocateFootage.useMutation;
8147
+ /** Generated alias around `trpc.recordingArchive.listRelocateJobs.useQuery`. */
8148
+ var useRecordingArchiveListRelocateJobs = trpc.recordingArchive.listRelocateJobs.useQuery;
8149
+ /** Generated alias around `trpc.recordingArchive.getRelocateResidue.useQuery`. */
8150
+ var useRecordingArchiveGetRelocateResidue = trpc.recordingArchive.getRelocateResidue.useQuery;
8151
+ /** Generated alias around `trpc.recordingArchive.reconcileLedgerAgainstDisk.useMutation`. */
8152
+ var useRecordingArchiveReconcileLedgerAgainstDisk = trpc.recordingArchive.reconcileLedgerAgainstDisk.useMutation;
8153
+ /** Generated alias around `trpc.recordingArchive.cancelRelocateJob.useMutation`. */
8154
+ var useRecordingArchiveCancelRelocateJob = trpc.recordingArchive.cancelRelocateJob.useMutation;
8155
+ /** Generated alias around `trpc.recordingArchive.planStorageRebalance.useQuery`. */
8156
+ var useRecordingArchivePlanStorageRebalance = trpc.recordingArchive.planStorageRebalance.useQuery;
8157
+ /** Generated alias around `trpc.recordingArchive.startStorageRebalance.useMutation`. */
8158
+ var useRecordingArchiveStartStorageRebalance = trpc.recordingArchive.startStorageRebalance.useMutation;
8159
+ /** Generated alias around `trpc.recordingArchive.getPlacement.useQuery`. */
8160
+ var useRecordingArchiveGetPlacement = trpc.recordingArchive.getPlacement.useQuery;
8161
+ /** Generated alias around `trpc.recordingArchive.setDevicePlacement.useMutation`. */
8162
+ var useRecordingArchiveSetDevicePlacement = trpc.recordingArchive.setDevicePlacement.useMutation;
8163
+ /** Generated alias around `trpc.recordingArchive.getStatus.useQuery`. */
8164
+ var useRecordingArchiveGetStatus = trpc.recordingArchive.getStatus.useQuery;
8165
+ /** Generated alias around `trpc.recordingArchive.getDeviceSettingsContribution.useQuery`. */
8166
+ var useRecordingArchiveGetDeviceSettingsContribution = trpc.recordingArchive.getDeviceSettingsContribution.useQuery;
8167
+ /** Generated alias around `trpc.recordingArchive.getDeviceLiveContribution.useQuery`. */
8168
+ var useRecordingArchiveGetDeviceLiveContribution = trpc.recordingArchive.getDeviceLiveContribution.useQuery;
8169
+ /** Generated alias around `trpc.recordingArchive.applyDeviceSettingsPatch.useMutation`. */
8170
+ var useRecordingArchiveApplyDeviceSettingsPatch = trpc.recordingArchive.applyDeviceSettingsPatch.useMutation;
8169
8171
  /** Generated alias around `trpc.recordingExport.createExport.useMutation`. */
8170
8172
  var useRecordingExportCreateExport = trpc.recordingExport.createExport.useMutation;
8171
8173
  /** Generated alias around `trpc.recordingExport.listExports.useQuery`. */
@@ -23007,55 +23009,6 @@ function useScrubController(sink, isPlayerLive = () => false) {
23007
23009
  };
23008
23010
  }
23009
23011
  //#endregion
23010
- //#region src/composites/cap-settings/recording-spans.ts
23011
- /**
23012
- * Merge availability ranges (across every profile) into the union of distinct
23013
- * time windows, ascending by start. Overlapping or touching intervals coalesce;
23014
- * zero/negative-length inputs are dropped. Newest-first ordering is the caller's
23015
- * concern (it reverses for display).
23016
- */
23017
- function mergeAvailabilitySpans(ranges) {
23018
- const sorted = ranges.filter((r) => r.endMs > r.startMs).map((r) => ({
23019
- startMs: r.startMs,
23020
- endMs: r.endMs
23021
- })).toSorted((a, b) => a.startMs - b.startMs);
23022
- const out = [];
23023
- for (const r of sorted) {
23024
- const last = out[out.length - 1];
23025
- if (last && r.startMs <= last.endMs) {
23026
- if (r.endMs > last.endMs) out[out.length - 1] = {
23027
- startMs: last.startMs,
23028
- endMs: r.endMs
23029
- };
23030
- } else out.push(r);
23031
- }
23032
- return out;
23033
- }
23034
- /**
23035
- * Pick the right unit for a byte count and render it with a sensible number of
23036
- * significant digits (binary prefixes, matching recording sizes elsewhere).
23037
- * KB and up render one decimal under 100, none above; bytes never get a decimal.
23038
- */
23039
- function formatBytes(bytes) {
23040
- if (!Number.isFinite(bytes) || bytes < 0) return "—";
23041
- if (bytes < 1024) return `${Math.round(bytes)} B`;
23042
- const units = [
23043
- "KB",
23044
- "MB",
23045
- "GB",
23046
- "TB",
23047
- "PB"
23048
- ];
23049
- let value = bytes / 1024;
23050
- let unit = "KB";
23051
- for (const u of units) {
23052
- unit = u;
23053
- if (value < 1024) break;
23054
- value /= 1024;
23055
- }
23056
- return `${value >= 100 ? Math.round(value).toString() : value.toFixed(1)} ${unit}`;
23057
- }
23058
- //#endregion
23059
23012
  //#region src/composites/cap-settings/CoverageTrack.tsx
23060
23013
  function CoverageTrack({ windowFrom, windowTo, spans, playheadMs, onSeek, onScrubStart, onScrubMove, onScrubEnd }) {
23061
23014
  const [hoverInfo, setHoverInfo] = (0, react$1.useState)(null);
@@ -23290,6 +23243,55 @@ function EventBucketStrip({ clips, loading, busyKey, onPlay, enabledKinds, onTog
23290
23243
  });
23291
23244
  }
23292
23245
  //#endregion
23246
+ //#region src/composites/cap-settings/recording-spans.ts
23247
+ /**
23248
+ * Merge availability ranges (across every profile) into the union of distinct
23249
+ * time windows, ascending by start. Overlapping or touching intervals coalesce;
23250
+ * zero/negative-length inputs are dropped. Newest-first ordering is the caller's
23251
+ * concern (it reverses for display).
23252
+ */
23253
+ function mergeAvailabilitySpans(ranges) {
23254
+ const sorted = ranges.filter((r) => r.endMs > r.startMs).map((r) => ({
23255
+ startMs: r.startMs,
23256
+ endMs: r.endMs
23257
+ })).toSorted((a, b) => a.startMs - b.startMs);
23258
+ const out = [];
23259
+ for (const r of sorted) {
23260
+ const last = out[out.length - 1];
23261
+ if (last && r.startMs <= last.endMs) {
23262
+ if (r.endMs > last.endMs) out[out.length - 1] = {
23263
+ startMs: last.startMs,
23264
+ endMs: r.endMs
23265
+ };
23266
+ } else out.push(r);
23267
+ }
23268
+ return out;
23269
+ }
23270
+ /**
23271
+ * Pick the right unit for a byte count and render it with a sensible number of
23272
+ * significant digits (binary prefixes, matching recording sizes elsewhere).
23273
+ * KB and up render one decimal under 100, none above; bytes never get a decimal.
23274
+ */
23275
+ function formatBytes(bytes) {
23276
+ if (!Number.isFinite(bytes) || bytes < 0) return "—";
23277
+ if (bytes < 1024) return `${Math.round(bytes)} B`;
23278
+ const units = [
23279
+ "KB",
23280
+ "MB",
23281
+ "GB",
23282
+ "TB",
23283
+ "PB"
23284
+ ];
23285
+ let value = bytes / 1024;
23286
+ let unit = "KB";
23287
+ for (const u of units) {
23288
+ unit = u;
23289
+ if (value < 1024) break;
23290
+ value /= 1024;
23291
+ }
23292
+ return `${value >= 100 ? Math.round(value).toString() : value.toFixed(1)} ${unit}`;
23293
+ }
23294
+ //#endregion
23293
23295
  //#region src/composites/cap-settings/RecordingTimeline.tsx
23294
23296
  var ALL_KINDS = [
23295
23297
  "motion",
@@ -23401,6 +23403,7 @@ function RecordingTimeline({ deviceId }) {
23401
23403
  const bucketMs = bucketMsForSpan(view.toMs - view.fromMs);
23402
23404
  const availabilityQuery = useRecordingGetAvailability({
23403
23405
  deviceId,
23406
+ provider: _camstack_types.RECORDING_SOURCE_CAMSTACK_ADDON,
23404
23407
  fromMs: view.fromMs,
23405
23408
  toMs: view.toMs
23406
23409
  });
@@ -23410,7 +23413,8 @@ function RecordingTimeline({ deviceId }) {
23410
23413
  until: view.toMs,
23411
23414
  bucketMs
23412
23415
  });
23413
- const ranges = availabilityQuery.data?.ranges ?? EMPTY_RANGES;
23416
+ const availabilityUnreadable = availabilityQuery.data?.read === "unreadable";
23417
+ const ranges = availabilityQuery.data?.read === "read" ? availabilityQuery.data.ranges : EMPTY_RANGES;
23414
23418
  const spans = (0, react$1.useMemo)(() => mergeAvailabilitySpans(ranges), [ranges]);
23415
23419
  const buckets = (0, react$1.useMemo)(() => densityRowsToBuckets(eventDensityQuery.data ?? [], view.fromMs, bucketMs), [
23416
23420
  eventDensityQuery.data,
@@ -23490,18 +23494,19 @@ function RecordingTimeline({ deviceId }) {
23490
23494
  setBusyKey(key);
23491
23495
  setPlaybackError(null);
23492
23496
  try {
23493
- const manifest = await system.trpcClient.recording.getPlaybackManifest.query({
23497
+ const playback = await system.trpcClient.recording.getPlayback.query({
23494
23498
  deviceId,
23499
+ provider: _camstack_types.RECORDING_SOURCE_CAMSTACK_ADDON,
23495
23500
  fromMs,
23496
23501
  toMs
23497
23502
  });
23498
- if (manifest?.playbackUrl) {
23503
+ if (playback.kind === "hls" && playback.manifest.playbackUrl) {
23499
23504
  setPlayheadMs(headMs);
23500
23505
  vod.play({
23501
- url: manifest.playbackUrl,
23506
+ url: playback.manifest.playbackUrl,
23502
23507
  label
23503
23508
  });
23504
- } else setPlaybackError("No playable footage for this selection.");
23509
+ } else setPlaybackError(playback.kind === "none" ? `No playable footage for this selection — ${playback.reason}` : "No playable footage for this selection.");
23505
23510
  } catch {
23506
23511
  setPlaybackError("Could not load this recording.");
23507
23512
  } finally {
@@ -23567,6 +23572,10 @@ function RecordingTimeline({ deviceId }) {
23567
23572
  variant: "warning",
23568
23573
  message: "Recorder unavailable — the recording service may not be running for this node."
23569
23574
  }) : null,
23575
+ availabilityUnreadable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ErrorBox, {
23576
+ variant: "warning",
23577
+ message: "CamStack could not be asked about this camera's recordings — this bar shows nothing, which is not the same as no footage."
23578
+ }) : null,
23570
23579
  playbackError ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ErrorBox, {
23571
23580
  variant: "warning",
23572
23581
  message: playbackError
@@ -23687,13 +23696,13 @@ function RecordingTimeline({ deviceId }) {
23687
23696
  var DAY_MS$1 = 1440 * 60 * 1e3;
23688
23697
  function RecordingPanel({ deviceId }) {
23689
23698
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
23690
- const statusQuery = useRecordingGetStatus({ deviceId });
23691
- const configQuery = useRecordingGetDeviceConfig({ deviceId });
23699
+ const statusQuery = useRecordingArchiveGetStatus({ deviceId });
23700
+ const configQuery = useRecordingArchiveGetDeviceConfig({ deviceId });
23692
23701
  const cameraLocation = useDeviceManagerGetDevice({ deviceId }).data?.location ?? null;
23693
23702
  const bindingsQuery = useDeviceManagerGetBindings({ deviceId });
23694
23703
  const deviceSignal = bindingsQuery.status === "pending" ? "pending" : bindingsQuery.status === "error" ? "unknown" : bindingsQuery.data.entries.some((e) => e.capName === "recording-signal") ? "present" : "absent";
23695
- const setConfig = useRecordingSetDeviceConfig();
23696
- const rescanStorage = useRecordingRescanStorage();
23704
+ const setConfig = useRecordingArchiveSetDeviceConfig();
23705
+ const rescanStorage = useRecordingArchiveRescanStorage();
23697
23706
  const { data: profileSlots } = useStreamBrokerListAllProfileSlots(void 0, { staleTime: 3e4 });
23698
23707
  const availableProfiles = (0, react$1.useMemo)(() => (0, _camstack_types.selectAssignedProfileSlots)(profileSlots ?? [], deviceId).map((s) => s.profile), [profileSlots, deviceId]);
23699
23708
  const saveConfig = (config) => {
@@ -23717,6 +23726,7 @@ function RecordingPanel({ deviceId }) {
23717
23726
  const toMs = (0, react$1.useMemo)(() => Date.now(), []);
23718
23727
  const availabilityQuery = useRecordingGetAvailability({
23719
23728
  deviceId,
23729
+ provider: _camstack_types.RECORDING_SOURCE_CAMSTACK_ADDON,
23720
23730
  fromMs: toMs - DAY_MS$1,
23721
23731
  toMs
23722
23732
  });
@@ -23724,7 +23734,8 @@ function RecordingPanel({ deviceId }) {
23724
23734
  const status = parsedStatus?.success ? parsedStatus.data : null;
23725
23735
  const parsedConfig = configQuery.data ? _camstack_types.RecordingConfigSchema.safeParse(configQuery.data) : null;
23726
23736
  const resolvedConfig = parsedConfig?.success ? parsedConfig.data : null;
23727
- const ranges = availabilityQuery.data?.ranges ?? [];
23737
+ const availabilityUnreadable = availabilityQuery.data?.read === "unreadable";
23738
+ const ranges = availabilityQuery.data?.read === "read" ? availabilityQuery.data.ranges : [];
23728
23739
  const recordedMs = ranges.reduce((acc, r) => acc + Math.max(0, r.endMs - r.startMs), 0);
23729
23740
  const isRecording = status?.enabled === true && status.activeMode === "continuous";
23730
23741
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -23783,8 +23794,8 @@ function RecordingPanel({ deviceId }) {
23783
23794
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WidgetMetricCard, {
23784
23795
  label: "Recorded (24h)",
23785
23796
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Clock, { className: "h-3.5 w-3.5" }),
23786
- footer: `${ranges.length} segment range${ranges.length === 1 ? "" : "s"}`,
23787
- children: availabilityQuery.isLoading ? "…" : formatDurationMs(recordedMs)
23797
+ footer: availabilityUnreadable ? "nobody could look" : `${ranges.length} segment range${ranges.length === 1 ? "" : "s"}`,
23798
+ children: availabilityQuery.isLoading ? "…" : availabilityUnreadable ? "—" : formatDurationMs(recordedMs)
23788
23799
  })
23789
23800
  ]
23790
23801
  }),
@@ -37370,11 +37381,13 @@ function useOptimisticSlice(realSlice, opts) {
37370
37381
  ]);
37371
37382
  if (!enabled) return {
37372
37383
  display: realSlice,
37373
- applyOptimistic: () => {}
37384
+ applyOptimistic: () => {},
37385
+ rollback: () => {}
37374
37386
  };
37375
37387
  return {
37376
37388
  display: override !== void 0 ? override : realSlice,
37377
- applyOptimistic
37389
+ applyOptimistic,
37390
+ rollback: clearOverride
37378
37391
  };
37379
37392
  }
37380
37393
  //#endregion
@@ -44929,10 +44942,25 @@ function AlarmSegments({ state, availableModes, busy, onDisarm, onArm }) {
44929
44942
  }, mode))]
44930
44943
  });
44931
44944
  }
44945
+ function messageOf(err) {
44946
+ return err instanceof Error ? err.message : String(err);
44947
+ }
44932
44948
  /**
44933
44949
  * Subscribes to the alarm-panel cap ONCE and exposes the disarm/arm handlers
44934
44950
  * with optimistic state updates. Both the hero and the inline control consume
44935
44951
  * this, so the cap is never double-subscribed.
44952
+ *
44953
+ * A rejected `arm`/`disarm` (the panel refusing, per D630) is never swallowed:
44954
+ * the optimistic patch is rolled back to the real slice and the rejection's
44955
+ * message is surfaced through `error`, which callers render. `error` also
44956
+ * clears on its own the next time a real slice arrives — a fresh server push
44957
+ * means the refusal is no longer the last word on the panel's state.
44958
+ *
44959
+ * A rejection is only ever the LATEST press's business. Each call captures a
44960
+ * fresh token; if a second press starts before the first's promise settles,
44961
+ * the first press's eventual rejection must not roll back or error over the
44962
+ * second press's still-pending optimistic state — the token check makes a
44963
+ * stale rejection a no-op instead.
44936
44964
  */
44937
44965
  function useAlarmControl(trpc, deviceId, optimistic) {
44938
44966
  const { cap, slice, available } = useDeviceCapability({
@@ -44941,24 +44969,42 @@ function useAlarmControl(trpc, deviceId, optimistic) {
44941
44969
  cap: (d) => d.alarmPanel,
44942
44970
  slice: (d) => d.state.alarmPanel
44943
44971
  });
44944
- const { display, applyOptimistic } = useOptimisticSlice(slice, { enabled: optimistic ?? true });
44972
+ const { display, applyOptimistic, rollback } = useOptimisticSlice(slice, { enabled: optimistic ?? true });
44973
+ const [error, setError] = (0, react$1.useState)(null);
44974
+ const clearError = () => setError(null);
44975
+ const latestCallRef = (0, react$1.useRef)(0);
44976
+ (0, react$1.useEffect)(() => {
44977
+ setError(null);
44978
+ }, [slice]);
44945
44979
  const busy = !available;
44946
44980
  const handleDisarm = () => {
44947
44981
  if (cap === void 0 || busy) return;
44982
+ const call = ++latestCallRef.current;
44948
44983
  applyOptimistic({ state: "disarming" });
44949
- cap.disarm({});
44984
+ cap.disarm({}).catch((err) => {
44985
+ if (latestCallRef.current !== call) return;
44986
+ rollback();
44987
+ setError(messageOf(err));
44988
+ });
44950
44989
  };
44951
44990
  const handleArm = (mode) => {
44952
44991
  if (cap === void 0 || busy) return;
44992
+ const call = ++latestCallRef.current;
44953
44993
  applyOptimistic({ state: "arming" });
44954
- cap.arm({ mode });
44994
+ cap.arm({ mode }).catch((err) => {
44995
+ if (latestCallRef.current !== call) return;
44996
+ rollback();
44997
+ setError(messageOf(err));
44998
+ });
44955
44999
  };
44956
45000
  return {
44957
45001
  display,
44958
45002
  capPresent: cap !== void 0,
44959
45003
  busy,
44960
45004
  handleDisarm,
44961
- handleArm
45005
+ handleArm,
45006
+ error,
45007
+ clearError
44962
45008
  };
44963
45009
  }
44964
45010
  /**
@@ -44979,41 +45025,59 @@ function useAlarmControl(trpc, deviceId, optimistic) {
44979
45025
  * of sizing makes it. So the row shows what a row is for — **the state** — and
44980
45026
  * offers the modes through a select, which is one line at any width. The four
44981
45027
  * segments live in the hero, where there is room for them.
45028
+ *
45029
+ * A refusal (D630) still has to be visible here, one line or not — it is a
45030
+ * small danger badge (icon only, `title` carries the full message, same
45031
+ * pattern as `OfflineBadge`) appended after the select. It never grows the
45032
+ * row past one line.
44982
45033
  */
44983
45034
  function AlarmInlineControl({ trpc, deviceId, optimistic }) {
44984
- const { display, capPresent, busy, handleDisarm, handleArm } = useAlarmControl(trpc, deviceId, optimistic);
45035
+ const { display, capPresent, busy, handleDisarm, handleArm, error } = useAlarmControl(trpc, deviceId, optimistic);
44985
45036
  if (!capPresent) return null;
44986
45037
  if (display === void 0) return null;
44987
45038
  const config = ALARM_STATE_CONFIG[display.state];
44988
45039
  const current = isArmedState(display.state) ? display.state.replace("armed_", "") : "";
44989
45040
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
44990
45041
  className: "flex min-w-0 items-center gap-2",
44991
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
44992
- className: cn("inline-flex shrink-0 items-center gap-1 rounded-md border px-1.5 py-0.5 text-[11px] font-medium whitespace-nowrap", config.colorClass, isTransitioningState(display.state) && "animate-pulse"),
44993
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlarmGlyph, {
44994
- icon: config.icon,
44995
- sizeClass: "h-3 w-3"
44996
- }), config.label]
44997
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
44998
- "aria-label": "Alarm mode",
44999
- disabled: busy,
45000
- value: current,
45001
- onClick: (e) => e.stopPropagation(),
45002
- onChange: (e) => {
45003
- e.stopPropagation();
45004
- const next = e.target.value;
45005
- if (next === "") handleDisarm();
45006
- else handleArm(next);
45007
- },
45008
- className: cn("min-w-0 shrink rounded-md border border-border bg-surface-subtle px-1.5 py-0.5 text-xs text-foreground-muted", busy && "cursor-not-allowed opacity-40"),
45009
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
45010
- value: "",
45011
- children: "Disarm"
45012
- }), display.availableModes.map((mode) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
45013
- value: mode,
45014
- children: ARM_MODE_LABEL[mode]
45015
- }, mode))]
45016
- })]
45042
+ children: [
45043
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
45044
+ className: cn("inline-flex shrink-0 items-center gap-1 rounded-md border px-1.5 py-0.5 text-[11px] font-medium whitespace-nowrap", config.colorClass, isTransitioningState(display.state) && "animate-pulse"),
45045
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlarmGlyph, {
45046
+ icon: config.icon,
45047
+ sizeClass: "h-3 w-3"
45048
+ }), config.label]
45049
+ }),
45050
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
45051
+ "aria-label": "Alarm mode",
45052
+ disabled: busy,
45053
+ value: current,
45054
+ onClick: (e) => e.stopPropagation(),
45055
+ onChange: (e) => {
45056
+ e.stopPropagation();
45057
+ const next = e.target.value;
45058
+ if (next === "") handleDisarm();
45059
+ else handleArm(next);
45060
+ },
45061
+ className: cn("min-w-0 shrink rounded-md border border-border bg-surface-subtle px-1.5 py-0.5 text-xs text-foreground-muted", busy && "cursor-not-allowed opacity-40"),
45062
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
45063
+ value: "",
45064
+ children: "Disarm"
45065
+ }), display.availableModes.map((mode) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
45066
+ value: mode,
45067
+ children: ARM_MODE_LABEL[mode]
45068
+ }, mode))]
45069
+ }),
45070
+ error !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
45071
+ "data-testid": "alarm-inline-error",
45072
+ role: "alert",
45073
+ title: error,
45074
+ className: "inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-danger/10 text-danger",
45075
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ShieldAlert, {
45076
+ className: "h-3 w-3",
45077
+ "aria-hidden": "true"
45078
+ })
45079
+ })
45080
+ ]
45017
45081
  });
45018
45082
  }
45019
45083
  /**
@@ -45030,32 +45094,54 @@ function AlarmInlineControl({ trpc, deviceId, optimistic }) {
45030
45094
  * PIN entry (when `requiresCode`) is deferred to a later task; the segments
45031
45095
  * call arm/disarm without a code, and the provider rejects when a code is
45032
45096
  * required — surfaced upstream.
45097
+ *
45098
+ * A refusal (D630: an open device, a required code, …) is never a swallowed
45099
+ * promise — `useAlarmControl` rolls the optimistic state back and hands the
45100
+ * rejection's message back as `error`, rendered below the segments.
45033
45101
  */
45034
45102
  function AlarmHeroCard({ trpc, deviceId, optimistic }) {
45035
- const { display, capPresent, busy, handleDisarm, handleArm } = useAlarmControl(trpc, deviceId, optimistic);
45103
+ const { display, capPresent, busy, handleDisarm, handleArm, error, clearError } = useAlarmControl(trpc, deviceId, optimistic);
45036
45104
  if (!capPresent) return null;
45037
45105
  if (display === void 0) return null;
45038
45106
  const config = ALARM_STATE_CONFIG[display.state];
45039
45107
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45040
45108
  className: "flex flex-col items-stretch gap-4 rounded-lg border border-border bg-surface p-6",
45041
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45042
- className: "flex flex-col items-center gap-2",
45043
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
45044
- "data-testid": "alarm-state",
45045
- "data-state": display.state,
45046
- className: cn("flex h-16 w-16 items-center justify-center rounded-full border-2", config.colorClass, isTransitioningState(display.state) && "animate-pulse"),
45047
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlarmGlyph, { icon: config.icon })
45048
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
45049
- className: cn("text-sm font-medium", config.colorClass, "border-0 bg-transparent"),
45050
- children: config.label
45051
- })]
45052
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlarmSegments, {
45053
- state: display.state,
45054
- availableModes: display.availableModes,
45055
- busy,
45056
- onDisarm: handleDisarm,
45057
- onArm: handleArm
45058
- })]
45109
+ children: [
45110
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45111
+ className: "flex flex-col items-center gap-2",
45112
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
45113
+ "data-testid": "alarm-state",
45114
+ "data-state": display.state,
45115
+ className: cn("flex h-16 w-16 items-center justify-center rounded-full border-2", config.colorClass, isTransitioningState(display.state) && "animate-pulse"),
45116
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlarmGlyph, { icon: config.icon })
45117
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
45118
+ className: cn("text-sm font-medium", config.colorClass, "border-0 bg-transparent"),
45119
+ children: config.label
45120
+ })]
45121
+ }),
45122
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AlarmSegments, {
45123
+ state: display.state,
45124
+ availableModes: display.availableModes,
45125
+ busy,
45126
+ onDisarm: handleDisarm,
45127
+ onArm: handleArm
45128
+ }),
45129
+ error !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
45130
+ "data-testid": "alarm-error",
45131
+ role: "alert",
45132
+ className: "flex items-start justify-between gap-2 rounded-md border border-danger/30 bg-danger/10 px-3 py-2 text-sm text-danger",
45133
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: error }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
45134
+ type: "button",
45135
+ "aria-label": "Dismiss",
45136
+ onClick: (e) => {
45137
+ e.stopPropagation();
45138
+ clearError();
45139
+ },
45140
+ className: "shrink-0 font-medium text-danger/80 hover:text-danger",
45141
+ children: "×"
45142
+ })]
45143
+ })
45144
+ ]
45059
45145
  });
45060
45146
  }
45061
45147
  //#endregion
@@ -56457,9 +56543,6 @@ exports.useEventEmitterGetStatus = useEventEmitterGetStatus;
56457
56543
  exports.useEventInvalidation = useEventInvalidation;
56458
56544
  exports.useEventStreamLatest = useEventStreamLatest;
56459
56545
  exports.useEventStreamMap = useEventStreamMap;
56460
- exports.useEventsGetEventClipUrl = useEventsGetEventClipUrl;
56461
- exports.useEventsGetEventThumbnail = useEventsGetEventThumbnail;
56462
- exports.useEventsGetEvents = useEventsGetEvents;
56463
56546
  exports.useFaceGalleryAssignFace = useFaceGalleryAssignFace;
56464
56547
  exports.useFaceGalleryAssignFaces = useFaceGalleryAssignFaces;
56465
56548
  exports.useFaceGalleryAuditIdentitySamples = useFaceGalleryAuditIdentitySamples;
@@ -56665,9 +56748,11 @@ exports.useNotificationRulesGetClipRetentionAsks = useNotificationRulesGetClipRe
56665
56748
  exports.useNotificationRulesGetConditionCatalog = useNotificationRulesGetConditionCatalog;
56666
56749
  exports.useNotificationRulesGetHistory = useNotificationRulesGetHistory;
56667
56750
  exports.useNotificationRulesGetRule = useNotificationRulesGetRule;
56751
+ exports.useNotificationRulesGetTemplateCatalog = useNotificationRulesGetTemplateCatalog;
56668
56752
  exports.useNotificationRulesListDeviceMutes = useNotificationRulesListDeviceMutes;
56669
56753
  exports.useNotificationRulesListRules = useNotificationRulesListRules;
56670
56754
  exports.useNotificationRulesListSnoozes = useNotificationRulesListSnoozes;
56755
+ exports.useNotificationRulesPreviewTemplate = useNotificationRulesPreviewTemplate;
56671
56756
  exports.useNotificationRulesResolveArtifactUrl = useNotificationRulesResolveArtifactUrl;
56672
56757
  exports.useNotificationRulesSetAlarmConfig = useNotificationRulesSetAlarmConfig;
56673
56758
  exports.useNotificationRulesSetDeviceMuted = useNotificationRulesSetDeviceMuted;
@@ -56929,10 +57014,40 @@ exports.usePtzSetHomeReturn = usePtzSetHomeReturn;
56929
57014
  exports.usePtzStop = usePtzStop;
56930
57015
  exports.useRebootReboot = useRebootReboot;
56931
57016
  exports.useRecordedPlayback = useRecordedPlayback;
56932
- exports.useRecordingApplyDeviceSettingsPatch = useRecordingApplyDeviceSettingsPatch;
56933
- exports.useRecordingCancelRelocateJob = useRecordingCancelRelocateJob;
56934
- exports.useRecordingCancelStorageMigrationMove = useRecordingCancelStorageMigrationMove;
56935
- exports.useRecordingDeleteFootprint = useRecordingDeleteFootprint;
57017
+ exports.useRecordingArchiveApplyDeviceSettingsPatch = useRecordingArchiveApplyDeviceSettingsPatch;
57018
+ exports.useRecordingArchiveCancelRelocateJob = useRecordingArchiveCancelRelocateJob;
57019
+ exports.useRecordingArchiveCancelStorageMigrationMove = useRecordingArchiveCancelStorageMigrationMove;
57020
+ exports.useRecordingArchiveDeleteFootprint = useRecordingArchiveDeleteFootprint;
57021
+ exports.useRecordingArchiveGetAvailabilityBatch = useRecordingArchiveGetAvailabilityBatch;
57022
+ exports.useRecordingArchiveGetDaysWithRecordingsBatch = useRecordingArchiveGetDaysWithRecordingsBatch;
57023
+ exports.useRecordingArchiveGetDeviceConfig = useRecordingArchiveGetDeviceConfig;
57024
+ exports.useRecordingArchiveGetDeviceLiveContribution = useRecordingArchiveGetDeviceLiveContribution;
57025
+ exports.useRecordingArchiveGetDeviceSettingsContribution = useRecordingArchiveGetDeviceSettingsContribution;
57026
+ exports.useRecordingArchiveGetPlacement = useRecordingArchiveGetPlacement;
57027
+ exports.useRecordingArchiveGetRelocateResidue = useRecordingArchiveGetRelocateResidue;
57028
+ exports.useRecordingArchiveGetStatus = useRecordingArchiveGetStatus;
57029
+ exports.useRecordingArchiveGetStorageMigrationMoveStatus = useRecordingArchiveGetStorageMigrationMoveStatus;
57030
+ exports.useRecordingArchiveGetStorageUsage = useRecordingArchiveGetStorageUsage;
57031
+ exports.useRecordingArchiveListOpsLog = useRecordingArchiveListOpsLog;
57032
+ exports.useRecordingArchiveListRelocateJobs = useRecordingArchiveListRelocateJobs;
57033
+ exports.useRecordingArchiveLocateSegment = useRecordingArchiveLocateSegment;
57034
+ exports.useRecordingArchivePauseForStorageMigration = useRecordingArchivePauseForStorageMigration;
57035
+ exports.useRecordingArchivePlanStorageRebalance = useRecordingArchivePlanStorageRebalance;
57036
+ exports.useRecordingArchivePruneFootage = useRecordingArchivePruneFootage;
57037
+ exports.useRecordingArchiveReadGopBytes = useRecordingArchiveReadGopBytes;
57038
+ exports.useRecordingArchiveReadSegmentBytes = useRecordingArchiveReadSegmentBytes;
57039
+ exports.useRecordingArchiveReadWindowBytes = useRecordingArchiveReadWindowBytes;
57040
+ exports.useRecordingArchiveReconcileLedgerAgainstDisk = useRecordingArchiveReconcileLedgerAgainstDisk;
57041
+ exports.useRecordingArchiveRefreshStorageLocationsForMigration = useRecordingArchiveRefreshStorageLocationsForMigration;
57042
+ exports.useRecordingArchiveRelocateFootage = useRecordingArchiveRelocateFootage;
57043
+ exports.useRecordingArchiveRenderClip = useRecordingArchiveRenderClip;
57044
+ exports.useRecordingArchiveRenderGif = useRecordingArchiveRenderGif;
57045
+ exports.useRecordingArchiveRescanStorage = useRecordingArchiveRescanStorage;
57046
+ exports.useRecordingArchiveResumeForStorageMigration = useRecordingArchiveResumeForStorageMigration;
57047
+ exports.useRecordingArchiveSetDeviceConfig = useRecordingArchiveSetDeviceConfig;
57048
+ exports.useRecordingArchiveSetDevicePlacement = useRecordingArchiveSetDevicePlacement;
57049
+ exports.useRecordingArchiveStartStorageMigrationMove = useRecordingArchiveStartStorageMigrationMove;
57050
+ exports.useRecordingArchiveStartStorageRebalance = useRecordingArchiveStartStorageRebalance;
56936
57051
  exports.useRecordingExportCancelExport = useRecordingExportCancelExport;
56937
57052
  exports.useRecordingExportCreateExport = useRecordingExportCreateExport;
56938
57053
  exports.useRecordingExportDeleteExport = useRecordingExportDeleteExport;
@@ -56941,42 +57056,14 @@ exports.useRecordingExportGetExport = useRecordingExportGetExport;
56941
57056
  exports.useRecordingExportListExports = useRecordingExportListExports;
56942
57057
  exports.useRecordingExportReadExportBytes = useRecordingExportReadExportBytes;
56943
57058
  exports.useRecordingGetAvailability = useRecordingGetAvailability;
56944
- exports.useRecordingGetAvailabilityBatch = useRecordingGetAvailabilityBatch;
56945
57059
  exports.useRecordingGetDaysWithRecordings = useRecordingGetDaysWithRecordings;
56946
- exports.useRecordingGetDaysWithRecordingsBatch = useRecordingGetDaysWithRecordingsBatch;
56947
- exports.useRecordingGetDeviceConfig = useRecordingGetDeviceConfig;
56948
- exports.useRecordingGetDeviceLiveContribution = useRecordingGetDeviceLiveContribution;
56949
- exports.useRecordingGetDeviceSettingsContribution = useRecordingGetDeviceSettingsContribution;
56950
- exports.useRecordingGetPlacement = useRecordingGetPlacement;
56951
- exports.useRecordingGetPlaybackManifest = useRecordingGetPlaybackManifest;
56952
- exports.useRecordingGetRelocateResidue = useRecordingGetRelocateResidue;
56953
- exports.useRecordingGetStatus = useRecordingGetStatus;
56954
- exports.useRecordingGetStorageMigrationMoveStatus = useRecordingGetStorageMigrationMoveStatus;
56955
- exports.useRecordingGetStorageUsage = useRecordingGetStorageUsage;
56956
- exports.useRecordingListOpsLog = useRecordingListOpsLog;
56957
- exports.useRecordingListRelocateJobs = useRecordingListRelocateJobs;
56958
- exports.useRecordingLocateSegment = useRecordingLocateSegment;
57060
+ exports.useRecordingGetPlayback = useRecordingGetPlayback;
57061
+ exports.useRecordingGetPlaybackOptions = useRecordingGetPlaybackOptions;
57062
+ exports.useRecordingListSources = useRecordingListSources;
56959
57063
  exports.useRecordingOnboardGetOptions = useRecordingOnboardGetOptions;
56960
57064
  exports.useRecordingOnboardGetStatus = useRecordingOnboardGetStatus;
56961
57065
  exports.useRecordingOnboardSetSettings = useRecordingOnboardSetSettings;
56962
- exports.useRecordingPauseForStorageMigration = useRecordingPauseForStorageMigration;
56963
- exports.useRecordingPlanStorageRebalance = useRecordingPlanStorageRebalance;
56964
- exports.useRecordingPruneFootage = useRecordingPruneFootage;
56965
- exports.useRecordingReadGopBytes = useRecordingReadGopBytes;
56966
- exports.useRecordingReadSegmentBytes = useRecordingReadSegmentBytes;
56967
- exports.useRecordingReadWindowBytes = useRecordingReadWindowBytes;
56968
- exports.useRecordingReconcileLedgerAgainstDisk = useRecordingReconcileLedgerAgainstDisk;
56969
- exports.useRecordingRefreshStorageLocationsForMigration = useRecordingRefreshStorageLocationsForMigration;
56970
- exports.useRecordingRelocateFootage = useRecordingRelocateFootage;
56971
- exports.useRecordingRenderClip = useRecordingRenderClip;
56972
- exports.useRecordingRenderGif = useRecordingRenderGif;
56973
- exports.useRecordingRescanStorage = useRecordingRescanStorage;
56974
- exports.useRecordingResumeForStorageMigration = useRecordingResumeForStorageMigration;
56975
- exports.useRecordingSetDeviceConfig = useRecordingSetDeviceConfig;
56976
- exports.useRecordingSetDevicePlacement = useRecordingSetDevicePlacement;
56977
57066
  exports.useRecordingSignalGetStatus = useRecordingSignalGetStatus;
56978
- exports.useRecordingStartStorageMigrationMove = useRecordingStartStorageMigrationMove;
56979
- exports.useRecordingStartStorageRebalance = useRecordingStartStorageRebalance;
56980
57067
  exports.useRemoteComponent = useRemoteComponent;
56981
57068
  exports.useRoleDisplayDefaults = useRoleDisplayDefaults;
56982
57069
  exports.useSceneMonitorCaptureReference = useSceneMonitorCaptureReference;