@camstack/addon-ai 0.4.78 → 0.4.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
@@ -8154,13 +8154,28 @@ var RecordingBandSchema = object({
8154
8154
  end: string().regex(HHMM),
8155
8155
  mode: RecordingBandModeSchema,
8156
8156
  triggers: RecordingBandTriggersSchema.optional(),
8157
+ /**
8158
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8159
+ *
8160
+ * It was the retroactive KEEP bound — which already-written segments survive
8161
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8162
+ * broker could serve, or the gate would delete the seconds the ring had just
8163
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8164
+ * expression of the broker's retention, in different units, in a different
8165
+ * addon, with an invariant the operator had to maintain by hand. The keep
8166
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8167
+ * left to configure here.
8168
+ *
8169
+ * The key survives in the SHAPE so a config written before that record still
8170
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8171
+ * strict, so simply deleting it would strip an operator's value in silence on
8172
+ * the next save (the failure D380 came one commit from shipping). Nothing
8173
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8174
+ */
8157
8175
  preBufferSec: number$1().min(0).optional(),
8158
8176
  postBufferSec: number$1().min(0).optional()
8159
8177
  });
8160
- ({
8161
- preBufferSec: 15,
8162
- postBufferSec: 30
8163
- }).postBufferSec * 1e3;
8178
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8164
8179
  /**
8165
8180
  * Per-device retention overrides. Every field is optional; an unset or `0`
8166
8181
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10737,12 +10752,30 @@ var BackupDestinationInfoSchema = object({
10737
10752
  lastSuccessAt: number$1().optional(),
10738
10753
  /** Newest-archive size from `manifests.json`, or undefined. */
10739
10754
  lastSuccessSizeBytes: number$1().optional(),
10740
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10755
+ /**
10756
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10757
+ * destination, comma-joined. Absent when no enabled schedule targets it
10758
+ * — a destination nothing is scheduled to write to must not advertise a
10759
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10760
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10761
+ * and reading it made a destination with a DISABLED schedule claim a
10762
+ * nightly run.
10763
+ */
10741
10764
  cron: string().optional(),
10742
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10765
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10743
10766
  nextRunAt: number$1().optional(),
10744
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10745
- lastRunAt: number$1().optional()
10767
+ /**
10768
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10769
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10770
+ * newest archive that actually landed) and `lastError`.
10771
+ */
10772
+ lastAttemptAt: number$1().optional(),
10773
+ /**
10774
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10775
+ * landed the archive. A destination that has never been written to has
10776
+ * neither this nor `lastAttemptAt`.
10777
+ */
10778
+ lastError: string().optional()
10746
10779
  });
10747
10780
  /**
10748
10781
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10905,8 +10938,16 @@ var BackupScheduleSchema = object({
10905
10938
  retentionCount: number$1().int().min(1).max(1e3),
10906
10939
  /** Optional subset of source locations to include; omitted = all. */
10907
10940
  dataSources: array(string()).readonly().optional(),
10908
- /** ms-epoch of last successful run. */
10909
- lastRunAt: number$1().optional(),
10941
+ /**
10942
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10943
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10944
+ * "succeeded" — a run refused by every destination stamps it too.
10945
+ */
10946
+ lastAttemptAt: number$1().optional(),
10947
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10948
+ lastSuccessAt: number$1().optional(),
10949
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10950
+ lastError: string().optional(),
10910
10951
  /** ms-epoch of next computed firing (read-only, filled on list). */
10911
10952
  nextRunAt: number$1().optional()
10912
10953
  });
@@ -10955,14 +10996,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10955
10996
  locationId: string(),
10956
10997
  enabled: boolean(),
10957
10998
  retentionCount: number$1().int().min(1).max(1e3),
