@camstack/addon-provider-rademacher 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
@@ -8936,13 +8936,28 @@ var RecordingBandSchema = object({
8936
8936
  end: string().regex(HHMM),
8937
8937
  mode: RecordingBandModeSchema,
8938
8938
  triggers: RecordingBandTriggersSchema.optional(),
8939
+ /**
8940
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8941
+ *
8942
+ * It was the retroactive KEEP bound — which already-written segments survive
8943
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8944
+ * broker could serve, or the gate would delete the seconds the ring had just
8945
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8946
+ * expression of the broker's retention, in different units, in a different
8947
+ * addon, with an invariant the operator had to maintain by hand. The keep
8948
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8949
+ * left to configure here.
8950
+ *
8951
+ * The key survives in the SHAPE so a config written before that record still
8952
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8953
+ * strict, so simply deleting it would strip an operator's value in silence on
8954
+ * the next save (the failure D380 came one commit from shipping). Nothing
8955
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8956
+ */
8939
8957
  preBufferSec: number().min(0).optional(),
8940
8958
  postBufferSec: number().min(0).optional()
8941
8959
  });
8942
- ({
8943
- preBufferSec: 15,
8944
- postBufferSec: 30
8945
- }).postBufferSec * 1e3;
8960
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8946
8961
  /**
8947
8962
  * Per-device retention overrides. Every field is optional; an unset or `0`
8948
8963
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -11519,12 +11534,30 @@ var BackupDestinationInfoSchema = object({
11519
11534
  lastSuccessAt: number().optional(),
11520
11535
  /** Newest-archive size from `manifests.json`, or undefined. */
11521
11536
  lastSuccessSizeBytes: number().optional(),
11522
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11537
+ /**
11538
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11539
+ * destination, comma-joined. Absent when no enabled schedule targets it
11540
+ * — a destination nothing is scheduled to write to must not advertise a
11541
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11542
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11543
+ * and reading it made a destination with a DISABLED schedule claim a
11544
+ * nightly run.
11545
+ */
11523
11546
  cron: string().optional(),
11524
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11547
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11525
11548
  nextRunAt: number().optional(),
11526
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11527
- lastRunAt: number().optional()
11549
+ /**
11550
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11551
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11552
+ * newest archive that actually landed) and `lastError`.
11553
+ */
11554
+ lastAttemptAt: number().optional(),
11555
+ /**
11556
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11557
+ * landed the archive. A destination that has never been written to has
11558
+ * neither this nor `lastAttemptAt`.
11559
+ */
11560
+ lastError: string().optional()
11528
11561
  });
11529
11562
  /**
11530
11563
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11687,8 +11720,16 @@ var BackupScheduleSchema = object({
11687
11720
  retentionCount: number().int().min(1).max(1e3),
11688
11721
  /** Optional subset of source locations to include; omitted = all. */
11689
11722
  dataSources: array(string()).readonly().optional(),
11690
- /** ms-epoch of last successful run. */
11691
- lastRunAt: number().optional(),
11723
+ /**
11724
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11725
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11726
+ * "succeeded" — a run refused by every destination stamps it too.
11727
+ */
11728
+ lastAttemptAt: number().optional(),
11729
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11730
+ lastSuccessAt: number().optional(),
11731
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11732
+ lastError: string().optional(),
11692
11733
  /** ms-epoch of next computed firing (read-only, filled on list). */
11693
11734
  nextRunAt: number().optional()
11694
11735
  });
@@ -11737,14 +11778,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11737
11778
  locationId: string(),
11738
11779
  enabled: boolean(),
11739
11780
  retentionCount: number().int().min(1).max(1e3),
