@camstack/addon-pipeline 1.1.60 → 1.1.61

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 (32) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/detection-pipeline/index.js +3 -3
  4. package/dist/detection-pipeline/index.mjs +3 -3
  5. package/dist/{dist-CcqqznPf.mjs → dist-D16_dBsr.mjs} +214 -6
  6. package/dist/{dist-DynD1EC-.js → dist-p_JqOxtk.js} +225 -5
  7. package/dist/{model-download-service-Cp9f4dk6-0wh7OK3s.mjs → model-download-service-Cp9f4dk6-CwUb5v3Y.mjs} +1 -1
  8. package/dist/{model-download-service-Cp9f4dk6-Cp_GTKTw.js → model-download-service-Cp9f4dk6-Dv-oFwjN.js} +12 -0
  9. package/dist/motion-wasm/index.js +1 -1
  10. package/dist/motion-wasm/index.mjs +1 -1
  11. package/dist/pipeline-runner/index.js +2 -2
  12. package/dist/pipeline-runner/index.mjs +2 -2
  13. package/dist/recorder/index.js +638 -11
  14. package/dist/recorder/index.mjs +639 -12
  15. package/dist/{step-definitions-DhhwklAL.js → step-definitions-CoxF5G31.js} +18 -2
  16. package/dist/{step-definitions-CvwB_Otk.mjs → step-definitions-DxAcpUV-.mjs} +18 -2
  17. package/dist/stream-broker/_stub.js +2 -2
  18. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-B07QYb7Q.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Wu4TlSuq.mjs} +3 -3
  19. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BPujpbZ0.mjs +26 -0
  20. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DSXctoaw.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DGxcX3Wf.mjs} +1 -1
  21. package/dist/stream-broker/{hostInit-C02YjaoP.mjs → hostInit-D_dSciqF.mjs} +3 -3
  22. package/dist/stream-broker/index.js +29 -9
  23. package/dist/stream-broker/index.mjs +29 -9
  24. package/dist/stream-broker/remoteEntry.js +1 -1
  25. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-ColkZGA1.js → MaskShapeCanvas-DI4BY7W2-BldL9_Ee.js} +1 -1
  26. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-BIzNJmu0.js → MotionZonesSettings-NcxxQN8r-BgWqMe4f.js} +1 -1
  27. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-BHuYOg7Q.js → PrivacyMaskSettings-APgPLF7p-YBgaXffP.js} +1 -1
  28. package/embed-dist/assets/index-e0bQ8yep.js +81 -0
  29. package/embed-dist/index.html +1 -1
  30. package/package.json +5 -1
  31. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DYQ6RHcb.mjs +0 -26
  32. package/embed-dist/assets/index-n1_ZSmy0.js +0 -81
@@ -3,9 +3,9 @@ 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-DynD1EC-.js");
6
+ const require_dist = require("../dist-p_JqOxtk.js");
7
7
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
8
- const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Cp_GTKTw.js");
8
+ const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Dv-oFwjN.js");
9
9
  let node_fs = require("node:fs");
10
10
  node_fs = require_chunk.__toESM(node_fs);
11
11
  let node_path = require("node:path");
@@ -1,7 +1,7 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { C as mapAudioLabelToMacro, L as errMsg, R as BaseAddon, U as hydrateSchema, h as audioAnalyzerCapability, l as HF_BASE_URL, m as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG } from "../dist-CcqqznPf.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";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
- import { r as downloadFile } from "../model-download-service-Cp9f4dk6-0wh7OK3s.mjs";
4
+ import { i as downloadFile } from "../model-download-service-Cp9f4dk6-CwUb5v3Y.mjs";
5
5
  import * as fs from "node:fs";
6
6
  import * as path$1 from "node:path";
7
7
  //#region src/audio-analyzer/audio-pipeline.ts
@@ -3,10 +3,10 @@ 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-DynD1EC-.js");
7
- const require_step_definitions = require("../step-definitions-DhhwklAL.js");
6
+ const require_dist = require("../dist-p_JqOxtk.js");
7
+ const require_step_definitions = require("../step-definitions-CoxF5G31.js");
8
8
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
9
- const require_model_download_service_Cp9f4dk6 = require("../model-download-service-Cp9f4dk6-Cp_GTKTw.js");
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");
11
11
  let sharp = require("sharp");
