@camstack/types 1.2.41 → 1.2.42

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 (34) hide show
  1. package/dist/addon.js +1 -1
  2. package/dist/addon.mjs +1 -1
  3. package/dist/canonical-hash-7nfBbEqR.mjs +35 -0
  4. package/dist/canonical-hash-BcZHRHIx.js +40 -0
  5. package/dist/capabilities/index.d.ts +2 -2
  6. package/dist/capabilities/notification-rules.cap.d.ts +41 -0
  7. package/dist/capabilities/pipeline-analytics.cap.d.ts +92 -4
  8. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +123 -0
  9. package/dist/capabilities/pipeline-runner.cap.d.ts +119 -1
  10. package/dist/capabilities/platform-probe.cap.d.ts +3 -3
  11. package/dist/capabilities/recording.cap.d.ts +3 -0
  12. package/dist/capabilities/stream-broker.cap.d.ts +300 -0
  13. package/dist/encode-profile.d.ts +2 -0
  14. package/dist/ffmpeg/encode-defaults.d.ts +89 -0
  15. package/dist/ffmpeg/hwaccel.d.ts +98 -0
  16. package/dist/ffmpeg/invocation.d.ts +250 -0
  17. package/dist/ffmpeg/process.d.ts +135 -0
  18. package/dist/ffmpeg/sharing-key.d.ts +39 -0
  19. package/dist/generated/addon-api.d.ts +60 -4
  20. package/dist/generated/device-proxy.d.ts +1 -1
  21. package/dist/generated/method-access-map.d.ts +1 -1
  22. package/dist/generated/system-proxy.d.ts +2 -2
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.js +1354 -20
  25. package/dist/index.mjs +1316 -21
  26. package/dist/interfaces/camera-switches.d.ts +217 -0
  27. package/dist/interfaces/ops-log.d.ts +4 -0
  28. package/dist/interfaces/pipeline-runner-capability.d.ts +9 -1
  29. package/dist/node.d.ts +2 -0
  30. package/dist/node.js +270 -36
  31. package/dist/node.mjs +269 -36
  32. package/dist/{sleep-CXimb854.mjs → sleep-BmNKsY7v.mjs} +5 -0
  33. package/dist/{sleep-DTce7-ch.js → sleep-Cvi1JxZp.js} +5 -0
  34. package/package.json +1 -1
package/dist/node.mjs CHANGED
@@ -1,12 +1,13 @@
1
+ import { t as canonicalHash } from "./canonical-hash-7nfBbEqR.mjs";
1
2
  import { t as errMsg } from "./err-msg-IQTHeDzc.mjs";
3
+ import { createHash } from "node:crypto";
2
4
  import * as fs from "node:fs";
