@camstack/addon-matter-broker 0.2.75 → 0.2.77

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.
package/dist/addon.js CHANGED
@@ -7965,13 +7965,28 @@ var RecordingBandSchema = object({
7965
7965
  end: string$2().regex(HHMM),
7966
7966
  mode: RecordingBandModeSchema,
7967
7967
  triggers: RecordingBandTriggersSchema.optional(),
7968
+ /**
7969
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
7970
+ *
7971
+ * It was the retroactive KEEP bound — which already-written segments survive
7972
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
7973
+ * broker could serve, or the gate would delete the seconds the ring had just
7974
+ * handed the writer. That "at least as wide as" is the tell: it was a second
7975
+ * expression of the broker's retention, in different units, in a different
7976
+ * addon, with an invariant the operator had to maintain by hand. The keep
7977
+ * bound is now derived from the one prebuffer ceiling and there is nothing
7978
+ * left to configure here.
7979
+ *
7980
+ * The key survives in the SHAPE so a config written before that record still
7981
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
7982
+ * strict, so simply deleting it would strip an operator's value in silence on
7983
+ * the next save (the failure D380 came one commit from shipping). Nothing
7984
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
7985
+ */
7968
7986
  preBufferSec: number().min(0).optional(),
7969
7987
  postBufferSec: number().min(0).optional()
7970
7988
  });
7971
- ({
7972
- preBufferSec: 15,
7973
- postBufferSec: 30
7974
- }).postBufferSec * 1e3;
7989
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
7975
7990
  /**
7976
7991
  * Per-device retention overrides. Every field is optional; an unset or `0`
7977
7992
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10548,12 +10563,30 @@ var BackupDestinationInfoSchema = object({
10548
10563
  lastSuccessAt: number().optional(),
10549
10564
  /** Newest-archive size from `manifests.json`, or undefined. */
10550
10565
  lastSuccessSizeBytes: number().optional(),
10551
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10566
+ /**
10567
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10568
+ * destination, comma-joined. Absent when no enabled schedule targets it
10569
+ * — a destination nothing is scheduled to write to must not advertise a
10570
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10571
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10572
+ * and reading it made a destination with a DISABLED schedule claim a
10573
+ * nightly run.
10574
+ */
10552
10575
  cron: string$2().optional(),
10553
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10576
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10554
10577
  nextRunAt: number().optional(),
10555
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10556
- lastRunAt: number().optional()
10578
+ /**
10579
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10580
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10581
+ * newest archive that actually landed) and `lastError`.
10582
+ */
10583
+ lastAttemptAt: number().optional(),
10584
+ /**
10585
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10586
+ * landed the archive. A destination that has never been written to has
10587
+ * neither this nor `lastAttemptAt`.
10588
+ */
10589
+ lastError: string$2().optional()
10557
10590
  });
10558
10591
  /**
10559
10592
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10716,8 +10749,16 @@ var BackupScheduleSchema = object({
10716
10749
  retentionCount: number().int().min(1).max(1e3),
10717
10750
  /** Optional subset of source locations to include; omitted = all. */
10718
10751
  dataSources: array(string$2()).readonly().optional(),
10719
- /** ms-epoch of last successful run. */
10720
- lastRunAt: number().optional(),
10752
+ /**
10753
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10754
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10755
+ * "succeeded" — a run refused by every destination stamps it too.
10756
+ */
10757
+ lastAttemptAt: number().optional(),
10758
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10759
+ lastSuccessAt: number().optional(),
10760
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10761
+ lastError: string$2().optional(),
10721
10762
  /** ms-epoch of next computed firing (read-only, filled on list). */
10722
10763
  nextRunAt: number().optional()
10723
10764
  });
@@ -10766,14 +10807,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10766
10807
  locationId: string$2(),
10767
10808
  enabled: boolean(),
10768
10809
  retentionCount: number().int().min(1).max(1e3),