11740
- label: string().optional(),
11741
- /**
11742
- * Per-destination cron expression. Empty string clears the
11743
- * schedule (manual-only). Validated server-side via croner;
11744
- * malformed expressions reject the upsert with an actionable
11745
- * message.
11746
- */
11747
- cron: string().optional()
11781
+ label: string().optional()
11748
11782
  }), _void(), {
11749
11783
  kind: "mutation",
11750
11784
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -8935,13 +8935,28 @@ var RecordingBandSchema = object({
8935
8935
  end: string().regex(HHMM),
8936
8936
  mode: RecordingBandModeSchema,
8937
8937
  triggers: RecordingBandTriggersSchema.optional(),
8938
+ /**
8939
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8940
+ *
8941
+ * It was the retroactive KEEP bound — which already-written segments survive
8942
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8943
+ * broker could serve, or the gate would delete the seconds the ring had just
8944
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8945
+ * expression of the broker's retention, in different units, in a different
8946
+ * addon, with an invariant the operator had to maintain by hand. The keep
8947
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8948
+ * left to configure here.
8949
+ *
8950
+ * The key survives in the SHAPE so a config written before that record still
8951
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8952
+ * strict, so simply deleting it would strip an operator's value in silence on
8953
+ * the next save (the failure D380 came one commit from shipping). Nothing
8954
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8955
+ */
8938
8956
  preBufferSec: number().min(0).optional(),
8939
8957
  postBufferSec: number().min(0).optional()
8940
8958
  });
8941
- ({
8942
- preBufferSec: 15,
8943
- postBufferSec: 30
8944
- }).postBufferSec * 1e3;
8959
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8945
8960
  /**
8946
8961
  * Per-device retention overrides. Every field is optional; an unset or `0`
8947
8962
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -11518,12 +11533,30 @@ var BackupDestinationInfoSchema = object({
11518
11533
  lastSuccessAt: number().optional(),
11519
11534
  /** Newest-archive size from `manifests.json`, or undefined. */
11520
11535
  lastSuccessSizeBytes: number().optional(),
11521
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11536
+ /**
11537
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11538
+ * destination, comma-joined. Absent when no enabled schedule targets it
11539
+ * — a destination nothing is scheduled to write to must not advertise a
11540
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11541
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11542
+ * and reading it made a destination with a DISABLED schedule claim a
11543
+ * nightly run.
11544
+ */
11522
11545
  cron: string().optional(),
11523
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11546
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11524
11547
  nextRunAt: number().optional(),
11525
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11526
- lastRunAt: number().optional()
11548
+ /**
11549
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11550
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11551
+ * newest archive that actually landed) and `lastError`.
11552
+ */
11553
+ lastAttemptAt: number().optional(),
11554
+ /**
11555
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11556
+ * landed the archive. A destination that has never been written to has
11557
+ * neither this nor `lastAttemptAt`.
11558
+ */
11559
+ lastError: string().optional()
11527
11560
  });
11528
11561
  /**
11529
11562
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11686,8 +11719,16 @@ var BackupScheduleSchema = object({
11686
11719
  retentionCount: number().int().min(1).max(1e3),
11687
11720
  /** Optional subset of source locations to include; omitted = all. */
11688
11721
  dataSources: array(string()).readonly().optional(),
11689
- /** ms-epoch of last successful run. */
11690
- lastRunAt: number().optional(),
11722
+ /**
11723
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11724
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11725
+ * "succeeded" — a run refused by every destination stamps it too.
11726
+ */
11727
+ lastAttemptAt: number().optional(),
11728
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11729
+ lastSuccessAt: number().optional(),
11730
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11731
+ lastError: string().optional(),
11691
11732
  /** ms-epoch of next computed firing (read-only, filled on list). */
11692
11733
  nextRunAt: number().optional()
11693
11734
  });
@@ -11736,14 +11777,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11736
11777
  locationId: string(),
11737
11778
  enabled: boolean(),
11738
11779
  retentionCount: number().int().min(1).max(1e3),
11739
- label: string().optional(),
11740
- /**
11741
- * Per-destination cron expression. Empty string clears the
11742
- * schedule (manual-only). Validated server-side via croner;
11743
- * malformed expressions reject the upsert with an actionable
11744
- * message.
11745
- */
11746
- cron: string().optional()
11780
+ label: string().optional()
11747
11781
  }), _void(), {
11748
11782
  kind: "mutation",
11749
11783
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.2.75",
3
+ "version": "0.2.77",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",