@camstack/addon-provider-amcrest 0.2.79 → 0.2.80

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
@@ -10544,12 +10544,30 @@ var BackupDestinationInfoSchema = object({
10544
10544
  lastSuccessAt: number().optional(),
10545
10545
  /** Newest-archive size from `manifests.json`, or undefined. */
10546
10546
  lastSuccessSizeBytes: number().optional(),
10547
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10547
+ /**
10548
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10549
+ * destination, comma-joined. Absent when no enabled schedule targets it
10550
+ * — a destination nothing is scheduled to write to must not advertise a
10551
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10552
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10553
+ * and reading it made a destination with a DISABLED schedule claim a
10554
+ * nightly run.
10555
+ */
10548
10556
  cron: string().optional(),
10549
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10557
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10550
10558
  nextRunAt: number().optional(),
10551
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10552
- lastRunAt: number().optional()
10559
+ /**
10560
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10561
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10562
+ * newest archive that actually landed) and `lastError`.
10563
+ */
10564
+ lastAttemptAt: number().optional(),
10565
+ /**
10566
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10567
+ * landed the archive. A destination that has never been written to has
10568
+ * neither this nor `lastAttemptAt`.
10569
+ */
10570
+ lastError: string().optional()
10553
10571
  });
10554
10572
  /**
10555
10573
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10712,8 +10730,16 @@ var BackupScheduleSchema = object({
10712
10730
  retentionCount: number().int().min(1).max(1e3),
10713
10731
  /** Optional subset of source locations to include; omitted = all. */
10714
10732
  dataSources: array(string()).readonly().optional(),
10715
- /** ms-epoch of last successful run. */
10716
- lastRunAt: number().optional(),
10733
+ /**
10734
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10735
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10736
+ * "succeeded" — a run refused by every destination stamps it too.
10737
+ */
10738
+ lastAttemptAt: number().optional(),
10739
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10740
+ lastSuccessAt: number().optional(),
10741
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10742
+ lastError: string().optional(),
10717
10743
  /** ms-epoch of next computed firing (read-only, filled on list). */
10718
10744
  nextRunAt: number().optional()
10719
10745
  });
@@ -10762,14 +10788,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10762
10788
  locationId: string(),
10763
10789
  enabled: boolean(),
10764
10790
  retentionCount: number().int().min(1).max(1e3),
10765
- label: string().optional(),
10766
- /**
10767
- * Per-destination cron expression. Empty string clears the
10768
- * schedule (manual-only). Validated server-side via croner;
10769
- * malformed expressions reject the upsert with an actionable
10770
- * message.
10771
- */
10772
- cron: string().optional()
10791
+ label: string().optional()
10773
10792
  }), _void(), {
10774
10793
  kind: "mutation",
10775
10794
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -10545,12 +10545,30 @@ var BackupDestinationInfoSchema = object({
10545
10545
  lastSuccessAt: number().optional(),
10546
10546
  /** Newest-archive size from `manifests.json`, or undefined. */
10547
10547
  lastSuccessSizeBytes: number().optional(),
10548
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10548
+ /**
10549
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10550
+ * destination, comma-joined. Absent when no enabled schedule targets it
10551
+ * — a destination nothing is scheduled to write to must not advertise a
10552
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10553
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10554
+ * and reading it made a destination with a DISABLED schedule claim a
10555
+ * nightly run.
10556
+ */
10549
10557
  cron: string().optional(),
10550
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10558
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10551
10559
  nextRunAt: number().optional(),
10552
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10553
- lastRunAt: number().optional()
10560
+ /**
10561
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10562
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10563
+ * newest archive that actually landed) and `lastError`.
10564
+ */
10565
+ lastAttemptAt: number().optional(),
10566
+ /**
10567
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10568
+ * landed the archive. A destination that has never been written to has
10569
+ * neither this nor `lastAttemptAt`.
10570
+ */
10571
+ lastError: string().optional()
10554
10572
  });
10555
10573
  /**
10556
10574
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10713,8 +10731,16 @@ var BackupScheduleSchema = object({
10713
10731
  retentionCount: number().int().min(1).max(1e3),
10714
10732
  /** Optional subset of source locations to include; omitted = all. */
10715
10733
  dataSources: array(string()).readonly().optional(),
10716
- /** ms-epoch of last successful run. */
10717
- lastRunAt: number().optional(),
10734
+ /**
10735
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10736
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10737
+ * "succeeded" — a run refused by every destination stamps it too.
10738
+ */
10739
+ lastAttemptAt: number().optional(),
10740
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10741
+ lastSuccessAt: number().optional(),
10742
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10743
+ lastError: string().optional(),
10718
10744
  /** ms-epoch of next computed firing (read-only, filled on list). */
10719
10745
  nextRunAt: number().optional()
10720
10746
  });
@@ -10763,14 +10789,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10763
10789
  locationId: string(),
10764
10790
  enabled: boolean(),
10765
10791
  retentionCount: number().int().min(1).max(1e3),
10766
- label: string().optional(),
10767
- /**
10768
- * Per-destination cron expression. Empty string clears the
10769
- * schedule (manual-only). Validated server-side via croner;
10770
- * malformed expressions reject the upsert with an actionable
10771
- * message.
10772
- */
10773
- cron: string().optional()
10792
+ label: string().optional()
10774
10793
  }), _void(), {
10775
10794
  kind: "mutation",
10776
10795
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-amcrest",
3
- "version": "0.2.79",
3
+ "version": "0.2.80",
4
4
  "description": "Amcrest/Dahua camera device provider addon for CamStack — Dahua CGI over HTTP(S) with digest auth (snapshot, RTSP catalog, PTZ, image/day-night config)",
5
5
  "keywords": [
6
6
  "camstack",