10769
- label: string$2().optional(),
10770
- /**
10771
- * Per-destination cron expression. Empty string clears the
10772
- * schedule (manual-only). Validated server-side via croner;
10773
- * malformed expressions reject the upsert with an actionable
10774
- * message.
10775
- */
10776
- cron: string$2().optional()
10810
+ label: string$2().optional()
10777
10811
  }), _void(), {
10778
10812
  kind: "mutation",
10779
10813
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -7963,13 +7963,28 @@ var RecordingBandSchema = object({
7963
7963
  end: string$2().regex(HHMM),
7964
7964
  mode: RecordingBandModeSchema,
7965
7965
  triggers: RecordingBandTriggersSchema.optional(),
7966
+ /**
7967
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
7968
+ *
7969
+ * It was the retroactive KEEP bound — which already-written segments survive
7970
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
7971
+ * broker could serve, or the gate would delete the seconds the ring had just
7972
+ * handed the writer. That "at least as wide as" is the tell: it was a second
7973
+ * expression of the broker's retention, in different units, in a different
7974
+ * addon, with an invariant the operator had to maintain by hand. The keep
7975
+ * bound is now derived from the one prebuffer ceiling and there is nothing
7976
+ * left to configure here.
7977
+ *
7978
+ * The key survives in the SHAPE so a config written before that record still
7979
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
7980
+ * strict, so simply deleting it would strip an operator's value in silence on
7981
+ * the next save (the failure D380 came one commit from shipping). Nothing
7982
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
7983
+ */
7966
7984
  preBufferSec: number().min(0).optional(),
7967
7985
  postBufferSec: number().min(0).optional()
7968
7986
  });
7969
- ({
7970
- preBufferSec: 15,
7971
- postBufferSec: 30
7972
- }).postBufferSec * 1e3;
7987
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
7973
7988
  /**
7974
7989
  * Per-device retention overrides. Every field is optional; an unset or `0`
7975
7990
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10546,12 +10561,30 @@ var BackupDestinationInfoSchema = object({
10546
10561
  lastSuccessAt: number().optional(),
10547
10562
  /** Newest-archive size from `manifests.json`, or undefined. */
10548
10563
  lastSuccessSizeBytes: number().optional(),
10549
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10564
+ /**
10565
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10566
+ * destination, comma-joined. Absent when no enabled schedule targets it
10567
+ * — a destination nothing is scheduled to write to must not advertise a
10568
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10569
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10570
+ * and reading it made a destination with a DISABLED schedule claim a
10571
+ * nightly run.
10572
+ */
10550
10573
  cron: string$2().optional(),
10551
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10574
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10552
10575
  nextRunAt: number().optional(),
10553
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10554
- lastRunAt: number().optional()
10576
+ /**
10577
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10578
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10579
+ * newest archive that actually landed) and `lastError`.
10580
+ */
10581
+ lastAttemptAt: number().optional(),
10582
+ /**
10583
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10584
+ * landed the archive. A destination that has never been written to has
10585
+ * neither this nor `lastAttemptAt`.
10586
+ */
10587
+ lastError: string$2().optional()
10555
10588
  });
10556
10589
  /**
10557
10590
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10714,8 +10747,16 @@ var BackupScheduleSchema = object({
10714
10747
  retentionCount: number().int().min(1).max(1e3),
10715
10748
  /** Optional subset of source locations to include; omitted = all. */
10716
10749
  dataSources: array(string$2()).readonly().optional(),
10717
- /** ms-epoch of last successful run. */
10718
- lastRunAt: number().optional(),
10750
+ /**
10751
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10752
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10753
+ * "succeeded" — a run refused by every destination stamps it too.
10754
+ */
10755
+ lastAttemptAt: number().optional(),
10756
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10757
+ lastSuccessAt: number().optional(),
10758
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10759
+ lastError: string$2().optional(),
10719
10760
  /** ms-epoch of next computed firing (read-only, filled on list). */
10720
10761
  nextRunAt: number().optional()
10721
10762
  });
@@ -10764,14 +10805,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10764
10805
  locationId: string$2(),
10765
10806
  enabled: boolean(),
10766
10807
  retentionCount: number().int().min(1).max(1e3),
10767
- label: string$2().optional(),
10768
- /**
10769
- * Per-destination cron expression. Empty string clears the
10770
- * schedule (manual-only). Validated server-side via croner;
10771
- * malformed expressions reject the upsert with an actionable
10772
- * message.
10773
- */
10774
- cron: string$2().optional()
10808
+ label: string$2().optional()
10775
10809
  }), _void(), {
10776
10810
  kind: "mutation",
10777
10811
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.2.75",
3
+ "version": "0.2.77",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",