@camstack/addon-provider-petkit 0.2.76 → 0.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.
package/dist/addon.js CHANGED
@@ -9053,13 +9053,28 @@ var RecordingBandSchema = object({
9053
9053
  end: string().regex(HHMM),
9054
9054
  mode: RecordingBandModeSchema,
9055
9055
  triggers: RecordingBandTriggersSchema.optional(),
9056
+ /**
9057
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
9058
+ *
9059
+ * It was the retroactive KEEP bound — which already-written segments survive
9060
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
9061
+ * broker could serve, or the gate would delete the seconds the ring had just
9062
+ * handed the writer. That "at least as wide as" is the tell: it was a second
9063
+ * expression of the broker's retention, in different units, in a different
9064
+ * addon, with an invariant the operator had to maintain by hand. The keep
9065
+ * bound is now derived from the one prebuffer ceiling and there is nothing
9066
+ * left to configure here.
9067
+ *
9068
+ * The key survives in the SHAPE so a config written before that record still
9069
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
9070
+ * strict, so simply deleting it would strip an operator's value in silence on
9071
+ * the next save (the failure D380 came one commit from shipping). Nothing
9072
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
9073
+ */
9056
9074
  preBufferSec: number().min(0).optional(),
9057
9075
  postBufferSec: number().min(0).optional()
9058
9076
  });
9059
- ({
9060
- preBufferSec: 15,
9061
- postBufferSec: 30
9062
- }).postBufferSec * 1e3;
9077
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
9063
9078
  /**
9064
9079
  * Per-device retention overrides. Every field is optional; an unset or `0`
9065
9080
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -11636,12 +11651,30 @@ var BackupDestinationInfoSchema = object({
11636
11651
  lastSuccessAt: number().optional(),
11637
11652
  /** Newest-archive size from `manifests.json`, or undefined. */
11638
11653
  lastSuccessSizeBytes: number().optional(),
11639
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11654
+ /**
11655
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11656
+ * destination, comma-joined. Absent when no enabled schedule targets it
11657
+ * — a destination nothing is scheduled to write to must not advertise a
11658
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11659
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11660
+ * and reading it made a destination with a DISABLED schedule claim a
11661
+ * nightly run.
11662
+ */
11640
11663
  cron: string().optional(),
11641
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11664
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11642
11665
  nextRunAt: number().optional(),
11643
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11644
- lastRunAt: number().optional()
11666
+ /**
11667
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11668
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11669
+ * newest archive that actually landed) and `lastError`.
11670
+ */
11671
+ lastAttemptAt: number().optional(),
11672
+ /**
11673
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11674
+ * landed the archive. A destination that has never been written to has
11675
+ * neither this nor `lastAttemptAt`.
11676
+ */
11677
+ lastError: string().optional()
11645
11678
  });
11646
11679
  /**
11647
11680
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11804,8 +11837,16 @@ var BackupScheduleSchema = object({
11804
11837
  retentionCount: number().int().min(1).max(1e3),
11805
11838
  /** Optional subset of source locations to include; omitted = all. */
11806
11839
  dataSources: array(string()).readonly().optional(),
11807
- /** ms-epoch of last successful run. */
11808
- lastRunAt: number().optional(),
11840
+ /**
11841
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11842
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11843
+ * "succeeded" — a run refused by every destination stamps it too.
11844
+ */
11845
+ lastAttemptAt: number().optional(),
11846
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11847
+ lastSuccessAt: number().optional(),
11848
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11849
+ lastError: string().optional(),
11809
11850
  /** ms-epoch of next computed firing (read-only, filled on list). */
11810
11851
  nextRunAt: number().optional()
11811
11852
  });
@@ -11854,14 +11895,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11854
11895
  locationId: string(),
11855
11896
  enabled: boolean(),
11856
11897
  retentionCount: number().int().min(1).max(1e3),
