@camstack/addon-mqtt-broker 1.2.77 → 1.2.78

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.
@@ -10578,12 +10578,30 @@ var BackupDestinationInfoSchema = object({
10578
10578
  lastSuccessAt: number().optional(),
10579
10579
  /** Newest-archive size from `manifests.json`, or undefined. */
10580
10580
  lastSuccessSizeBytes: number().optional(),
10581
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10581
+ /**
10582
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10583
+ * destination, comma-joined. Absent when no enabled schedule targets it
10584
+ * — a destination nothing is scheduled to write to must not advertise a
10585
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10586
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10587
+ * and reading it made a destination with a DISABLED schedule claim a
10588
+ * nightly run.
10589
+ */
10582
10590
  cron: string().optional(),
10583
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10591
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10584
10592
  nextRunAt: number().optional(),
10585
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10586
- lastRunAt: number().optional()
10593
+ /**
10594
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10595
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10596
+ * newest archive that actually landed) and `lastError`.
10597
+ */
10598
+ lastAttemptAt: number().optional(),
10599
+ /**
10600
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10601
+ * landed the archive. A destination that has never been written to has
10602
+ * neither this nor `lastAttemptAt`.
10603
+ */
10604
+ lastError: string().optional()
10587
10605
  });
10588
10606
  /**
10589
10607
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10746,8 +10764,16 @@ var BackupScheduleSchema = object({
10746
10764
  retentionCount: number().int().min(1).max(1e3),
10747
10765
  /** Optional subset of source locations to include; omitted = all. */
10748
10766
  dataSources: array(string()).readonly().optional(),
10749
- /** ms-epoch of last successful run. */
10750
- lastRunAt: number().optional(),
10767
+ /**
10768
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10769
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10770
+ * "succeeded" — a run refused by every destination stamps it too.
10771
+ */
10772
+ lastAttemptAt: number().optional(),
10773
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10774
+ lastSuccessAt: number().optional(),
10775
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10776
+ lastError: string().optional(),
10751
10777
  /** ms-epoch of next computed firing (read-only, filled on list). */
10752
10778
  nextRunAt: number().optional()
10753
10779
  });
@@ -10796,14 +10822,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10796
10822
  locationId: string(),
10797
10823
  enabled: boolean(),
10798
10824
  retentionCount: number().int().min(1).max(1e3),
10799
- label: string().optional(),
10800
- /**
10801
- * Per-destination cron expression. Empty string clears the
10802
- * schedule (manual-only). Validated server-side via croner;
10803
- * malformed expressions reject the upsert with an actionable
10804
- * message.
10805
- */
10806
- cron: string().optional()
10825
+ label: string().optional()
10807
10826
  }), _void(), {
10808
10827
  kind: "mutation",
10809
10828
  auth: "admin"
@@ -10573,12 +10573,30 @@ var BackupDestinationInfoSchema = object({
10573
10573
  lastSuccessAt: number().optional(),
10574
10574
  /** Newest-archive size from `manifests.json`, or undefined. */
10575
10575
  lastSuccessSizeBytes: number().optional(),
10576
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10576
+ /**
10577
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10578
+ * destination, comma-joined. Absent when no enabled schedule targets it
10579
+ * — a destination nothing is scheduled to write to must not advertise a
10580
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10581
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10582
+ * and reading it made a destination with a DISABLED schedule claim a
10583
+ * nightly run.
10584
+ */
10577
10585
  cron: string().optional(),
10578
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10586
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10579
10587
  nextRunAt: number().optional(),
10580
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10581
- lastRunAt: number().optional()
10588
+ /**
10589
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10590
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10591
+ * newest archive that actually landed) and `lastError`.
10592
+ */
10593
+ lastAttemptAt: number().optional(),
10594
+ /**
10595
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10596
+ * landed the archive. A destination that has never been written to has
10597
+ * neither this nor `lastAttemptAt`.
10598
+ */
10599
+ lastError: string().optional()
10582
10600
  });
10583
10601
  /**
10584
10602
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10741,8 +10759,16 @@ var BackupScheduleSchema = object({
10741
10759
  retentionCount: number().int().min(1).max(1e3),
10742
10760
  /** Optional subset of source locations to include; omitted = all. */
10743
10761
  dataSources: array(string()).readonly().optional(),
10744
- /** ms-epoch of last successful run. */
10745
- lastRunAt: number().optional(),
10762
+ /**
10763
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10764
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10765
+ * "succeeded" — a run refused by every destination stamps it too.
10766
+ */
10767
+ lastAttemptAt: number().optional(),
10768
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10769
+ lastSuccessAt: number().optional(),
10770
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10771
+ lastError: string().optional(),
10746
10772
  /** ms-epoch of next computed firing (read-only, filled on list). */
10747
10773
  nextRunAt: number().optional()
10748
10774
  });
@@ -10791,14 +10817,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10791
10817
  locationId: string(),
10792
10818
  enabled: boolean(),
10793
10819
  retentionCount: number().int().min(1).max(1e3),
10794
- label: string().optional(),
10795
- /**
10796
- * Per-destination cron expression. Empty string clears the
10797
- * schedule (manual-only). Validated server-side via croner;
10798
- * malformed expressions reject the upsert with an actionable
10799
- * message.
10800
- */
10801
- cron: string().optional()
10820
+ label: string().optional()
10802
10821
  }), _void(), {
10803
10822
  kind: "mutation",
10804
10823
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.2.77",
3
+ "version": "1.2.78",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",