@camstack/addon-provider-tuya 0.2.77 → 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
@@ -11369,12 +11369,30 @@ var BackupDestinationInfoSchema = object({
11369
11369
  lastSuccessAt: number().optional(),
11370
11370
  /** Newest-archive size from `manifests.json`, or undefined. */
11371
11371
  lastSuccessSizeBytes: number().optional(),
11372
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11372
+ /**
11373
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11374
+ * destination, comma-joined. Absent when no enabled schedule targets it
11375
+ * — a destination nothing is scheduled to write to must not advertise a
11376
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11377
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11378
+ * and reading it made a destination with a DISABLED schedule claim a
11379
+ * nightly run.
11380
+ */
11373
11381
  cron: string().optional(),
11374
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11382
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11375
11383
  nextRunAt: number().optional(),
11376
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11377
- lastRunAt: number().optional()
11384
+ /**
11385
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11386
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11387
+ * newest archive that actually landed) and `lastError`.
11388
+ */
11389
+ lastAttemptAt: number().optional(),
11390
+ /**
11391
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11392
+ * landed the archive. A destination that has never been written to has
11393
+ * neither this nor `lastAttemptAt`.
11394
+ */
11395
+ lastError: string().optional()
11378
11396
  });
11379
11397
  /**
11380
11398
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11537,8 +11555,16 @@ var BackupScheduleSchema = object({
11537
11555
  retentionCount: number().int().min(1).max(1e3),
11538
11556
  /** Optional subset of source locations to include; omitted = all. */
11539
11557
  dataSources: array(string()).readonly().optional(),
11540
- /** ms-epoch of last successful run. */
11541
- lastRunAt: number().optional(),
11558
+ /**
11559
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11560
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11561
+ * "succeeded" — a run refused by every destination stamps it too.
11562
+ */
11563
+ lastAttemptAt: number().optional(),
11564
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11565
+ lastSuccessAt: number().optional(),
11566
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11567
+ lastError: string().optional(),
11542
11568
  /** ms-epoch of next computed firing (read-only, filled on list). */
11543
11569
  nextRunAt: number().optional()
11544
11570
  });
@@ -11587,14 +11613,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11587
11613
  locationId: string(),
11588
11614
  enabled: boolean(),
11589
11615
  retentionCount: number().int().min(1).max(1e3),
11590
- label: string().optional(),
11591
- /**
11592
- * Per-destination cron expression. Empty string clears the
11593
- * schedule (manual-only). Validated server-side via croner;
11594
- * malformed expressions reject the upsert with an actionable
11595
- * message.
11596
- */
11597
- cron: string().optional()
11616
+ label: string().optional()
11598
11617
  }), _void(), {
11599
11618
  kind: "mutation",
11600
11619
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -11368,12 +11368,30 @@ var BackupDestinationInfoSchema = object({
11368
11368
  lastSuccessAt: number().optional(),
11369
11369
  /** Newest-archive size from `manifests.json`, or undefined. */
11370
11370
  lastSuccessSizeBytes: number().optional(),
11371
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
11371
+ /**
11372
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
11373
+ * destination, comma-joined. Absent when no enabled schedule targets it
11374
+ * — a destination nothing is scheduled to write to must not advertise a
11375
+ * cadence (D384). This is never the `backup_destination_policies.cron`
11376
+ * column: that per-location cron has scheduled nothing since 2026-07-28
11377
+ * and reading it made a destination with a DISABLED schedule claim a
11378
+ * nightly run.
11379
+ */
11372
11380
  cron: string().optional(),
11373
- /** ms-epoch of next computed firing for this destination's cron, if any. */
11381
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
11374
11382
  nextRunAt: number().optional(),
11375
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
11376
- lastRunAt: number().optional()
11383
+ /**
11384
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
11385
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
11386
+ * newest archive that actually landed) and `lastError`.
11387
+ */
11388
+ lastAttemptAt: number().optional(),
11389
+ /**
11390
+ * Why the last attempt failed, verbatim. Absent when the last attempt
11391
+ * landed the archive. A destination that has never been written to has
11392
+ * neither this nor `lastAttemptAt`.
11393
+ */
11394
+ lastError: string().optional()
11377
11395
  });
11378
11396
  /**
11379
11397
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -11536,8 +11554,16 @@ var BackupScheduleSchema = object({
11536
11554
  retentionCount: number().int().min(1).max(1e3),
11537
11555
  /** Optional subset of source locations to include; omitted = all. */
11538
11556
  dataSources: array(string()).readonly().optional(),
11539
- /** ms-epoch of last successful run. */
11540
- lastRunAt: number().optional(),
11557
+ /**
11558
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
11559
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
11560
+ * "succeeded" — a run refused by every destination stamps it too.
11561
+ */
11562
+ lastAttemptAt: number().optional(),
11563
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
11564
+ lastSuccessAt: number().optional(),
11565
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
11566
+ lastError: string().optional(),
11541
11567
  /** ms-epoch of next computed firing (read-only, filled on list). */
11542
11568
  nextRunAt: number().optional()
11543
11569
  });
@@ -11586,14 +11612,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
11586
11612
  locationId: string(),
11587
11613
  enabled: boolean(),
11588
11614
  retentionCount: number().int().min(1).max(1e3),
11589
- label: string().optional(),
11590
- /**
11591
- * Per-destination cron expression. Empty string clears the
11592
- * schedule (manual-only). Validated server-side via croner;
11593
- * malformed expressions reject the upsert with an actionable
11594
- * message.
11595
- */
11596
- cron: string().optional()
11615
+ label: string().optional()
11597
11616
  }), _void(), {
11598
11617
  kind: "mutation",
11599
11618
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-tuya",
3
- "version": "0.2.77",
3
+ "version": "0.2.78",
4
4
  "description": "Tuya / Smart Life device-provider addon for CamStack — account-onboarded (Tuya IoT cloud fetch of device localKeys) + LOCAL DP control via the @apocaliss92/nodetuya encrypted-LAN client, exposing switch / water-heater-family kettle entities",
5
5
  "keywords": [
6
6
  "camstack",