12
12
  sharp = require_chunk.__toESM(sharp);
@@ -1,8 +1,8 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { D as nodePin, F as supportedRuntimes$1, H as createEvent, L as errMsg, M as runtimeDevices$1, O as pipelineExecutorCapability, R as BaseAddon, U as hydrateSchema, X as sleep, b as detectionPipelineCapability, ct as EventCategory, f as YAMNET_TO_MACRO, q as parseJsonUnknown, t as APPLE_SA_TO_MACRO, v as defaultDeviceFor$1, x as evaluateZoneRules } from "../dist-CcqqznPf.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-CvwB_Otk.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";
4
4
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
5
- import { a as isModelDownloaded, i as ensureModel, n as deleteModelFromDisk } from "../model-download-service-Cp9f4dk6-0wh7OK3s.mjs";
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";
7
7
  import sharp from "sharp";
8
8
  import * as fs from "node:fs";
@@ -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",
@@ -8156,7 +8199,10 @@ var COCO_TO_MACRO = {
8156
8199
  elephant: "animal",
8157
8200
  bear: "animal",
8158
8201
  zebra: "animal",
8159
- giraffe: "animal"
8202
+ giraffe: "animal",
8203
+ suitcase: "package",
8204
+ backpack: "package",
8205
+ handbag: "package"
8160
8206
  },
8161
8207
  preserveOriginal: false
8162
8208
  };
@@ -13751,7 +13797,11 @@ array(ZoneRuleSchema).readonly();
13751
13797
  * Extend the enum here when a new gating consumer comes online (audio
13752
13798
  * gating, alert filtering, …) — no other surface needs to change.
13753
13799
  */
