@camstack/system 1.2.473 → 1.2.475

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 (86) hide show
  1. package/dist/{agent-https-B9Q3-IKd.js → agent-https-BsqT0qni.js} +8 -8
  2. package/dist/{agent-https-DOwn4pqL.mjs → agent-https-wA8gGLc1.mjs} +8 -8
  3. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  5. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  7. package/dist/builtins/alerts/alerts.addon.js +1 -1
  8. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  9. package/dist/builtins/autotrack/index.js +1 -1
  10. package/dist/builtins/autotrack/index.mjs +1 -1
  11. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +2 -2
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +2 -2
  13. package/dist/builtins/calendars/calendars.addon.js +1 -1
  14. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  15. package/dist/builtins/camera-grid/index.js +1 -1
  16. package/dist/builtins/camera-grid/index.mjs +1 -1
  17. package/dist/builtins/composer/composer.addon.js +2 -2
  18. package/dist/builtins/composer/composer.addon.mjs +2 -2
  19. package/dist/builtins/console-logging/index.js +1 -1
  20. package/dist/builtins/console-logging/index.mjs +1 -1
  21. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  22. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  23. package/dist/builtins/device-history/device-history.addon.js +1 -1
  24. package/dist/builtins/device-history/device-history.addon.mjs +1 -1
  25. package/dist/builtins/device-manager/device-manager.addon.js +71 -1
  26. package/dist/builtins/device-manager/device-manager.addon.mjs +71 -1
  27. package/dist/builtins/device-manager/device-state-mirror.d.ts +4 -0
  28. package/dist/builtins/device-manager/running-flip.d.ts +11 -0
  29. package/dist/builtins/hub-forwarder/index.js +1 -1
  30. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  31. package/dist/builtins/keychain/index.js +3 -3
  32. package/dist/builtins/keychain/index.mjs +3 -3
  33. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  34. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  35. package/dist/builtins/local-auth/local-auth.addon.js +2 -2
  36. package/dist/builtins/local-auth/local-auth.addon.mjs +2 -2
  37. package/dist/builtins/local-network/local-network.addon.js +2 -2
  38. package/dist/builtins/local-network/local-network.addon.mjs +2 -2
  39. package/dist/builtins/loki-logging/index.js +1 -1
  40. package/dist/builtins/loki-logging/index.mjs +1 -1
  41. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  42. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  43. package/dist/builtins/platform-probe/index.js +1 -1
  44. package/dist/builtins/platform-probe/index.mjs +1 -1
  45. package/dist/builtins/record-entries/index.js +1 -1
  46. package/dist/builtins/record-entries/index.mjs +1 -1
  47. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  48. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  49. package/dist/builtins/snapshot/index.js +1 -1
  50. package/dist/builtins/snapshot/index.mjs +1 -1
  51. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  52. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  53. package/dist/builtins/sqlite-storage/index.js +1 -1
  54. package/dist/builtins/sqlite-storage/index.mjs +1 -1
  55. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +2 -2
  56. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +2 -2
  57. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  58. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  59. package/dist/builtins/system-config/system-config.addon.js +8 -8
  60. package/dist/builtins/system-config/system-config.addon.mjs +8 -8
  61. package/dist/builtins/winston-logging/index.js +1 -1
  62. package/dist/builtins/winston-logging/index.mjs +1 -1
  63. package/dist/{composition-sources-cwD35HB0.mjs → composition-sources-CiFkyAcf.mjs} +1 -1
  64. package/dist/{composition-sources-Dj_nInUQ.js → composition-sources-DeUSUid6.js} +1 -1
  65. package/dist/{constants-XkWSVvgY.js → constants-3Wj5OyEk.js} +1 -1
  66. package/dist/{constants-p5mPM1iL.mjs → constants-DZJAkne8.mjs} +1 -1
  67. package/dist/{device-ca-DyUtcpf4.mjs → device-ca-DiV5xcMz.mjs} +14 -13
  68. package/dist/{device-ca-BXzQ1pYj.js → device-ca-ftrfVdc0.js} +14 -13
  69. package/dist/{dist-Bmah6waF.js → dist-BtDdPdZ7.js} +606 -113
  70. package/dist/{dist-C9lbdBL5.mjs → dist-DygMs3Qc.mjs} +606 -113
  71. package/dist/file-host-worker.js +1 -1
  72. package/dist/file-host-worker.mjs +1 -1
  73. package/dist/{hub-mdns-ciao-CUr6ewsX.js → hub-mdns-ciao-B1VcdfT1.js} +4 -4
  74. package/dist/{hub-mdns-ciao-BemeCNGe.mjs → hub-mdns-ciao-Bc9PnWu3.mjs} +4 -4
  75. package/dist/index.js +13 -7
  76. package/dist/index.mjs +13 -7
  77. package/dist/{lib-8oZrELLm.js → lib-C3U1yluo.js} +1 -1
  78. package/dist/{lib-DK38ompL.mjs → lib-DFZblCIu.mjs} +1 -1
  79. package/dist/{restore-archive-C0aohmAK.mjs → restore-archive-D_Pwryre.mjs} +1 -1
  80. package/dist/{restore-archive-DbPmyjiM.js → restore-archive-TDkQfmLO.js} +1 -1
  81. package/dist/tls/cert-utc-time.d.ts +1 -0
  82. package/dist/{wal-maintenance-BT8Ns0W3.js → wal-maintenance-D3UwIKX5.js} +0 -0
  83. package/dist/{wal-maintenance-BuB731DK.mjs → wal-maintenance-rLv4uOmp.mjs} +0 -0
  84. package/dist/{x509.es-DK__ETIe.mjs → x509.es-BRiJgOvu.mjs} +24 -1
  85. package/dist/{x509.es-C4cOo48M.js → x509.es-WtnRNyYS.js} +29 -0
  86. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require("./chunk-Cek0wNdY.js");
