@camstack/addon-post-analysis 1.1.31 → 1.1.33

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.
@@ -1,4 +1,4 @@
1
- //#region ../types/dist/event-category-H4AVePnn.mjs
1
+ //#region ../types/dist/event-category-D4HJq7Mw.mjs
2
2
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
3
3
  EventCategory["SystemBoot"] = "system.boot";
4
4
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -151,6 +151,11 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
151
151
  /** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
152
152
  * thumb is a scrub gap the recorder's keyframe backfill covers. */
153
153
  EventCategory["RecordingThumbSampled"] = "recording.thumb-sampled";
154
+ /** Export render progress (0–100). Telemetry (D8): a lost tick is a stale
155
+ * progress bar the client reconciles via `recordingExport.getExport`. */
156
+ EventCategory["RecordingExportProgress"] = "recording.export.progress";
157
+ EventCategory["RecordingExportCompleted"] = "recording.export.completed";
158
+ EventCategory["RecordingExportFailed"] = "recording.export.failed";
154
159
  EventCategory["DetectionEvent"] = "detection.event";
155
160
  EventCategory["SessionTrackNew"] = "session.track.new";
156
161
  EventCategory["SessionTrackExpired"] = "session.track.expired";
@@ -440,6 +445,25 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
440
445
  */
441
446
  EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
