@camstack/types 1.2.131 → 1.2.133

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.
@@ -6,7 +6,7 @@
6
6
  * scope+access check inside `protectedProcedure` (see
7
7
  * `server/backend/src/api/trpc/trpc.middleware.ts`).
8
8
  *
9
- * Coverage: 994 method paths across 126 capabilities.
9
+ * Coverage: 999 method paths across 126 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -6,8 +6,8 @@
6
6
  * system-scope cap that takes a deviceId was previously never device-filtered
7
7
  * — see the generator header).
8
8
  *
9
- * Coverage: 352 methods carry a device reference, of which
10
- * 130 are on SYSTEM-scope caps.
9
+ * Coverage: 351 methods carry a device reference, of which
10
+ * 131 are on SYSTEM-scope caps.
11
11
  *
12
12
  * Top-level fields, number arrays, and one-level arrays of objects carrying
13
13
  * a numeric device field (targets[].deviceId) are all mapped; the matcher
@@ -68,7 +68,7 @@ export interface SystemProxy {
68
68
  readonly decoder: Pick<InferProvider<typeof decoderCapability>, 'supportsCodec' | 'getInfo' | 'createSession' | 'destroySession' | 'pushPacket' | 'openStream' | 'pullFrames' | 'pullHandles' | 'getFrame' | 'getShmStats' | 'updateConfig' | 'getStats' | 'listActiveSessions' | 'reprobeHwaccel'>;
69
69
  readonly deviceAdoption: Pick<InferProvider<typeof deviceAdoptionCapability>, 'listCandidateFilters' | 'listCandidates' | 'getCandidate' | 'refresh' | 'adopt' | 'release' | 'resync'>;
70
70
  readonly deviceExport: Pick<InferProvider<typeof deviceExportCapability>, 'getStatus' | 'listSupportedDeviceKinds' | 'listExposedDevices' | 'exposeDevice' | 'unexposeDevice'>;
71
- readonly deviceManager: Pick<InferProvider<typeof deviceManagerCapability>, 'allocateDeviceId' | 'registerDevice' | 'removeDevice' | 'persistConfig' | 'getRoleDisplayDefaults' | 'setRoleDisplayDefaults' | 'listLocations' | 'addLocation' | 'removeLocation' | 'listPersistedByAddon' | 'listAll' | 'getChildren' | 'getChildrenBatch' | 'getLinkedDevicesBatch' | 'removeByIntegration' | 'getBindingsBatch' | 'getAllBindings' | 'listWrappersForCap' | 'listBindableCapsForDeviceType' | 'discoverDevices' | 'adoptDevice' | 'getCreationSchema' | 'createDevice' | 'testCreationField' | 'adoptionListCandidateFilters' | 'adoptionListCandidates' | 'adoptionRefresh' | 'adoptionAdopt' | 'adoptionRelease' | 'adoptionStartJob' | 'adoptionListJobs' | 'adoptionCancelJob' | 'adoptionResync' | 'discoveryProviders' | 'discoverAllProviders' | 'discoverProvider' | 'providerCreationType' | 'providerDiscoveryParamsSchema' | 'getDeviceStatusAggregateBatch'>;
71
+ readonly deviceManager: Pick<InferProvider<typeof deviceManagerCapability>, 'allocateDeviceId' | 'registerDevice' | 'removeDevice' | 'persistConfig' | 'getRoleDisplayDefaults' | 'setRoleDisplayDefaults' | 'listLocations' | 'addLocation' | 'removeLocation' | 'renameLocation' | 'listPersistedByAddon' | 'listAll' | 'getChildren' | 'getChildrenBatch' | 'getLinkedDevicesBatch' | 'removeByIntegration' | 'getBindingsBatch' | 'getAllBindings' | 'listWrappersForCap' | 'listBindableCapsForDeviceType' | 'discoverDevices' | 'adoptDevice' | 'getCreationSchema' | 'createDevice' | 'testCreationField' | 'adoptionListCandidateFilters' | 'adoptionListCandidates' | 'adoptionRefresh' | 'adoptionAdopt' | 'adoptionRelease' | 'adoptionStartJob' | 'adoptionListJobs' | 'adoptionCancelJob' | 'adoptionResync' | 'discoveryProviders' | 'discoverAllProviders' | 'discoverProvider' | 'providerCreationType' | 'providerDiscoveryParamsSchema' | 'getDeviceStatusAggregateBatch'>;
72
72
  readonly deviceProvider: Pick<InferProvider<typeof deviceProviderCapability>, 'start' | 'stop' | 'getStatus' | 'getDevices' | 'supportsDiscovery' | 'discoverDevices' | 'getDiscoveryParamsSchema' | 'getManualCreationType' | 'adoptDiscoveredDevice' | 'supportsManualCreation' | 'getChildCreationSchema' | 'createDevice' | 'testCreationField'>;
73
73
  readonly deviceState: Pick<InferProvider<typeof deviceStateCapability>, 'getAllSnapshots'>;
74
74
  readonly faceGallery: Pick<InferProvider<typeof faceGalleryCapability>, 'listIdentities' | 'createIdentity' | 'renameIdentity' | 'deleteIdentity' | 'listIdentitySamples' | 'removeSample' | 'getFaceMedia' | 'assignFace' | 'unassignFace' | 'deleteFace' | 'assignFaces' | 'unassignFaces' | 'suggestFaceClusters'>;
@@ -87,12 +87,12 @@ export interface SystemProxy {
87
87
  readonly pipelineOrchestrator: Pick<InferProvider<typeof pipelineOrchestratorCapability>, 'pauseForStorageMigration' | 'resumeForStorageMigration' | 'rebalance' | 'getPipelineAssignments' | 'getAgentLoad' | 'getGlobalMetrics' | 'getCapabilityBindings' | 'setCapabilityBinding' | 'getIngestOwner' | 'getAudioNodeLoad' | 'getAgentSettings' | 'listAgentSettings' | 'removeAgentSettings' | 'setAgentMaxCameras' | 'setAgentDetectWeight' | 'setAgentCapabilities' | 'setAgentReachableHost' | 'setAgentInferenceDevices' | 'getNodeInferenceDevices' | 'resetNodePipelineDefaults' | 'getCameraStatuses' | 'reconcileFromDisk' | 'getReconcileFromDiskStatus' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate'>;
88
88
  readonly pipelineRunner: Pick<InferProvider<typeof pipelineRunnerCapability>, 'attachCamera' | 'reportMotion' | 'getLocalLoad' | 'getLocalMetrics' | 'getAllCameraMetrics' | 'getLocalCameras' | 'getNativeCrop' | 'runStatelessStep'>;
89
89
  readonly plateGallery: Pick<InferProvider<typeof plateGalleryCapability>, 'getPlateMedia' | 'searchPlates' | 'suggestPlateClusters' | 'correctPlateText' | 'deletePlate' | 'listVehicles' | 'createVehicle' | 'renameVehicle' | 'deleteVehicle' | 'listVehicleSamples' | 'removeVehicleSample' | 'assignPlate' | 'unassignPlate' | 'assignPlates' | 'unassignPlates'>;
90
- readonly recording: Pick<InferProvider<typeof recordingCapability>, 'getStorageUsage' | 'listOpsLog' | 'pauseForStorageMigration' | 'resumeForStorageMigration' | 'refreshStorageLocationsForMigration' | 'startStorageMigrationMove' | 'getStorageMigrationMoveStatus' | 'cancelStorageMigrationMove' | 'relocateFootage' | 'listRelocateJobs' | 'getRelocateResidue' | 'reconcileLedgerAgainstDisk' | 'cancelRelocateJob' | 'planStorageRebalance' | 'startStorageRebalance'>;
90
+ readonly recording: Pick<InferProvider<typeof recordingCapability>, 'getStorageUsage' | 'listOpsLog' | 'pauseForStorageMigration' | 'resumeForStorageMigration' | 'refreshStorageLocationsForMigration' | 'startStorageMigrationMove' | 'getStorageMigrationMoveStatus' | 'cancelStorageMigrationMove' | 'relocateFootage' | 'listRelocateJobs' | 'getRelocateResidue' | 'reconcileLedgerAgainstDisk' | 'cancelRelocateJob' | 'planStorageRebalance' | 'startStorageRebalance' | 'getPlacement' | 'setDevicePlacement'>;
91
91
  readonly recordingExport: Pick<InferProvider<typeof recordingExportCapability>, 'createExport' | 'getExport' | 'cancelExport' | 'deleteExport' | 'getDownloadUrl' | 'readExportBytes'>;
92
92
  readonly serverManagement: Pick<InferProvider<typeof serverManagementCapability>, 'getServerPackageStatus' | 'checkServerUpdate' | 'applyServerUpdate' | 'rollbackServerUpdate' | 'restartServer'>;
93
93
  readonly settingsStore: Pick<InferProvider<typeof settingsStoreCapability>, 'get' | 'set' | 'query' | 'insert' | 'insertMany' | 'update' | 'delete' | 'deleteWhere' | 'updateWhere' | 'count' | 'aggregate' | 'histogram' | 'isEmpty' | 'declareCollection'>;
94
94
  readonly storage: Pick<InferProvider<typeof storageCapability>, 'resolve' | 'write' | 'read' | 'exists' | 'list' | 'delete' | 'getAvailableSpace' | 'beginUpload' | 'writeChunk' | 'finalizeUpload' | 'abortUpload' | 'beginDownload' | 'readChunk' | 'endDownload' | 'listLocations' | 'getDefaultLocation' | 'listLocationDeclarations' | 'upsertLocation' | 'deleteLocation' | 'testLocation' | 'listProviders' | 'testConfig'>;
95
- readonly storageMigration: Pick<InferProvider<typeof storageMigrationCapability>, 'plan' | 'start' | 'status' | 'cancel' | 'movers' | 'residue' | 'drain'>;
95
+ readonly storageMigration: Pick<InferProvider<typeof storageMigrationCapability>, 'plan' | 'start' | 'status' | 'cancel' | 'movers' | 'residue' | 'drain' | 'cleanupStart' | 'cleanupStatus' | 'cleanupCancel' | 'history'>;
96
96
  readonly streamBroker: Pick<InferProvider<typeof streamBrokerCapability>, 'fetchEventMedia' | 'listAllCameraStreams' | 'listAllProfileSlots' | 'getBrokerStats' | 'probeStream' | 'listClients' | 'killClient' | 'getStreamUrl' | 'getStreamWithCodec' | 'releaseStreamWithCodec' | 'acquireEgressTranscode' | 'releaseEgressTranscode' | 'subscribeAudioChunks' | 'pullAudioChunks' | 'unsubscribeAudioChunks' | 'subscribeFrames' | 'pullFrameHandles' | 'unsubscribeFrames' | 'setPreBufferDuration' | 'getPreBufferInfo' | 'getRtspPort' | 'getAllRtspEntries' | 'getRtspEntry' | 'regenerateRtspToken' | 'setRtspEnabled' | 'isRtspEnabled'>;
97
97
  readonly system: Pick<InferProvider<typeof systemCapability>, 'info' | 'health' | 'featureFlags' | 'networkAddresses' | 'getRetentionConfig' | 'setRetentionConfig' | 'forceRetentionCleanup' | 'getSiteLocation' | 'setSiteLocation' | 'detectSiteLocation' | 'getRequestCensus' | 'getLoadContributions' | 'getFailureContributions' | 'getLoggingSettings' | 'setLoggingSettings'>;
98
98
  readonly terminalSession: Pick<InferProvider<typeof terminalSessionCapability>, 'listProfiles' | 'listInstances' | 'createInstance' | 'updateInstance' | 'deleteInstance' | 'setInstanceEnabled' | 'listLegacyCameras' | 'adoptLegacyMonitor' | 'listSessions' | 'openSession' | 'resize' | 'pullOutput' | 'writeInput' | 'close'>;
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_event_category = require("./event-category-BaEgqJNv.js");
3
- const require_sleep = require("./sleep-CqVyhcl-.js");
3
+ const require_sleep = require("./sleep-DkBAyPva.js");
4
4
  const require_canonical_hash = require("./canonical-hash-DNV8S5ET.js");
5
5
  const require_enums = require("./enums.js");
6
6
  const require_err_msg = require("./err-msg-COpsHMw2.js");
@@ -2345,6 +2345,13 @@ var MediaRelocateModeSchema = zod.z.enum([
2345
2345
  ]);
2346
2346
  var RelocateMediaInputSchema = zod.z.object({
2347
2347
  toLocationId: zod.z.string(),
2348
+ /**
2349
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
2350
+ * every row that is not already on `toLocationId` (the historical
2351
+ * behaviour). A named source is what a from→to migration needs: without it
2352
+ * "move events off disk 2" also emptied disk 1.
2353
+ */
2354
+ fromLocationId: zod.z.string().optional(),
2348
2355
  throttleMbps: zod.z.number().min(1).max(1e3).optional(),
2349
2356
  /** Omitted = `move`, the pre-existing behaviour. */
2350
2357
  mode: MediaRelocateModeSchema.optional()
@@ -2412,6 +2419,19 @@ var StorageMigrationDestinationsSchema = zod.z.object({
2412
2419
  galleryMedia: zod.z.string().min(1).optional()
2413
2420
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
2414
2421
  /**
2422
+ * Optional named source per class. Omitted = the class's current default
2423
+ * (the historical behaviour). A named source that is NOT the default is a
2424
+ * drain of that disk: bytes move, the default stays, and the source is
2425
+ * disabled when the move finishes.
2426
+ */
2427
+ var StorageMigrationSourcesSchema = zod.z.object({
2428
+ recordings: zod.z.string().min(1).optional(),
2429
+ recordingsLow: zod.z.string().min(1).optional(),
2430
+ eventMedia: zod.z.string().min(1).optional(),
2431
+ backups: zod.z.string().min(1).optional(),
2432
+ galleryMedia: zod.z.string().min(1).optional()
2433
+ }).optional();
2434
+ /**
2415
2435
  * How a migration sequences the cutover against the byte move.
2416
2436
  *
2417
2437
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -2433,6 +2453,8 @@ var StorageMigrationModeSchema = zod.z.enum(["blocking", "nonBlocking"]);
2433
2453
  /** Shared input for planning and starting an orchestrated storage migration. */
2434
2454
  var StorageMigrationInputSchema = zod.z.object({
2435
2455
  destinations: StorageMigrationDestinationsSchema,
2456
+ /** Omitted = each class's current default. */
2457
+ sources: StorageMigrationSourcesSchema,
2436
2458
  throttleMbps: zod.z.number().min(1).max(1e3).optional(),
2437
2459
  /** Omitted = `blocking`, which stays the default. */
2438
2460
  mode: StorageMigrationModeSchema.optional()
@@ -2512,6 +2534,13 @@ var StorageMigrationMoveSchema = zod.z.object({
2512
2534
  storageClass: StorageMigrationClassSchema,
2513
2535
  fromLocationId: zod.z.string(),
2514
2536
  toLocationId: zod.z.string(),
2537
+ /**
2538
+ * True when `from` was NOT the class default at plan time. The move still
2539
+ * copies bytes, but the default is left alone and the source is disabled
2540
+ * once the copy verifies. Absent on jobs planned before this field existed
2541
+ * — those jobs always repointed, which is `false`.
2542
+ */
2543
+ freezeSource: zod.z.boolean().optional(),
2515
2544
  moverJobId: zod.z.string().nullable(),
2516
2545
  state: RelocateJobStateSchema.nullable(),
2517
2546
  error: zod.z.string().nullable(),
@@ -2525,6 +2554,7 @@ var StorageMigrationJobSchema = zod.z.object({
2525
2554
  * can tell a seconds-long cutover from a thirty-hour one. */
2526
2555
  mode: StorageMigrationModeSchema,
2527
2556
  destinations: StorageMigrationDestinationsSchema,
2557
+ sources: StorageMigrationSourcesSchema,
2528
2558
  throttleMbps: zod.z.number(),
2529
2559
  moves: zod.z.array(StorageMigrationMoveSchema),
2530
2560
  pauseLeaseId: zod.z.string().nullable(),
@@ -2574,6 +2604,7 @@ var StorageMigrationFindingSchema = zod.z.object({
2574
2604
  });
2575
2605
  var StorageMigrationPlanSchema = zod.z.object({
2576
2606
  destinations: StorageMigrationDestinationsSchema,
2607
+ sources: StorageMigrationSourcesSchema,
2577
2608
  /** The mode this plan was built for. A plan is only valid for its mode: the
2578
2609
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
2579
2610
  * it. */
@@ -2581,7 +2612,8 @@ var StorageMigrationPlanSchema = zod.z.object({
2581
2612
  moves: zod.z.array(zod.z.object({
2582
2613
  storageClass: StorageMigrationClassSchema,
2583
2614
  fromLocationId: zod.z.string(),
2584
- toLocationId: zod.z.string()
2615
+ toLocationId: zod.z.string(),
2616
+ freezeSource: zod.z.boolean().optional()
2585
2617
  })),
2586
2618
  findings: zod.z.array(StorageMigrationFindingSchema)
2587
2619
  });
@@ -2768,9 +2800,50 @@ var LedgerWalkReportSchema = zod.z.object({
2768
2800
  var RelocatableMediaCountSchema = zod.z.object({ rows: zod.z.number().int().nonnegative() }).nullable();
2769
2801
  var RelocatableMediaCountInputSchema = zod.z.object({
2770
2802
  toLocationId: zod.z.string().min(1),
2803
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
2804
+ fromLocationId: zod.z.string().optional(),
2771
2805
  /** Omitted = `move`. */
2772
2806
  mode: MediaRelocateModeSchema.optional()
2773
2807
  });
2808
+ /**
2809
+ * Operator cleanup of leftover analytics rows, optional debug media, and
2810
+ * ghost ledger entries on frozen footage locations.
2811
+ *
2812
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
2813
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
2814
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
2815
+ * with no operator-visible status.
2816
+ */
2817
+ var StorageCleanupPhaseSchema = zod.z.enum([
2818
+ "orphans",
2819
+ "debug-media",
2820
+ "ghost-ledger",
2821
+ "done",
2822
+ "failed",
2823
+ "cancelled"
2824
+ ]);
2825
+ var StorageCleanupInputSchema = zod.z.object({
2826
+ /** Also walk motion stills / track filmstrips. Off by default. */
2827
+ includeDebugMedia: zod.z.boolean().optional() });
2828
+ var StorageCleanupJobSchema = zod.z.object({
2829
+ jobId: zod.z.string(),
2830
+ phase: StorageCleanupPhaseSchema,
2831
+ includeDebugMedia: zod.z.boolean(),
2832
+ orphansReclaimed: zod.z.number().int().nonnegative(),
2833
+ orphanBytesReclaimed: zod.z.number().int().nonnegative(),
2834
+ debugMediaReclaimed: zod.z.number().int().nonnegative(),
2835
+ debugMediaBytesReclaimed: zod.z.number().int().nonnegative(),
2836
+ ghostsForgotten: zod.z.number().int().nonnegative(),
2837
+ ghostBytesForgotten: zod.z.number().int().nonnegative(),
2838
+ /** Short operator-facing line: current collection, pass, or location. */
2839
+ detail: zod.z.string().nullable(),
2840
+ cancelRequested: zod.z.boolean(),
2841
+ startedAt: zod.z.number(),
2842
+ updatedAt: zod.z.number(),
2843
+ finishedAt: zod.z.number().nullable(),
2844
+ error: zod.z.string().nullable()
2845
+ });
2846
+ var StorageCleanupStatusInputSchema = zod.z.object({ jobId: zod.z.string().optional() });
2774
2847
  //#endregion
2775
2848
  //#region src/interfaces/server-analysis.ts
2776
2849
  var SUB_DETECTION_TYPES = ["face", "plate"];
@@ -2810,11 +2883,10 @@ var StorageLocationTypeSchema = zod.z.string().regex(/^[a-z][a-zA-Z0-9-]*$/);
2810
2883
  * The default location for a type uses `id === <type>:default` by
2811
2884
  * convention (the bare type ref like `'backups'` resolves to it).
2812
2885
  *
2813
- * `isSystem: true` marks a location as orchestrator-seeded and
2814
- * undeletable. The bootstrap-installed defaults (one per type) carry
2815
- * this flag; operator-added locations don't. Editing the config of
2816
- * a system location is allowed (path migration, provider swap) but
2817
- * deleting it is rejected at the cap level.
2886
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
2887
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
2888
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
2889
+ * / last-enabled, not on this bit.
2818
2890
  */
2819
2891
  var StorageLocationSchema = zod.z.object({
2820
2892
  id: zod.z.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -10467,6 +10539,27 @@ var deviceManagerCapability = {
10467
10539
  kind: "mutation",
10468
10540
  auth: "admin"
10469
10541
  }),
10542
+ /** Rename a room: replace the label in the registry IN PLACE and move
10543
+ * every device that carried it, as ONE server operation.
10544
+ *
10545
+ * The admin UI used to do this as `addLocation(to)` → N ×
10546
+ * `setLocation(device, to)` → `removeLocation(from)` from the browser.
10547
+ * Nothing bound those three together, so a closed tab left the fleet
10548
+ * split across two rooms — one of which the operator believed was gone.
10549
+ *
10550
+ * `from` is matched the way the registry matches everywhere else
10551
+ * (trimmed, case-insensitive) and need NOT be registered: the registry is
10552
+ * a suggestion list, and the devices that most need a rename are exactly
10553
+ * the ones carrying a label nobody registered. `to` renames onto an
10554
+ * existing room by MERGING into it, leaving no duplicate label. An empty
10555
+ * `to` throws before anything is written. */
10556
+ renameLocation: require_sleep.method(zod.z.object({
10557
+ from: zod.z.string(),
10558
+ to: zod.z.string()
10559
+ }), zod.z.object({ moved: zod.z.number() }), {
10560
+ kind: "mutation",
10561
+ auth: "admin"
10562
+ }),
10470
10563
  /** Soft-disable / re-enable the device. Drivers consult
10471
10564
  * `BaseDevice.disabled` to gate lifecycle hooks. */
10472
10565
  setDisabled: require_sleep.method(zod.z.object({
@@ -18626,46 +18719,6 @@ var RecentTracksPageSchema = zod.z.object({
18626
18719
  /** Cursor for the next page, or null when this page is the last. */
18627
18720
  nextCursor: zod.z.string().nullable()
18628
18721
  });
18629
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
18630
- var LIST_GROUPS_MAX_LIMIT = 100;
18631
- var AnalyticsGroupRecordSchema = zod.z.object({
18632
- id: zod.z.string(),
18633
- deviceId: zod.z.number().int(),
18634
- openedAt: zod.z.number().int(),
18635
- closedAt: zod.z.number().int(),
18636
- timestamp: zod.z.number().int(),
18637
- memberCount: zod.z.number().int(),
18638
- memberTrackIds: zod.z.array(zod.z.string()).readonly(),
18639
- className: zod.z.string(),
18640
- classes: zod.z.array(zod.z.string()).readonly(),
18641
- /** Relative event-media path, or null when the group has no picture yet. */
18642
- mediaUrl: zod.z.string().nullable(),
18643
- singleton: zod.z.boolean()
18644
- });
18645
- var AnalyticsGroupMemberSchema = zod.z.object({
18646
- trackId: zod.z.string(),
18647
- deviceId: zod.z.number().int(),
18648
- className: zod.z.string(),
18649
- firstSeen: zod.z.number().int(),
18650
- lastSeen: zod.z.number().int(),
18651
- mediaUrl: zod.z.string().nullable()
18652
- });
18653
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: zod.z.array(AnalyticsGroupMemberSchema).readonly() });
18654
- var ListGroupsQueryInput = zod.z.object({
18655
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
18656
- deviceIds: zod.z.array(zod.z.number()),
18657
- /** Window lower bound on `closedAt` (inclusive). */
18658
- since: zod.z.number().optional(),
18659
- /** Window upper bound on `openedAt` (inclusive). */
18660
- until: zod.z.number().optional(),
18661
- limit: zod.z.number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
18662
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
18663
- cursor: zod.z.string().optional()
18664
- });
18665
- var ListGroupsPageSchema = zod.z.object({
18666
- groups: zod.z.array(AnalyticsGroupRecordSchema).readonly(),
18667
- nextCursor: zod.z.string().nullable()
18668
- });
18669
18722
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
18670
18723
  var KEY_EVENTS_MAX_LIMIT = 200;
18671
18724
  var KeyEventQueryInput = zod.z.object({
@@ -18769,9 +18822,7 @@ var TrackCascadeCountsSchema = zod.z.object({
18769
18822
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
18770
18823
  plates: zod.z.number().int(),
18771
18824
  /** Per-track CLIP search vectors removed (best-effort). */
18772
- embeddings: zod.z.number().int(),
18773
- /** Group membership + group rows removed with their last member (best-effort). */
18774
- groups: zod.z.number().int()
18825
+ embeddings: zod.z.number().int()
18775
18826
  });
18776
18827
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18777
18828
  var DiskReconcileCountsSchema = zod.z.object({
@@ -19047,16 +19098,6 @@ var pipelineAnalyticsCapability = {
19047
19098
  * are not included (same contract as `listTracks`).
19048
19099
  */
19049
19100
  listRecentTracks: require_sleep.method(RecentTracksQueryInput, RecentTracksPageSchema),
19050
- /**
19051
- * Batched co-moving group listing — the Groups feed. Same merge/cursor
19052
- * contract as {@link listRecentTracks}. A group is a sealed partition of
19053
- * one session; `getGroup` is the detail with members.
19054
- */
19055
- listGroups: require_sleep.method(ListGroupsQueryInput, ListGroupsPageSchema),
19056
- getGroup: require_sleep.method(zod.z.object({
19057
- deviceId: zod.z.number(),
19058
- groupId: zod.z.string().min(1)
19059
- }), AnalyticsGroupDetailSchema.nullable()),
19060
19101
  clearTracks: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), zod.z.void(), {
19061
19102
  kind: "mutation",
19062
19103
  auth: "admin"
@@ -22648,7 +22689,23 @@ var storageMigrationCapability = {
22648
22689
  drain: require_sleep.method(StorageMigrationDrainInputSchema, zod.z.object({ jobId: zod.z.string() }), {
22649
22690
  kind: "mutation",
22650
22691
  auth: "admin"
22651
- })
22692
+ }),
22693
+ /**
22694
+ * One operator cleanup of leftover analytics (DB + blobs) and ghost
22695
+ * ledger rows on frozen footage locations. Optional debug-media sweep.
22696
+ * Returns immediately; poll {@link cleanupStatus}.
22697
+ */
22698
+ cleanupStart: require_sleep.method(StorageCleanupInputSchema, zod.z.object({ jobId: zod.z.string() }), {
22699
+ kind: "mutation",
22700
+ auth: "admin"
22701
+ }),
22702
+ cleanupStatus: require_sleep.method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }),
22703
+ cleanupCancel: require_sleep.method(zod.z.object({ jobId: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
22704
+ kind: "mutation",
22705
+ auth: "admin"
22706
+ }),
22707
+ /** Recent finished migration jobs, newest first. The live job is `status`. */
22708
+ history: require_sleep.method(zod.z.object({}), zod.z.array(StorageMigrationJobSchema).readonly(), { auth: "admin" })
22652
22709
  }
22653
22710
  };
22654
22711
  //#endregion
@@ -31185,6 +31242,33 @@ var RecordingRebalanceInputSchema = zod.z.object({
31185
31242
  minMoveGb: zod.z.number().min(0).optional()
31186
31243
  });
31187
31244
  /**
31245
+ * Operator-facing placement of one camera onto a recordings location.
31246
+ *
31247
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
31248
+ * Auto (the planner may move this camera). `locationId` is where high/mid
31249
+ * currently write — the plan, which may disagree with the pin when Auto.
31250
+ */
31251
+ var RecordingDevicePlacementSchema = zod.z.object({
31252
+ deviceId: zod.z.number().int(),
31253
+ profile: zod.z.string(),
31254
+ locationId: zod.z.string()
31255
+ });
31256
+ var RecordingDevicePinSchema = zod.z.object({
31257
+ deviceId: zod.z.number().int(),
31258
+ /** Recordings-class location this camera is pinned to. */
31259
+ locationId: zod.z.string()
31260
+ });
31261
+ var RecordingPlacementViewSchema = zod.z.object({
31262
+ assignments: zod.z.array(RecordingDevicePlacementSchema),
31263
+ pins: zod.z.array(RecordingDevicePinSchema),
31264
+ defaultLocations: zod.z.record(zod.z.string(), zod.z.string())
31265
+ });
31266
+ var RecordingSetDevicePlacementInputSchema = zod.z.object({
31267
+ deviceId: zod.z.number().int(),
31268
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
31269
+ locationId: zod.z.string().nullable()
31270
+ });
31271
+ /**
31188
31272
  * Result of locating footage at a wall-clock instant for one device/profile.
31189
31273
  * `segment` carries the covering segment's window; `gap` reports the forward
31190
31274
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -31537,6 +31621,22 @@ var recordingCapability = {
31537
31621
  startStorageRebalance: require_sleep.method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
31538
31622
  kind: "mutation",
31539
31623
  auth: "admin"
31624
+ }),
31625
+ /**
31626
+ * The placement plan in force plus operator pins. Drives the Locations
31627
+ * admin page: Auto vs a named recordings location, per camera.
31628
+ */
31629
+ getPlacement: require_sleep.method(zod.z.object({}), RecordingPlacementViewSchema, {
31630
+ kind: "query",
31631
+ auth: "admin"
31632
+ }),
31633
+ /**
31634
+ * Pin a camera to a recordings location, or clear the pin (Auto). High and
31635
+ * mid follow the pin; low stays with the recordingsLow planner.
31636
+ */
31637
+ setDevicePlacement: require_sleep.method(RecordingSetDevicePlacementInputSchema, zod.z.object({ ok: zod.z.literal(true) }), {
31638
+ kind: "mutation",
31639
+ auth: "admin"
31540
31640
  })
31541
31641
  }
31542
31642
  };
@@ -40200,6 +40300,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
40200
40300
  addonId: null,
40201
40301
  access: "delete"
40202
40302
  },
40303
+ "deviceManager.renameLocation": {
40304
+ capName: "device-manager",
40305
+ capScope: "system",
40306
+ addonId: null,
40307
+ access: "create"
40308
+ },
40203
40309
  "deviceManager.runDeviceAction": {
40204
40310
  capName: "device-manager",
40205
40311
  capScope: "system",
@@ -41892,12 +41998,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
41892
41998
  addonId: null,
41893
41999
  access: "view"
41894
42000
  },
41895
- "pipelineAnalytics.getGroup": {
41896
- capName: "pipeline-analytics",
41897
- capScope: "device",
41898
- addonId: null,
41899
- access: "view"
41900
- },
41901
42001
  "pipelineAnalytics.getKeyEvents": {
41902
42002
  capName: "pipeline-analytics",
41903
42003
  capScope: "device",
@@ -42000,12 +42100,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
42000
42100
  addonId: null,
42001
42101
  access: "view"
42002
42102
  },
42003
- "pipelineAnalytics.listGroups": {
42004
- capName: "pipeline-analytics",
42005
- capScope: "device",
42006
- addonId: null,
42007
- access: "view"
42008
- },
42009
42103
  "pipelineAnalytics.listOpsLog": {
42010
42104
  capName: "pipeline-analytics",
42011
42105
  capScope: "device",
@@ -43020,6 +43114,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43020
43114
  addonId: null,
43021
43115
  access: "view"
43022
43116
  },
43117
+ "recording.getPlacement": {
43118
+ capName: "recording",
43119
+ capScope: "system",
43120
+ addonId: null,
43121
+ access: "view"
43122
+ },
43023
43123
  "recording.getPlaybackManifest": {
43024
43124
  capName: "recording",
43025
43125
  capScope: "system",
@@ -43146,6 +43246,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
43146
43246
  addonId: null,
43147
43247
  access: "create"
43148
43248
  },
43249
+ "recording.setDevicePlacement": {
43250
+ capName: "recording",
43251
+ capScope: "system",
43252
+ addonId: null,
43253
+ access: "create"
43254
+ },
43149
43255
  "recording.startStorageMigrationMove": {
43150
43256
  capName: "recording",
43151
43257
  capScope: "system",
@@ -43590,12 +43696,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
43590
43696
  addonId: null,
43591
43697
  access: "create"
43592
43698
  },
43699
+ "storageMigration.cleanupCancel": {
43700
+ capName: "storage-migration",
43701
+ capScope: "system",
43702
+ addonId: null,
43703
+ access: "create"
43704
+ },
43705
+ "storageMigration.cleanupStart": {
43706
+ capName: "storage-migration",
43707
+ capScope: "system",
43708
+ addonId: null,
43709
+ access: "create"
43710
+ },
43711
+ "storageMigration.cleanupStatus": {
43712
+ capName: "storage-migration",
43713
+ capScope: "system",
43714
+ addonId: null,
43715
+ access: "view"
43716
+ },
43593
43717
  "storageMigration.drain": {
43594
43718
  capName: "storage-migration",
43595
43719
  capScope: "system",
43596
43720
  addonId: null,
43597
43721
  access: "create"
43598
43722
  },
43723
+ "storageMigration.history": {
43724
+ capName: "storage-migration",
43725
+ capScope: "system",
43726
+ addonId: null,
43727
+ access: "view"
43728
+ },
43599
43729
  "storageMigration.movers": {
43600
43730
  capName: "storage-migration",
43601
43731
  capScope: "system",
@@ -45855,11 +45985,6 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
45855
45985
  form: "single",
45856
45986
  optional: true
45857
45987
  }],
45858
- "pipelineAnalytics.getGroup": [{
45859
- name: "deviceId",
45860
- form: "single",
45861
- optional: false
45862
- }],
45863
45988
  "pipelineAnalytics.getKeyEvents": [{
45864
45989
  name: "deviceId",
45865
45990
  form: "single",
@@ -45925,11 +46050,6 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
45925
46050
  form: "single",
45926
46051
  optional: false
45927
46052
  }],
45928
- "pipelineAnalytics.listGroups": [{
45929
- name: "deviceIds",
45930
- form: "array",
45931
- optional: false
45932
- }],
45933
46053
  "pipelineAnalytics.listOpsLog": [{
45934
46054
  name: "deviceId",
45935
46055
  form: "single",
@@ -46345,6 +46465,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
46345
46465
  form: "single",
46346
46466
  optional: false
46347
46467
  }],
46468
+ "recording.setDevicePlacement": [{
46469
+ name: "deviceId",
46470
+ form: "single",
46471
+ optional: false
46472
+ }],
46348
46473
  "recording.startStorageMigrationMove": [{
46349
46474
  name: "deviceId",
46350
46475
  form: "single",
@@ -46816,6 +46941,7 @@ var SYSTEM_SCOPE_DEVICE_METHODS = [
46816
46941
  "recording.renderGif",
46817
46942
  "recording.rescanStorage",
46818
46943
  "recording.setDeviceConfig",
46944
+ "recording.setDevicePlacement",
46819
46945
  "recording.startStorageMigrationMove",
46820
46946
  "recordingExport.createExport",
46821
46947
  "recordingExport.listExports",
@@ -47451,6 +47577,7 @@ function createSystemProxy(api) {
47451
47577
  listLocations: (input) => dispatch("deviceManager", "listLocations", "query", input),
47452
47578
  addLocation: (input) => dispatch("deviceManager", "addLocation", "mutation", input),
47453
47579
  removeLocation: (input) => dispatch("deviceManager", "removeLocation", "mutation", input),
47580
+ renameLocation: (input) => dispatch("deviceManager", "renameLocation", "mutation", input),
47454
47581
  listPersistedByAddon: (input) => dispatch("deviceManager", "listPersistedByAddon", "query", input),
47455
47582
  listAll: (input) => dispatch("deviceManager", "listAll", "query", input),
47456
47583
  getChildren: (input) => dispatch("deviceManager", "getChildren", "query", input),
@@ -47744,7 +47871,9 @@ function createSystemProxy(api) {
47744
47871
  reconcileLedgerAgainstDisk: (input) => dispatch("recording", "reconcileLedgerAgainstDisk", "mutation", input),
47745
47872
  cancelRelocateJob: (input) => dispatch("recording", "cancelRelocateJob", "mutation", input),
47746
47873
  planStorageRebalance: (input) => dispatch("recording", "planStorageRebalance", "query", input),
47747
- startStorageRebalance: (input) => dispatch("recording", "startStorageRebalance", "mutation", input)
47874
+ startStorageRebalance: (input) => dispatch("recording", "startStorageRebalance", "mutation", input),
47875
+ getPlacement: (input) => dispatch("recording", "getPlacement", "query", input),
47876
+ setDevicePlacement: (input) => dispatch("recording", "setDevicePlacement", "mutation", input)
47748
47877
  },
47749
47878
  recordingExport: {
47750
47879
  createExport: (input) => dispatch("recordingExport", "createExport", "mutation", input),
@@ -47808,7 +47937,11 @@ function createSystemProxy(api) {
47808
47937
  cancel: (input) => dispatch("storageMigration", "cancel", "mutation", input),
47809
47938
  movers: (input) => dispatch("storageMigration", "movers", "query", input),
47810
47939
  residue: (input) => dispatch("storageMigration", "residue", "query", input),
47811
- drain: (input) => dispatch("storageMigration", "drain", "mutation", input)
47940
+ drain: (input) => dispatch("storageMigration", "drain", "mutation", input),
47941
+ cleanupStart: (input) => dispatch("storageMigration", "cleanupStart", "mutation", input),
47942
+ cleanupStatus: (input) => dispatch("storageMigration", "cleanupStatus", "query", input),
47943
+ cleanupCancel: (input) => dispatch("storageMigration", "cleanupCancel", "mutation", input),
47944
+ history: (input) => dispatch("storageMigration", "history", "query", input)
47812
47945
  },
47813
47946
  streamBroker: {
47814
47947
  fetchEventMedia: (input) => dispatch("streamBroker", "fetchEventMedia", "mutation", input),
@@ -51884,9 +52017,6 @@ exports.AlertSeveritySchema = AlertSeveritySchema;
51884
52017
  exports.AlertSourceSchema = AlertSourceSchema;
51885
52018
  exports.AlertStatusSchema = AlertStatusSchema;
51886
52019
  exports.AmbientLightSensorStatusSchema = AmbientLightSensorStatusSchema;
51887
- exports.AnalyticsGroupDetailSchema = AnalyticsGroupDetailSchema;
51888
- exports.AnalyticsGroupMemberSchema = AnalyticsGroupMemberSchema;
51889
- exports.AnalyticsGroupRecordSchema = AnalyticsGroupRecordSchema;
51890
52020
  exports.ApiKeyRecordSchema = ApiKeyRecordSchema;
51891
52021
  exports.ApiKeySummarySchema = ApiKeySummarySchema;
51892
52022
  exports.ArchiveEntrySchema = ArchiveEntrySchema;
@@ -52251,8 +52381,6 @@ exports.LedgerWalkSkipCountsSchema = LedgerWalkSkipCountsSchema;
52251
52381
  exports.LedgerWalkSkipReasonSchema = LedgerWalkSkipReasonSchema;
52252
52382
  exports.LinkedDeviceSchema = LinkedDeviceSchema;
52253
52383
  exports.LinkedDevicesModeSchema = LinkedDevicesModeSchema;
52254
- exports.ListGroupsPageSchema = ListGroupsPageSchema;
52255
- exports.ListGroupsQueryInput = ListGroupsQueryInput;
52256
52384
  exports.LlmDefaultSchema = LlmDefaultSchema;
52257
52385
  exports.LlmDefaultSelectorSchema = LlmDefaultSelectorSchema;
52258
52386
  exports.LlmDownloadProgressSchema = LlmDownloadProgressSchema;
@@ -52715,6 +52843,10 @@ exports.StorageBeginDownloadInputSchema = BeginDownloadInputSchema;
52715
52843
  exports.StorageBeginDownloadResultSchema = BeginDownloadResultSchema;
52716
52844
  exports.StorageBeginUploadInputSchema = BeginUploadInputSchema;
52717
52845
  exports.StorageBeginUploadResultSchema = BeginUploadResultSchema;
52846
+ exports.StorageCleanupInputSchema = StorageCleanupInputSchema;
52847
+ exports.StorageCleanupJobSchema = StorageCleanupJobSchema;
52848
+ exports.StorageCleanupPhaseSchema = StorageCleanupPhaseSchema;
52849
+ exports.StorageCleanupStatusInputSchema = StorageCleanupStatusInputSchema;
52718
52850
  exports.StorageEndDownloadInputSchema = EndDownloadInputSchema;
52719
52851
  exports.StorageFinalizeUploadInputSchema = FinalizeUploadInputSchema;
52720
52852
  exports.StorageLocationDeclarationSchema = StorageLocationDeclarationSchema;
@@ -52740,6 +52872,7 @@ exports.StorageMigrationParticipantSchema = StorageMigrationParticipantSchema;
52740
52872
  exports.StorageMigrationPhaseSchema = StorageMigrationPhaseSchema;
52741
52873
  exports.StorageMigrationPlanSchema = StorageMigrationPlanSchema;
52742
52874
  exports.StorageMigrationResidueSchema = StorageMigrationResidueSchema;
52875
+ exports.StorageMigrationSourcesSchema = StorageMigrationSourcesSchema;
52743
52876
  exports.StorageProviderInfoSchema = ProviderInfoSchema;
52744
52877
  exports.StorageReadChunkInputSchema = ReadChunkInputSchema;
52745
52878
  exports.StorageTestLocationResultSchema = TestLocationResultSchema;