3
5
  import { chmodSync, createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
4
6
  import * as path from "node:path";
5
7
  import { basename, join } from "node:path";
6
8
  import { pipeline } from "node:stream/promises";
7
9
  import { Readable } from "node:stream";
8
- import { execFileSync } from "node:child_process";
9
- import { createHash } from "node:crypto";
10
+ import { execFileSync, spawn } from "node:child_process";
10
11
  //#region src/deps/binary-downloader.ts
11
12
  /**
12
13
  * Recursively find the first file named exactly `name` under `dir`. Used as the
@@ -577,39 +578,6 @@ var FilesystemStorageProvider = class {
577
578
  }
578
579
  };
579
580
  //#endregion
580
- //#region src/utils/canonical-hash.ts
581
- /**
582
- * Deterministic SHA-256 hash of an arbitrary serialisable value. The
583
- * canonical form sorts object keys alphabetically at every depth so two
584
- * structurally-equal inputs with different key insertion orders produce
585
- * the same hash. Returns a 64-char lowercase hex digest.
586
- *
587
- * Used by export adapters (Alexa, HAP) to short-circuit re-discovery /
588
- * accessory-rebuild work when the upstream shape is byte-identical to
589
- * the last applied state — preventing user-visible "re-discovery"
590
- * notifications on every addon-runner respawn. Each respawn re-fires
591
- * `DeviceBindingsChanged` for every cap registration, which without
592
- * this guard would propagate redundant pushes.
593
- *
594
- * Note: this is a SYMPTOMATIC fix layered on top of the binding-change
595
- * subscription. The proper fix is a single "device ready" lifecycle
596
- * barrier so exports react only when the full cap set has landed —
597
- * tracked separately for post-HA-integration work.
598
- */
599
- function canonicalHash(value) {
600
- const canonical = JSON.stringify(value, replaceWithSortedKeys);
601
- return createHash("sha256").update(canonical ?? "").digest("hex");
602
- }
603
- function replaceWithSortedKeys(_key, value) {
604
- if (value && typeof value === "object" && !Array.isArray(value)) {
605
- const obj = value;
606
- const out = {};
607
- for (const k of Object.keys(obj).toSorted()) out[k] = obj[k];
608
- return out;
609
- }
610
- return value;
611
- }
612
- //#endregion
613
581
  //#region src/utils/export-reconciler.ts
614
582
  /**
615
583
  * Compute the stable 64-char lowercase-hex fingerprint of a device's
@@ -666,4 +634,269 @@ function resolveExportFingerprint(input) {
666
634
  return input.persisted ?? input.fresh;
667
635
  }
668
636
  //#endregion
669
- export { FilesystemStorageProvider, PYTHON_VERSION, buildBinaryPath, canonicalDeviceFingerprint, canonicalHash, diffExportTargets, downloadBinary, ensureBinary, ensureFfmpeg, ensurePython, findInPath, getFfmpegDownloadUrl, getPlatformInfo, getPythonDownloadUrl, installPythonPackages, installPythonRequirements, resolveExportFingerprint };
637
+ //#region src/ffmpeg/process.ts
638
+ /**
639
+ * `FfmpegProcess` — the ONE spawn/lifecycle wrapper for a live-media ffmpeg.
640
+ *
641
+ * Extracted from `TranscodeEgress.spawnAttempt`, which was already the most
642
+ * complete of the repo's hand-rolled lifecycles: first-data deadline, hardware
643
+ * →software retry, SIGTERM-then-SIGKILL. This generalises it and adds the two
644
+ * things every copy was missing — a `tags: { deviceId }` on every line, and a
645
+ * bounded restart — so a consumer gets them by construction instead of by
646
+ * remembering.
647
+ *
648
+ * ## What it owns
649
+ *
650
+ * - spawn, with the argv from the ONE builder (`./invocation.js`);
651
+ * - a FIRST-DATA deadline: an ffmpeg that starts but never emits is dead, and
652
+ * nothing downstream can tell that apart from a slow camera;
653
+ * - HARDWARE→SOFTWARE retry, announced at `warn`. A silent downgrade on this
654
+ * hub is a flow bug, not a capability limit — see `docs/design/decode-path.md`;
655
+ * - exit classification (`ok` / `signalled-by-us` / `crashed` / `no-output`);
656
+ * - bounded restart with backoff, and a terminal give-up (never an infinite
657
+ * loop — the same rule `CrashSupervisor` enforces for runners, D6);
658
+ * - SIGTERM then SIGKILL after a grace, gated on the child not having already
659
+ * exited.
660
+ *
661
+ * ## What it does NOT own
662
+ *
663
+ * The output PLUMBING. A consumer attaches to `stdout` / `stderr` itself,
664
+ * because what the bytes mean is the consumer's business: the broker deframes
665
+ * Annex-B into a restreamer, the WebRTC leg regroups access units, HomeKit
666
+ * writes nothing to stdout at all (its output is two RTP sockets). A wrapper
667
+ * that also owned the bytes would need a mode per consumer, which is the same
668
+ * mistake as one builder per consumer.
669
+ */
670
+ var DEFAULT_FIRST_DATA_TIMEOUT_MS = 8e3;
671
+ var DEFAULT_RESTART_DELAY_MS = 1e3;
672
+ var DEFAULT_STABLE_RUN_MS = 3e4;
673
+ var DEFAULT_KILL_GRACE_MS = 500;
674
+ var STDERR_TAIL_LINES = 12;
675
+ var FfmpegProcess = class {
676
+ opts;
677
+ child = null;
678
+ stopped = false;
679
+ producedOutput = false;
680
+ consecutiveFailures = 0;
681
+ startedAtMs = 0;
682
+ stderrTail = [];
683
+ activeHwAccel;
684
+ triedSoftwareFallback = false;
685
+ firstDataTimer = null;
686
+ constructor(opts) {
687
+ this.opts = opts;
688
+ this.activeHwAccel = opts.decodeHwAccel;
689
+ }
690
+ /** Queryable tags on every line — `deviceId` is never optional. */
691
+ get logTags() {
692
+ return {
693
+ deviceId: this.opts.deviceId,
694
+ ...this.opts.tags
695
+ };
696
+ }
697
+ get now() {
698
+ return (this.opts.now ?? Date.now)();
699
+ }
700
+ /** `true` while a child is running. */
701
+ isRunning() {
702
+ return this.child !== null && !this.stopped;
703
+ }
704
+ /** The backend the CURRENT child decodes with (`null` ⇒ software). */
705
+ activeDecodeHwAccel() {
706
+ return this.activeHwAccel;
707
+ }
708
+ /**
709
+ * Spawn the first child. Resolves as soon as it produces output; rejects if
710
+ * it dies or stays silent past the deadline AFTER the software retry has
711
+ * also been exhausted. A caller that wants fire-and-forget can ignore the
712
+ * promise — the restart loop runs regardless.
713
+ */
714
+ start() {
715
+ return new Promise((resolve, reject) => {
716
+ this.spawnAttempt(resolve, reject);
717
+ });
718
+ }
719
+ spawnAttempt(onLive, onDead) {
720
+ if (this.stopped) return;
721
+ const args = [...this.opts.buildArgs(this.activeHwAccel)];
722
+ const spawnFn = this.opts.spawnFn ?? spawn;
723
+ const setTimeoutImpl = this.opts.setTimeoutFn ?? setTimeout;
724
+ this.opts.logger.info(`ffmpeg ${this.opts.role}: spawning`, {
725
+ tags: this.logTags,
726
+ meta: {
727
+ decodeHwAccel: this.activeHwAccel ?? "software",
728
+ attempt: this.consecutiveFailures + 1
729
+ }
730
+ });
731
+ let child;
732
+ try {
733
+ child = spawnFn(this.opts.binaryPath, args, { stdio: this.opts.stdio ?? [
734
+ "ignore",
735
+ "pipe",
736
+ "pipe"
737
+ ] });
738
+ } catch (err) {
739
+ this.handleFailure("crashed", null, null, err, onLive, onDead);
740
+ return;
741
+ }
742
+ this.child = child;
743
+ this.startedAtMs = this.now;
744
+ this.producedOutput = false;
745
+ this.stderrTail = [];
746
+ let settled = false;
747
+ const timeoutMs = this.opts.firstDataTimeoutMs ?? DEFAULT_FIRST_DATA_TIMEOUT_MS;
748
+ if (timeoutMs > 0) this.firstDataTimer = setTimeoutImpl(() => {
749
+ if (settled || this.producedOutput || this.stopped) return;
750
+ settled = true;
751
+ this.opts.logger.warn(`ffmpeg ${this.opts.role}: no output within ${timeoutMs}ms`, {
752
+ tags: this.logTags,
753
+ meta: { decodeHwAccel: this.activeHwAccel ?? "software" }
754
+ });
755
+ this.killChild();
756
+ this.handleFailure("no-output", null, null, null, onLive, onDead);
757
+ }, timeoutMs);
758
+ child.stderr?.setEncoding("utf8");
759
+ child.stderr?.on("data", (line) => {
760
+ const text = String(line).trim();
761
+ if (text.length === 0) return;
762
+ this.stderrTail.push(text);
763
+ if (this.stderrTail.length > STDERR_TAIL_LINES) this.stderrTail.shift();
764
+ this.opts.logger.debug(`ffmpeg ${this.opts.role}`, {
765
+ tags: this.logTags,
766
+ meta: { line: text }
767
+ });
768
+ });
769
+ child.once("error", (err) => {
770
+ if (settled || this.stopped) return;
771
+ settled = true;
772
+ this.handleFailure("crashed", null, null, err, onLive, onDead);
773
+ });
774
+ child.once("exit", (code, signal) => {
775
+ this.clearFirstDataTimer();
776
+ if (this.child === child) this.child = null;
777
+ if (this.stopped) {
778
+ this.report("stopped", code, signal);
779
+ return;
780
+ }
781
+ if (settled && this.producedOutput) {
782
+ this.report("crashed", code, signal);
783
+ this.scheduleRestart(onLive, onDead);
784
+ return;
785
+ }
786
+ if (settled) return;
787
+ settled = true;
788
+ this.handleFailure(this.producedOutput ? "crashed" : "no-output", code, signal, null, onLive, onDead);
789
+ });
790
+ this.opts.onChild(child);
791
+ child.stdout?.once("data", () => {
792
+ this.producedOutput = true;
793
+ this.clearFirstDataTimer();
794
+ if (settled) return;
795
+ settled = true;
796
+ this.opts.logger.info(`ffmpeg ${this.opts.role}: live`, {
797
+ tags: this.logTags,
798
+ meta: { decodeHwAccel: this.activeHwAccel ?? "software" }
799
+ });
800
+ onLive();
801
+ });
802
+ }
803
+ /**
804
+ * A child failed before going live. Try SOFTWARE once if it was decoding in
805
+ * hardware — loudly — then fall through to the bounded restart.
806
+ */
807
+ handleFailure(classification, code, signal, err, onLive, onDead) {
808
+ this.report(classification, code, signal, err);
809
+ if (this.activeHwAccel !== null && !this.triedSoftwareFallback && !this.stopped) {
810
+ this.triedSoftwareFallback = true;
811
+ this.opts.logger.warn(`ffmpeg ${this.opts.role}: hardware decode produced no output — retrying in SOFTWARE`, {
812
+ tags: this.logTags,
813
+ meta: {
814
+ decodeHwAccel: this.activeHwAccel,
815
+ classification,
816
+ code,
817
+ signal,
818
+ stderrTail: this.stderrTail
819
+ }
820
+ });
821
+ this.activeHwAccel = null;
822
+ this.spawnAttempt(onLive, onDead);
823
+ return;
824
+ }
825
+ this.consecutiveFailures += 1;
826
+ const maxRestarts = this.opts.maxRestarts ?? 0;
827
+ if (this.consecutiveFailures > maxRestarts || this.stopped) {
828
+ const reason = `ffmpeg ${this.opts.role} gave up after ${this.consecutiveFailures} attempt(s) (${classification}, code=${code} signal=${signal})`;
829
+ this.opts.logger.error(reason, {
830
+ tags: this.logTags,
831
+ meta: { stderrTail: this.stderrTail }
832
+ });
833
+ onDead(new Error(reason));
834
+ return;
835
+ }
836
+ this.scheduleRestart(onLive, onDead);
837
+ }
838
+ scheduleRestart(onLive, onDead) {
839
+ if (this.stopped) return;
840
+ const maxRestarts = this.opts.maxRestarts ?? 0;
841
+ if (maxRestarts === 0) return;
842
+ if (this.producedOutput && this.now - this.startedAtMs >= (this.opts.stableRunMs ?? DEFAULT_STABLE_RUN_MS)) this.consecutiveFailures = 0;
843
+ if (this.consecutiveFailures > maxRestarts) return;
844
+ (this.opts.setTimeoutFn ?? setTimeout)(() => {
845
+ if (this.stopped) return;
846
+ this.spawnAttempt(onLive, onDead);
847
+ }, (this.opts.restartDelayMs ?? DEFAULT_RESTART_DELAY_MS) * Math.min(this.consecutiveFailures + 1, 8));
848
+ }
849
+ report(classification, code, signal, err) {
850
+ const exit = {
851
+ classification,
852
+ code,
853
+ signal,
854
+ stderrTail: [...this.stderrTail],
855
+ decodeHwAccel: this.activeHwAccel
856
+ };
857
+ if (classification === "crashed" || classification === "no-output") this.opts.logger.warn(`ffmpeg ${this.opts.role} exited: ${classification}`, {
858
+ tags: this.logTags,
859
+ meta: {
860
+ code,
861
+ signal,
862
+ decodeHwAccel: this.activeHwAccel ?? "software",
863
+ error: err instanceof Error ? err.message : err === void 0 ? void 0 : String(err),
864
+ stderrTail: exit.stderrTail
865
+ }
866
+ });
867
+ this.opts.onExit?.(exit);
868
+ }
869
+ clearFirstDataTimer() {
870
+ if (this.firstDataTimer !== null) {
871
+ clearTimeout(this.firstDataTimer);
872
+ this.firstDataTimer = null;
873
+ }
874
+ }
875
+ /** Terminate for good. Idempotent; no restart follows. */
876
+ stop() {
877
+ if (this.stopped) return;
878
+ this.stopped = true;
879
+ this.clearFirstDataTimer();
880
+ this.killChild();
881
+ }
882
+ killChild() {
883
+ const child = this.child;
884
+ this.child = null;
885
+ if (!child) return;
886
+ if (child.exitCode !== null || child.signalCode !== null) return;
887
+ try {
888
+ child.kill("SIGTERM");
889
+ } catch {
890
+ return;
891
+ }
892
+ const grace = (this.opts.setTimeoutFn ?? setTimeout)(() => {
893
+ if (child.exitCode !== null || child.signalCode !== null) return;
894
+ try {
895
+ child.kill("SIGKILL");
896
+ } catch {}
897
+ }, this.opts.killGraceMs ?? DEFAULT_KILL_GRACE_MS);
898
+ if (typeof grace === "object" && grace !== null && "unref" in grace) grace.unref();
899
+ }
900
+ };
901
+ //#endregion
902
+ export { FfmpegProcess, FilesystemStorageProvider, PYTHON_VERSION, buildBinaryPath, canonicalDeviceFingerprint, canonicalHash, diffExportTargets, downloadBinary, ensureBinary, ensureFfmpeg, ensurePython, findInPath, getFfmpegDownloadUrl, getPlatformInfo, getPythonDownloadUrl, installPythonPackages, installPythonRequirements, resolveExportFingerprint };
@@ -3103,6 +3103,8 @@ function createDeviceProxy(api, binding, opts) {
3103
3103
  updateRule: (input) => dispatch("notification-rules", "notificationRules", "updateRule", "mutation", input),
3104
3104
  deleteRule: (input) => dispatch("notification-rules", "notificationRules", "deleteRule", "mutation", input),
3105
3105
  setRuleEnabled: (input) => dispatch("notification-rules", "notificationRules", "setRuleEnabled", "mutation", input),
3106
+ listDeviceMutes: (input) => dispatch("notification-rules", "notificationRules", "listDeviceMutes", "query", input),
3107
+ setDeviceMuted: (input) => dispatch("notification-rules", "notificationRules", "setDeviceMuted", "mutation", input),
3106
3108
  testRule: (input) => dispatch("notification-rules", "notificationRules", "testRule", "mutation", input),
3107
3109
  getConditionCatalog: (input) => dispatch("notification-rules", "notificationRules", "getConditionCatalog", "query", input),
3108
3110
  getHistory: (input) => dispatch("notification-rules", "notificationRules", "getHistory", "query", input),
@@ -3153,6 +3155,7 @@ function createDeviceProxy(api, binding, opts) {
3153
3155
  pruneTracksBefore: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneTracksBefore", "mutation", input),
3154
3156
  wipeAllAnalytics: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "wipeAllAnalytics", "mutation", input),
3155
3157
  deleteTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "deleteTracks", "mutation", input),
3158
+ setTrackFlags: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "setTrackFlags", "mutation", input),
3156
3159
  getEventStoreFootprint: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventStoreFootprint", "query", input),