442
447
  /**
448
+ * Fired by `addon-post-analysis` when a package-drop is confirmed inside
449
+ * a package zone — a newly-appeared stationary object of a package class
450
+ * that cleared the class / zone / dwell / size gates. Payload:
451
+ * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
452
+ * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
453
+ * Telemetry (D8): the durable record is the `package-events` store row;
454
+ * this bus topic drives notifier rules + live UI. See
455
+ * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
456
+ */
457
+ EventCategory["PipelineAnalyticsPackageDelivered"] = "pipeline-analytics.package-delivered";
458
+ /**
459
+ * Fired by `addon-post-analysis` when a previously-delivered package
460
+ * leaves its zone (the stationary entry departed — moved or swept).
461
+ * Payload: `PipelineAnalyticsPackagePickedUpPayload` carrying
462
+ * `{ deviceId, entryId, deliveredEventId, className, timestamp }`.
463
+ * Telemetry (D8). See package-zones-design §5.2.
464
+ */
465
+ EventCategory["PipelineAnalyticsPackagePickedUp"] = "pipeline-analytics.package-picked-up";
466
+ /**
443
467
  * Fired by `addon-post-analysis` whenever a gallery face row changes:
444
468
  * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
445
469
  * `'unassigned'` its identity link changed, `'deleted'` the row was
@@ -5178,6 +5202,25 @@ function _instanceof(cls, params = {}) {
5178
5202
  };
5179
5203
  return inst;
5180
5204
  }
5205
+ //#endregion
5206
+ //#region ../../node_modules/zod/v4/classic/compat.js
5207
+ /** @deprecated Use the raw string literal codes instead, e.g. "invalid_type". */
5208
+ var ZodIssueCode = {
5209
+ invalid_type: "invalid_type",
5210
+ too_big: "too_big",
5211
+ too_small: "too_small",
5212
+ invalid_format: "invalid_format",
5213
+ not_multiple_of: "not_multiple_of",
5214
+ unrecognized_keys: "unrecognized_keys",
5215
+ invalid_union: "invalid_union",
5216
+ invalid_key: "invalid_key",
5217
+ invalid_element: "invalid_element",
5218
+ invalid_value: "invalid_value",
5219
+ custom: "custom"
5220
+ };
5221
+ /** @deprecated Do not use. Stub definition, only included for zod-to-json-schema compatibility. */
5222
+ var ZodFirstPartyTypeKind;
5223
+ ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5181
5224
  Object.fromEntries([
5182
5225
  {
5183
5226
  id: "overview",
@@ -7251,6 +7294,24 @@ var RecordingRetentionSchema = object({
7251
7294
  maxSizeGb: number().min(0).optional()
7252
7295
  });
7253
7296
  /**
7297
+ * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7298
+ * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7299
+ * previews at. Five graduated steps; absent on a config = `standard` (the
7300
+ * shipped default, matching `sheet-geometry`/`sheet-composer`).
7301
+ *
7302
+ * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7303
+ * Each window's index sidecar carries its own tile dims, so a camera whose
7304
+ * preset changed over time renders every historical window at the dims it was
7305
+ * written with.
7306
+ */
7307
+ var ScrubThumbnailPresetSchema = _enum([
7308
+ "minimal",
7309
+ "low",
7310
+ "standard",
7311
+ "high",
7312
+ "max"
7313
+ ]);
7314
+ /**
7254
7315
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7255
7316
  *
7256
7317
  * `mode` is the authoritative storage choice; `schedule`/`triggers`/`pre`/`post`
@@ -7287,7 +7348,14 @@ var RecordingConfigSchema = object({
7287
7348
  * derived into bands once via `migrateConfigToBands`.
7288
7349
  */
7289
7350
  bands: array(RecordingBandSchema).optional(),
7290
- retention: RecordingRetentionSchema.optional()
7351
+ retention: RecordingRetentionSchema.optional(),
7352
+ /**
7353
+ * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7354
+ * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7355
+ * windows only — existing sheets are immutable, and each window's index
7356
+ * carries its own tile dims so mixed-preset history renders correctly.
7357
+ */
7358
+ scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7291
7359
  });
7292
7360
  /**
7293
7361
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -12664,7 +12732,11 @@ array(ZoneRuleSchema).readonly();
12664
12732
  * Extend the enum here when a new gating consumer comes online (audio
12665
12733
  * gating, alert filtering, …) — no other surface needs to change.
12666
12734
  */
12667
- var ZoneRuleStageEnum = _enum(["motion", "detection"]);
12735
+ var ZoneRuleStageEnum = _enum([
12736
+ "motion",
12737
+ "detection",
12738
+ "package"
12739
+ ]);
12668
12740
  DeviceType.Camera, method(object({
12669
12741
  deviceId: number(),
12670
12742
  stage: ZoneRuleStageEnum
@@ -12677,7 +12749,8 @@ DeviceType.Camera, method(object({
12677
12749
  auth: "admin"
12678
12750
  }), object({
12679
12751
  motion: array(ZoneRuleSchema).readonly(),
12680
- detection: array(ZoneRuleSchema).readonly()
12752
+ detection: array(ZoneRuleSchema).readonly(),
12753
+ package: array(ZoneRuleSchema).readonly()
12681
12754
  });
12682
12755
  var ProviderStatusSchema = object({
12683
12756
  connected: boolean(),
@@ -15876,6 +15949,7 @@ var EventKindIconSchema = _enum([
15876
15949
  "smoke",
15877
15950
  "water",
15878
15951
  "button",
15952
+ "package",
15879
15953
  "generic"
15880
15954
  ]);
15881
15955
  var EventKindCategorySchema = _enum([
@@ -15883,7 +15957,8 @@ var EventKindCategorySchema = _enum([
15883
15957
  "audio",
15884
15958
  "detection",
15885
15959
  "sensor",
15886
- "custom"
15960
+ "custom",
15961
+ "package"
15887
15962
  ]);
15888
15963
  var EventKindDescriptorSchema = object({
15889
15964
  /** Stable kind id (e.g. 'motion', 'person', 'contact'). */
@@ -19774,6 +19849,108 @@ method(object({
19774
19849
  auth: "admin"
19775
19850
  });
19776
19851
  /**
19852
+ * `recordingExport` cap — render a footage time range into a single downloadable
19853
+ * MP4 (regular / accelerated / decelerated / timelapse, ± audio), kept for a
19854
+ * bounded lifetime with a durable history, auto-expiry, and optional
19855
+ * delete-after-download.
19856
+ *
19857
+ * Like `recording` this is a `scope:'system', mode:'singleton'` cap: the
19858
+ * recorder self-gates so exactly ONE node (the designated `recordingNodeId`,
19859
+ * default `hub`) registers it. Device-scoped methods carry `deviceId` in their
19860
+ * input and dispatch to that single provider; the render runs on the node that
19861
+ * owns the footage (no cross-node segment transfer). Download rides the
19862
+ * framework addon data-plane. State persists in a DurableState blob (NOT
19863
+ * SQLite); history rows survive file deletion for audit.
19864
+ */
19865
+ /** Playback-speed multiplier for the render (1 = realtime). */
19866
+ var ExportSpeedSchema = number().min(.25).max(32);
19867
+ /** Timelapse cadence — sample one source frame per `everyMs`, output at `outputFps`. */
19868
+ var ExportTimelapseSchema = object({
19869
+ everyMs: number().int().positive(),
19870
+ outputFps: number().int().min(1).max(60).optional()
19871
+ });
19872
+ /**
19873
+ * Render options. `speed` and `timelapse` are mutually exclusive. `includeAudio`
19874
+ * is honoured only for a realtime-ish speed (0.5–2×); timelapse is always
19875
+ * silent. `maxLifeMs` bounds how long the finished file is kept;
19876
+ * `deleteAfterDownload` removes it shortly after the first complete download.
19877
+ */
19878
+ var ExportOptionsSchema = object({
19879
+ speed: ExportSpeedSchema.optional(),
19880
+ timelapse: ExportTimelapseSchema.optional(),
19881
+ includeAudio: boolean(),
19882
+ maxLifeMs: number().int().positive(),
19883
+ deleteAfterDownload: boolean(),
19884
+ title: string().max(200).optional()
19885
+ }).superRefine((v, ctx) => {
19886
+ if (v.speed !== void 0 && v.timelapse !== void 0) ctx.addIssue({
19887
+ code: ZodIssueCode.custom,
19888
+ message: "speed and timelapse are mutually exclusive",
19889
+ path: ["timelapse"]
19890
+ });
19891
+ });
19892
+ var ExportStateSchema = _enum([
19893
+ "queued",
19894
+ "rendering",
19895
+ "ready",
19896
+ "failed",
19897
+ "expired",
19898
+ "deleted"
19899
+ ]);
19900
+ /** One export job / history row. */
19901
+ var ExportRecordSchema = object({
19902
+ id: string(),
19903
+ deviceId: number(),
19904
+ profile: string(),
19905
+ fromMs: number(),
19906
+ toMs: number(),
19907
+ options: ExportOptionsSchema,
19908
+ state: ExportStateSchema,
19909
+ /** 0–100 while rendering; null otherwise. */
19910
+ progressPct: number().nullable(),
19911
+ /** File size once ready; null before. */
19912
+ fileBytes: number().nullable(),
19913
+ expiresAt: number(),
19914
+ deleteAfterDownload: boolean(),
19915
+ /** Epoch of the first complete download; null until then. */
19916
+ downloadedAt: number().nullable(),
19917
+ createdAt: number(),
19918
+ /** User id/name that requested the export. */
19919
+ createdBy: string(),
19920
+ /** Failure reason when state is 'failed'; null otherwise. */
19921
+ error: string().nullable()
19922
+ });
19923
+ /** Candidate download URLs (LAN first, then operator extra hosts). */
19924
+ var ExportDownloadSchema = object({
19925
+ url: string(),
19926
+ endpoints: array(string())
19927
+ });
19928
+ method(object({
19929
+ deviceId: number(),
19930
+ profile: string(),
19931
+ fromMs: number(),
19932
+ toMs: number(),
19933
+ options: ExportOptionsSchema
19934
+ }), ExportRecordSchema, {
19935
+ kind: "mutation",
19936
+ auth: "protected"
19937
+ }), method(object({ deviceId: number().optional() }), array(ExportRecordSchema), {
19938
+ kind: "query",
19939
+ auth: "protected"
19940
+ }), method(object({ exportId: string() }), ExportRecordSchema, {
19941
+ kind: "query",
19942
+ auth: "protected"
19943
+ }), method(object({ exportId: string() }), ExportRecordSchema, {
19944
+ kind: "mutation",
19945
+ auth: "protected"
19946
+ }), method(object({ exportId: string() }), ExportRecordSchema, {
19947
+ kind: "mutation",
19948
+ auth: "protected"
19949
+ }), method(object({ exportId: string() }), ExportDownloadSchema, {
19950
+ kind: "query",
19951
+ auth: "protected"
19952
+ });
19953
+ /**
19777
19954
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
19778
19955
  * payload the (legacy) push `streamBroker.publishCameraStream` carried, minus
19779
19956
  * `deviceId`.
@@ -23697,6 +23874,42 @@ Object.freeze({
23697
23874
  addonId: null,
23698
23875
  access: "create"
23699
23876
  },
23877
+ "recordingExport.cancelExport": {
23878
+ capName: "recordingExport",
23879
+ capScope: "system",
23880
+ addonId: null,
23881
+ access: "create"
23882
+ },
23883
+ "recordingExport.createExport": {
23884
+ capName: "recordingExport",
23885
+ capScope: "system",
23886
+ addonId: null,
23887
+ access: "create"
23888
+ },
23889
+ "recordingExport.deleteExport": {
23890
+ capName: "recordingExport",
23891
+ capScope: "system",
23892
+ addonId: null,
23893
+ access: "delete"
23894
+ },
23895
+ "recordingExport.getDownloadUrl": {
23896
+ capName: "recordingExport",
23897
+ capScope: "system",
23898
+ addonId: null,
23899
+ access: "view"
23900
+ },
23901
+ "recordingExport.getExport": {
23902
+ capName: "recordingExport",
23903
+ capScope: "system",
23904
+ addonId: null,
23905
+ access: "view"
23906
+ },
23907
+ "recordingExport.listExports": {
23908
+ capName: "recordingExport",
23909
+ capScope: "system",
23910
+ addonId: null,
23911
+ access: "view"
23912
+ },
23700
23913
  "sceneMonitor.captureReference": {
23701
23914
  capName: "scene-monitor",
23702
23915
  capScope: "device",
@@ -24856,4 +25069,4 @@ object({
24856
25069
  schemaVersion: literal(1)
24857
25070
  });
24858
25071
  //#endregion
24859
- export { EventCategory as C, string as S, createEvent as _, cosineSimilarity as a, number as b, hfModelUrl as c, plateGalleryCapability as d, videoclipsCapability as f, DeviceType as g, BaseAddon as h, audioMetricsCapability as i, nodePin as l, errMsg as m, EVENT_PAD_MS as n, embeddingEncoderCapability as o, zoneAnalyticsCapability as p, addonWidgetsSourceCapability as r, faceGalleryCapability as s, EVENT_KIND_BY_CAP as t, pipelineAnalyticsCapability as u, hydrateSchema as v, object as x, boolean as y };
25072
+ export { string as C, object as S, createEvent as _, cosineSimilarity as a, boolean as b, hfModelUrl as c, plateGalleryCapability as d, videoclipsCapability as f, DeviceType as g, BaseAddon as h, audioMetricsCapability as i, nodePin as l, errMsg as m, EVENT_PAD_MS as n, embeddingEncoderCapability as o, zoneAnalyticsCapability as p, addonWidgetsSourceCapability as r, faceGalleryCapability as s, EVENT_KIND_BY_CAP as t, pipelineAnalyticsCapability as u, hydrateSchema as v, EventCategory as w, number as x, array as y };
@@ -20,7 +20,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
20
20
  enumerable: true
21
21
  }) : target, mod));
22
22
  //#endregion
23
- //#region ../types/dist/event-category-H4AVePnn.mjs
23
+ //#region ../types/dist/event-category-D4HJq7Mw.mjs
24
24
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
25
25
  EventCategory["SystemBoot"] = "system.boot";
26
26
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -173,6 +173,11 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
173
173
  /** Runner-sampled scrub thumbnail (~1/5 s/camera). Telemetry (D8): a lost
174
174
  * thumb is a scrub gap the recorder's keyframe backfill covers. */
175
175
  EventCategory["RecordingThumbSampled"] = "recording.thumb-sampled";
176
+ /** Export render progress (0–100). Telemetry (D8): a lost tick is a stale
177
+ * progress bar the client reconciles via `recordingExport.getExport`. */
178
+ EventCategory["RecordingExportProgress"] = "recording.export.progress";
179
+ EventCategory["RecordingExportCompleted"] = "recording.export.completed";
180
+ EventCategory["RecordingExportFailed"] = "recording.export.failed";
176
181
  EventCategory["DetectionEvent"] = "detection.event";
177
182
  EventCategory["SessionTrackNew"] = "session.track.new";
178
183
  EventCategory["SessionTrackExpired"] = "session.track.expired";
@@ -462,6 +467,25 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
462
467
  */
463
468
  EventCategory["PipelineAnalyticsStationaryChanged"] = "pipeline-analytics.stationary-changed";
464
469
  /**
470
+ * Fired by `addon-post-analysis` when a package-drop is confirmed inside
471
+ * a package zone — a newly-appeared stationary object of a package class
472
+ * that cleared the class / zone / dwell / size gates. Payload:
473
+ * `PipelineAnalyticsPackageDeliveredPayload` carrying `{ deviceId,
474
+ * entryId, className, zoneIds, keyFrameMediaKey?, bbox, timestamp }`.
475
+ * Telemetry (D8): the durable record is the `package-events` store row;
476
+ * this bus topic drives notifier rules + live UI. See
477
+ * docs/superpowers/specs/2026-07-17-package-zones-design.md §5.1.
478
+ */
479
+ EventCategory["PipelineAnalyticsPackageDelivered"] = "pipeline-analytics.package-delivered";
480
+ /**
481
+ * Fired by `addon-post-analysis` when a previously-delivered package
482
+ * leaves its zone (the stationary entry departed — moved or swept).
483
+ * Payload: `PipelineAnalyticsPackagePickedUpPayload` carrying
484
+ * `{ deviceId, entryId, deliveredEventId, className, timestamp }`.
485
+ * Telemetry (D8). See package-zones-design §5.2.
486
+ */
487
+ EventCategory["PipelineAnalyticsPackagePickedUp"] = "pipeline-analytics.package-picked-up";
488
+ /**
465
489
  * Fired by `addon-post-analysis` whenever a gallery face row changes:
466
490
  * `kind:'buffered'` a new detected face was persisted, `'assigned'` /
467
491
  * `'unassigned'` its identity link changed, `'deleted'` the row was
@@ -5200,6 +5224,25 @@ function _instanceof(cls, params = {}) {
5200
5224
  };
5201
5225
  return inst;
5202
5226
  }
5227
+ //#endregion
5228
+ //#region ../../node_modules/zod/v4/classic/compat.js
5229
+ /** @deprecated Use the raw string literal codes instead, e.g. "invalid_type". */
5230
+ var ZodIssueCode = {
5231
+ invalid_type: "invalid_type",
5232
+ too_big: "too_big",
5233
+ too_small: "too_small",
5234
+ invalid_format: "invalid_format",
5235
+ not_multiple_of: "not_multiple_of",
5236
+ unrecognized_keys: "unrecognized_keys",
5237
+ invalid_union: "invalid_union",
5238
+ invalid_key: "invalid_key",
5239
+ invalid_element: "invalid_element",
5240
+ invalid_value: "invalid_value",
5241
+ custom: "custom"
5242
+ };
5243
+ /** @deprecated Do not use. Stub definition, only included for zod-to-json-schema compatibility. */
5244
+ var ZodFirstPartyTypeKind;
5245
+ ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5203
5246
  Object.fromEntries([
5204
5247
  {
5205
5248
  id: "overview",
@@ -7273,6 +7316,24 @@ var RecordingRetentionSchema = object({
7273
7316
  maxSizeGb: number().min(0).optional()
7274
7317
  });
7275
7318
  /**
7319
+ * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7320
+ * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7321
+ * previews at. Five graduated steps; absent on a config = `standard` (the
7322
+ * shipped default, matching `sheet-geometry`/`sheet-composer`).
7323
+ *
7324
+ * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7325
+ * Each window's index sidecar carries its own tile dims, so a camera whose
7326
+ * preset changed over time renders every historical window at the dims it was
7327
+ * written with.
7328
+ */
7329
+ var ScrubThumbnailPresetSchema = _enum([
7330
+ "minimal",
7331
+ "low",
7332
+ "standard",
7333
+ "high",
7334
+ "max"
7335
+ ]);
7336
+ /**
7276
7337
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7277
7338
  *
7278
7339
  * `mode` is the authoritative storage choice; `schedule`/`triggers`/`pre`/`post`
@@ -7309,7 +7370,14 @@ var RecordingConfigSchema = object({
7309
7370
  * derived into bands once via `migrateConfigToBands`.
7310
7371
  */
7311
7372
  bands: array(RecordingBandSchema).optional(),
7312
- retention: RecordingRetentionSchema.optional()
7373
+ retention: RecordingRetentionSchema.optional(),
7374
+ /**
7375
+ * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7376
+ * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7377
+ * windows only — existing sheets are immutable, and each window's index
7378
+ * carries its own tile dims so mixed-preset history renders correctly.
7379
+ */
7380
+ scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7313
7381
  });
7314
7382
  /**
7315
7383
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
@@ -12686,7 +12754,11 @@ array(ZoneRuleSchema).readonly();
12686
12754
  * Extend the enum here when a new gating consumer comes online (audio
12687
12755
  * gating, alert filtering, …) — no other surface needs to change.
12688
12756
  */
12689
- var ZoneRuleStageEnum = _enum(["motion", "detection"]);
12757
+ var ZoneRuleStageEnum = _enum([
12758
+ "motion",
12759
+ "detection",
12760
+ "package"
12761
+ ]);
12690
12762
  DeviceType.Camera, method(object({
12691
12763
  deviceId: number(),
12692
12764
  stage: ZoneRuleStageEnum
@@ -12699,7 +12771,8 @@ DeviceType.Camera, method(object({
12699
12771
  auth: "admin"
12700
12772
  }), object({
12701
12773
  motion: array(ZoneRuleSchema).readonly(),
12702
- detection: array(ZoneRuleSchema).readonly()
12774
+ detection: array(ZoneRuleSchema).readonly(),
12775
+ package: array(ZoneRuleSchema).readonly()
12703
12776
  });
12704
12777
  var ProviderStatusSchema = object({
12705
12778
  connected: boolean(),
@@ -15898,6 +15971,7 @@ var EventKindIconSchema = _enum([
15898
15971
  "smoke",
15899
15972
  "water",
15900
15973
  "button",
15974
+ "package",
15901
15975
  "generic"
15902
15976
  ]);
15903
15977
  var EventKindCategorySchema = _enum([
@@ -15905,7 +15979,8 @@ var EventKindCategorySchema = _enum([
15905
15979
  "audio",
15906
15980
  "detection",
15907
15981
  "sensor",
15908
- "custom"
15982
+ "custom",
15983
+ "package"
15909
15984
  ]);
15910
15985
  var EventKindDescriptorSchema = object({
15911
15986
  /** Stable kind id (e.g. 'motion', 'person', 'contact'). */
@@ -19796,6 +19871,108 @@ method(object({
19796
19871
  auth: "admin"
19797
19872
  });
19798
19873
  /**
19874
+ * `recordingExport` cap — render a footage time range into a single downloadable
19875
+ * MP4 (regular / accelerated / decelerated / timelapse, ± audio), kept for a
19876
+ * bounded lifetime with a durable history, auto-expiry, and optional
19877
+ * delete-after-download.
19878
+ *
19879
+ * Like `recording` this is a `scope:'system', mode:'singleton'` cap: the
19880
+ * recorder self-gates so exactly ONE node (the designated `recordingNodeId`,
19881
+ * default `hub`) registers it. Device-scoped methods carry `deviceId` in their
19882
+ * input and dispatch to that single provider; the render runs on the node that
19883
+ * owns the footage (no cross-node segment transfer). Download rides the
19884
+ * framework addon data-plane. State persists in a DurableState blob (NOT
19885
+ * SQLite); history rows survive file deletion for audit.
19886
+ */
19887
+ /** Playback-speed multiplier for the render (1 = realtime). */
19888
+ var ExportSpeedSchema = number().min(.25).max(32);
19889
+ /** Timelapse cadence — sample one source frame per `everyMs`, output at `outputFps`. */
19890
+ var ExportTimelapseSchema = object({
19891
+ everyMs: number().int().positive(),
19892
+ outputFps: number().int().min(1).max(60).optional()
19893
+ });
19894
+ /**
19895
+ * Render options. `speed` and `timelapse` are mutually exclusive. `includeAudio`
19896
+ * is honoured only for a realtime-ish speed (0.5–2×); timelapse is always
19897
+ * silent. `maxLifeMs` bounds how long the finished file is kept;
19898
+ * `deleteAfterDownload` removes it shortly after the first complete download.
19899
+ */
19900
+ var ExportOptionsSchema = object({
19901
+ speed: ExportSpeedSchema.optional(),
19902
+ timelapse: ExportTimelapseSchema.optional(),
19903
+ includeAudio: boolean(),
19904
+ maxLifeMs: number().int().positive(),
19905
+ deleteAfterDownload: boolean(),
19906
+ title: string().max(200).optional()
19907
+ }).superRefine((v, ctx) => {
19908
+ if (v.speed !== void 0 && v.timelapse !== void 0) ctx.addIssue({
19909
+ code: ZodIssueCode.custom,
19910
+ message: "speed and timelapse are mutually exclusive",
19911
+ path: ["timelapse"]
19912
+ });
19913
+ });
19914
+ var ExportStateSchema = _enum([
19915
+ "queued",
19916
+ "rendering",
19917
+ "ready",
19918
+ "failed",
19919
+ "expired",
19920
+ "deleted"
19921
+ ]);
19922
+ /** One export job / history row. */
19923
+ var ExportRecordSchema = object({
19924
+ id: string(),
19925
+ deviceId: number(),
19926
+ profile: string(),
19927
+ fromMs: number(),
19928
+ toMs: number(),
19929
+ options: ExportOptionsSchema,
19930
+ state: ExportStateSchema,
19931
+ /** 0–100 while rendering; null otherwise. */
19932
+ progressPct: number().nullable(),
19933
+ /** File size once ready; null before. */
19934
+ fileBytes: number().nullable(),
19935
+ expiresAt: number(),
19936
+ deleteAfterDownload: boolean(),
19937
+ /** Epoch of the first complete download; null until then. */
19938
+ downloadedAt: number().nullable(),
19939
+ createdAt: number(),
19940
+ /** User id/name that requested the export. */
19941
+ createdBy: string(),
19942
+ /** Failure reason when state is 'failed'; null otherwise. */
19943
+ error: string().nullable()
19944
+ });
19945
+ /** Candidate download URLs (LAN first, then operator extra hosts). */
19946
+ var ExportDownloadSchema = object({
19947
+ url: string(),
19948
+ endpoints: array(string())
19949
+ });
19950
+ method(object({
19951
+ deviceId: number(),
19952
+ profile: string(),
19953
+ fromMs: number(),
19954
+ toMs: number(),
19955
+ options: ExportOptionsSchema
19956
+ }), ExportRecordSchema, {
19957
+ kind: "mutation",
19958
+ auth: "protected"
19959
+ }), method(object({ deviceId: number().optional() }), array(ExportRecordSchema), {
19960
+ kind: "query",
19961
+ auth: "protected"
19962
+ }), method(object({ exportId: string() }), ExportRecordSchema, {
19963
+ kind: "query",
19964
+ auth: "protected"
19965
+ }), method(object({ exportId: string() }), ExportRecordSchema, {
19966
+ kind: "mutation",
19967
+ auth: "protected"
19968
+ }), method(object({ exportId: string() }), ExportRecordSchema, {
19969
+ kind: "mutation",
19970
+ auth: "protected"
19971
+ }), method(object({ exportId: string() }), ExportDownloadSchema, {
19972
+ kind: "query",
19973
+ auth: "protected"
19974
+ });
19975
+ /**
19799
19976
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
19800
19977
  * payload the (legacy) push `streamBroker.publishCameraStream` carried, minus
19801
19978
  * `deviceId`.
@@ -23719,6 +23896,42 @@ Object.freeze({
23719
23896
  addonId: null,
23720
23897
  access: "create"
23721
23898
  },
23899
+ "recordingExport.cancelExport": {
23900
+ capName: "recordingExport",
23901
+ capScope: "system",
23902
+ addonId: null,
23903
+ access: "create"
23904
+ },
23905
+ "recordingExport.createExport": {
23906
+ capName: "recordingExport",
23907
+ capScope: "system",
23908
+ addonId: null,
23909
+ access: "create"
23910
+ },
23911
+ "recordingExport.deleteExport": {
23912
+ capName: "recordingExport",
23913
+ capScope: "system",
23914
+ addonId: null,
23915
+ access: "delete"
23916
+ },
23917
+ "recordingExport.getDownloadUrl": {
23918
+ capName: "recordingExport",
23919
+ capScope: "system",
23920
+ addonId: null,
23921
+ access: "view"
23922
+ },
23923
+ "recordingExport.getExport": {
23924
+ capName: "recordingExport",
23925
+ capScope: "system",
23926
+ addonId: null,
23927
+ access: "view"
23928
+ },
23929
+ "recordingExport.listExports": {
23930
+ capName: "recordingExport",
23931
+ capScope: "system",
23932
+ addonId: null,
23933
+ access: "view"
23934
+ },
23722
23935
  "sceneMonitor.captureReference": {
23723
23936
  capName: "scene-monitor",
23724
23937
  capScope: "device",
@@ -24920,6 +25133,12 @@ Object.defineProperty(exports, "addonWidgetsSourceCapability", {
24920
25133
  return addonWidgetsSourceCapability;
24921
25134
  }
24922
25135
  });
25136
+ Object.defineProperty(exports, "array", {
25137
+ enumerable: true,
25138
+ get: function() {
25139
+ return array;
25140
+ }
25141
+ });
24923
25142
  Object.defineProperty(exports, "audioMetricsCapability", {
24924
25143
  enumerable: true,
24925
25144
  get: function() {
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-Cy4Tp-yp.js");
5
+ const require_dist = require("../dist-V8XOHDoj.js");
6
6
  let node_fs = require("node:fs");
7
7
  let node_fs$1 = require_dist.__toESM(node_fs, 1);
8
8
  node_fs = require_dist.__toESM(node_fs);
@@ -1,4 +1,4 @@
1
- import { c as hfModelUrl, h as BaseAddon, o as embeddingEncoderCapability } from "../dist-D1cY_vlY.mjs";
1
+ import { c as hfModelUrl, h as BaseAddon, o as embeddingEncoderCapability } from "../dist-CA0GikiM.mjs";
2
2
  import { createRequire } from "node:module";
3
3
  import * as fs from "node:fs";
4
4
  import * as path$1 from "node:path";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-Cy4Tp-yp.js");
1
+ const require_dist = require("./dist-V8XOHDoj.js");
2
2
  let node_fs = require("node:fs");
3
3
  node_fs = require_dist.__toESM(node_fs, 1);
4
4
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { a as e, i as t, n, o as r, r as i, t as a } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react__loadShare__.js-C0AuF9av.mjs";
2
2
  import { t as o } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_tanstack_mf_1_react_mf_2_query__loadShare__.js-B3Wx5J80.mjs";
3
- import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-D6C5R_2c.mjs";
3
+ import { a as s, i as c, n as l, o as u, r as d, s as f, t as p } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-ai-NpPOn.mjs";
4
4
  import { n as m, r as h, t as g } from "./_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare__react_mf_1_jsx_mf_2_runtime__loadShare__.js-Bm-iyjmq.mjs";
5
5
  //#region ../../node_modules/lucide-react/dist/esm/shared/src/utils.js
6
6
  var _ = (e) => e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), v = (e) => e.replace(/^([A-Z])|[\s-_]+(\w)/g, (e, t, n) => n ? n.toUpperCase() : t.toLowerCase()), y = (e) => {
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.1.26",
6
+ version: "1.1.28",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_analytics_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.1.47",
21
+ version: "1.1.49",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_analytics_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.1.38",
36
+ version: "1.1.40",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_analytics_widgets",