2
- const require_dist = require("./dist-Bmah6waF.js");
3
- const require_x509_es = require("./x509.es-C4cOo48M.js");
2
+ const require_dist = require("./dist-BtDdPdZ7.js");
3
+ const require_x509_es = require("./x509.es-WtnRNyYS.js");
4
4
  let zod = require("zod");
5
5
  let node_crypto = require("node:crypto");
6
6
  let _camstack_types_node = require("@camstack/types/node");
@@ -687,7 +687,7 @@ async function generateCa(now, hostnames = [], commonName = CA_COMMON_NAME) {
687
687
  await require_x509_es.SubjectKeyIdentifierExtension.create(keys.publicKey),
688
688
  createNameConstraintsExtension(buildNameConstraintSet(hostnames))
689
689
  ];
690
- const cert = await require_x509_es.X509CertificateGenerator.createSelfSigned({
690
+ const cert = await require_x509_es.withUtcTimeEncoding(() => require_x509_es.X509CertificateGenerator.createSelfSigned({
691
691
  serialNumber: freshSerial(),
692
692
  name: [{ CN: [commonName] }],
693
693
  notBefore: require_x509_es.backdatedNotBefore(now),
@@ -695,7 +695,7 @@ async function generateCa(now, hostnames = [], commonName = CA_COMMON_NAME) {
695
695
  keys,
696
696
  signingAlgorithm: SIGNING_ALGORITHM,
697
697
  extensions
698
- });
698
+ }));
699
699
  return {
700
700
  certPem: toCertPem(cert),
701
701
  keyPem: await exportKeyPem(keys.privateKey),
@@ -728,7 +728,7 @@ async function issueLeaf(ca, identity, commonName, validDays, now) {
728
728
  new require_x509_es.SubjectAlternativeNameExtension(subjectAltNames(identity))
729
729
  ];
730
730
  return {
731
- certPem: toCertPem(await require_x509_es.X509CertificateGenerator.create({
731
+ certPem: toCertPem(await require_x509_es.withUtcTimeEncoding(() => require_x509_es.X509CertificateGenerator.create({
732
732
  serialNumber: freshSerial(),
733
733
  subject: `CN=${commonName}`,
734
734
  issuer: ca.cert.subject,
@@ -738,7 +738,7 @@ async function issueLeaf(ca, identity, commonName, validDays, now) {
738
738
  signingKey: ca.privateKey,
739
739
  signingAlgorithm: SIGNING_ALGORITHM,
740
740
  extensions
741
- })),
741
+ }))),
742
742
  keyPem: await exportKeyPem(keys.privateKey)
743
743
  };
744
744
  }
@@ -759,7 +759,7 @@ async function issueLeafFromCsr(ca, csrPem, identity, commonName, validDays, now
759
759
  await require_x509_es.AuthorityKeyIdentifierExtension.create(ca.cert),
760
760
  new require_x509_es.SubjectAlternativeNameExtension(subjectAltNames(identity))
761
761
  ];
762
- return toCertPem(await require_x509_es.X509CertificateGenerator.create({
762
+ return toCertPem(await require_x509_es.withUtcTimeEncoding(() => require_x509_es.X509CertificateGenerator.create({
763
763
  serialNumber: freshSerial(),
764
764
  subject: `CN=${commonName}`,
765
765
  issuer: ca.cert.subject,
@@ -769,7 +769,7 @@ async function issueLeafFromCsr(ca, csrPem, identity, commonName, validDays, now
769
769
  signingKey: ca.privateKey,
770
770
  signingAlgorithm: SIGNING_ALGORITHM,
771
771
  extensions
772
- }));
772
+ })));
773
773
  }
774
774
  //#endregion
775
775
  //#region src/tls/agent-https.ts
@@ -1,5 +1,5 @@
1
- import { qi as defineRecordKinds } from "./dist-C9lbdBL5.mjs";
2
- import { S as backdatedNotBefore, _ as NameConstraints, a as KeyUsageFlags, c as Pkcs10CertificateRequest, d as SubjectKeyIdentifierExtension, f as X509Certificate$1, g as GeneralSubtrees, h as GeneralSubtree, i as Extension, l as Pkcs10CertificateRequestGenerator, m as cryptoProvider, n as BasicConstraintsExtension, o as KeyUsagesExtension, p as X509CertificateGenerator, r as ExtendedKeyUsageExtension, s as PemConverter, t as AuthorityKeyIdentifierExtension, u as SubjectAlternativeNameExtension, v as GeneralName, x as AsnConvert } from "./x509.es-DK__ETIe.mjs";
1
+ import { qi as defineRecordKinds } from "./dist-DygMs3Qc.mjs";
2
+ import { C as backdatedNotBefore, S as withUtcTimeEncoding, _ as NameConstraints, a as KeyUsageFlags, c as Pkcs10CertificateRequest, d as SubjectKeyIdentifierExtension, f as X509Certificate$1, g as GeneralSubtrees, h as GeneralSubtree, i as Extension, l as Pkcs10CertificateRequestGenerator, m as cryptoProvider, n as BasicConstraintsExtension, o as KeyUsagesExtension, p as X509CertificateGenerator, r as ExtendedKeyUsageExtension, s as PemConverter, t as AuthorityKeyIdentifierExtension, u as SubjectAlternativeNameExtension, v as GeneralName, x as AsnConvert } from "./x509.es-BRiJgOvu.mjs";
3
3
  import { z } from "zod";
4
4
  import { X509Certificate, createHash, createPrivateKey, randomBytes, webcrypto } from "node:crypto";
5
5
  import { writeOwnerOnlyFileSync } from "@camstack/types/node";
@@ -685,7 +685,7 @@ async function generateCa(now, hostnames = [], commonName = CA_COMMON_NAME) {
685
685
  await SubjectKeyIdentifierExtension.create(keys.publicKey),
686
686
  createNameConstraintsExtension(buildNameConstraintSet(hostnames))
687
687
  ];
688
- const cert = await X509CertificateGenerator.createSelfSigned({
688
+ const cert = await withUtcTimeEncoding(() => X509CertificateGenerator.createSelfSigned({
689
689
  serialNumber: freshSerial(),
690
690
  name: [{ CN: [commonName] }],
691
691
  notBefore: backdatedNotBefore(now),
@@ -693,7 +693,7 @@ async function generateCa(now, hostnames = [], commonName = CA_COMMON_NAME) {
693
693
  keys,
694
694
  signingAlgorithm: SIGNING_ALGORITHM,
695
695
  extensions
696
- });
696
+ }));
697
697
  return {
698
698
  certPem: toCertPem(cert),
699
699
  keyPem: await exportKeyPem(keys.privateKey),
@@ -726,7 +726,7 @@ async function issueLeaf(ca, identity, commonName, validDays, now) {
726
726
  new SubjectAlternativeNameExtension(subjectAltNames(identity))
727
727
  ];
728
728
  return {
729
- certPem: toCertPem(await X509CertificateGenerator.create({
729
+ certPem: toCertPem(await withUtcTimeEncoding(() => X509CertificateGenerator.create({
730
730
  serialNumber: freshSerial(),
731
731
  subject: `CN=${commonName}`,
732
732
  issuer: ca.cert.subject,
@@ -736,7 +736,7 @@ async function issueLeaf(ca, identity, commonName, validDays, now) {
736
736
  signingKey: ca.privateKey,
737
737
  signingAlgorithm: SIGNING_ALGORITHM,
738
738
  extensions
739
- })),
739
+ }))),
740
740
  keyPem: await exportKeyPem(keys.privateKey)
741
741
  };
742
742
  }
@@ -757,7 +757,7 @@ async function issueLeafFromCsr(ca, csrPem, identity, commonName, validDays, now
757
757
  await AuthorityKeyIdentifierExtension.create(ca.cert),
758
758
  new SubjectAlternativeNameExtension(subjectAltNames(identity))
759
759
  ];
760
- return toCertPem(await X509CertificateGenerator.create({
760
+ return toCertPem(await withUtcTimeEncoding(() => X509CertificateGenerator.create({
761
761
  serialNumber: freshSerial(),
762
762
  subject: `CN=${commonName}`,
763
763
  issuer: ca.cert.subject,
@@ -767,7 +767,7 @@ async function issueLeafFromCsr(ca, csrPem, identity, commonName, validDays, now
767
767
  signingKey: ca.privateKey,
768
768
  signingAlgorithm: SIGNING_ALGORITHM,
769
769
  extensions
770
- }));
770
+ })));
771
771
  }
772
772
  //#endregion
773
773
  //#region src/tls/agent-https.ts
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Oa as EventCategory, _t as addonPagesCapability, ei as errMsg, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { Oa as EventCategory, _t as addonPagesCapability, ei as errMsg, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let node_crypto = require("node:crypto");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { Oa as EventCategory, ei as errMsg, ti as BaseAddon, yt as addonWidgetsCapability } from "../../dist-C9lbdBL5.mjs";
1
+ import { Oa as EventCategory, ei as errMsg, ti as BaseAddon, yt as addonWidgetsCapability } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
8
  //#region src/builtins/alerts/alert-episode-policy.ts
9
9
  /**
@@ -1,4 +1,4 @@
1
- import { Oa as EventCategory, St as alertsCapability, Wi as createEvent, bn as isAlertEpisodeSeverity, bt as alertEpisodeId, ei as errMsg, i as AlertSchema, qi as defineRecordKinds, ti as BaseAddon, xt as alertEpisodePayload, yn as isAlertEpisodeOpen } from "../../dist-C9lbdBL5.mjs";
1
+ import { Oa as EventCategory, St as alertsCapability, Wi as createEvent, bn as isAlertEpisodeSeverity, bt as alertEpisodeId, ei as errMsg, i as AlertSchema, qi as defineRecordKinds, ti as BaseAddon, xt as alertEpisodePayload, yn as isAlertEpisodeOpen } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
3
  //#region src/builtins/alerts/alert-episode-policy.ts
4
4
  /**
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  //#region src/builtins/autotrack/autotrack-config.ts
8
8
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
9
9
  deadZoneFraction: .5,
@@ -1,4 +1,4 @@
1
- import { Et as bareAddonId, I as FIRST_LEVEL_MACRO_CLASSES, Oa as EventCategory, ei as errMsg, nr as ptzAutotrackCapability, ta as isEvent, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { Et as bareAddonId, I as FIRST_LEVEL_MACRO_CLASSES, Oa as EventCategory, ei as errMsg, nr as ptzAutotrackCapability, ta as isEvent, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  //#region src/builtins/autotrack/autotrack-config.ts
3
3
  var DEFAULT_AUTOTRACK_LOOP_CONFIG = {
4
4
  deadZoneFraction: .5,
@@ -3,9 +3,9 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
- const require_restore_archive = require("../../restore-archive-DbPmyjiM.js");
8
+ const require_restore_archive = require("../../restore-archive-TDkQfmLO.js");
9
9
  let node_crypto = require("node:crypto");
10
10
  let node_fs_promises = require("node:fs/promises");
11
11
  node_fs_promises = require_chunk.__toESM(node_fs_promises);
@@ -1,6 +1,6 @@
1
- import { Ca as toNodeId, Dr as storageOccupancyCapability, Oa as EventCategory, Tt as backupCapability, Vn as mayWriteToLocation, la as nodePin, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { Ca as toNodeId, Dr as storageOccupancyCapability, Oa as EventCategory, Tt as backupCapability, Vn as mayWriteToLocation, la as nodePin, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
- import { _ as backupRecordStoresOf, a as BackupSnapshotRefusedError, d as ENCRYPTED_BACKUP_SUFFIX, f as generateBackupKeyPair, g as backupOrchestratorRecordKinds, i as BackupCancelledError, l as BackupKeyFormatError, m as parseBackupSecretKey, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as parseBackupPublicKey, r as prepareRestoreArchive, s as SystemBackupService } from "../../restore-archive-C0aohmAK.mjs";
3
+ import { _ as backupRecordStoresOf, a as BackupSnapshotRefusedError, d as ENCRYPTED_BACKUP_SUFFIX, f as generateBackupKeyPair, g as backupOrchestratorRecordKinds, i as BackupCancelledError, l as BackupKeyFormatError, m as parseBackupSecretKey, n as precheckRestoreKey, o as DEFAULT_BACKUP_DATABASES, p as parseBackupPublicKey, r as prepareRestoreArchive, s as SystemBackupService } from "../../restore-archive-D_Pwryre.mjs";
4
4
  import { randomUUID } from "node:crypto";
5
5
  import * as fsp from "node:fs/promises";
6
6
  import * as path$1 from "node:path";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_settle_sources = require("../../settle-sources-Bhsy57y-.js");
8
8
  let zod = require("zod");
9
9
  //#region src/builtins/calendars/calendar-color.ts
@@ -1,4 +1,4 @@
1
- import { Mt as calendarsCapability, g as CalendarPreferencesSchema, qi as defineRecordKinds, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { Mt as calendarsCapability, g as CalendarPreferencesSchema, qi as defineRecordKinds, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as settleSourcesWithTimeout } from "../../settle-sources-CDtNC8ub.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/builtins/calendars/calendar-color.ts
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  let zod = require("zod");
8
8
  let _camstack_types_node = require("@camstack/types/node");
9
9
  let node_path = require("node:path");
@@ -1,4 +1,4 @@
1
- import { $i as hydrateSchema, $r as DeviceType, Br as buildFfmpegArgs, Gn as motionCapability, Hn as memoizePinnedFfmpeg, N as DeclaredDevices, Nt as cameraGridLayoutCapability, Oa as EventCategory, Sr as snapshotCapability, T as DERIVED_CAMERA_SILENCED_CAP_NAMES, Wi as createEvent, X as MOTION_CLOSE_AFTER_MS, Zr as DeviceFeature, a as BaseDevice, ei as errMsg, kr as streamCatalogCapability, qt as declarationOwnerNodeId, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { $i as hydrateSchema, $r as DeviceType, Br as buildFfmpegArgs, Gn as motionCapability, Hn as memoizePinnedFfmpeg, N as DeclaredDevices, Nt as cameraGridLayoutCapability, Oa as EventCategory, Sr as snapshotCapability, T as DERIVED_CAMERA_SILENCED_CAP_NAMES, Wi as createEvent, X as MOTION_CLOSE_AFTER_MS, Zr as DeviceFeature, a as BaseDevice, ei as errMsg, kr as streamCatalogCapability, qt as declarationOwnerNodeId, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  import { z } from "zod";
3
3
  import { FfmpegProcess } from "@camstack/types/node";
4
4
  import { join } from "node:path";
@@ -3,8 +3,8 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
7
- const require_composition_sources = require("../../composition-sources-Dj_nInUQ.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
+ const require_composition_sources = require("../../composition-sources-DeUSUid6.js");
8
8
  let zod = require("zod");
9
9
  //#region src/builtins/shared/device-state-changed.ts
10
10
  /** Structural narrowing helper for untrusted bus payloads. */
@@ -1,5 +1,5 @@
1
- import { $n as planComposition, $r as DeviceType, Gr as compositionItemFieldPath, Hr as composedDeviceRef, It as composerCapability, Jr as createStatefulExpressionMemory, Kr as compositionSliceKey, Lt as compositionFieldKey, N as DeclaredDevices, Oa as EventCategory, Ot as buildCapabilityLookup, Ur as composedDeviceStableId, Vr as cloneStatefulExpressionMemory, Wi as createEvent, Wr as compositionFeatureEnabled, Xr as toExpressionValue, Yr as disarmRoseMemory, a as BaseDevice, cn as evaluateCompositionField, d as COMPOSED_ITEM_FIXED_FIELDS, dn as expressionContainsBuiltinCall, ei as errMsg, qr as compositionSourceKey, r as ALL_CAPABILITY_DEFINITIONS, ti as BaseAddon, zr as COMPOSER_ADDON_ID } from "../../dist-C9lbdBL5.mjs";
2
- import { n as normalizedNativeOwner } from "../../composition-sources-cwD35HB0.mjs";
1
+ import { $n as planComposition, $r as DeviceType, Gr as compositionItemFieldPath, Hr as composedDeviceRef, It as composerCapability, Jr as createStatefulExpressionMemory, Kr as compositionSliceKey, Lt as compositionFieldKey, N as DeclaredDevices, Oa as EventCategory, Ot as buildCapabilityLookup, Ur as composedDeviceStableId, Vr as cloneStatefulExpressionMemory, Wi as createEvent, Wr as compositionFeatureEnabled, Xr as toExpressionValue, Yr as disarmRoseMemory, a as BaseDevice, cn as evaluateCompositionField, d as COMPOSED_ITEM_FIXED_FIELDS, dn as expressionContainsBuiltinCall, ei as errMsg, qr as compositionSourceKey, r as ALL_CAPABILITY_DEFINITIONS, ti as BaseAddon, zr as COMPOSER_ADDON_ID } from "../../dist-DygMs3Qc.mjs";
2
+ import { n as normalizedNativeOwner } from "../../composition-sources-CiFkyAcf.mjs";
3
3
  import { z } from "zod";
4
4
  //#region src/builtins/shared/device-state-changed.ts
5
5
  /** Structural narrowing helper for untrusted bus payloads. */
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/console-logging/console-destination.ts
9
9
  var LEVEL_RANK = {
@@ -1,4 +1,4 @@
1
- import { Ln as logDestinationCapability, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { Ln as logDestinationCapability, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/console-logging/console-destination.ts
4
4
  var LEVEL_RANK = {
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_chunk = require("../../chunk-Cek0wNdY.js");
3
- const require_dist = require("../../dist-Bmah6waF.js");
3
+ const require_dist = require("../../dist-BtDdPdZ7.js");
4
4
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
5
- const require_composition_sources = require("../../composition-sources-Dj_nInUQ.js");
5
+ const require_composition_sources = require("../../composition-sources-DeUSUid6.js");
6
6
  const require_prefix_range = require("../../prefix-range-D_KueXbQ.js");
7
7
  const require_prefix_walk = require("../../prefix-walk-Dv6MLZlM.js");
8
8
  let zod = require("zod");
@@ -1,6 +1,6 @@
1
- import { $i as hydrateSchema, $n as planComposition, Bt as coreBlockComposition, Hi as collectSecretMarkerRefs, Hr as composedDeviceRef, Ht as coreBlockSourceKind, Kn as normalizeCoreBlockWrite, N as DeclaredDevices, Nr as validateComposition, Ot as buildCapabilityLookup, Rt as compositionSourceRefs, Ta as transformSecretWrite, Ut as coreBlocksCapability, Vt as coreBlockIdFromAddonId, Zt as describeComposableCaps, ei as errMsg, f as COMPOSER_RUNNER_ID, ia as isSecretMarker, lr as resolveCoreBlockEntry, m as CORE_BLOCK_ADDON_PREFIX, oa as isSecretRefOwnedBy, or as replacedFieldKeys, p as CORE_BLOCKS_ADDON_ID, qi as defineRecordKinds, qr as compositionSourceKey, r as ALL_CAPABILITY_DEFINITIONS, ti as BaseAddon, ur as resolveCoreBlockFiles, v as CoreBlockSchema, va as resolveSecretMarkers, xa as secretTreeFromSchema, zt as coreBlockAddonId } from "../../dist-C9lbdBL5.mjs";
1
+ import { $i as hydrateSchema, $n as planComposition, Bt as coreBlockComposition, Hi as collectSecretMarkerRefs, Hr as composedDeviceRef, Ht as coreBlockSourceKind, Kn as normalizeCoreBlockWrite, N as DeclaredDevices, Nr as validateComposition, Ot as buildCapabilityLookup, Rt as compositionSourceRefs, Ta as transformSecretWrite, Ut as coreBlocksCapability, Vt as coreBlockIdFromAddonId, Zt as describeComposableCaps, ei as errMsg, f as COMPOSER_RUNNER_ID, ia as isSecretMarker, lr as resolveCoreBlockEntry, m as CORE_BLOCK_ADDON_PREFIX, oa as isSecretRefOwnedBy, or as replacedFieldKeys, p as CORE_BLOCKS_ADDON_ID, qi as defineRecordKinds, qr as compositionSourceKey, r as ALL_CAPABILITY_DEFINITIONS, ti as BaseAddon, ur as resolveCoreBlockFiles, v as CoreBlockSchema, va as resolveSecretMarkers, xa as secretTreeFromSchema, zt as coreBlockAddonId } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
- import { t as describeCompositionSources } from "../../composition-sources-cwD35HB0.mjs";
3
+ import { t as describeCompositionSources } from "../../composition-sources-CiFkyAcf.mjs";
4
4
  import { t as prefixRange } from "../../prefix-range-Dl0znowN.mjs";
5
5
  import { n as unwrapStoredValue, t as loadPrefixed } from "../../prefix-walk-DAOBSyH1.mjs";
6
6
  import { createRequire } from "node:module";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  //#region src/builtins/device-history/time/bucket-time.ts
8
8
  /**
9
9
  * Bucket arithmetic for the three rollup tiers (D850, plan §4/§5.5).
@@ -1,4 +1,4 @@
1
- import { $r as DeviceType, B as HISTORY_ITEM_CATALOG, Ct as armRemovalReconcile, D as DEVICE_HISTORY_ENERGY_KEY, Oa as EventCategory, Qi as historyItemFieldPath, Yi as emitReadiness, en as deviceHistoryCapability, nn as deviceRemovalHookCapability, ti as BaseAddon, ui as HISTORY_DEFAULT_MIN_INTERVAL_MS, z as HISTORY_CATALOG } from "../../dist-C9lbdBL5.mjs";
1
+ import { $r as DeviceType, B as HISTORY_ITEM_CATALOG, Ct as armRemovalReconcile, D as DEVICE_HISTORY_ENERGY_KEY, Oa as EventCategory, Qi as historyItemFieldPath, Yi as emitReadiness, en as deviceHistoryCapability, nn as deviceRemovalHookCapability, ti as BaseAddon, ui as HISTORY_DEFAULT_MIN_INTERVAL_MS, z as HISTORY_CATALOG } from "../../dist-DygMs3Qc.mjs";
2
2
  //#region src/builtins/device-history/time/bucket-time.ts
3
3
  /**
4
4
  * Bucket arithmetic for the three rollup tiers (D850, plan §4/§5.5).
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_read_all_rows$1 = require("../../read-all-rows-CVoO1ONM.js");
8
8
  const require_prefix_range = require("../../prefix-range-D_KueXbQ.js");
9
9
  const require_prefix_walk = require("../../prefix-walk-Dv6MLZlM.js");
@@ -8988,6 +8988,48 @@ function errorMessage$3(err) {
8988
8988
  return err instanceof Error ? err.message : String(err);
8989
8989
  }
8990
8990
  //#endregion
8991
+ //#region src/builtins/device-manager/running-flip.ts
8992
+ function readRunning(slice) {
8993
+ const running = slice["running"];
8994
+ if (running === true || running === false) return running;
8995
+ return null;
8996
+ }
8997
+ var RunningFlipDetector = class {
8998
+ #memory = /* @__PURE__ */ new Map();
8999
+ seed(deviceId, running) {
9000
+ this.#memory.set(deviceId, running);
9001
+ }
9002
+ note(deviceId, slice) {
9003
+ const running = readRunning(slice);
9004
+ const since = typeof slice["since"] === "number" && Number.isFinite(slice["since"]) ? slice["since"] : null;
9005
+ const phase = typeof slice["phase"] === "string" ? slice["phase"] : null;
9006
+ const prev = this.#memory.get(deviceId);
9007
+ this.#memory.set(deviceId, running);
9008
+ if (prev === void 0) {
9009
+ if (running === true) return {
9010
+ kind: "started",
9011
+ deviceId,
9012
+ since,
9013
+ phase
9014
+ };
9015
+ return null;
9016
+ }
9017
+ if (prev === true && running === false) return {
9018
+ kind: "finished",
9019
+ deviceId,
9020
+ since,
9021
+ phase
9022
+ };
9023
+ if (prev !== true && running === true) return {
9024
+ kind: "started",
9025
+ deviceId,
9026
+ since,
9027
+ phase
9028
+ };
9029
+ return null;
9030
+ }
9031
+ };
9032
+ //#endregion
8991
9033
  //#region src/builtins/device-manager/runtime-state-persist-gate.ts
8992
9034
  /**
8993
9035
  * The subset of `blob` that is allowed on disk: slices whose capability
@@ -9490,6 +9532,7 @@ var MirrorRowWriter = class MirrorRowWriter {
9490
9532
  * the owner alone — `nativeSlice` and `DeviceNativeShadowChanged`, a category
9491
9533
  * the public routers refuse (D224).
9492
9534
  */
9535
+ var RUNNING_STATE_CAP = "running-state";
9493
9536
  var SEED_REFUSAL_MESSAGE = "runtime-state row unreadable — native write refused until it reads";
9494
9537
  function errorMessage$1(err) {
9495
9538
  return err instanceof Error ? err.message : String(err);
@@ -9524,6 +9567,8 @@ var DeviceStateMirror = class {
9524
9567
  seedRefusalLogged = /* @__PURE__ */ new Set();
9525
9568
  /** Every write of a device's row, and what is believed to be on it. */
9526
9569
  writer;
9570
+ /** Edge detector for `running-state` flip events (D933). */
9571
+ runningFlip = new RunningFlipDetector();
9527
9572
  constructor(ctx, policyFor = require_dist.runtimeStatePolicyFor, schemaFor = defaultSchemaFor) {
9528
9573
  this.ctx = ctx;
9529
9574
  this.policyFor = policyFor;
@@ -9931,6 +9976,7 @@ var DeviceStateMirror = class {
9931
9976
  meta: { caps: split.dropped }
9932
9977
  });
9933
9978
  for (const [capName, cap] of this.claims.claimsOf(deviceId)) this.claims.seedView(deviceId, capName, cap, this.nativeOf(deviceId, capName));
9979
+ this.seedRunningFlip(deviceId);
9934
9980
  this.seeded.add(deviceId);
9935
9981
  this.rowRead.add(deviceId);
9936
9982
  this.writer.markPersisted(deviceId, persistableBlob(joinRuntimeBlob(split.native, split.owned, this.policyFor), this.policyFor));
@@ -10038,12 +10084,36 @@ var DeviceStateMirror = class {
10038
10084
  for (const deviceId of deviceIds) out[String(deviceId)] = this.snapshotForDevice(deviceId);
10039
10085
  return out;
10040
10086
  }
10087
+ /** Remember a restored running bit so the first public merge does not emit a flip. */
10088
+ seedRunningFlip(deviceId) {
10089
+ const slice = this.capSlice(deviceId, RUNNING_STATE_CAP);
10090
+ if (slice === null) return;
10091
+ const running = slice["running"];
10092
+ this.runningFlip.seed(deviceId, running === true || running === false ? running : null);
10093
+ }
10041
10094
  /**
10042
10095
  * The PUBLIC event: exactly `{ deviceId, capName, slice }` for every device,
10043
10096
  * claimed or not. The native shadow never rides here (D224) — see
10044
10097
  * `emitNativeShadow`.
10045
10098
  */
10046
10099
  emitStateChanged(deviceId, capName, slice) {
10100
+ if (capName === RUNNING_STATE_CAP) {
10101
+ const flip = this.runningFlip.note(deviceId, slice);
10102
+ if (flip !== null) this.ctx.eventBus.emit({
10103
+ id: (0, node_crypto.randomUUID)(),
10104
+ timestamp: /* @__PURE__ */ new Date(),
10105
+ source: {
10106
+ type: "device",
10107
+ id: deviceId
10108
+ },
10109
+ category: flip.kind === "started" ? require_dist.EventCategory.RunningStarted : require_dist.EventCategory.RunningFinished,
10110
+ data: {
10111
+ deviceId: flip.deviceId,
10112
+ since: flip.since,
10113
+ phase: flip.phase
10114
+ }
10115
+ });
10116
+ }
10047
10117
  this.ctx.eventBus.emit({
10048
10118
  id: (0, node_crypto.randomUUID)(),
10049
10119
  timestamp: /* @__PURE__ */ new Date(),
@@ -1,4 +1,4 @@
1
- import { $r as DeviceType, $t as deviceExtensionCapability, Ea as userError, F as DeviceTombstoneSchema, In as locationIconKey, L as FieldClaimModeSchema, Mn as legacyAutoLinkIds, Ni as WELL_KNOWN_TAB_MAP, Oa as EventCategory, Oi as SECRET_CLEAR, P as DeviceStatusSchema, Pt as canonicalIconKey, Qr as DeviceRole, R as FieldClaimSchema, Sa as sleep$1, Ta as transformSecretWrite, Ui as collectZodSecretPaths, Wt as createDeviceExtensionProvider, Y as MINUTES_PER_DAY, Yt as defineExtensionSlotProvider, Zn as parseStreamParamsFormPatch, Zr as DeviceFeature, aa as isSecretMarkerLike, ba as secretTreeFromPaths, ea as isDeviceConfigCap, ei as errMsg, gn as formatMinutes, hr as runtimeStatePolicyFor, ia as isSecretMarker, in as deviceStatusCapability, jt as buildStreamParamsConfigSchema, l as CAP_NAMES_WITH_STATUS, na as isKeychainStoredField, on as enumerateItemArrayFields, ot as STREAM_PROFILE_META, qi as defineRecordKinds, qn as normalizeUnit, r as ALL_CAPABILITY_DEFINITIONS, ra as isSecretClear, rn as deviceStateCapability, s as CAMERA_SWITCH_ORDER, sn as enumerateSchemaFields, ti as BaseAddon, tn as deviceManagerCapability, un as expandContainer, va as resolveSecretMarkers, w as DAY_NAMES, wa as toSecretFieldView, xr as siteZoneKey } from "../../dist-C9lbdBL5.mjs";
1
+ import { $r as DeviceType, $t as deviceExtensionCapability, Ea as userError, F as DeviceTombstoneSchema, In as locationIconKey, L as FieldClaimModeSchema, Mn as legacyAutoLinkIds, Ni as WELL_KNOWN_TAB_MAP, Oa as EventCategory, Oi as SECRET_CLEAR, P as DeviceStatusSchema, Pt as canonicalIconKey, Qr as DeviceRole, R as FieldClaimSchema, Sa as sleep$1, Ta as transformSecretWrite, Ui as collectZodSecretPaths, Wt as createDeviceExtensionProvider, Y as MINUTES_PER_DAY, Yt as defineExtensionSlotProvider, Zn as parseStreamParamsFormPatch, Zr as DeviceFeature, aa as isSecretMarkerLike, ba as secretTreeFromPaths, ea as isDeviceConfigCap, ei as errMsg, gn as formatMinutes, hr as runtimeStatePolicyFor, ia as isSecretMarker, in as deviceStatusCapability, jt as buildStreamParamsConfigSchema, l as CAP_NAMES_WITH_STATUS, na as isKeychainStoredField, on as enumerateItemArrayFields, ot as STREAM_PROFILE_META, qi as defineRecordKinds, qn as normalizeUnit, r as ALL_CAPABILITY_DEFINITIONS, ra as isSecretClear, rn as deviceStateCapability, s as CAMERA_SWITCH_ORDER, sn as enumerateSchemaFields, ti as BaseAddon, tn as deviceManagerCapability, un as expandContainer, va as resolveSecretMarkers, w as DAY_NAMES, wa as toSecretFieldView, xr as siteZoneKey } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as require_read_all_rows } from "../../read-all-rows-TaPqdWNF.mjs";
3
3
  import { t as prefixRange } from "../../prefix-range-Dl0znowN.mjs";
4
4
  import { t as loadPrefixed } from "../../prefix-walk-DAOBSyH1.mjs";
@@ -8982,6 +8982,48 @@ function errorMessage$3(err) {
8982
8982
  return err instanceof Error ? err.message : String(err);
8983
8983
  }
8984
8984
  //#endregion
8985
+ //#region src/builtins/device-manager/running-flip.ts
8986
+ function readRunning(slice) {
8987
+ const running = slice["running"];
8988
+ if (running === true || running === false) return running;
8989
+ return null;
8990
+ }
8991
+ var RunningFlipDetector = class {
8992
+ #memory = /* @__PURE__ */ new Map();
8993
+ seed(deviceId, running) {
8994
+ this.#memory.set(deviceId, running);
8995
+ }
8996
+ note(deviceId, slice) {
8997
+ const running = readRunning(slice);
8998
+ const since = typeof slice["since"] === "number" && Number.isFinite(slice["since"]) ? slice["since"] : null;
8999
+ const phase = typeof slice["phase"] === "string" ? slice["phase"] : null;
9000
+ const prev = this.#memory.get(deviceId);
9001
+ this.#memory.set(deviceId, running);
9002
+ if (prev === void 0) {
9003
+ if (running === true) return {
9004
+ kind: "started",
9005
+ deviceId,
9006
+ since,
9007
+ phase
9008
+ };
9009
+ return null;
9010
+ }
9011
+ if (prev === true && running === false) return {
9012
+ kind: "finished",
9013
+ deviceId,
9014
+ since,
9015
+ phase
9016
+ };
9017
+ if (prev !== true && running === true) return {
9018
+ kind: "started",
9019
+ deviceId,
9020
+ since,
9021
+ phase
9022
+ };
9023
+ return null;
9024
+ }
9025
+ };
9026
+ //#endregion
8985
9027
  //#region src/builtins/device-manager/runtime-state-persist-gate.ts
8986
9028
  /**
8987
9029
  * The subset of `blob` that is allowed on disk: slices whose capability
@@ -9484,6 +9526,7 @@ var MirrorRowWriter = class MirrorRowWriter {
9484
9526
  * the owner alone — `nativeSlice` and `DeviceNativeShadowChanged`, a category
9485
9527
  * the public routers refuse (D224).
9486
9528
  */
9529
+ var RUNNING_STATE_CAP = "running-state";
9487
9530
  var SEED_REFUSAL_MESSAGE = "runtime-state row unreadable — native write refused until it reads";
9488
9531
  function errorMessage$1(err) {
9489
9532
  return err instanceof Error ? err.message : String(err);
@@ -9518,6 +9561,8 @@ var DeviceStateMirror = class {
9518
9561
  seedRefusalLogged = /* @__PURE__ */ new Set();
9519
9562
  /** Every write of a device's row, and what is believed to be on it. */
9520
9563
  writer;
9564
+ /** Edge detector for `running-state` flip events (D933). */
9565
+ runningFlip = new RunningFlipDetector();
9521
9566
  constructor(ctx, policyFor = runtimeStatePolicyFor, schemaFor = defaultSchemaFor) {
9522
9567
  this.ctx = ctx;
9523
9568
  this.policyFor = policyFor;
@@ -9925,6 +9970,7 @@ var DeviceStateMirror = class {
9925
9970
  meta: { caps: split.dropped }
9926
9971
  });
9927
9972
  for (const [capName, cap] of this.claims.claimsOf(deviceId)) this.claims.seedView(deviceId, capName, cap, this.nativeOf(deviceId, capName));
9973
+ this.seedRunningFlip(deviceId);
9928
9974
  this.seeded.add(deviceId);
9929
9975
  this.rowRead.add(deviceId);
9930
9976
  this.writer.markPersisted(deviceId, persistableBlob(joinRuntimeBlob(split.native, split.owned, this.policyFor), this.policyFor));
@@ -10032,12 +10078,36 @@ var DeviceStateMirror = class {
10032
10078
  for (const deviceId of deviceIds) out[String(deviceId)] = this.snapshotForDevice(deviceId);
10033
10079
  return out;
10034
10080
  }
10081
+ /** Remember a restored running bit so the first public merge does not emit a flip. */
10082
+ seedRunningFlip(deviceId) {
10083
+ const slice = this.capSlice(deviceId, RUNNING_STATE_CAP);
10084
+ if (slice === null) return;
10085
+ const running = slice["running"];
10086
+ this.runningFlip.seed(deviceId, running === true || running === false ? running : null);
10087
+ }
10035
10088
  /**
10036
10089
  * The PUBLIC event: exactly `{ deviceId, capName, slice }` for every device,
10037
10090
  * claimed or not. The native shadow never rides here (D224) — see
10038
10091
  * `emitNativeShadow`.
10039
10092
  */
10040
10093
  emitStateChanged(deviceId, capName, slice) {
10094
+ if (capName === RUNNING_STATE_CAP) {
10095
+ const flip = this.runningFlip.note(deviceId, slice);
10096
+ if (flip !== null) this.ctx.eventBus.emit({
10097
+ id: randomUUID(),
10098
+ timestamp: /* @__PURE__ */ new Date(),
10099
+ source: {
10100
+ type: "device",
10101
+ id: deviceId
10102
+ },
10103
+ category: flip.kind === "started" ? EventCategory.RunningStarted : EventCategory.RunningFinished,
10104
+ data: {
10105
+ deviceId: flip.deviceId,
10106
+ since: flip.since,
10107
+ phase: flip.phase
10108
+ }
10109
+ });
10110
+ }
10041
10111
  this.ctx.eventBus.emit({
10042
10112
  id: randomUUID(),
10043
10113
  timestamp: /* @__PURE__ */ new Date(),
@@ -58,6 +58,8 @@ export declare class DeviceStateMirror {
58
58
  private readonly seedRefusalLogged;
59
59
  /** Every write of a device's row, and what is believed to be on it. */
60
60
  private readonly writer;
61
+ /** Edge detector for `running-state` flip events (D933). */
62
+ private readonly runningFlip;
61
63
  constructor(ctx: AddonContext, policyFor?: RuntimeStatePolicyLookup, schemaFor?: RuntimeStateSchemaLookup);
62
64
  /**
63
65
  * Single-cap mirror update — diff against the current mirror,
@@ -247,6 +249,8 @@ export declare class DeviceStateMirror {
247
249
  /** Whole-system mirror dump. Backs `deviceState.getAllSnapshots` — one
248
250
  * round-trip for a warm boot instead of N per-device calls. */
249
251
  allSnapshots(): Record<string, Record<string, Record<string, unknown>>>;
252
+ /** Remember a restored running bit so the first public merge does not emit a flip. */
253
+ private seedRunningFlip;
250
254
  /**
251
255
  * The PUBLIC event: exactly `{ deviceId, capName, slice }` for every device,
252
256
  * claimed or not. The native shadow never rides here (D224) — see
@@ -0,0 +1,11 @@
1
+ export interface RunningFlipEvent {
2
+ readonly kind: "started" | "finished";
3
+ readonly deviceId: number;
4
+ readonly since: number | null;
5
+ readonly phase: string | null;
6
+ }
7
+ export declare class RunningFlipDetector {
8
+ #private;
9
+ seed(deviceId: number, running: boolean | null): void;
10
+ note(deviceId: number, slice: Record<string, unknown>): RunningFlipEvent | null;
11
+ }
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  require("../../chunk-Cek0wNdY.js");
6
- const require_dist = require("../../dist-Bmah6waF.js");
6
+ const require_dist = require("../../dist-BtDdPdZ7.js");
7
7
  const require_formatter = require("../../formatter-DqAKDlvN.js");
8
8
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
9
9
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;
@@ -1,4 +1,4 @@
1
- import { Ln as logDestinationCapability, ti as BaseAddon } from "../../dist-C9lbdBL5.mjs";
1
+ import { Ln as logDestinationCapability, ti as BaseAddon } from "../../dist-DygMs3Qc.mjs";
2
2
  import { t as formatLogLine } from "../../formatter-B7qW8bPJ.mjs";
3
3
  //#region src/builtins/hub-forwarder/hub-forwarder-destination.ts
4
4
  var DEFAULT_OUTBOUND_BUFFER_SIZE = 500;