@camstack/addon-pipeline 1.1.61 → 1.1.62

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 (30) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/detection-pipeline/index.js +2 -2
  4. package/dist/detection-pipeline/index.mjs +2 -2
  5. package/dist/{dist-p_JqOxtk.js → dist-DlMmkOsE.js} +164 -2
  6. package/dist/{dist-D16_dBsr.mjs → dist-LkwlodgP.mjs} +159 -3
  7. package/dist/motion-wasm/index.js +1 -1
  8. package/dist/motion-wasm/index.mjs +1 -1
  9. package/dist/pipeline-runner/index.js +2 -2
  10. package/dist/pipeline-runner/index.mjs +2 -2
  11. package/dist/recorder/index.js +161 -20
  12. package/dist/recorder/index.mjs +161 -20
  13. package/dist/{step-definitions-CoxF5G31.js → step-definitions-CxwB0fEq.js} +68 -1
  14. package/dist/{step-definitions-DxAcpUV-.mjs → step-definitions-DxN9tmQP.mjs} +68 -1
  15. package/dist/stream-broker/_stub.js +2 -2
  16. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Wu4TlSuq.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-3gAFmxjh.mjs} +3 -3
  17. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DHJB3xUN.mjs +26 -0
  18. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DGxcX3Wf.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-C4pcysOQ.mjs} +1 -1
  19. package/dist/stream-broker/{hostInit-D_dSciqF.mjs → hostInit-B1aDV0u0.mjs} +3 -3
  20. package/dist/stream-broker/index.js +1 -1
  21. package/dist/stream-broker/index.mjs +1 -1
  22. package/dist/stream-broker/remoteEntry.js +1 -1
  23. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-BldL9_Ee.js → MaskShapeCanvas-DI4BY7W2-C7IhxQQ_.js} +1 -1
  24. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-BgWqMe4f.js → MotionZonesSettings-NcxxQN8r-DZXzBUU8.js} +1 -1
  25. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-YBgaXffP.js → PrivacyMaskSettings-APgPLF7p-Dz9ttl4A.js} +1 -1
  26. package/embed-dist/assets/index-DRsQUyLF.js +81 -0
  27. package/embed-dist/index.html +1 -1
  28. package/package.json +1 -1
  29. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BPujpbZ0.mjs +0 -26
  30. package/embed-dist/assets/index-e0bQ8yep.js +0 -81
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-p_JqOxtk.js");
6
+ const require_dist = require("../dist-DlMmkOsE.js");
7
7
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
8
8
  const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Dv-oFwjN.js");
9
9
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { B as BaseAddon, G as hydrateSchema, g as audioAnalyzerCapability, h as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, u as HF_BASE_URL, w as mapAudioLabelToMacro, z as errMsg } from "../dist-D16_dBsr.mjs";
2
+ import { B as errMsg, K as hydrateSchema, T as mapAudioLabelToMacro, V as BaseAddon, _ as audioAnalyzerCapability, g as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, u as HF_BASE_URL } from "../dist-LkwlodgP.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { i as downloadFile } from "../model-download-service-Cp9f4dk6-CwUb5v3Y.mjs";
5
5
  import * as fs from "node:fs";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-p_JqOxtk.js");
7
- const require_step_definitions = require("../step-definitions-CoxF5G31.js");
6
+ const require_dist = require("../dist-DlMmkOsE.js");
7
+ const require_step_definitions = require("../step-definitions-CxwB0fEq.js");
8
8
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
9
9
  const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Dv-oFwjN.js");
10
10
  let node_child_process = require("node:child_process");
