@camstack/addon-notifiers 1.2.81 → 1.2.82

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
@@ -10701,12 +10701,30 @@ var BackupDestinationInfoSchema = object({
10701
10701
  lastSuccessAt: number().optional(),
10702
10702
  /** Newest-archive size from `manifests.json`, or undefined. */
10703
10703
  lastSuccessSizeBytes: number().optional(),
10704
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10704
+ /**
10705
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10706
+ * destination, comma-joined. Absent when no enabled schedule targets it
10707
+ * — a destination nothing is scheduled to write to must not advertise a
10708
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10709
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10710
+ * and reading it made a destination with a DISABLED schedule claim a
10711
+ * nightly run.
10712
+ */
10705
10713
  cron: string().optional(),
10706
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10714
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10707
10715
  nextRunAt: number().optional(),
10708
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10709
- lastRunAt: number().optional()
10716
+ /**
10717
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10718
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10719
+ * newest archive that actually landed) and `lastError`.
10720
+ */
10721
+ lastAttemptAt: number().optional(),
10722
+ /**
10723
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10724
+ * landed the archive. A destination that has never been written to has
10725
+ * neither this nor `lastAttemptAt`.
10726
+ */
10727
+ lastError: string().optional()
10710
10728
  });
10711
10729
  /**
10712
10730
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10869,8 +10887,16 @@ var BackupScheduleSchema = object({
10869
10887
  retentionCount: number().int().min(1).max(1e3),
10870
10888
  /** Optional subset of source locations to include; omitted = all. */
10871
10889
  dataSources: array(string()).readonly().optional(),
10872
- /** ms-epoch of last successful run. */
10873
- lastRunAt: number().optional(),
10890
+ /**
10891
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10892
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10893
+ * "succeeded" — a run refused by every destination stamps it too.
10894
+ */
10895
+ lastAttemptAt: number().optional(),
10896
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10897
+ lastSuccessAt: number().optional(),
10898
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10899
+ lastError: string().optional(),
10874
10900
  /** ms-epoch of next computed firing (read-only, filled on list). */
10875
10901
  nextRunAt: number().optional()
10876
10902
  });
@@ -10919,14 +10945,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10919
10945
  locationId: string(),
10920
10946
  enabled: boolean(),
10921
10947
  retentionCount: number().int().min(1).max(1e3),
10922
- label: string().optional(),
10923
- /**
10924
- * Per-destination cron expression. Empty string clears the
10925
- * schedule (manual-only). Validated server-side via croner;
10926
- * malformed expressions reject the upsert with an actionable
10927
- * message.
10928
- */
10929
- cron: string().optional()
10948
+ label: string().optional()
10930
10949
  }), _void(), {
10931
10950
  kind: "mutation",
10932
10951
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -10674,12 +10674,30 @@ var BackupDestinationInfoSchema = object({
10674
10674
  lastSuccessAt: number().optional(),
10675
10675
  /** Newest-archive size from `manifests.json`, or undefined. */
10676
10676
  lastSuccessSizeBytes: number().optional(),
10677
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10677
+ /**
10678
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10679
+ * destination, comma-joined. Absent when no enabled schedule targets it
10680
+ * — a destination nothing is scheduled to write to must not advertise a
10681
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10682
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10683
+ * and reading it made a destination with a DISABLED schedule claim a
10684
+ * nightly run.
10685
+ */
10678
10686
  cron: string().optional(),
10679
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10687
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10680
10688
  nextRunAt: number().optional(),
10681
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10682
- lastRunAt: number().optional()
10689
+ /**
10690
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10691
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10692
+ * newest archive that actually landed) and `lastError`.
10693
+ */
10694
+ lastAttemptAt: number().optional(),
10695
+ /**
10696
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10697
+ * landed the archive. A destination that has never been written to has
10698
+ * neither this nor `lastAttemptAt`.
10699
+ */
10700
+ lastError: string().optional()
10683
10701
  });
10684
10702
  /**
10685
10703
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10842,8 +10860,16 @@ var BackupScheduleSchema = object({
10842
10860
  retentionCount: number().int().min(1).max(1e3),
10843
10861
  /** Optional subset of source locations to include; omitted = all. */
10844
10862
  dataSources: array(string()).readonly().optional(),
10845
- /** ms-epoch of last successful run. */
10846
- lastRunAt: number().optional(),
10863
+ /**
10864
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10865
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10866
+ * "succeeded" — a run refused by every destination stamps it too.
10867
+ */
10868
+ lastAttemptAt: number().optional(),
10869
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10870
+ lastSuccessAt: number().optional(),
10871
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10872
+ lastError: string().optional(),
10847
10873
  /** ms-epoch of next computed firing (read-only, filled on list). */
10848
10874
  nextRunAt: number().optional()
10849
10875
  });
@@ -10892,14 +10918,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10892
10918
  locationId: string(),
10893
10919
  enabled: boolean(),
10894
10920
  retentionCount: number().int().min(1).max(1e3),
10895
- label: string().optional(),
10896
- /**
10897
- * Per-destination cron expression. Empty string clears the
10898
- * schedule (manual-only). Validated server-side via croner;
10899
- * malformed expressions reject the upsert with an actionable
10900
- * message.
10901
- */
10902
- cron: string().optional()
10921
+ label: string().optional()
10903
10922
  }), _void(), {
10904
10923
  kind: "mutation",
10905
10924
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-notifiers",
3
- "version": "1.2.81",
3
+ "version": "1.2.82",
4
4
  "description": "System notifiers addon for CamStack — a `notification-output` collection provider hosting per-kind notifier adapters (ntfy, pushover, gotify, telegram, discord, webhook, zentik).",
5
5
  "keywords": [
6
6
  "camstack",