@camstack/addon-model-studio 1.1.67 → 1.1.69

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-Db0aScD3.mjs → MotionZonesSettings-2nfRmzek.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-cR3N_ytC.mjs → PrivacyMaskSettings-D1HwI9im.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-DXVHDH0R.mjs → SceneMonitorEditor-CTulO4dx.mjs} +3 -3
  4. package/dist/_stub.js +11 -11
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-C8IQbCbH.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-B8CCq8Dr.mjs} +4 -4
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D3nnR9M4.mjs +26 -0
  7. package/dist/{hostInit-CkaBFfbc.mjs → hostInit-DqW2OoG4.mjs} +3 -3
  8. package/dist/model-studio.addon.js +173 -76
  9. package/dist/model-studio.addon.mjs +173 -76
  10. package/dist/{player-overlays-lBkRCWTl.mjs → player-overlays-Di5vy9rE.mjs} +1 -1
  11. package/dist/remoteEntry.js +1 -1
  12. package/dist/{responsive-yDg54Ukl.mjs → responsive-BNKIZ0zt.mjs} +1 -1
  13. package/dist/{square-CRbl_bVG.mjs → square-CGsVW-Ek.mjs} +1 -1
  14. package/dist/{trash-2-6w-9eKkh.mjs → trash-2-BK9nZVTj.mjs} +1 -1
  15. package/dist/{use-device-snapshot-czNca4dI.mjs → use-device-snapshot-B0oXfamV.mjs} +1 -1
  16. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-C0fXheVA.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CPlzO0uZ.mjs} +1 -1
  17. package/package.json +1 -1
  18. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BCT-V4ES.mjs +0 -26
@@ -8663,6 +8663,13 @@ var MediaRelocateModeSchema = _enum([
8663
8663
  ]);