@@ -1,6 +1,6 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { B as BaseAddon, G as hydrateSchema, L as supportedRuntimes$1, O as nodePin, P as runtimeDevices$1, Q as sleep, S as evaluateZoneRules, W as createEvent, Y as parseJsonUnknown, k as pipelineExecutorCapability, p as YAMNET_TO_MACRO, t as APPLE_SA_TO_MACRO, ut as EventCategory, x as detectionPipelineCapability, y as defaultDeviceFor$1, z as errMsg } from "../dist-D16_dBsr.mjs";
3
- import { a as getStepDefinition, i as getStep, n as ALL_STEPS, o as resolveModelForFormat, r as getDefaultModelForFormat, t as ALL_PIPELINE_STEPS } from "../step-definitions-DxAcpUV-.mjs";
2
+ import { $ as sleep, A as pipelineExecutorCapability, B as errMsg, C as evaluateZoneRules, F as runtimeDevices$1, G as createEvent, K as hydrateSchema, R as supportedRuntimes$1, S as detectionPipelineCapability, V as BaseAddon, X as parseJsonUnknown, b as defaultDeviceFor$1, dt as EventCategory, k as nodePin, m as YAMNET_TO_MACRO, t as APPLE_SA_TO_MACRO } from "../dist-LkwlodgP.mjs";
3
+ import { a as getStepDefinition, i as getStep, n as ALL_STEPS, o as resolveModelForFormat, r as getDefaultModelForFormat, t as ALL_PIPELINE_STEPS } from "../step-definitions-DxN9tmQP.mjs";
4
4
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
5
5
  import { a as ensureModel, o as isModelDownloaded, r as deleteModelFromDisk } from "../model-download-service-Cp9f4dk6-CwUb5v3Y.mjs";
6
6
  import { spawn } from "node:child_process";
@@ -7580,6 +7580,62 @@ function migrateConfigToBands(config) {
7580
7580
  return schedules.map((schedule) => bandFromSchedule(schedule, bandMode, config));
7581
7581
  }
7582
7582
  /**
7583
+ * Ops-log — the durable, append-only operations audit shared by the
7584
+ * recordings and events management surfaces.
7585
+ *
7586
+ * ONE row shape is reused for both domains so a single "Activity" view can
7587
+ * merge the recorder's DurableState ring (recordings ops-log) and the
7588
+ * pipeline-analytics SQLite collection (events ops-log). Each row records a
7589
+ * management operation, WHY it ran (reason), and its measurable effect
7590
+ * (itemsAffected + bytesReclaimed). Writes are best-effort — a failed log must
7591
+ * never fail the operation it records.
7592
+ */
7593
+ /** Which management domain the operation belongs to. */
7594
+ var OpsLogDomainSchema = _enum(["recording", "events"]);
7595
+ /** The kind of management operation performed. */
7596
+ var OpsLogOpSchema = _enum([
7597
+ "prune",
7598
+ "manual-delete",
7599
+ "rescan",
7600
+ "retention-run"
7601
+ ]);
7602
+ /** Why the operation ran. */
7603
+ var OpsLogReasonSchema = _enum([
7604
+ "retention",
7605
+ "quota",
7606
+ "manual",
7607
+ "operator"
7608
+ ]);
7609
+ /** One audit row, shared verbatim by both domains. */
7610
+ var OpsLogEntrySchema = object({
7611
+ /** Unique row id. */
7612
+ id: string(),
7613
+ /** Epoch ms the operation completed. */
7614
+ at: number(),
7615
+ domain: OpsLogDomainSchema,
7616
+ op: OpsLogOpSchema,
7617
+ reason: OpsLogReasonSchema,
7618
+ /** The camera the op targeted; null for a cluster/global op. */
7619
+ deviceId: number().nullable(),
7620
+ /** Node that performed the op (the log carries nodeId — no cross-node aggregation). */
7621
+ nodeId: string(),
7622
+ /** Buckets / rows deleted (op-specific unit). */
7623
+ itemsAffected: number(),
7624
+ /** Bytes reclaimed by the op (0 when not measurable). */
7625
+ bytesReclaimed: number(),
7626
+ /** Free-text detail (e.g. "floor moved to <ts>"); null when none. */
7627
+ detail: string().nullable(),
7628
+ /** Who/what triggered the op. */
7629
+ actor: string()
7630
+ });
7631
+ /** Shared query input for the per-domain `listOpsLog` cap methods. */
7632
+ var OpsLogQueryInputSchema = object({
7633
+ /** Restrict to a single camera; omit for every row. */
7634
+ deviceId: number().optional(),
7635
+ /** Max rows returned, newest-first. */
7636
+ limit: number().int().min(1).max(1e3).optional()
7637
+ });
7638
+ /**
7583
7639
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
7584
7640
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
7585
7641
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -17558,6 +17614,26 @@ var TrackCascadeCountsSchema = object({
17558
17614
  /** Per-track CLIP search vectors removed (best-effort). */