3157
3160
  pruneEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneEvents", "mutation", input),
3158
3161
  deleteDeviceEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "deleteDeviceEvents", "mutation", input),
@@ -3388,6 +3391,8 @@ function createDeviceProxy(api, binding, opts) {
3388
3391
  setCameraStepOverride: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepOverride", "mutation", input),
3389
3392
  setCameraPipelineForAgent: (input) => dispatchSystem("pipelineOrchestrator", "setCameraPipelineForAgent", "mutation", input),
3390
3393
  resolvePipeline: (input) => dispatchSystem("pipelineOrchestrator", "resolvePipeline", "query", input),
3394
+ getCameraSwitches: (input) => dispatchSystem("pipelineOrchestrator", "getCameraSwitches", "query", input),
3395
+ setCameraSwitch: (input) => dispatchSystem("pipelineOrchestrator", "setCameraSwitch", "mutation", input),
3391
3396
  getCameraStatus: (input) => dispatchSystem("pipelineOrchestrator", "getCameraStatus", "query", input),
3392
3397
  getDeviceSettingsContribution: (input) => dispatchSystem("pipelineOrchestrator", "getDeviceSettingsContribution", "query", input),
3393
3398
  getDeviceLiveContribution: (input) => dispatchSystem("pipelineOrchestrator", "getDeviceLiveContribution", "query", input),
@@ -3103,6 +3103,8 @@ function createDeviceProxy(api, binding, opts) {
3103
3103
  updateRule: (input) => dispatch("notification-rules", "notificationRules", "updateRule", "mutation", input),
3104
3104
  deleteRule: (input) => dispatch("notification-rules", "notificationRules", "deleteRule", "mutation", input),
3105
3105
  setRuleEnabled: (input) => dispatch("notification-rules", "notificationRules", "setRuleEnabled", "mutation", input),
3106
+ listDeviceMutes: (input) => dispatch("notification-rules", "notificationRules", "listDeviceMutes", "query", input),
3107
+ setDeviceMuted: (input) => dispatch("notification-rules", "notificationRules", "setDeviceMuted", "mutation", input),
3106
3108
  testRule: (input) => dispatch("notification-rules", "notificationRules", "testRule", "mutation", input),
3107
3109
  getConditionCatalog: (input) => dispatch("notification-rules", "notificationRules", "getConditionCatalog", "query", input),
3108
3110
  getHistory: (input) => dispatch("notification-rules", "notificationRules", "getHistory", "query", input),
@@ -3153,6 +3155,7 @@ function createDeviceProxy(api, binding, opts) {
3153
3155
  pruneTracksBefore: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneTracksBefore", "mutation", input),
3154
3156
  wipeAllAnalytics: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "wipeAllAnalytics", "mutation", input),
3155
3157
  deleteTracks: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "deleteTracks", "mutation", input),
3158
+ setTrackFlags: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "setTrackFlags", "mutation", input),
3156
3159
  getEventStoreFootprint: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "getEventStoreFootprint", "query", input),