13754
- var ZoneRuleStageEnum = _enum(["motion", "detection"]);
13800
+ var ZoneRuleStageEnum = _enum([
13801
+ "motion",
13802
+ "detection",
13803
+ "package"
13804
+ ]);
13755
13805
  DeviceType.Camera, method(object({
13756
13806
  deviceId: number(),
13757
13807
  stage: ZoneRuleStageEnum
@@ -13764,7 +13814,8 @@ DeviceType.Camera, method(object({
13764
13814
  auth: "admin"
13765
13815
  }), object({
13766
13816
  motion: array(ZoneRuleSchema).readonly(),
13767
- detection: array(ZoneRuleSchema).readonly()
13817
+ detection: array(ZoneRuleSchema).readonly(),
13818
+ package: array(ZoneRuleSchema).readonly()
13768
13819
  });
13769
13820
  var ProviderStatusSchema = object({
13770
13821
  connected: boolean(),
@@ -17157,6 +17208,7 @@ var EventKindIconSchema = _enum([
17157
17208
  "smoke",
17158
17209
  "water",
17159
17210
  "button",
17211
+ "package",
17160
17212
  "generic"
17161
17213
  ]);
17162
17214
  var EventKindCategorySchema = _enum([
@@ -17164,7 +17216,8 @@ var EventKindCategorySchema = _enum([
17164
17216
  "audio",
17165
17217
  "detection",
17166
17218
  "sensor",
17167
- "custom"
17219
+ "custom",
17220
+ "package"
17168
17221
  ]);
17169
17222
  var EventKindDescriptorSchema = object({
17170
17223
  /** Stable kind id (e.g. 'motion', 'person', 'contact'). */
@@ -20938,6 +20991,125 @@ var recordingCapability = {
20938
20991
  }
20939
20992
  };
20940
20993
  /**
20994
+ * `recordingExport` cap — render a footage time range into a single downloadable
20995
+ * MP4 (regular / accelerated / decelerated / timelapse, ± audio), kept for a
20996
+ * bounded lifetime with a durable history, auto-expiry, and optional
20997
+ * delete-after-download.
20998
+ *
20999
+ * Like `recording` this is a `scope:'system', mode:'singleton'` cap: the
21000
+ * recorder self-gates so exactly ONE node (the designated `recordingNodeId`,
21001
+ * default `hub`) registers it. Device-scoped methods carry `deviceId` in their
21002
+ * input and dispatch to that single provider; the render runs on the node that
21003
+ * owns the footage (no cross-node segment transfer). Download rides the
21004
+ * framework addon data-plane. State persists in a DurableState blob (NOT
21005
+ * SQLite); history rows survive file deletion for audit.
21006
+ */
21007
+ /** Playback-speed multiplier for the render (1 = realtime). */
21008
+ var ExportSpeedSchema = number().min(.25).max(32);
21009
+ /** Timelapse cadence — sample one source frame per `everyMs`, output at `outputFps`. */
21010
+ var ExportTimelapseSchema = object({
21011
+ everyMs: number().int().positive(),
21012
+ outputFps: number().int().min(1).max(60).optional()
21013
+ });
21014
+ /**
21015
+ * Render options. `speed` and `timelapse` are mutually exclusive. `includeAudio`
21016
+ * is honoured only for a realtime-ish speed (0.5–2×); timelapse is always
21017
+ * silent. `maxLifeMs` bounds how long the finished file is kept;
21018
+ * `deleteAfterDownload` removes it shortly after the first complete download.
21019
+ */
21020
+ var ExportOptionsSchema = object({
21021
+ speed: ExportSpeedSchema.optional(),
21022
+ timelapse: ExportTimelapseSchema.optional(),
21023
+ includeAudio: boolean(),
21024
+ maxLifeMs: number().int().positive(),
21025
+ deleteAfterDownload: boolean(),
21026
+ title: string().max(200).optional()
21027
+ }).superRefine((v, ctx) => {
21028
+ if (v.speed !== void 0 && v.timelapse !== void 0) ctx.addIssue({
21029
+ code: ZodIssueCode.custom,
21030
+ message: "speed and timelapse are mutually exclusive",
21031
+ path: ["timelapse"]
21032
+ });
21033
+ });
21034
+ var ExportStateSchema = _enum([
21035
+ "queued",
21036
+ "rendering",
21037
+ "ready",
21038
+ "failed",
21039
+ "expired",
21040
+ "deleted"
21041
+ ]);
21042
+ /** One export job / history row. */
21043
+ var ExportRecordSchema = object({
21044
+ id: string(),
21045
+ deviceId: number(),
21046
+ profile: string(),
21047
+ fromMs: number(),
21048
+ toMs: number(),
21049
+ options: ExportOptionsSchema,
21050
+ state: ExportStateSchema,
21051
+ /** 0–100 while rendering; null otherwise. */
21052
+ progressPct: number().nullable(),
21053
+ /** File size once ready; null before. */
21054
+ fileBytes: number().nullable(),
21055
+ expiresAt: number(),
21056
+ deleteAfterDownload: boolean(),
21057
+ /** Epoch of the first complete download; null until then. */
21058
+ downloadedAt: number().nullable(),
21059
+ createdAt: number(),
21060
+ /** User id/name that requested the export. */
21061
+ createdBy: string(),
21062
+ /** Failure reason when state is 'failed'; null otherwise. */
21063
+ error: string().nullable()
21064
+ });
21065
+ /** Candidate download URLs (LAN first, then operator extra hosts). */
21066
+ var ExportDownloadSchema = object({
21067
+ url: string(),
21068
+ endpoints: array(string())
21069
+ });
21070
+ var recordingExportCapability = {
21071
+ name: "recordingExport",
21072
+ scope: "system",
21073
+ mode: "singleton",
21074
+ methods: {
21075
+ /** Queue a render of `[fromMs,toMs)` for `deviceId`/`profile`. Fails fast
21076
+ * when no footage covers the range. Returns the queued record. */
21077
+ createExport: method(object({
21078
+ deviceId: number(),
21079
+ profile: string(),
21080
+ fromMs: number(),
21081
+ toMs: number(),
21082
+ options: ExportOptionsSchema
21083
+ }), ExportRecordSchema, {
21084
+ kind: "mutation",
21085
+ auth: "protected"
21086
+ }),
21087
+ /** All export rows (history included), optionally scoped to one device. */
21088
+ listExports: method(object({ deviceId: number().optional() }), array(ExportRecordSchema), {
21089
+ kind: "query",
21090
+ auth: "protected"
21091
+ }),
21092
+ getExport: method(object({ exportId: string() }), ExportRecordSchema, {
21093
+ kind: "query",
21094
+ auth: "protected"
21095
+ }),
21096
+ /** Abort a queued/rendering export; the partial file is removed. */
21097
+ cancelExport: method(object({ exportId: string() }), ExportRecordSchema, {
21098
+ kind: "mutation",
21099
+ auth: "protected"
21100
+ }),
21101
+ /** Remove the file but keep the history row (state → 'deleted'). */
21102
+ deleteExport: method(object({ exportId: string() }), ExportRecordSchema, {
21103
+ kind: "mutation",
21104
+ auth: "protected"
21105
+ }),
21106
+ getDownloadUrl: method(object({ exportId: string() }), ExportDownloadSchema, {
21107
+ kind: "query",
21108
+ auth: "protected"
21109
+ })
21110
+ }
21111
+ };
21112
+ /**
20941
21113
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
20942
21114
  * payload the (legacy) push `streamBroker.publishCameraStream` carried, minus
20943
21115
  * `deviceId`.
@@ -24861,6 +25033,42 @@ Object.freeze({
24861
25033
  addonId: null,
24862
25034
  access: "create"
24863
25035
  },
25036
+ "recordingExport.cancelExport": {
25037
+ capName: "recordingExport",
25038
+ capScope: "system",
25039
+ addonId: null,
25040
+ access: "create"
25041
+ },
25042
+ "recordingExport.createExport": {
25043
+ capName: "recordingExport",
25044
+ capScope: "system",
25045
+ addonId: null,
25046
+ access: "create"
25047
+ },
25048
+ "recordingExport.deleteExport": {
25049
+ capName: "recordingExport",
25050
+ capScope: "system",
25051
+ addonId: null,
25052
+ access: "delete"
25053
+ },
25054
+ "recordingExport.getDownloadUrl": {
25055
+ capName: "recordingExport",
25056
+ capScope: "system",
25057
+ addonId: null,
25058
+ access: "view"
25059
+ },
25060
+ "recordingExport.getExport": {
25061
+ capName: "recordingExport",
25062
+ capScope: "system",
25063
+ addonId: null,
25064
+ access: "view"
25065
+ },
25066
+ "recordingExport.listExports": {
25067
+ capName: "recordingExport",
25068
+ capScope: "system",
25069
+ addonId: null,
25070
+ access: "view"
25071
+ },
24864
25072
  "sceneMonitor.captureReference": {
24865
25073
  capName: "scene-monitor",
24866
25074
  capScope: "device",
@@ -26222,4 +26430,4 @@ function defaultDeviceFor(id) {
26222
26430
  return def(id).defaultDevice;
26223
26431
  }
26224
26432
  //#endregion
26225
- export { boolean as $, recordingCapability as A, DeviceFeature as B, mapAudioLabelToMacro as C, nodePin as D, motionDetectionCapability as E, supportedRuntimes as F, makeProfileBrokerId as G, createEvent as H, webrtcSessionCapability as I, parseProfileBrokerId as J, makeSourceBrokerId as K, errMsg as L, runtimeDevices as M, storageEvictableCapability as N, pipelineExecutorCapability as O, streamBrokerCapability as P, array as Q, BaseAddon as R, hfModelUrl as S, migrateConfigToBands as T, hydrateSchema as U, DeviceType as V, isEvent as W, sleep as X, selectAssignedProfileSlots as Y, _enum as Z, customAction as _, COCO_TO_MACRO as a, record as at, detectionPipelineCapability as b, EncodeProfileSchema as c, EventCategory as ct, RingBuffer as d, discriminatedUnion as et, YAMNET_TO_MACRO as f, cameraStreamsCapability as g, audioAnalyzerCapability as h, COCO_80_LABELS as i, object as it, resolveScrubThumbnailGeometry as j, pipelineRunnerCapability as k, HF_BASE_URL as l, audioAnalysisCapability as m, AUDIO_BACKEND_CHOICES as n, literal as nt, DEFAULT_AUDIO_ANALYZER_CONFIG as o, string as ot, addonWidgetsSourceCapability as p, parseJsonUnknown as q, AUDIO_MACRO_LABELS as r, number as rt, EVENT_PAD_MS as s, union as st, APPLE_SA_TO_MACRO as t, lazy as tt, RecordingConfigSchema as u, defaultDeviceFor as v, maskUrlCredentials as w, evaluateZoneRules as x, defineCustomActions as y, CAM_PROFILE_ORDER as z };
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 };
@@ -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",
@@ -8156,7 +8199,10 @@ var COCO_TO_MACRO = {
8156
8199
  elephant: "animal",
8157
8200
  bear: "animal",
8158
8201
  zebra: "animal",
8159
- giraffe: "animal"
8202
+ giraffe: "animal",
8203
+ suitcase: "package",
8204
+ backpack: "package",
8205
+ handbag: "package"
8160
8206
  },
8161
8207
  preserveOriginal: false
8162
8208
  };
@@ -13751,7 +13797,11 @@ array(ZoneRuleSchema).readonly();
13751
13797
  * Extend the enum here when a new gating consumer comes online (audio
13752
13798
  * gating, alert filtering, …) — no other surface needs to change.
13753
13799
  */
13754
- var ZoneRuleStageEnum = _enum(["motion", "detection"]);
13800
+ var ZoneRuleStageEnum = _enum([
13801
+ "motion",
13802
+ "detection",
13803
+ "package"
13804
+ ]);
13755
13805
  DeviceType.Camera, method(object({
13756
13806
  deviceId: number(),
13757
13807
  stage: ZoneRuleStageEnum
@@ -13764,7 +13814,8 @@ DeviceType.Camera, method(object({
13764
13814
  auth: "admin"
13765
13815
  }), object({
13766
13816
  motion: array(ZoneRuleSchema).readonly(),
13767
- detection: array(ZoneRuleSchema).readonly()
13817
+ detection: array(ZoneRuleSchema).readonly(),
13818
+ package: array(ZoneRuleSchema).readonly()
13768
13819
  });
13769
13820
  var ProviderStatusSchema = object({
13770
13821
  connected: boolean(),
@@ -17157,6 +17208,7 @@ var EventKindIconSchema = _enum([
17157
17208
  "smoke",
17158
17209
  "water",
17159
17210
  "button",
17211
+ "package",
17160
17212
  "generic"
17161
17213
  ]);
17162
17214
  var EventKindCategorySchema = _enum([
@@ -17164,7 +17216,8 @@ var EventKindCategorySchema = _enum([
17164
17216
  "audio",
17165
17217
  "detection",
17166
17218
  "sensor",
17167
- "custom"
17219
+ "custom",
17220
+ "package"
17168
17221
  ]);
17169
17222
  var EventKindDescriptorSchema = object({
17170
17223
  /** Stable kind id (e.g. 'motion', 'person', 'contact'). */
@@ -20938,6 +20991,125 @@ var recordingCapability = {
20938
20991
  }
20939
20992
  };
20940
20993
  /**
20994
+ * `recordingExport` cap — render a footage time range into a single downloadable
20995
+ * MP4 (regular / accelerated / decelerated / timelapse, ± audio), kept for a
20996
+ * bounded lifetime with a durable history, auto-expiry, and optional
20997
+ * delete-after-download.
20998
+ *
20999
+ * Like `recording` this is a `scope:'system', mode:'singleton'` cap: the
21000
+ * recorder self-gates so exactly ONE node (the designated `recordingNodeId`,
21001
+ * default `hub`) registers it. Device-scoped methods carry `deviceId` in their
21002
+ * input and dispatch to that single provider; the render runs on the node that
21003
+ * owns the footage (no cross-node segment transfer). Download rides the
21004
+ * framework addon data-plane. State persists in a DurableState blob (NOT
21005
+ * SQLite); history rows survive file deletion for audit.
21006
+ */
21007
+ /** Playback-speed multiplier for the render (1 = realtime). */
21008
+ var ExportSpeedSchema = number().min(.25).max(32);
21009
+ /** Timelapse cadence — sample one source frame per `everyMs`, output at `outputFps`. */
21010
+ var ExportTimelapseSchema = object({
21011
+ everyMs: number().int().positive(),
21012
+ outputFps: number().int().min(1).max(60).optional()
21013
+ });
21014
+ /**
21015
+ * Render options. `speed` and `timelapse` are mutually exclusive. `includeAudio`
21016
+ * is honoured only for a realtime-ish speed (0.5–2×); timelapse is always
21017
+ * silent. `maxLifeMs` bounds how long the finished file is kept;
21018
+ * `deleteAfterDownload` removes it shortly after the first complete download.
21019
+ */
21020
+ var ExportOptionsSchema = object({
21021
+ speed: ExportSpeedSchema.optional(),
21022
+ timelapse: ExportTimelapseSchema.optional(),
21023
+ includeAudio: boolean(),
21024
+ maxLifeMs: number().int().positive(),
21025
+ deleteAfterDownload: boolean(),
21026
+ title: string().max(200).optional()
21027
+ }).superRefine((v, ctx) => {
21028
+ if (v.speed !== void 0 && v.timelapse !== void 0) ctx.addIssue({
21029
+ code: ZodIssueCode.custom,
21030
+ message: "speed and timelapse are mutually exclusive",
21031
+ path: ["timelapse"]
21032
+ });
21033
+ });
21034
+ var ExportStateSchema = _enum([
21035
+ "queued",
21036
+ "rendering",
21037
+ "ready",
21038
+ "failed",
21039
+ "expired",
21040
+ "deleted"
21041
+ ]);
21042
+ /** One export job / history row. */
21043
+ var ExportRecordSchema = object({
21044
+ id: string(),
21045
+ deviceId: number(),
21046
+ profile: string(),
21047
+ fromMs: number(),
21048
+ toMs: number(),
21049
+ options: ExportOptionsSchema,
21050
+ state: ExportStateSchema,
21051
+ /** 0–100 while rendering; null otherwise. */
21052
+ progressPct: number().nullable(),
21053
+ /** File size once ready; null before. */
21054
+ fileBytes: number().nullable(),
21055
+ expiresAt: number(),
21056
+ deleteAfterDownload: boolean(),
21057
+ /** Epoch of the first complete download; null until then. */
21058
+ downloadedAt: number().nullable(),
21059
+ createdAt: number(),
21060
+ /** User id/name that requested the export. */
21061
+ createdBy: string(),
21062
+ /** Failure reason when state is 'failed'; null otherwise. */
21063
+ error: string().nullable()
21064
+ });
21065
+ /** Candidate download URLs (LAN first, then operator extra hosts). */
21066
+ var ExportDownloadSchema = object({
21067
+ url: string(),
21068
+ endpoints: array(string())
21069
+ });
21070
+ var recordingExportCapability = {
21071
+ name: "recordingExport",
21072
+ scope: "system",
21073
+ mode: "singleton",
21074
+ methods: {
21075
+ /** Queue a render of `[fromMs,toMs)` for `deviceId`/`profile`. Fails fast
21076
+ * when no footage covers the range. Returns the queued record. */
21077
+ createExport: method(object({
21078
+ deviceId: number(),
21079
+ profile: string(),
21080
+ fromMs: number(),
21081
+ toMs: number(),
21082
+ options: ExportOptionsSchema
21083
+ }), ExportRecordSchema, {
21084
+ kind: "mutation",
21085
+ auth: "protected"
21086
+ }),
21087
+ /** All export rows (history included), optionally scoped to one device. */
21088
+ listExports: method(object({ deviceId: number().optional() }), array(ExportRecordSchema), {
21089
+ kind: "query",
21090
+ auth: "protected"
21091
+ }),
21092
+ getExport: method(object({ exportId: string() }), ExportRecordSchema, {
21093
+ kind: "query",
21094
+ auth: "protected"
21095
+ }),
21096
+ /** Abort a queued/rendering export; the partial file is removed. */
21097
+ cancelExport: method(object({ exportId: string() }), ExportRecordSchema, {
21098
+ kind: "mutation",
21099
+ auth: "protected"
21100
+ }),
21101
+ /** Remove the file but keep the history row (state → 'deleted'). */
21102
+ deleteExport: method(object({ exportId: string() }), ExportRecordSchema, {
21103
+ kind: "mutation",
21104
+ auth: "protected"
21105
+ }),
21106
+ getDownloadUrl: method(object({ exportId: string() }), ExportDownloadSchema, {
21107
+ kind: "query",
21108
+ auth: "protected"
21109
+ })
21110
+ }
21111
+ };
21112
+ /**
20941
21113
  * One publishable camera stream as its OWNING PROVIDER describes it — the same
20942
21114
  * payload the (legacy) push `streamBroker.publishCameraStream` carried, minus
20943
21115
  * `deviceId`.
@@ -24861,6 +25033,42 @@ Object.freeze({
24861
25033
  addonId: null,
24862
25034
  access: "create"
24863
25035
  },
25036
+ "recordingExport.cancelExport": {
25037
+ capName: "recordingExport",
25038
+ capScope: "system",
25039
+ addonId: null,
25040
+ access: "create"
25041
+ },
25042
+ "recordingExport.createExport": {
25043
+ capName: "recordingExport",
25044
+ capScope: "system",
25045
+ addonId: null,
25046
+ access: "create"
25047
+ },
25048
+ "recordingExport.deleteExport": {
25049
+ capName: "recordingExport",
25050
+ capScope: "system",
25051
+ addonId: null,
25052
+ access: "delete"
25053
+ },
25054
+ "recordingExport.getDownloadUrl": {
25055
+ capName: "recordingExport",
25056
+ capScope: "system",
25057
+ addonId: null,
25058
+ access: "view"
25059
+ },
25060
+ "recordingExport.getExport": {
25061
+ capName: "recordingExport",
25062
+ capScope: "system",
25063
+ addonId: null,
25064
+ access: "view"
25065
+ },
25066
+ "recordingExport.listExports": {
25067
+ capName: "recordingExport",
25068
+ capScope: "system",
25069
+ addonId: null,
25070
+ access: "view"
25071
+ },
24864
25072
  "sceneMonitor.captureReference": {
24865
25073
  capName: "scene-monitor",
24866
25074
  capScope: "device",
@@ -26300,6 +26508,12 @@ Object.defineProperty(exports, "EventCategory", {
26300
26508
  return EventCategory;
26301
26509
  }
26302
26510
  });
26511
+ Object.defineProperty(exports, "ExportRecordSchema", {
26512
+ enumerable: true,
26513
+ get: function() {
26514
+ return ExportRecordSchema;
26515
+ }
26516
+ });
26303
26517
  Object.defineProperty(exports, "HF_BASE_URL", {
26304
26518
  enumerable: true,
26305
26519
  get: function() {
@@ -26534,6 +26748,12 @@ Object.defineProperty(exports, "recordingCapability", {
26534
26748
  return recordingCapability;
26535
26749
  }
26536
26750
  });
26751
+ Object.defineProperty(exports, "recordingExportCapability", {
26752
+ enumerable: true,
26753
+ get: function() {
26754
+ return recordingExportCapability;
26755
+ }
26756
+ });
26537
26757
  Object.defineProperty(exports, "resolveScrubThumbnailGeometry", {
26538
26758
  enumerable: true,
26539
26759
  get: function() {
@@ -328,4 +328,4 @@ function deleteModelFromDisk(modelsDir, entry, format) {
328
328
  return true;
329
329
  }
330
330
  //#endregion
331
- export { isModelDownloaded as a, ensureModel as i, deleteModelFromDisk as n, downloadFile as r, createFileDataPlaneHandler as t };
331
+ export { ensureModel as a, downloadFile as i, createFileDataPlaneHandler as n, isModelDownloaded as o, deleteModelFromDisk as r, parseRangeHeader as s, contentTypeFor as t };