17559
17615
  embeddings: number().int()
17560
17616
  });
17617
+ /** Event-store footprint for one camera. */
17618
+ var EventStoreDeviceFootprintSchema = object({
17619
+ deviceId: number(),
17620
+ /** Persisted event rows (motion + object + audio) for the camera. */
17621
+ rows: number().int(),
17622
+ /** Event-owned media bytes on disk for the camera. */
17623
+ bytes: number().int()
17624
+ });
17625
+ /** Aggregate event-store footprint: global totals + per-camera breakdown. */
17626
+ var EventStoreFootprintSchema = object({
17627
+ totalRows: number().int(),
17628
+ totalBytes: number().int(),
17629
+ devices: array(EventStoreDeviceFootprintSchema).readonly()
17630
+ });
17631
+ /** Per-kind counts returned by the event-prune / device-delete mutations. */
17632
+ var EventPruneCountsSchema = object({
17633
+ motion: number().int(),
17634
+ object: number().int(),
17635
+ audio: number().int()
17636
+ });
17561
17637
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
17562
17638
  deviceId: number(),
17563
17639
  trackId: string()
@@ -17621,6 +17697,21 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17621
17697
  }), {
17622
17698
  kind: "mutation",
17623
17699
  auth: "admin"
17700
+ }), method(object({}), EventStoreFootprintSchema, {
17701
+ kind: "query",
17702
+ auth: "admin"
17703
+ }), method(object({
17704
+ olderThanMs: number(),
17705
+ reason: OpsLogReasonSchema.optional()
17706
+ }), EventPruneCountsSchema, {
17707
+ kind: "mutation",
17708
+ auth: "admin"
17709
+ }), method(object({ deviceId: number() }), EventPruneCountsSchema, {
17710
+ kind: "mutation",
17711
+ auth: "admin"
17712
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17713
+ kind: "query",
17714
+ auth: "admin"
17624
17715
  }), method(object({
17625
17716
  eventId: string(),
17626
17717
  kind: MediaFileKindEnum.optional()
@@ -20979,14 +21070,43 @@ var recordingCapability = {
20979
21070
  auth: "admin"
20980
21071
  }),
20981
21072
  /** Apply this device's retention policy to footage now; returns the oldest
20982
- * surviving footage start (the retention floor) or null if no footage. */
20983
- pruneFootage: method(object({ deviceId: number() }), object({
21073
+ * surviving footage start (the retention floor) or null if no footage. The
21074
+ * prune is logged to the recordings ops-log with `reason` (default
21075
+ * `'retention'` — the policy-driven prune; `'quota'` when disk-pressure
21076
+ * triggered). */
21077
+ pruneFootage: method(object({
21078
+ deviceId: number(),
21079
+ reason: OpsLogReasonSchema.optional()
21080
+ }), object({
20984
21081
  floorMs: number().nullable(),
20985
21082
  deletedBuckets: number().int(),
20986
21083
  reclaimedBytes: number().int()
20987
21084
  }), {
20988
21085
  kind: "mutation",
20989
21086
  auth: "admin"
21087
+ }),
21088
+ /**
21089
+ * Manually delete a camera's footage — the whole footprint, or a
21090
+ * `[fromMs, toMs)` window when either bound is given. Logged to the
21091
+ * recordings ops-log as `op:'manual-delete', reason:'manual'`. Destructive:
21092
+ * the admin UI guards it behind a confirm.
21093
+ */
21094
+ deleteFootprint: method(object({
21095
+ deviceId: number(),
21096
+ fromMs: number().optional(),
21097
+ toMs: number().optional()
21098
+ }), object({
21099
+ deletedBuckets: number().int(),
21100
+ reclaimedBytes: number().int()
21101
+ }), {
21102
+ kind: "mutation",
21103
+ auth: "admin"
21104
+ }),
21105
+ /** The recordings ops-log rows (newest-first), optionally scoped to one
21106
+ * camera. Backed by the recorder's bounded DurableState ring. */
21107
+ listOpsLog: method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
21108
+ kind: "query",
21109
+ auth: "admin"
20990
21110
  })
20991
21111
  }
20992
21112
  };
@@ -24127,6 +24247,12 @@ Object.freeze({
24127
24247
  addonId: null,
24128
24248
  access: "delete"
24129
24249
  },
24250
+ "pipelineAnalytics.deleteDeviceEvents": {
24251
+ capName: "pipeline-analytics",
24252
+ capScope: "device",
24253
+ addonId: null,
24254
+ access: "delete"
24255
+ },
24130
24256
  "pipelineAnalytics.deleteTracks": {
24131
24257
  capName: "pipeline-analytics",
24132
24258
  capScope: "device",
@@ -24157,6 +24283,12 @@ Object.freeze({
24157
24283
  addonId: null,
24158
24284
  access: "view"
24159
24285
  },
24286
+ "pipelineAnalytics.getEventStoreFootprint": {
24287
+ capName: "pipeline-analytics",
24288
+ capScope: "device",
24289
+ addonId: null,
24290
+ access: "view"
24291
+ },
24160
24292
  "pipelineAnalytics.getKeyEvents": {
24161
24293
  capName: "pipeline-analytics",
24162
24294
  capScope: "device",
@@ -24199,6 +24331,12 @@ Object.freeze({
24199
24331
  addonId: null,
24200
24332
  access: "view"
24201
24333
  },
24334
+ "pipelineAnalytics.listOpsLog": {
24335
+ capName: "pipeline-analytics",
24336
+ capScope: "device",
24337
+ addonId: null,
24338
+ access: "view"
24339
+ },
24202
24340
  "pipelineAnalytics.listRecentTracks": {
24203
24341
  capName: "pipeline-analytics",
24204
24342
  capScope: "device",
@@ -24211,6 +24349,12 @@ Object.freeze({
24211
24349
  addonId: null,
24212
24350
  access: "view"
24213
24351
  },
24352
+ "pipelineAnalytics.pruneEvents": {
24353
+ capName: "pipeline-analytics",
24354
+ capScope: "device",
24355
+ addonId: null,
24356
+ access: "create"
24357
+ },
24214
24358
  "pipelineAnalytics.pruneEventsBefore": {
24215
24359
  capName: "pipeline-analytics",
24216
24360
  capScope: "device",
@@ -24973,6 +25117,12 @@ Object.freeze({
24973
25117
  addonId: null,
24974
25118
  access: "create"
24975
25119
  },
25120
+ "recording.deleteFootprint": {
25121
+ capName: "recording",
25122
+ capScope: "system",
25123
+ addonId: null,
25124
+ access: "delete"
25125
+ },
24976
25126
  "recording.getAvailability": {
24977
25127
  capName: "recording",
24978
25128
  capScope: "system",
@@ -25003,6 +25153,12 @@ Object.freeze({
25003
25153
  addonId: null,
25004
25154
  access: "view"
25005
25155
  },
25156
+ "recording.listOpsLog": {
25157
+ capName: "recording",
25158
+ capScope: "system",
25159
+ addonId: null,
25160
+ access: "view"
25161
+ },
25006
25162
  "recording.locateSegment": {
25007
25163
  capName: "recording",
25008
25164
  capScope: "system",
@@ -26520,6 +26676,12 @@ Object.defineProperty(exports, "HF_BASE_URL", {
26520
26676
  return HF_BASE_URL;
26521
26677
  }
26522
26678
  });
26679
+ Object.defineProperty(exports, "OpsLogEntrySchema", {
26680
+ enumerable: true,
26681
+ get: function() {
26682
+ return OpsLogEntrySchema;
26683
+ }
26684
+ });
26523
26685
  Object.defineProperty(exports, "RecordingConfigSchema", {
26524
26686
  enumerable: true,
26525
26687
  get: function() {
@@ -7580,6 +7580,62 @@ function migrateConfigToBands(config) {
7580
7580
  return schedules.map((schedule) => bandFromSchedule(schedule, bandMode, config));
7581
7581
  }
7582
7582
  /**
7583
+ * Ops-log — the durable, append-only operations audit shared by the
7584
+ * recordings and events management surfaces.
7585
+ *
7586
+ * ONE row shape is reused for both domains so a single "Activity" view can
7587
+ * merge the recorder's DurableState ring (recordings ops-log) and the
7588
+ * pipeline-analytics SQLite collection (events ops-log). Each row records a
7589
+ * management operation, WHY it ran (reason), and its measurable effect
7590
+ * (itemsAffected + bytesReclaimed). Writes are best-effort — a failed log must
7591
+ * never fail the operation it records.
7592
+ */
7593
+ /** Which management domain the operation belongs to. */
7594
+ var OpsLogDomainSchema = _enum(["recording", "events"]);
7595
+ /** The kind of management operation performed. */
7596
+ var OpsLogOpSchema = _enum([
7597
+ "prune",
7598
+ "manual-delete",
7599
+ "rescan",
7600
+ "retention-run"
7601
+ ]);
7602
+ /** Why the operation ran. */
7603
+ var OpsLogReasonSchema = _enum([
7604
+ "retention",
7605
+ "quota",
7606
+ "manual",
7607
+ "operator"
7608
+ ]);
7609
+ /** One audit row, shared verbatim by both domains. */
7610
+ var OpsLogEntrySchema = object({
7611
+ /** Unique row id. */
7612
+ id: string(),
7613
+ /** Epoch ms the operation completed. */
7614
+ at: number(),
7615
+ domain: OpsLogDomainSchema,
7616
+ op: OpsLogOpSchema,
7617
+ reason: OpsLogReasonSchema,
7618
+ /** The camera the op targeted; null for a cluster/global op. */
7619
+ deviceId: number().nullable(),
7620
+ /** Node that performed the op (the log carries nodeId — no cross-node aggregation). */
7621
+ nodeId: string(),
7622
+ /** Buckets / rows deleted (op-specific unit). */
7623
+ itemsAffected: number(),
7624
+ /** Bytes reclaimed by the op (0 when not measurable). */
7625
+ bytesReclaimed: number(),
7626
+ /** Free-text detail (e.g. "floor moved to <ts>"); null when none. */
7627
+ detail: string().nullable(),
7628
+ /** Who/what triggered the op. */
7629
+ actor: string()
7630
+ });
7631
+ /** Shared query input for the per-domain `listOpsLog` cap methods. */
7632
+ var OpsLogQueryInputSchema = object({
7633
+ /** Restrict to a single camera; omit for every row. */
7634
+ deviceId: number().optional(),
7635
+ /** Max rows returned, newest-first. */
7636
+ limit: number().int().min(1).max(1e3).optional()
7637
+ });
7638
+ /**
7583
7639
  * `StorageLocationType` — an addon-declared id that identifies the *kind* of
7584
7640
  * storage a location serves. Defined here (not in `capabilities/storage.cap.ts`)
7585
7641
  * so the persisted record schema and the consumer-facing cap can both consume it
@@ -17558,6 +17614,26 @@ var TrackCascadeCountsSchema = object({
17558
17614
  /** Per-track CLIP search vectors removed (best-effort). */
17559
17615
  embeddings: number().int()
17560
17616
  });
17617
+ /** Event-store footprint for one camera. */
17618
+ var EventStoreDeviceFootprintSchema = object({
17619
+ deviceId: number(),
17620
+ /** Persisted event rows (motion + object + audio) for the camera. */
17621
+ rows: number().int(),
17622
+ /** Event-owned media bytes on disk for the camera. */
17623
+ bytes: number().int()
17624
+ });
17625
+ /** Aggregate event-store footprint: global totals + per-camera breakdown. */
17626
+ var EventStoreFootprintSchema = object({
17627
+ totalRows: number().int(),
17628
+ totalBytes: number().int(),
17629
+ devices: array(EventStoreDeviceFootprintSchema).readonly()
17630
+ });
17631
+ /** Per-kind counts returned by the event-prune / device-delete mutations. */
17632
+ var EventPruneCountsSchema = object({
17633
+ motion: number().int(),
17634
+ object: number().int(),
17635
+ audio: number().int()
17636
+ });
17561
17637
  DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).readonly()), method(object({
17562
17638
  deviceId: number(),
17563
17639
  trackId: string()
@@ -17621,6 +17697,21 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17621
17697
  }), {
17622
17698
  kind: "mutation",
17623
17699
  auth: "admin"
17700
+ }), method(object({}), EventStoreFootprintSchema, {
17701
+ kind: "query",
17702
+ auth: "admin"
17703
+ }), method(object({
17704
+ olderThanMs: number(),
17705
+ reason: OpsLogReasonSchema.optional()
17706
+ }), EventPruneCountsSchema, {
17707
+ kind: "mutation",
17708
+ auth: "admin"
17709
+ }), method(object({ deviceId: number() }), EventPruneCountsSchema, {
17710
+ kind: "mutation",
17711
+ auth: "admin"
17712
+ }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17713
+ kind: "query",
17714
+ auth: "admin"
17624
17715
  }), method(object({
17625
17716
  eventId: string(),
17626
17717
  kind: MediaFileKindEnum.optional()
@@ -20979,14 +21070,43 @@ var recordingCapability = {
20979
21070
  auth: "admin"
20980
21071
  }),
20981
21072
  /** Apply this device's retention policy to footage now; returns the oldest
20982
- * surviving footage start (the retention floor) or null if no footage. */
20983
- pruneFootage: method(object({ deviceId: number() }), object({
21073
+ * surviving footage start (the retention floor) or null if no footage. The
21074
+ * prune is logged to the recordings ops-log with `reason` (default
21075
+ * `'retention'` — the policy-driven prune; `'quota'` when disk-pressure
21076
+ * triggered). */
21077
+ pruneFootage: method(object({
21078
+ deviceId: number(),
21079
+ reason: OpsLogReasonSchema.optional()
21080
+ }), object({
20984
21081
  floorMs: number().nullable(),
20985
21082
  deletedBuckets: number().int(),
20986
21083
  reclaimedBytes: number().int()
20987
21084
  }), {
20988
21085
  kind: "mutation",
20989
21086
  auth: "admin"
21087
+ }),
21088
+ /**
21089
+ * Manually delete a camera's footage — the whole footprint, or a
21090
+ * `[fromMs, toMs)` window when either bound is given. Logged to the
21091
+ * recordings ops-log as `op:'manual-delete', reason:'manual'`. Destructive:
21092
+ * the admin UI guards it behind a confirm.
21093
+ */
21094
+ deleteFootprint: method(object({
21095
+ deviceId: number(),
21096
+ fromMs: number().optional(),
21097
+ toMs: number().optional()
21098
+ }), object({
21099
+ deletedBuckets: number().int(),
21100
+ reclaimedBytes: number().int()
21101
+ }), {
21102
+ kind: "mutation",
21103
+ auth: "admin"
21104
+ }),
21105
+ /** The recordings ops-log rows (newest-first), optionally scoped to one
21106
+ * camera. Backed by the recorder's bounded DurableState ring. */
21107
+ listOpsLog: method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
21108
+ kind: "query",
21109
+ auth: "admin"
20990
21110
  })
20991
21111
  }
20992
21112
  };
@@ -24127,6 +24247,12 @@ Object.freeze({
24127
24247
  addonId: null,
24128
24248
  access: "delete"
24129
24249
  },
24250
+ "pipelineAnalytics.deleteDeviceEvents": {
24251
+ capName: "pipeline-analytics",
24252
+ capScope: "device",
24253
+ addonId: null,
24254
+ access: "delete"
24255
+ },
24130
24256
  "pipelineAnalytics.deleteTracks": {
24131
24257
  capName: "pipeline-analytics",
24132
24258
  capScope: "device",
@@ -24157,6 +24283,12 @@ Object.freeze({
24157
24283
  addonId: null,
24158
24284
  access: "view"
24159
24285
  },
24286
+ "pipelineAnalytics.getEventStoreFootprint": {
24287
+ capName: "pipeline-analytics",
24288
+ capScope: "device",
24289
+ addonId: null,
24290
+ access: "view"
24291
+ },
24160
24292
  "pipelineAnalytics.getKeyEvents": {
24161
24293
  capName: "pipeline-analytics",
24162
24294
  capScope: "device",
@@ -24199,6 +24331,12 @@ Object.freeze({
24199
24331
  addonId: null,
24200
24332
  access: "view"
24201
24333
  },
24334
+ "pipelineAnalytics.listOpsLog": {
24335
+ capName: "pipeline-analytics",
24336
+ capScope: "device",
24337
+ addonId: null,
24338
+ access: "view"
24339
+ },
24202
24340
  "pipelineAnalytics.listRecentTracks": {
24203
24341
  capName: "pipeline-analytics",
24204
24342
  capScope: "device",
@@ -24211,6 +24349,12 @@ Object.freeze({
24211
24349
  addonId: null,
24212
24350
  access: "view"
24213
24351
  },
24352
+ "pipelineAnalytics.pruneEvents": {
24353
+ capName: "pipeline-analytics",
24354
+ capScope: "device",
24355
+ addonId: null,
24356
+ access: "create"
24357
+ },
24214
24358
  "pipelineAnalytics.pruneEventsBefore": {
24215
24359
  capName: "pipeline-analytics",
24216
24360
  capScope: "device",
@@ -24973,6 +25117,12 @@ Object.freeze({
24973
25117
  addonId: null,
24974
25118
  access: "create"
24975
25119
  },
25120
+ "recording.deleteFootprint": {
25121
+ capName: "recording",
25122
+ capScope: "system",
25123
+ addonId: null,
25124
+ access: "delete"
25125
+ },
24976
25126
  "recording.getAvailability": {
24977
25127
  capName: "recording",
24978
25128
  capScope: "system",
@@ -25003,6 +25153,12 @@ Object.freeze({
25003
25153
  addonId: null,
25004
25154
  access: "view"
25005
25155
  },
25156
+ "recording.listOpsLog": {
25157
+ capName: "recording",
25158
+ capScope: "system",
25159
+ addonId: null,
25160
+ access: "view"
25161
+ },
25006
25162
  "recording.locateSegment": {
25007
25163
  capName: "recording",
25008
25164
  capScope: "system",
@@ -26430,4 +26586,4 @@ function defaultDeviceFor(id) {
26430
26586
  return def(id).defaultDevice;
26431
26587
  }
26432
26588
  //#endregion
26433
- export { _enum as $, pipelineRunnerCapability as A, BaseAddon as B, hfModelUrl as C, motionDetectionCapability as D, migrateConfigToBands as E, storageEvictableCapability as F, hydrateSchema as G, DeviceFeature as H, streamBrokerCapability as I, makeSourceBrokerId as J, isEvent as K, supportedRuntimes as L, recordingExportCapability as M, resolveScrubThumbnailGeometry as N, nodePin as O, runtimeDevices as P, sleep as Q, webrtcSessionCapability as R, evaluateZoneRules as S, maskUrlCredentials as T, DeviceType as U, CAM_PROFILE_ORDER as V, createEvent as W, parseProfileBrokerId as X, parseJsonUnknown as Y, selectAssignedProfileSlots as Z, cameraStreamsCapability as _, COCO_TO_MACRO as a, number as at, defineCustomActions as b, EncodeProfileSchema as c, string as ct, RecordingConfigSchema as d, array as et, RingBuffer as f, audioAnalyzerCapability as g, audioAnalysisCapability as h, COCO_80_LABELS as i, literal as it, recordingCapability as j, pipelineExecutorCapability as k, ExportRecordSchema as l, union as lt, addonWidgetsSourceCapability as m, AUDIO_BACKEND_CHOICES as n, discriminatedUnion as nt, DEFAULT_AUDIO_ANALYZER_CONFIG as o, object as ot, YAMNET_TO_MACRO as p, makeProfileBrokerId as q, AUDIO_MACRO_LABELS as r, lazy as rt, EVENT_PAD_MS as s, record as st, APPLE_SA_TO_MACRO as t, boolean as tt, HF_BASE_URL as u, EventCategory as ut, customAction as v, mapAudioLabelToMacro as w, detectionPipelineCapability as x, defaultDeviceFor as y, errMsg as z };
26589
+ export { sleep as $, pipelineExecutorCapability as A, errMsg as B, evaluateZoneRules as C, migrateConfigToBands as D, maskUrlCredentials as E, runtimeDevices as F, createEvent as G, CAM_PROFILE_ORDER as H, storageEvictableCapability as I, makeProfileBrokerId as J, hydrateSchema as K, streamBrokerCapability as L, recordingCapability as M, recordingExportCapability as N, motionDetectionCapability as O, resolveScrubThumbnailGeometry as P, selectAssignedProfileSlots as Q, supportedRuntimes as R, detectionPipelineCapability as S, mapAudioLabelToMacro as T, DeviceFeature as U, BaseAddon as V, DeviceType as W, parseJsonUnknown as X, makeSourceBrokerId as Y, parseProfileBrokerId as Z, audioAnalyzerCapability as _, COCO_TO_MACRO as a, literal as at, defaultDeviceFor as b, EncodeProfileSchema as c, record as ct, OpsLogEntrySchema as d, EventCategory as dt, _enum as et, RecordingConfigSchema as f, audioAnalysisCapability as g, addonWidgetsSourceCapability as h, COCO_80_LABELS as i, lazy as it, pipelineRunnerCapability as j, nodePin as k, ExportRecordSchema as l, string as lt, YAMNET_TO_MACRO as m, AUDIO_BACKEND_CHOICES as n, boolean as nt, DEFAULT_AUDIO_ANALYZER_CONFIG as o, number as ot, RingBuffer as p, isEvent as q, AUDIO_MACRO_LABELS as r, discriminatedUnion as rt, EVENT_PAD_MS as s, object as st, APPLE_SA_TO_MACRO as t, array as tt, HF_BASE_URL as u, union as ut, cameraStreamsCapability as v, hfModelUrl as w, defineCustomActions as x, customAction as y, webrtcSessionCapability as z };
@@ -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-p_JqOxtk.js");
5
+ const require_dist = require("../dist-DlMmkOsE.js");
6
6
  let node_fs = require("node:fs");
7
7
  let node_path = require("node:path");
8
8
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { B as BaseAddon, D as motionDetectionCapability, G as hydrateSchema, S as evaluateZoneRules, U as DeviceType } from "../dist-D16_dBsr.mjs";
1
+ import { C as evaluateZoneRules, K as hydrateSchema, O as motionDetectionCapability, V as BaseAddon, W as DeviceType } from "../dist-LkwlodgP.mjs";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -3,11 +3,11 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-p_JqOxtk.js");
6
+ const require_dist = require("../dist-DlMmkOsE.js");
7
7
  const require_remote_restream = require("../remote-restream-CO36Sr30.js");
8
8
  const require_sheet_geometry = require("../sheet-geometry-BR-ip0CP.js");
9
9
  const require_worker_protocol = require("../worker-protocol-PP4jKHHJ.js");
10
- const require_step_definitions = require("../step-definitions-CoxF5G31.js");
10
+ const require_step_definitions = require("../step-definitions-CxwB0fEq.js");
11
11
  let node_child_process = require("node:child_process");
12
12
  let node_url = require("node:url");
13
13
  let sharp = require("sharp");
@@ -1,8 +1,8 @@
1
- import { $ as _enum, A as pipelineRunnerCapability, B as BaseAddon, O as nodePin, W as createEvent, at as number, b as defineCustomActions, ct as string, et as array, ot as object, rt as lazy, tt as boolean, ut as EventCategory, v as customAction, z as errMsg } from "../dist-D16_dBsr.mjs";
1
+ import { B as errMsg, G as createEvent, V as BaseAddon, dt as EventCategory, et as _enum, it as lazy, j as pipelineRunnerCapability, k as nodePin, lt as string, nt as boolean, ot as number, st as object, tt as array, x as defineCustomActions, y as customAction } from "../dist-LkwlodgP.mjs";
2
2
  import { n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-BeHi78PZ.mjs";
3
3
  import { r as resolveHubHostname } from "../sheet-geometry-DcpuGTCm.mjs";
4
4
  import { t as isWorkerReply } from "../worker-protocol-CyVJTZEO.mjs";
5
- import { a as getStepDefinition } from "../step-definitions-DxAcpUV-.mjs";
5
+ import { a as getStepDefinition } from "../step-definitions-DxN9tmQP.mjs";
6
6
  import { fork } from "node:child_process";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import sharp from "sharp";