11857
- label: string().optional(),
11858
- /**
11859
- * Per-destination cron expression. Empty string clears the
11860
- * schedule (manual-only). Validated server-side via croner;
11861
- * malformed expressions reject the upsert with an actionable
11862
- * message.
11863
- */
11864
- cron: string().optional()
11898
+ label: string().optional()
11865
11899
  }), _void(), {
11866
11900
  kind: "mutation",
11867
11901
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -9052,13 +9052,28 @@ var RecordingBandSchema = object({
9052
9052
  end: string().regex(HHMM),
9053
9053
  mode: RecordingBandModeSchema,
9054
9054
  triggers: RecordingBandTriggersSchema.optional(),
9055
+ /**
9056
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
9057
+ *
9058
+ * It was the retroactive KEEP bound — which already-written segments survive
9059
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
9060
+ * broker could serve, or the gate would delete the seconds the ring had just
9061
+ * handed the writer. That "at least as wide as" is the tell: it was a second
9062
+ * expression of the broker's retention, in different units, in a different
9063
+ * addon, with an invariant the operator had to maintain by hand. The keep
9064
+ * bound is now derived from the one prebuffer ceiling and there is nothing
9065
+ * left to configure here.
9066
+ *
9067
+ * The key survives in the SHAPE so a config written before that record still
9068
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
9069
+ * strict, so simply deleting it would strip an operator's value in silence on
9070
+ * the next save (the failure D380 came one commit from shipping). Nothing
9071
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
9072
+ */
9055
9073
  preBufferSec: number().min(0).optional(),
9056
9074
  postBufferSec: number().min(0).optional()
9057
9075
  });
9058
- ({
9059
- preBufferSec: 15,
9060
- postBufferSec: 30
9061
- }).postBufferSec * 1e3;
9076
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
9062
9077
  /**
9063
9078
  * Per-device retention overrides. Every field is optional; an unset or `0`
9064
9079
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -11635,12 +11650,30 @@ var BackupDestinationInfoSchema = object({
11635
11650
  lastSuccessAt: number().optional(),
11636
11651
  /** Newest-archive size from `manifests.json`, or undefined. */
11637
11652
  lastSuccessSizeBytes: number().optional(),
11638
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11653
+ /**
11654
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11655
+ * destination, comma-joined. Absent when no enabled schedule targets it
11656
+ * — a destination nothing is scheduled to write to must not advertise a
11657
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11658
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11659
+ * and reading it made a destination with a DISABLED schedule claim a
11660
+ * nightly run.
11661
+ */
11639
11662
  cron: string().optional(),
11640
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11663
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11641
11664
  nextRunAt: number().optional(),
11642
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11643
- lastRunAt: number().optional()
11665
+ /**
11666
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11667
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11668
+ * newest archive that actually landed) and `lastError`.
11669
+ */
11670
+ lastAttemptAt: number().optional(),
11671
+ /**
11672
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11673
+ * landed the archive. A destination that has never been written to has
11674
+ * neither this nor `lastAttemptAt`.
11675
+ */
11676
+ lastError: string().optional()
11644
11677
  });
11645
11678
  /**
11646
11679
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11803,8 +11836,16 @@ var BackupScheduleSchema = object({
11803
11836
  retentionCount: number().int().min(1).max(1e3),
11804
11837
  /** Optional subset of source locations to include; omitted = all. */
11805
11838
  dataSources: array(string()).readonly().optional(),
11806
- /** ms-epoch of last successful run. */
11807
- lastRunAt: number().optional(),
11839
+ /**
11840
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11841
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11842
+ * "succeeded" — a run refused by every destination stamps it too.
11843
+ */
11844
+ lastAttemptAt: number().optional(),
11845
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11846
+ lastSuccessAt: number().optional(),
11847
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11848
+ lastError: string().optional(),
11808
11849
  /** ms-epoch of next computed firing (read-only, filled on list). */
11809
11850
  nextRunAt: number().optional()
11810
11851
  });
@@ -11853,14 +11894,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11853
11894
  locationId: string(),
11854
11895
  enabled: boolean(),
11855
11896
  retentionCount: number().int().min(1).max(1e3),
11856
- label: string().optional(),
11857
- /**
11858
- * Per-destination cron expression. Empty string clears the
11859
- * schedule (manual-only). Validated server-side via croner;
11860
- * malformed expressions reject the upsert with an actionable
11861
- * message.
11862
- */
11863
- cron: string().optional()
11897
+ label: string().optional()
11864
11898
  }), _void(), {
11865
11899
  kind: "mutation",
11866
11900
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-petkit",
3
- "version": "0.2.76",
3
+ "version": "0.2.78",
4
4
  "description": "PetKit smart-feeder device-provider addon for CamStack — wraps the @apocaliss92/nodepetkit PetKit cloud client",
5
5
  "keywords": [
6
6
  "camstack",