3157
3160
  pruneEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "pruneEvents", "mutation", input),
3158
3161
  deleteDeviceEvents: (input) => dispatch("pipeline-analytics", "pipelineAnalytics", "deleteDeviceEvents", "mutation", input),
@@ -3388,6 +3391,8 @@ function createDeviceProxy(api, binding, opts) {
3388
3391
  setCameraStepOverride: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepOverride", "mutation", input),
3389
3392
  setCameraPipelineForAgent: (input) => dispatchSystem("pipelineOrchestrator", "setCameraPipelineForAgent", "mutation", input),
3390
3393
  resolvePipeline: (input) => dispatchSystem("pipelineOrchestrator", "resolvePipeline", "query", input),
3394
+ getCameraSwitches: (input) => dispatchSystem("pipelineOrchestrator", "getCameraSwitches", "query", input),
3395
+ setCameraSwitch: (input) => dispatchSystem("pipelineOrchestrator", "setCameraSwitch", "mutation", input),
3391
3396
  getCameraStatus: (input) => dispatchSystem("pipelineOrchestrator", "getCameraStatus", "query", input),
3392
3397
  getDeviceSettingsContribution: (input) => dispatchSystem("pipelineOrchestrator", "getDeviceSettingsContribution", "query", input),
3393
3398
  getDeviceLiveContribution: (input) => dispatchSystem("pipelineOrchestrator", "getDeviceLiveContribution", "query", input),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.2.41",
3
+ "version": "1.2.42",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",