8664
8664
  var RelocateMediaInputSchema = object({
8665
8665
  toLocationId: string(),
8666
+ /**
8667
+ * Restrict the pass to rows currently on this location. Omitted / `'*'` =
8668
+ * every row that is not already on `toLocationId` (the historical
8669
+ * behaviour). A named source is what a from→to migration needs: without it
8670
+ * "move events off disk 2" also emptied disk 1.
8671
+ */
8672
+ fromLocationId: string().optional(),
8666
8673
  throttleMbps: number().min(1).max(1e3).optional(),
8667
8674
  /** Omitted = `move`, the pre-existing behaviour. */
8668
8675
  mode: MediaRelocateModeSchema.optional()
@@ -8730,6 +8737,19 @@ var StorageMigrationDestinationsSchema = object({
8730
8737
  galleryMedia: string().min(1).optional()
8731
8738
  }).refine((value) => Object.keys(value).length > 0, { message: "select at least one storage class" });
8732
8739
  /**
8740
+ * Optional named source per class. Omitted = the class's current default
8741
+ * (the historical behaviour). A named source that is NOT the default is a
8742
+ * drain of that disk: bytes move, the default stays, and the source is
8743
+ * disabled when the move finishes.
8744
+ */
8745
+ var StorageMigrationSourcesSchema = object({
8746
+ recordings: string().min(1).optional(),
8747
+ recordingsLow: string().min(1).optional(),
8748
+ eventMedia: string().min(1).optional(),
8749
+ backups: string().min(1).optional(),
8750
+ galleryMedia: string().min(1).optional()
8751
+ }).optional();
8752
+ /**
8733
8753
  * How a migration sequences the cutover against the byte move.
8734
8754
  *
8735
8755
  * - `blocking` — the historical order: pause, move every byte, repoint,
@@ -8751,6 +8771,8 @@ var StorageMigrationModeSchema = _enum(["blocking", "nonBlocking"]);
8751
8771
  /** Shared input for planning and starting an orchestrated storage migration. */
8752
8772
  var StorageMigrationInputSchema = object({
8753
8773
  destinations: StorageMigrationDestinationsSchema,
8774
+ /** Omitted = each class's current default. */
8775
+ sources: StorageMigrationSourcesSchema,
8754
8776
  throttleMbps: number().min(1).max(1e3).optional(),
8755
8777
  /** Omitted = `blocking`, which stays the default. */
8756
8778
  mode: StorageMigrationModeSchema.optional()
@@ -8830,6 +8852,13 @@ var StorageMigrationMoveSchema = object({
8830
8852
  storageClass: StorageMigrationClassSchema,
8831
8853
  fromLocationId: string(),
8832
8854
  toLocationId: string(),
8855
+ /**
8856
+ * True when `from` was NOT the class default at plan time. The move still
8857
+ * copies bytes, but the default is left alone and the source is disabled
8858
+ * once the copy verifies. Absent on jobs planned before this field existed
8859
+ * — those jobs always repointed, which is `false`.
8860
+ */
8861
+ freezeSource: boolean().optional(),
8833
8862
  moverJobId: string().nullable(),
8834
8863
  state: RelocateJobStateSchema.nullable(),
8835
8864
  error: string().nullable(),
@@ -8843,6 +8872,7 @@ var StorageMigrationJobSchema = object({
8843
8872
  * can tell a seconds-long cutover from a thirty-hour one. */
8844
8873
  mode: StorageMigrationModeSchema,
8845
8874
  destinations: StorageMigrationDestinationsSchema,
8875
+ sources: StorageMigrationSourcesSchema,
8846
8876
  throttleMbps: number(),
8847
8877
  moves: array(StorageMigrationMoveSchema),
8848
8878
  pauseLeaseId: string().nullable(),
@@ -8868,6 +8898,7 @@ var StorageMigrationFindingSchema = object({
8868
8898
  });
8869
8899
  var StorageMigrationPlanSchema = object({
8870
8900
  destinations: StorageMigrationDestinationsSchema,
8901
+ sources: StorageMigrationSourcesSchema,
8871
8902
  /** The mode this plan was built for. A plan is only valid for its mode: the
8872
8903
  * `eventMedia` seal gate and the single-cardinality refusal both depend on
8873
8904
  * it. */
@@ -8875,7 +8906,8 @@ var StorageMigrationPlanSchema = object({
8875
8906
  moves: array(object({
8876
8907
  storageClass: StorageMigrationClassSchema,
8877
8908
  fromLocationId: string(),
8878
- toLocationId: string()
8909
+ toLocationId: string(),
8910
+ freezeSource: boolean().optional()
8879
8911
  })),
8880
8912
  findings: array(StorageMigrationFindingSchema)
8881
8913
  });
@@ -9053,10 +9085,51 @@ var LedgerWalkReportSchema = object({
9053
9085
  var RelocatableMediaCountSchema = object({ rows: number().int().nonnegative() }).nullable();
9054
9086
  var RelocatableMediaCountInputSchema = object({
9055
9087
  toLocationId: string().min(1),
9088
+ /** Restrict the count to one source; omitted / `'*'` = every non-target row. */
9089
+ fromLocationId: string().optional(),
9056
9090
  /** Omitted = `move`. */
9057
9091
  mode: MediaRelocateModeSchema.optional()
9058
9092
  });
9059
9093
  /**
9094
+ * Operator cleanup of leftover analytics rows, optional debug media, and
9095
+ * ghost ledger entries on frozen footage locations.
9096
+ *
9097
+ * A pass is tens of minutes on a standing backlog. The hub method RETURNS
9098
+ * `{ jobId }` immediately; progress is `cleanupStatus`. Awaiting the work
9099
+ * is how `addons.custom` hit the 60 s UDS deadline while reclaim continued
9100
+ * with no operator-visible status.
9101
+ */
9102
+ var StorageCleanupPhaseSchema = _enum([
9103
+ "orphans",
9104
+ "debug-media",
9105
+ "ghost-ledger",
9106
+ "done",
9107
+ "failed",
9108
+ "cancelled"
9109
+ ]);
9110
+ var StorageCleanupInputSchema = object({
9111
+ /** Also walk motion stills / track filmstrips. Off by default. */
9112
+ includeDebugMedia: boolean().optional() });
9113
+ var StorageCleanupJobSchema = object({
9114
+ jobId: string(),
9115
+ phase: StorageCleanupPhaseSchema,
9116
+ includeDebugMedia: boolean(),
9117
+ orphansReclaimed: number().int().nonnegative(),
9118
+ orphanBytesReclaimed: number().int().nonnegative(),
9119
+ debugMediaReclaimed: number().int().nonnegative(),
9120
+ debugMediaBytesReclaimed: number().int().nonnegative(),
9121
+ ghostsForgotten: number().int().nonnegative(),
9122
+ ghostBytesForgotten: number().int().nonnegative(),
9123
+ /** Short operator-facing line: current collection, pass, or location. */
9124
+ detail: string().nullable(),
9125
+ cancelRequested: boolean(),
9126
+ startedAt: number(),
9127
+ updatedAt: number(),
9128
+ finishedAt: number().nullable(),
9129
+ error: string().nullable()
9130
+ });
9131
+ var StorageCleanupStatusInputSchema = object({ jobId: string().optional() });
9132
+ /**
9060
9133
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
9061
9134
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
9062
9135
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -9084,11 +9157,10 @@ var StorageLocationTypeSchema = string().regex(/^[a-z][a-zA-Z0-9-]*$/);
9084
9157
  * The default location for a type uses `id === <type>:default` by
9085
9158
  * convention (the bare type ref like `'backups'` resolves to it).
9086
9159
  *
9087
- * `isSystem: true` marks a location as orchestrator-seeded and
9088
- * undeletable. The bootstrap-installed defaults (one per type) carry
9089
- * this flag; operator-added locations don't. Editing the config of
9090
- * a system location is allowed (path migration, provider swap) but
9091
- * deleting it is rejected at the cap level.
9160
+ * `isSystem` is a legacy persisted flag. Seed still creates the initial
9161
+ * `<type>:default` locations; the flag is no longer a lock, a badge, or a
9162
+ * prune selector. New writes leave it false. Deletion is gated on uniqueness
9163
+ * / last-enabled, not on this bit.
9092
9164
  */
9093
9165
  var StorageLocationSchema = object({
9094
9166
  id: string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/),
@@ -13406,6 +13478,12 @@ method(object({
13406
13478
  }), _void(), {
13407
13479
  kind: "mutation",
13408
13480
  auth: "admin"
13481
+ }), method(object({
13482
+ from: string(),
13483
+ to: string()
13484
+ }), object({ moved: number() }), {
13485
+ kind: "mutation",
13486
+ auth: "admin"
13409
13487
  }), method(object({
13410
13488
  deviceId: number(),
13411
13489
  disabled: boolean()
@@ -19342,46 +19420,6 @@ var RecentTracksPageSchema = object({
19342
19420
  /** Cursor for the next page, or null when this page is the last. */
19343
19421
  nextCursor: string().nullable()
19344
19422
  });
19345
- var LIST_GROUPS_DEFAULT_LIMIT = 40;
19346
- var LIST_GROUPS_MAX_LIMIT = 100;
19347
- var AnalyticsGroupRecordSchema = object({
19348
- id: string(),
19349
- deviceId: number().int(),
19350
- openedAt: number().int(),
19351
- closedAt: number().int(),
19352
- timestamp: number().int(),
19353
- memberCount: number().int(),
19354
- memberTrackIds: array(string()).readonly(),
19355
- className: string(),
19356
- classes: array(string()).readonly(),
19357
- /** Relative event-media path, or null when the group has no picture yet. */
19358
- mediaUrl: string().nullable(),
19359
- singleton: boolean()
19360
- });
19361
- var AnalyticsGroupMemberSchema = object({
19362
- trackId: string(),
19363
- deviceId: number().int(),
19364
- className: string(),
19365
- firstSeen: number().int(),
19366
- lastSeen: number().int(),
19367
- mediaUrl: string().nullable()
19368
- });
19369
- var AnalyticsGroupDetailSchema = AnalyticsGroupRecordSchema.extend({ members: array(AnalyticsGroupMemberSchema).readonly() });
19370
- var ListGroupsQueryInput = object({
19371
- /** Devices to merge. An empty array yields `{ groups: [], nextCursor: null }`. */
19372
- deviceIds: array(number()),
19373
- /** Window lower bound on `closedAt` (inclusive). */
19374
- since: number().optional(),
19375
- /** Window upper bound on `openedAt` (inclusive). */
19376
- until: number().optional(),
19377
- limit: number().int().min(1).max(LIST_GROUPS_MAX_LIMIT).default(LIST_GROUPS_DEFAULT_LIMIT),
19378
- /** Opaque continuation cursor from a previous page's `nextCursor`. */
19379
- cursor: string().optional()
19380
- });
19381
- var ListGroupsPageSchema = object({
19382
- groups: array(AnalyticsGroupRecordSchema).readonly(),
19383
- nextCursor: string().nullable()
19384
- });
19385
19423
  var KEY_EVENTS_DEFAULT_LIMIT = 50;
19386
19424
  var KEY_EVENTS_MAX_LIMIT = 200;
19387
19425
  var KeyEventQueryInput = object({
@@ -19485,9 +19523,7 @@ var TrackCascadeCountsSchema = object({
19485
19523
  /** Unassigned plate reads removed (best-effort; plate leg deferred to plate-intelligence). */
19486
19524
  plates: number().int(),
19487
19525
  /** Per-track CLIP search vectors removed (best-effort). */
19488
- embeddings: number().int(),
19489
- /** Group membership + group rows removed with their last member (best-effort). */
19490
- groups: number().int()
19526
+ embeddings: number().int()
19491
19527
  });
19492
19528
  /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
19493
19529
  var DiskReconcileCountsSchema = object({
@@ -19736,10 +19772,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19736
19772
  * stationary registry). Default false: the timeline lists passages,
19737
19773
  * not parking records (operator decision, 2026-08-15). */
19738
19774
  includeStationary: boolean().optional()
19739
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(ListGroupsQueryInput, ListGroupsPageSchema), method(object({
19740
- deviceId: number(),
19741
- groupId: string().min(1)
19742
- }), AnalyticsGroupDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19775
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
19743
19776
  kind: "mutation",
19744
19777
  auth: "admin"
19745
19778
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -21815,7 +21848,13 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
21815
21848
  }), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string() }), {
21816
21849
  kind: "mutation",
21817
21850
  auth: "admin"
21818
- });
21851
+ }), method(StorageCleanupInputSchema, object({ jobId: string() }), {
21852
+ kind: "mutation",
21853
+ auth: "admin"
21854
+ }), method(StorageCleanupStatusInputSchema, StorageCleanupJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
21855
+ kind: "mutation",
21856
+ auth: "admin"
21857
+ }), method(object({}), array(StorageMigrationJobSchema).readonly(), { auth: "admin" });
21819
21858
  var ProviderInfoSchema = discriminatedUnion("shouldSaveDiskSpace", [object({
21820
21859
  providerId: string().min(1),
21821
21860
  displayName: string().min(1),
@@ -27193,6 +27232,33 @@ var RecordingRebalanceInputSchema = object({
27193
27232
  minMoveGb: number().min(0).optional()
27194
27233
  });
27195
27234
  /**
27235
+ * Operator-facing placement of one camera onto a recordings location.
27236
+ *
27237
+ * `pinLocationId` is the operator instruction: a location id, or `null` for
27238
+ * Auto (the planner may move this camera). `locationId` is where high/mid
27239
+ * currently write — the plan, which may disagree with the pin when Auto.
27240
+ */
27241
+ var RecordingDevicePlacementSchema = object({
27242
+ deviceId: number().int(),
27243
+ profile: string(),
27244
+ locationId: string()
27245
+ });
27246
+ var RecordingDevicePinSchema = object({
27247
+ deviceId: number().int(),
27248
+ /** Recordings-class location this camera is pinned to. */
27249
+ locationId: string()
27250
+ });
27251
+ var RecordingPlacementViewSchema = object({
27252
+ assignments: array(RecordingDevicePlacementSchema),
27253
+ pins: array(RecordingDevicePinSchema),
27254
+ defaultLocations: record(string(), string())
27255
+ });
27256
+ var RecordingSetDevicePlacementInputSchema = object({
27257
+ deviceId: number().int(),
27258
+ /** `null` = Auto. Otherwise a `recordings:*` location id. */
27259
+ locationId: string().nullable()
27260
+ });
27261
+ /**
27196
27262
  * Result of locating footage at a wall-clock instant for one device/profile.
27197
27263
  * `segment` carries the covering segment's window; `gap` reports the forward
27198
27264
  * nearest covered edge (`null` past the end of footage / when none exists)
@@ -27418,6 +27484,12 @@ method(object({
27418
27484
  }), method(RecordingRebalanceInputSchema, RecordingRebalancePlanSchema, {
27419
27485
  kind: "mutation",
27420
27486
  auth: "admin"
27487
+ }), method(object({}), RecordingPlacementViewSchema, {
27488
+ kind: "query",
27489
+ auth: "admin"
27490
+ }), method(RecordingSetDevicePlacementInputSchema, object({ ok: literal(true) }), {
27491
+ kind: "mutation",
27492
+ auth: "admin"
27421
27493
  });
27422
27494
  /**
27423
27495
  * `recording-export` cap — render a footage time range into a single downloadable
@@ -30788,6 +30860,12 @@ Object.freeze({
30788
30860
  addonId: null,
30789
30861
  access: "delete"
30790
30862
  },
30863
+ "deviceManager.renameLocation": {
30864
+ capName: "device-manager",
30865
+ capScope: "system",
30866
+ addonId: null,
30867
+ access: "create"
30868
+ },
30791
30869
  "deviceManager.runDeviceAction": {
30792
30870
  capName: "device-manager",
30793
30871
  capScope: "system",
@@ -32480,12 +32558,6 @@ Object.freeze({
32480
32558
  addonId: null,
32481
32559
  access: "view"
32482
32560
  },
32483
- "pipelineAnalytics.getGroup": {
32484
- capName: "pipeline-analytics",
32485
- capScope: "device",
32486
- addonId: null,
32487
- access: "view"
32488
- },
32489
32561
  "pipelineAnalytics.getKeyEvents": {
32490
32562
  capName: "pipeline-analytics",
32491
32563
  capScope: "device",
@@ -32588,12 +32660,6 @@ Object.freeze({
32588
32660
  addonId: null,
32589
32661
  access: "view"
32590
32662
  },
32591
- "pipelineAnalytics.listGroups": {
32592
- capName: "pipeline-analytics",
32593
- capScope: "device",
32594
- addonId: null,
32595
- access: "view"
32596
- },
32597
32663
  "pipelineAnalytics.listOpsLog": {
32598
32664
  capName: "pipeline-analytics",
32599
32665
  capScope: "device",
@@ -33608,6 +33674,12 @@ Object.freeze({
33608
33674
  addonId: null,
33609
33675
  access: "view"
33610
33676
  },
33677
+ "recording.getPlacement": {
33678
+ capName: "recording",
33679
+ capScope: "system",
33680
+ addonId: null,
33681
+ access: "view"
33682
+ },
33611
33683
  "recording.getPlaybackManifest": {
33612
33684
  capName: "recording",
33613
33685
  capScope: "system",
@@ -33734,6 +33806,12 @@ Object.freeze({
33734
33806
  addonId: null,
33735
33807
  access: "create"
33736
33808
  },
33809
+ "recording.setDevicePlacement": {
33810
+ capName: "recording",
33811
+ capScope: "system",
33812
+ addonId: null,
33813
+ access: "create"
33814
+ },
33737
33815
  "recording.startStorageMigrationMove": {
33738
33816
  capName: "recording",
33739
33817
  capScope: "system",
@@ -34178,12 +34256,36 @@ Object.freeze({
34178
34256
  addonId: null,
34179
34257
  access: "create"
34180
34258
  },
34259
+ "storageMigration.cleanupCancel": {
34260
+ capName: "storage-migration",
34261
+ capScope: "system",
34262
+ addonId: null,
34263
+ access: "create"
34264
+ },
34265
+ "storageMigration.cleanupStart": {
34266
+ capName: "storage-migration",
34267
+ capScope: "system",
34268
+ addonId: null,
34269
+ access: "create"
34270
+ },
34271
+ "storageMigration.cleanupStatus": {
34272
+ capName: "storage-migration",
34273
+ capScope: "system",
34274
+ addonId: null,
34275
+ access: "view"
34276
+ },
34181
34277
  "storageMigration.drain": {
34182
34278
  capName: "storage-migration",
34183
34279
  capScope: "system",
34184
34280
  addonId: null,
34185
34281
  access: "create"
34186
34282
  },
34283
+ "storageMigration.history": {
34284
+ capName: "storage-migration",
34285
+ capScope: "system",
34286
+ addonId: null,
34287
+ access: "view"
34288
+ },
34187
34289
  "storageMigration.movers": {
34188
34290
  capName: "storage-migration",
34189
34291
  capScope: "system",
@@ -36180,11 +36282,6 @@ Object.freeze({
36180
36282
  form: "single",
36181
36283
  optional: true
36182
36284
  }],
36183
- "pipelineAnalytics.getGroup": [{
36184
- name: "deviceId",
36185
- form: "single",
36186
- optional: false
36187
- }],
36188
36285
  "pipelineAnalytics.getKeyEvents": [{
36189
36286
  name: "deviceId",
36190
36287
  form: "single",
@@ -36250,11 +36347,6 @@ Object.freeze({
36250
36347
  form: "single",
36251
36348
  optional: false
36252
36349
  }],
36253
- "pipelineAnalytics.listGroups": [{
36254
- name: "deviceIds",
36255
- form: "array",
36256
- optional: false
36257
- }],
36258
36350
  "pipelineAnalytics.listOpsLog": [{
36259
36351
  name: "deviceId",
36260
36352
  form: "single",
@@ -36670,6 +36762,11 @@ Object.freeze({
36670
36762
  form: "single",
36671
36763
  optional: false
36672
36764
  }],
36765
+ "recording.setDevicePlacement": [{
36766
+ name: "deviceId",
36767
+ form: "single",
36768
+ optional: false
36769
+ }],
36673
36770
  "recording.startStorageMigrationMove": [{
36674
36771
  name: "deviceId",
36675
36772
  form: "single",