@camstack/addon-pipeline 1.1.21 → 1.1.23

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 +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/audio-codec-ffmpeg/index.js +1 -1
  4. package/dist/audio-codec-ffmpeg/index.mjs +1 -1
  5. package/dist/decoder-ffmpeg/index.js +1 -1
  6. package/dist/decoder-ffmpeg/index.mjs +1 -1
  7. package/dist/detection-pipeline/index.js +1 -1
  8. package/dist/detection-pipeline/index.mjs +1 -1
  9. package/dist/{dist-BiP1gPeY.js → dist-CE3a05qT.js} +228 -16
  10. package/dist/{dist-tzhTTRq4.mjs → dist-pd_-3C0T.mjs} +228 -16
  11. package/dist/motion-wasm/index.js +1 -1
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/pipeline-runner/index.js +412 -247
  14. package/dist/pipeline-runner/index.mjs +412 -247
  15. package/dist/recorder/index.js +260 -234
  16. package/dist/recorder/index.mjs +260 -234
  17. package/dist/stream-broker/_stub.js +378 -324
  18. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-D08qJTw_.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BVFAEkIB.mjs} +2 -2
  19. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BFeBlYRQ.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-C0QtG7oR.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BC1Jt6G8.mjs} +1 -1
  21. package/dist/stream-broker/{hostInit-CGnMNtPl.mjs → hostInit-DHej3Ep9.mjs} +2 -2
  22. package/dist/stream-broker/index.js +13788 -12378
  23. package/dist/stream-broker/index.mjs +13907 -12497
  24. package/dist/stream-broker/remoteEntry.js +1 -1
  25. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-CW4Qu4V6.js → MaskShapeCanvas-DI4BY7W2-BqXU75it.js} +1 -1
  26. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-CHJ39tfi.js → MotionZonesSettings-NcxxQN8r-Ct2fpgCd.js} +1 -1
  27. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-dInJ7kcz.js → PrivacyMaskSettings-APgPLF7p-a9eFVPPl.js} +1 -1
  28. package/embed-dist/assets/index-DhdVxWXL.js +80 -0
  29. package/embed-dist/index.html +1 -1
  30. package/package.json +1 -1
  31. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BSWrW78G.mjs +0 -26
  32. package/embed-dist/assets/index-CKpVWKSG.js +0 -80
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_model_download_service_C_IHWnXx = require("../model-download-service-C-IHWnXx-BnQ_awK4.js");
6
- const require_dist = require("../dist-BiP1gPeY.js");
6
+ const require_dist = require("../dist-CE3a05qT.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_model_download_service_C_IHWnXx.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { B as BaseAddon, E as mapAudioLabelToMacro, J as hydrateSchema, g as audioAnalyzerCapability, h as audioAnalysisCapability, l as HF_BASE_URL, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, z as errMsg } from "../dist-tzhTTRq4.mjs";
2
+ import { B as BaseAddon, E as mapAudioLabelToMacro, J as hydrateSchema, g as audioAnalyzerCapability, h as audioAnalysisCapability, l as HF_BASE_URL, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG, z as errMsg } from "../dist-pd_-3C0T.mjs";
3
3
  import { r as downloadFile } from "../model-download-service-C-IHWnXx-3Mmeob3l.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
@@ -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-BiP1gPeY.js");
5
+ const require_dist = require("../dist-CE3a05qT.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_child_process = require("node:child_process");
8
8
  //#region src/audio-codec-ffmpeg/ffmpeg-audio-process.ts
@@ -1,4 +1,4 @@
1
- import { B as BaseAddon, _ as audioCodecCapability, z as errMsg } from "../dist-tzhTTRq4.mjs";
1
+ import { B as BaseAddon, _ as audioCodecCapability, z as errMsg } from "../dist-pd_-3C0T.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { spawn } from "node:child_process";
4
4
  //#region src/audio-codec-ffmpeg/ffmpeg-audio-process.ts
@@ -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-BiP1gPeY.js");
5
+ const require_dist = require("../dist-CE3a05qT.js");
6
6
  const require_frame_dropper = require("../frame-dropper-7RTo_YyG.js");
7
7
  let _camstack_shm_ring = require("@camstack/shm-ring");
8
8
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { B as BaseAddon, b as decoderCapability, f as RingBuffer, s as DEFAULT_DECODER_HWACCEL_CONFIG, u as HWACCEL_OPTIONS, z as errMsg } from "../dist-tzhTTRq4.mjs";
1
+ import { B as BaseAddon, b as decoderCapability, f as RingBuffer, s as DEFAULT_DECODER_HWACCEL_CONFIG, u as HWACCEL_OPTIONS, z as errMsg } from "../dist-pd_-3C0T.mjs";
2
2
  import { r as logBannerArgs, t as FrameDropper } from "../frame-dropper-CwkBTPGV.mjs";
3
3
  import { FrameRingReaderCache, FrameRingWriter, MIN_RING_SLOTS, computeSegmentSize, computeSlotByteLength, createSegment, deriveSlotCount } from "@camstack/shm-ring";
4
4
  import { randomUUID } from "node:crypto";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_model_download_service_C_IHWnXx = require("../model-download-service-C-IHWnXx-BnQ_awK4.js");
6
- const require_dist = require("../dist-BiP1gPeY.js");
6
+ const require_dist = require("../dist-CE3a05qT.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_model_download_service_C_IHWnXx.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { A as nodePin, B as BaseAddon, C as detectionPipelineCapability, J as hydrateSchema, L as supportedRuntimes$1, P as runtimeDevices$1, T as hfModelUrl, W as EventCategory, Z as parseJsonUnknown, a as COCO_TO_MACRO, et as sleep, i as COCO_80_LABELS, j as pipelineExecutorCapability, p as YAMNET_TO_MACRO, q as createEvent, r as AUDIO_MACRO_LABELS, t as APPLE_SA_TO_MACRO, w as evaluateZoneRules, x as defaultDeviceFor$1, z as errMsg } from "../dist-tzhTTRq4.mjs";
2
+ import { A as nodePin, B as BaseAddon, C as detectionPipelineCapability, J as hydrateSchema, L as supportedRuntimes$1, P as runtimeDevices$1, T as hfModelUrl, W as EventCategory, Z as parseJsonUnknown, a as COCO_TO_MACRO, et as sleep, i as COCO_80_LABELS, j as pipelineExecutorCapability, p as YAMNET_TO_MACRO, q as createEvent, r as AUDIO_MACRO_LABELS, t as APPLE_SA_TO_MACRO, w as evaluateZoneRules, x as defaultDeviceFor$1, z as errMsg } from "../dist-pd_-3C0T.mjs";
3
3
  import { a as isModelDownloaded, i as ensureModel, n as deleteModelFromDisk } from "../model-download-service-C-IHWnXx-3Mmeob3l.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-C2M2zF7x.mjs
4630
+ //#region ../types/dist/sleep-MHm--th-.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5895,6 +5895,7 @@ var CamStreamKindSchema = _enum([
5895
5895
  "pull-rtsp",
5896
5896
  "pull-rtmp",
5897
5897
  "pull-http",
5898
+ "pull-flv",
5898
5899
  "pull-rfc4571",
5899
5900
  "push-annexb",
5900
5901
  "derived"
@@ -14611,7 +14612,7 @@ var AddBrokerInputSchema = object({
14611
14612
  });
14612
14613
  var AddBrokerResultSchema = object({ id: string() });
14613
14614
  var IdInputSchema = object({ id: string() });
14614
- var TestResultSchema = discriminatedUnion("ok", [object({
14615
+ var TestResultSchema$1 = discriminatedUnion("ok", [object({
14615
14616
  ok: literal(true),
14616
14617
  latencyMs: number()
14617
14618
  }), object({
@@ -14634,7 +14635,7 @@ var StatusSchema = object({
14634
14635
  brokerCount: number(),
14635
14636
  embeddedRunning: boolean()
14636
14637
  });
14637
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
14638
+ method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema$1, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
14638
14639
  var NetworkEndpointSchema = object({
14639
14640
  url: string(),
14640
14641
  hostname: string(),
@@ -14668,23 +14669,198 @@ var NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
14668
14669
  sourcePort: number().optional()
14669
14670
  });
14670
14671
  method(_void(), NetworkEndpointSchema, { kind: "mutation" }), method(_void(), _void(), { kind: "mutation" }), method(_void(), NetworkEndpointSchema.nullable()), method(_void(), NetworkAccessStatusSchema), method(_void(), array(NetworkEndpointEntrySchema).readonly());
14671
- method(object({
14672
- title: string(),
14672
+ /**
14673
+ * notification-output — canonical, capability-gated notification delivery.
14674
+ *
14675
+ * Apprise-derived model (see
14676
+ * `docs/superpowers/specs/2026-07-03-notification-output-notifier-matrix.md`):
14677
+ * callers emit ONE canonical `Notification`; each provider declares a
14678
+ * per-kind capability descriptor (`TargetKind`), and the pure degrade
14679
+ * engine (`@camstack/types` `prepareNotification`) transcodes / degrades the
14680
+ * message to what the kind supports — callers never special-case a service.
14681
+ *
14682
+ * DESIGN DECISIONS (locked):
14683
+ * - Target CRUD lives on THIS cap (`upsertTarget` / `deleteTarget` /
14684
+ * `setTargetEnabled`), each provider persisting via the `settings-store`
14685
+ * cap. Rationale: the admin UI needs one uniform surface across the
14686
+ * notifiers addon AND the HA addon; the addon-`globalSettingsSchema`-array
14687
+ * alternative would fork the UI per addon and cannot host the
14688
+ * discovery→adopt flow.
14689
+ * - `listTargetKinds` / `listTargets` / `discoverTargets` return arrays →
14690
+ * the generated cap-mount auto-`concatCollection`-fans them across every
14691
+ * registered provider (notifiers addon + HA addon) so one catalog is
14692
+ * routable. `send` / `testTarget` / CRUD route to ONE provider by the
14693
+ * `addonId` the generated collection router extracts from the call input.
14694
+ * - `Attachment.bytes` is `Uint8Array`. Transport-safe: superjson (the tRPC
14695
+ * transformer) + UDS MsgPack both round-trip typed arrays — already used by
14696
+ * `storage` / `storage-provider` / `recording` caps over the same path. No
14697
+ * base64 fallback needed.
14698
+ *
14699
+ * TODO (deferred, closed-set change — separate decision): add
14700
+ * `providerKind: 'notify'` so notification providers surface on the unified
14701
+ * admin "Integrations" page.
14702
+ */
14703
+ /**
14704
+ * Zentik-derived typed-media enum — the superset across every kind. Each
14705
+ * adapter picks what it supports and the degrade engine filters the rest.
14706
+ */
14707
+ var AttachmentMediaTypeSchema = _enum([
14708
+ "image",
14709
+ "video",
14710
+ "gif",
14711
+ "audio",
14712
+ "icon"
14713
+ ]);
14714
+ /**
14715
+ * A single attachment. Exactly one of `url` (remote source, most adapters
14716
+ * prefer this) or `bytes` (inline source; required for Pushover-style
14717
+ * bytes-only kinds) MUST be present — the degrade engine expresses a
14718
+ * url→bytes fetch as a `needsFetch` directive the adapter executes.
14719
+ */
14720
+ var AttachmentSchema = object({
14721
+ mediaType: AttachmentMediaTypeSchema,
14722
+ url: string().optional(),
14723
+ bytes: _instanceof(Uint8Array).optional(),
14724
+ mime: string().optional(),
14725
+ name: string().optional()
14726
+ }).refine((a) => a.url !== void 0 || a.bytes !== void 0, { message: "Attachment requires either `url` or `bytes`" });
14727
+ var NotificationFormatSchema = _enum([
14728
+ "text",
14729
+ "markdown",
14730
+ "html"
14731
+ ]);
14732
+ /** A single tap-through action button. */
14733
+ var NotificationActionSchema = object({
14734
+ id: string(),
14735
+ label: string(),
14736
+ url: string().optional()
14737
+ });
14738
+ /**
14739
+ * The canonical notification. `body` is the only hard field (Apprise model).
14740
+ * `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
14741
+ * NOT a fixed severity enum — each kind declares its own `caps.levels` and
14742
+ * the adapter maps this ordinal onto its native level. `level?` is an
14743
+ * optional kind-native level id (`emergency`, `silent`, …) that overrides
14744
+ * `priority` for that one target.
14745
+ */
14746
+ var NotificationSchema = object({
14673
14747
  body: string(),
14674
- imageUrl: string().optional(),
14748
+ title: string().optional(),
14749
+ format: NotificationFormatSchema.default("text"),
14750
+ priority: number().int().min(1).max(5).default(3),
14751
+ level: string().optional(),
14752
+ attachments: array(AttachmentSchema).optional(),
14753
+ clickUrl: string().optional(),
14754
+ actions: array(NotificationActionSchema).optional(),
14755
+ sound: string().optional(),
14756
+ ttl: number().optional(),
14757
+ tag: string().optional(),
14675
14758
  deviceId: number().optional(),
14676
14759
  eventId: string().optional(),
14677
- priority: _enum([
14678
- "low",
14679
- "normal",
14680
- "high",
14681
- "critical"
14682
- ]).default("normal"),
14683
14760
  metadata: record(string(), unknown()).optional()
14684
- }), _void(), { kind: "mutation" }), method(_void(), object({
14761
+ });
14762
+ /** One declared native severity/priority level for a kind. */
14763
+ var TargetKindLevelSchema = object({
14764
+ id: string(),
14765
+ label: string(),
14766
+ /** Which canonical priority (1..5) this level maps to. `null` = qualitative-only. */
14767
+ ordinal: number().int().min(1).max(5).nullable(),
14768
+ flags: object({
14769
+ critical: boolean().optional(),
14770
+ silent: boolean().optional(),
14771
+ noPush: boolean().optional()
14772
+ }).optional(),
14773
+ /** e.g. Pushover `emergency` requires `retry` / `expire`. */
14774
+ requires: array(string()).optional(),
14775
+ description: string().optional()
14776
+ });
14777
+ /** The full capability block consulted before dispatch. */
14778
+ var TargetKindCapsSchema = object({
14779
+ attachments: object({
14780
+ mediaTypes: array(AttachmentMediaTypeSchema),
14781
+ mode: _enum([
14782
+ "url",
14783
+ "bytes",
14784
+ "both"
14785
+ ]),
14786
+ max: number().int().nonnegative(),
14787
+ maxBytes: number().int().positive().optional()
14788
+ }),
14789
+ /** Max action buttons (0 = none). */
14790
+ actions: number().int().nonnegative(),
14791
+ levels: array(TargetKindLevelSchema),
14792
+ format: array(NotificationFormatSchema),
14793
+ clickUrl: boolean(),
14794
+ sound: boolean(),
14795
+ ttl: boolean(),
14796
+ bodyMaxLen: number().int().positive()
14797
+ });
14798
+ /**
14799
+ * `configSchema` is a `ConfigUISchema` tree passed through to the admin
14800
+ * FormBuilder. Stored as `z.unknown()` at the cap seam (mirrors
14801
+ * `device-provider.getChildCreationSchema` `CreationSchemaOutputSchema`) —
14802
+ * the union is large and not meant for runtime validation here; the exported
14803
+ * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14804
+ */
14805
+ var ConfigSchemaPassthrough = unknown();
14806
+ var TargetKindSchema = object({
14807
+ kind: string(),
14808
+ label: string(),
14809
+ icon: string(),
14810
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
14811
+ addonId: string(),
14812
+ configSchema: ConfigSchemaPassthrough,
14813
+ supportsDiscovery: boolean(),
14814
+ caps: TargetKindCapsSchema
14815
+ });
14816
+ /**
14817
+ * A persisted target. `config` holds secrets; providers REDACT secret fields
14818
+ * (return a presence marker only) when serving `listTargets` — never
14819
+ * round-trip a stored secret to the UI.
14820
+ */
14821
+ var TargetSchema = object({
14822
+ id: string(),
14823
+ name: string(),
14824
+ kind: string(),
14825
+ addonId: string(),
14826
+ enabled: boolean(),
14827
+ config: record(string(), unknown())
14828
+ });
14829
+ /** A discovery-surfaced candidate (config is partial + non-secret). */
14830
+ var DiscoveredTargetSchema = object({
14831
+ kind: string(),
14832
+ suggestedName: string(),
14833
+ config: record(string(), unknown())
14834
+ });
14835
+ /** The degrade engine's report — what was resolved / dropped / degraded. */
14836
+ var RenderedAsSchema = object({
14837
+ level: string(),
14838
+ format: NotificationFormatSchema,
14839
+ attachmentsSent: number().int().nonnegative(),
14840
+ actionsSent: number().int().nonnegative(),
14841
+ truncated: boolean(),
14842
+ dropped: array(string())
14843
+ });
14844
+ var SendResultSchema = object({
14685
14845
  success: boolean(),
14686
- error: string().optional()
14687
- }), { kind: "mutation" });
14846
+ error: string().optional(),
14847
+ renderedAs: RenderedAsSchema.optional()
14848
+ });
14849
+ /** Same shape as SendResult — kept as a distinct name for the test panel. */
14850
+ var TestResultSchema = SendResultSchema;
14851
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema)), method(object({
14852
+ kind: string(),
14853
+ config: record(string(), unknown()).optional()
14854
+ }), array(DiscoveredTargetSchema)), method(object({
14855
+ targetId: string(),
14856
+ notification: NotificationSchema
14857
+ }), SendResultSchema, { kind: "mutation" }), method(object({
14858
+ targetId: string(),
14859
+ sample: NotificationSchema.optional()
14860
+ }), TestResultSchema, { kind: "mutation" }), method(object({ target: TargetSchema }), TargetSchema, { kind: "mutation" }), method(object({ targetId: string() }), _void(), { kind: "mutation" }), method(object({
14861
+ targetId: string(),
14862
+ enabled: boolean()
14863
+ }), _void(), { kind: "mutation" });
14688
14864
  /**
14689
14865
  * Zod schemas for persisted record types.
14690
14866
  *
@@ -20807,13 +20983,49 @@ Object.freeze({
20807
20983
  addonId: null,
20808
20984
  access: "create"
20809
20985
  },
20986
+ "notificationOutput.deleteTarget": {
20987
+ capName: "notification-output",
20988
+ capScope: "system",
20989
+ addonId: null,
20990
+ access: "delete"
20991
+ },
20992
+ "notificationOutput.discoverTargets": {
20993
+ capName: "notification-output",
20994
+ capScope: "system",
20995
+ addonId: null,
20996
+ access: "view"
20997
+ },
20998
+ "notificationOutput.listTargetKinds": {
20999
+ capName: "notification-output",
21000
+ capScope: "system",
21001
+ addonId: null,
21002
+ access: "view"
21003
+ },
21004
+ "notificationOutput.listTargets": {
21005
+ capName: "notification-output",
21006
+ capScope: "system",
21007
+ addonId: null,
21008
+ access: "view"
21009
+ },
20810
21010
  "notificationOutput.send": {
20811
21011
  capName: "notification-output",
20812
21012
  capScope: "system",
20813
21013
  addonId: null,
20814
21014
  access: "create"
20815
21015
  },
20816
- "notificationOutput.sendTest": {
21016
+ "notificationOutput.setTargetEnabled": {
21017
+ capName: "notification-output",
21018
+ capScope: "system",
21019
+ addonId: null,
21020
+ access: "create"
21021
+ },
21022
+ "notificationOutput.testTarget": {
21023
+ capName: "notification-output",
21024
+ capScope: "system",
21025
+ addonId: null,
21026
+ access: "create"
21027
+ },
21028
+ "notificationOutput.upsertTarget": {
20817
21029
  capName: "notification-output",
20818
21030
  capScope: "system",
20819
21031
  addonId: null,
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-C2M2zF7x.mjs
4630
+ //#region ../types/dist/sleep-MHm--th-.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5895,6 +5895,7 @@ var CamStreamKindSchema = _enum([
5895
5895
  "pull-rtsp",
5896
5896
  "pull-rtmp",
5897
5897
  "pull-http",
5898
+ "pull-flv",
5898
5899
  "pull-rfc4571",
5899
5900
  "push-annexb",
5900
5901
  "derived"
@@ -14611,7 +14612,7 @@ var AddBrokerInputSchema = object({
14611
14612
  });
14612
14613
  var AddBrokerResultSchema = object({ id: string() });
14613
14614
  var IdInputSchema = object({ id: string() });
14614
- var TestResultSchema = discriminatedUnion("ok", [object({
14615
+ var TestResultSchema$1 = discriminatedUnion("ok", [object({
14615
14616
  ok: literal(true),
14616
14617
  latencyMs: number()
14617
14618
  }), object({
@@ -14634,7 +14635,7 @@ var StatusSchema = object({
14634
14635
  brokerCount: number(),
14635
14636
  embeddedRunning: boolean()
14636
14637
  });
14637
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
14638
+ method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema), method(AddBrokerInputSchema, AddBrokerResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(IdInputSchema, TestResultSchema$1, { kind: "mutation" }), method(StartEmbeddedInputSchema, StartEmbeddedResultSchema, { kind: "mutation" }), method(IdInputSchema, _void(), { kind: "mutation" }), method(_void(), StatusSchema);
14638
14639
  var NetworkEndpointSchema = object({
14639
14640
  url: string(),
14640
14641
  hostname: string(),
@@ -14668,23 +14669,198 @@ var NetworkEndpointEntrySchema = NetworkEndpointSchema.extend({
14668
14669
  sourcePort: number().optional()
14669
14670
  });
14670
14671
  method(_void(), NetworkEndpointSchema, { kind: "mutation" }), method(_void(), _void(), { kind: "mutation" }), method(_void(), NetworkEndpointSchema.nullable()), method(_void(), NetworkAccessStatusSchema), method(_void(), array(NetworkEndpointEntrySchema).readonly());
14671
- method(object({
14672
- title: string(),
14672
+ /**
14673
+ * notification-output — canonical, capability-gated notification delivery.
14674
+ *
14675
+ * Apprise-derived model (see
14676
+ * `docs/superpowers/specs/2026-07-03-notification-output-notifier-matrix.md`):
14677
+ * callers emit ONE canonical `Notification`; each provider declares a
14678
+ * per-kind capability descriptor (`TargetKind`), and the pure degrade
14679
+ * engine (`@camstack/types` `prepareNotification`) transcodes / degrades the
14680
+ * message to what the kind supports — callers never special-case a service.
14681
+ *
14682
+ * DESIGN DECISIONS (locked):
14683
+ * - Target CRUD lives on THIS cap (`upsertTarget` / `deleteTarget` /
14684
+ * `setTargetEnabled`), each provider persisting via the `settings-store`
14685
+ * cap. Rationale: the admin UI needs one uniform surface across the
14686
+ * notifiers addon AND the HA addon; the addon-`globalSettingsSchema`-array
14687
+ * alternative would fork the UI per addon and cannot host the
14688
+ * discovery→adopt flow.
14689
+ * - `listTargetKinds` / `listTargets` / `discoverTargets` return arrays →
14690
+ * the generated cap-mount auto-`concatCollection`-fans them across every
14691
+ * registered provider (notifiers addon + HA addon) so one catalog is
14692
+ * routable. `send` / `testTarget` / CRUD route to ONE provider by the
14693
+ * `addonId` the generated collection router extracts from the call input.
14694
+ * - `Attachment.bytes` is `Uint8Array`. Transport-safe: superjson (the tRPC
14695
+ * transformer) + UDS MsgPack both round-trip typed arrays — already used by
14696
+ * `storage` / `storage-provider` / `recording` caps over the same path. No
14697
+ * base64 fallback needed.
14698
+ *
14699
+ * TODO (deferred, closed-set change — separate decision): add
14700
+ * `providerKind: 'notify'` so notification providers surface on the unified
14701
+ * admin "Integrations" page.
14702
+ */
14703
+ /**
14704
+ * Zentik-derived typed-media enum — the superset across every kind. Each
14705
+ * adapter picks what it supports and the degrade engine filters the rest.
14706
+ */
14707
+ var AttachmentMediaTypeSchema = _enum([
14708
+ "image",
14709
+ "video",
14710
+ "gif",
14711
+ "audio",
14712
+ "icon"
14713
+ ]);
14714
+ /**
14715
+ * A single attachment. Exactly one of `url` (remote source, most adapters
14716
+ * prefer this) or `bytes` (inline source; required for Pushover-style
14717
+ * bytes-only kinds) MUST be present — the degrade engine expresses a
14718
+ * url→bytes fetch as a `needsFetch` directive the adapter executes.
14719
+ */
14720
+ var AttachmentSchema = object({
14721
+ mediaType: AttachmentMediaTypeSchema,
14722
+ url: string().optional(),
14723
+ bytes: _instanceof(Uint8Array).optional(),
14724
+ mime: string().optional(),
14725
+ name: string().optional()
14726
+ }).refine((a) => a.url !== void 0 || a.bytes !== void 0, { message: "Attachment requires either `url` or `bytes`" });
14727
+ var NotificationFormatSchema = _enum([
14728
+ "text",
14729
+ "markdown",
14730
+ "html"
14731
+ ]);
14732
+ /** A single tap-through action button. */
14733
+ var NotificationActionSchema = object({
14734
+ id: string(),
14735
+ label: string(),
14736
+ url: string().optional()
14737
+ });
14738
+ /**
14739
+ * The canonical notification. `body` is the only hard field (Apprise model).
14740
+ * `priority` is a 5-level ORDINAL (1=lowest … 3=normal(default) … 5=urgent),
14741
+ * NOT a fixed severity enum — each kind declares its own `caps.levels` and
14742
+ * the adapter maps this ordinal onto its native level. `level?` is an
14743
+ * optional kind-native level id (`emergency`, `silent`, …) that overrides
14744
+ * `priority` for that one target.
14745
+ */
14746
+ var NotificationSchema = object({
14673
14747
  body: string(),
14674
- imageUrl: string().optional(),
14748
+ title: string().optional(),
14749
+ format: NotificationFormatSchema.default("text"),
14750
+ priority: number().int().min(1).max(5).default(3),
14751
+ level: string().optional(),
14752
+ attachments: array(AttachmentSchema).optional(),
14753
+ clickUrl: string().optional(),
14754
+ actions: array(NotificationActionSchema).optional(),
14755
+ sound: string().optional(),
14756
+ ttl: number().optional(),
14757
+ tag: string().optional(),
14675
14758
  deviceId: number().optional(),
14676
14759
  eventId: string().optional(),
14677
- priority: _enum([
14678
- "low",
14679
- "normal",
14680
- "high",
14681
- "critical"
14682
- ]).default("normal"),
14683
14760
  metadata: record(string(), unknown()).optional()
14684
- }), _void(), { kind: "mutation" }), method(_void(), object({
14761
+ });
14762
+ /** One declared native severity/priority level for a kind. */
14763
+ var TargetKindLevelSchema = object({
14764
+ id: string(),
14765
+ label: string(),
14766
+ /** Which canonical priority (1..5) this level maps to. `null` = qualitative-only. */
14767
+ ordinal: number().int().min(1).max(5).nullable(),
14768
+ flags: object({
14769
+ critical: boolean().optional(),
14770
+ silent: boolean().optional(),
14771
+ noPush: boolean().optional()
14772
+ }).optional(),
14773
+ /** e.g. Pushover `emergency` requires `retry` / `expire`. */
14774
+ requires: array(string()).optional(),
14775
+ description: string().optional()
14776
+ });
14777
+ /** The full capability block consulted before dispatch. */
14778
+ var TargetKindCapsSchema = object({
14779
+ attachments: object({
14780
+ mediaTypes: array(AttachmentMediaTypeSchema),
14781
+ mode: _enum([
14782
+ "url",
14783
+ "bytes",
14784
+ "both"
14785
+ ]),
14786
+ max: number().int().nonnegative(),
14787
+ maxBytes: number().int().positive().optional()
14788
+ }),
14789
+ /** Max action buttons (0 = none). */
14790
+ actions: number().int().nonnegative(),
14791
+ levels: array(TargetKindLevelSchema),
14792
+ format: array(NotificationFormatSchema),
14793
+ clickUrl: boolean(),
14794
+ sound: boolean(),
14795
+ ttl: boolean(),
14796
+ bodyMaxLen: number().int().positive()
14797
+ });
14798
+ /**
14799
+ * `configSchema` is a `ConfigUISchema` tree passed through to the admin
14800
+ * FormBuilder. Stored as `z.unknown()` at the cap seam (mirrors
14801
+ * `device-provider.getChildCreationSchema` `CreationSchemaOutputSchema`) —
14802
+ * the union is large and not meant for runtime validation here; the exported
14803
+ * `TargetKind` type re-tightens `configSchema` to `ConfigUISchema`.
14804
+ */
14805
+ var ConfigSchemaPassthrough = unknown();
14806
+ var TargetKindSchema = object({
14807
+ kind: string(),
14808
+ label: string(),
14809
+ icon: string(),
14810
+ /** Stamped by each provider so the concat-fanned catalog stays routable. */
14811
+ addonId: string(),
14812
+ configSchema: ConfigSchemaPassthrough,
14813
+ supportsDiscovery: boolean(),
14814
+ caps: TargetKindCapsSchema
14815
+ });
14816
+ /**
14817
+ * A persisted target. `config` holds secrets; providers REDACT secret fields
14818
+ * (return a presence marker only) when serving `listTargets` — never
14819
+ * round-trip a stored secret to the UI.
14820
+ */
14821
+ var TargetSchema = object({
14822
+ id: string(),
14823
+ name: string(),
14824
+ kind: string(),
14825
+ addonId: string(),
14826
+ enabled: boolean(),
14827
+ config: record(string(), unknown())
14828
+ });
14829
+ /** A discovery-surfaced candidate (config is partial + non-secret). */
14830
+ var DiscoveredTargetSchema = object({
14831
+ kind: string(),
14832
+ suggestedName: string(),
14833
+ config: record(string(), unknown())
14834
+ });
14835
+ /** The degrade engine's report — what was resolved / dropped / degraded. */
14836
+ var RenderedAsSchema = object({
14837
+ level: string(),
14838
+ format: NotificationFormatSchema,
14839
+ attachmentsSent: number().int().nonnegative(),
14840
+ actionsSent: number().int().nonnegative(),
14841
+ truncated: boolean(),
14842
+ dropped: array(string())
14843
+ });
14844
+ var SendResultSchema = object({
14685
14845
  success: boolean(),
14686
- error: string().optional()
14687
- }), { kind: "mutation" });
14846
+ error: string().optional(),
14847
+ renderedAs: RenderedAsSchema.optional()
14848
+ });
14849
+ /** Same shape as SendResult — kept as a distinct name for the test panel. */
14850
+ var TestResultSchema = SendResultSchema;
14851
+ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSchema)), method(object({
14852
+ kind: string(),
14853
+ config: record(string(), unknown()).optional()
14854
+ }), array(DiscoveredTargetSchema)), method(object({
14855
+ targetId: string(),
14856
+ notification: NotificationSchema
14857
+ }), SendResultSchema, { kind: "mutation" }), method(object({
14858
+ targetId: string(),
14859
+ sample: NotificationSchema.optional()
14860
+ }), TestResultSchema, { kind: "mutation" }), method(object({ target: TargetSchema }), TargetSchema, { kind: "mutation" }), method(object({ targetId: string() }), _void(), { kind: "mutation" }), method(object({
14861
+ targetId: string(),
14862
+ enabled: boolean()
14863
+ }), _void(), { kind: "mutation" });
14688
14864
  /**
14689
14865
  * Zod schemas for persisted record types.
14690
14866
  *
@@ -20807,13 +20983,49 @@ Object.freeze({
20807
20983
  addonId: null,
20808
20984
  access: "create"
20809
20985
  },
20986
+ "notificationOutput.deleteTarget": {
20987
+ capName: "notification-output",
20988
+ capScope: "system",
20989
+ addonId: null,
20990
+ access: "delete"
20991
+ },
20992
+ "notificationOutput.discoverTargets": {
20993
+ capName: "notification-output",
20994
+ capScope: "system",
20995
+ addonId: null,
20996
+ access: "view"
20997
+ },
20998
+ "notificationOutput.listTargetKinds": {
20999
+ capName: "notification-output",
21000
+ capScope: "system",
21001
+ addonId: null,
21002
+ access: "view"
21003
+ },
21004
+ "notificationOutput.listTargets": {
21005
+ capName: "notification-output",
21006
+ capScope: "system",
21007
+ addonId: null,
21008
+ access: "view"
21009
+ },
20810
21010
  "notificationOutput.send": {
20811
21011
  capName: "notification-output",
20812
21012
  capScope: "system",
20813
21013
  addonId: null,
20814
21014
  access: "create"
20815
21015
  },
20816
- "notificationOutput.sendTest": {
21016
+ "notificationOutput.setTargetEnabled": {
21017
+ capName: "notification-output",
21018
+ capScope: "system",
21019
+ addonId: null,
21020
+ access: "create"
21021
+ },
21022
+ "notificationOutput.testTarget": {
21023
+ capName: "notification-output",
21024
+ capScope: "system",
21025
+ addonId: null,
21026
+ access: "create"
21027
+ },
21028
+ "notificationOutput.upsertTarget": {
20817
21029
  capName: "notification-output",
20818
21030
  capScope: "system",
20819
21031
  addonId: null,
@@ -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-BiP1gPeY.js");
5
+ const require_dist = require("../dist-CE3a05qT.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