10958
- label: string().optional(),
10959
- /**
10960
- * Per-destination cron expression. Empty string clears the
10961
- * schedule (manual-only). Validated server-side via croner;
10962
- * malformed expressions reject the upsert with an actionable
10963
- * message.
10964
- */
10965
- cron: string().optional()
10999
+ label: string().optional()
10966
11000
  }), _void(), {
10967
11001
  kind: "mutation",
10968
11002
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -8181,13 +8181,28 @@ var RecordingBandSchema = object({
8181
8181
  end: string().regex(HHMM),
8182
8182
  mode: RecordingBandModeSchema,
8183
8183
  triggers: RecordingBandTriggersSchema.optional(),
8184
+ /**
8185
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8186
+ *
8187
+ * It was the retroactive KEEP bound — which already-written segments survive
8188
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8189
+ * broker could serve, or the gate would delete the seconds the ring had just
8190
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8191
+ * expression of the broker's retention, in different units, in a different
8192
+ * addon, with an invariant the operator had to maintain by hand. The keep
8193
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8194
+ * left to configure here.
8195
+ *
8196
+ * The key survives in the SHAPE so a config written before that record still
8197
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8198
+ * strict, so simply deleting it would strip an operator's value in silence on
8199
+ * the next save (the failure D380 came one commit from shipping). Nothing
8200
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8201
+ */
8184
8202
  preBufferSec: number$1().min(0).optional(),
8185
8203
  postBufferSec: number$1().min(0).optional()
8186
8204
  });
8187
- ({
8188
- preBufferSec: 15,
8189
- postBufferSec: 30
8190
- }).postBufferSec * 1e3;
8205
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8191
8206
  /**
8192
8207
  * Per-device retention overrides. Every field is optional; an unset or `0`
8193
8208
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10764,12 +10779,30 @@ var BackupDestinationInfoSchema = object({
10764
10779
  lastSuccessAt: number$1().optional(),
10765
10780
  /** Newest-archive size from `manifests.json`, or undefined. */
10766
10781
  lastSuccessSizeBytes: number$1().optional(),
10767
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10782
+ /**
10783
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10784
+ * destination, comma-joined. Absent when no enabled schedule targets it
10785
+ * — a destination nothing is scheduled to write to must not advertise a
10786
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10787
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10788
+ * and reading it made a destination with a DISABLED schedule claim a
10789
+ * nightly run.
10790
+ */
10768
10791
  cron: string().optional(),
10769
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10792
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10770
10793
  nextRunAt: number$1().optional(),
10771
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10772
- lastRunAt: number$1().optional()
10794
+ /**
10795
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10796
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10797
+ * newest archive that actually landed) and `lastError`.
10798
+ */
10799
+ lastAttemptAt: number$1().optional(),
10800
+ /**
10801
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10802
+ * landed the archive. A destination that has never been written to has
10803
+ * neither this nor `lastAttemptAt`.
10804
+ */
10805
+ lastError: string().optional()
10773
10806
  });
10774
10807
  /**
10775
10808
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10932,8 +10965,16 @@ var BackupScheduleSchema = object({
10932
10965
  retentionCount: number$1().int().min(1).max(1e3),
10933
10966
  /** Optional subset of source locations to include; omitted = all. */
10934
10967
  dataSources: array(string()).readonly().optional(),
10935
- /** ms-epoch of last successful run. */
10936
- lastRunAt: number$1().optional(),
10968
+ /**
10969
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10970
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10971
+ * "succeeded" — a run refused by every destination stamps it too.
10972
+ */
10973
+ lastAttemptAt: number$1().optional(),
10974
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10975
+ lastSuccessAt: number$1().optional(),
10976
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10977
+ lastError: string().optional(),
10937
10978
  /** ms-epoch of next computed firing (read-only, filled on list). */
10938
10979
  nextRunAt: number$1().optional()
10939
10980
  });
@@ -10982,14 +11023,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10982
11023
  locationId: string(),
10983
11024
  enabled: boolean(),
10984
11025
  retentionCount: number$1().int().min(1).max(1e3),
10985
- label: string().optional(),
10986
- /**
10987
- * Per-destination cron expression. Empty string clears the
10988
- * schedule (manual-only). Validated server-side via croner;
10989
- * malformed expressions reject the upsert with an actionable
10990
- * message.
10991
- */
10992
- cron: string().optional()
11026
+ label: string().optional()
10993
11027
  }), _void(), {
10994
11028
  kind: "mutation",
10995
11029
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-ai",
3
- "version": "0.4.78",
3
+ "version": "0.4.80",
4
4
  "description": "AI addon for CamStack — the `llm` collection provider (cloud, LAN, and camstack-managed local llama.cpp profiles) plus the per-node `llm-runtime` managed executor.",
5
5
  "keywords": [
6
6
  "camstack",