@camstack/addon-terminal 0.1.81 → 0.1.83

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
@@ -8050,13 +8050,28 @@ var RecordingBandSchema = object({
8050
8050
  end: string().regex(HHMM),
8051
8051
  mode: RecordingBandModeSchema,
8052
8052
  triggers: RecordingBandTriggersSchema.optional(),
8053
+ /**
8054
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8055
+ *
8056
+ * It was the retroactive KEEP bound — which already-written segments survive
8057
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8058
+ * broker could serve, or the gate would delete the seconds the ring had just
8059
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8060
+ * expression of the broker's retention, in different units, in a different
8061
+ * addon, with an invariant the operator had to maintain by hand. The keep
8062
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8063
+ * left to configure here.
8064
+ *
8065
+ * The key survives in the SHAPE so a config written before that record still
8066
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8067
+ * strict, so simply deleting it would strip an operator's value in silence on
8068
+ * the next save (the failure D380 came one commit from shipping). Nothing
8069
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8070
+ */
8053
8071
  preBufferSec: number().min(0).optional(),
8054
8072
  postBufferSec: number().min(0).optional()
8055
8073
  });
8056
- ({
8057
- preBufferSec: 15,
8058
- postBufferSec: 30
8059
- }).postBufferSec * 1e3;
8074
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8060
8075
  /**
8061
8076
  * Per-device retention overrides. Every field is optional; an unset or `0`
8062
8077
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10633,12 +10648,30 @@ var BackupDestinationInfoSchema = object({
10633
10648
  lastSuccessAt: number().optional(),
10634
10649
  /** Newest-archive size from `manifests.json`, or undefined. */
10635
10650
  lastSuccessSizeBytes: number().optional(),
10636
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10651
+ /**
10652
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10653
+ * destination, comma-joined. Absent when no enabled schedule targets it
10654
+ * — a destination nothing is scheduled to write to must not advertise a
10655
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10656
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10657
+ * and reading it made a destination with a DISABLED schedule claim a
10658
+ * nightly run.
10659
+ */
10637
10660
  cron: string().optional(),
10638
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10661
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10639
10662
  nextRunAt: number().optional(),
10640
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10641
- lastRunAt: number().optional()
10663
+ /**
10664
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10665
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10666
+ * newest archive that actually landed) and `lastError`.
10667
+ */
10668
+ lastAttemptAt: number().optional(),
10669
+ /**
10670
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10671
+ * landed the archive. A destination that has never been written to has
10672
+ * neither this nor `lastAttemptAt`.
10673
+ */
10674
+ lastError: string().optional()
10642
10675
  });
10643
10676
  /**
10644
10677
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10801,8 +10834,16 @@ var BackupScheduleSchema = object({
10801
10834
  retentionCount: number().int().min(1).max(1e3),
10802
10835
  /** Optional subset of source locations to include; omitted = all. */
10803
10836
  dataSources: array(string()).readonly().optional(),
10804
- /** ms-epoch of last successful run. */
10805
- lastRunAt: number().optional(),
10837
+ /**
10838
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10839
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10840
+ * "succeeded" — a run refused by every destination stamps it too.
10841
+ */
10842
+ lastAttemptAt: number().optional(),
10843
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10844
+ lastSuccessAt: number().optional(),
10845
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10846
+ lastError: string().optional(),
10806
10847
  /** ms-epoch of next computed firing (read-only, filled on list). */
10807
10848
  nextRunAt: number().optional()
10808
10849
  });
@@ -10851,14 +10892,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10851
10892
  locationId: string(),
10852
10893
  enabled: boolean(),
10853
10894
  retentionCount: number().int().min(1).max(1e3),
10854
- label: string().optional(),
10855
- /**
10856
- * Per-destination cron expression. Empty string clears the
10857
- * schedule (manual-only). Validated server-side via croner;
10858
- * malformed expressions reject the upsert with an actionable
10859
- * message.
10860
- */
10861
- cron: string().optional()
10895
+ label: string().optional()
10862
10896
  }), _void(), {
10863
10897
  kind: "mutation",
10864
10898
  auth: "admin"
package/dist/addon.mjs CHANGED
@@ -8027,13 +8027,28 @@ var RecordingBandSchema = object({
8027
8027
  end: string().regex(HHMM),
8028
8028
  mode: RecordingBandModeSchema,
8029
8029
  triggers: RecordingBandTriggersSchema.optional(),
8030
+ /**
8031
+ * RETIRED (D381). A band no longer carries a pre-buffer of its own.
8032
+ *
8033
+ * It was the retroactive KEEP bound — which already-written segments survive
8034
+ * a trigger — and it had to be at least as wide as the widest pre-roll the
8035
+ * broker could serve, or the gate would delete the seconds the ring had just
8036
+ * handed the writer. That "at least as wide as" is the tell: it was a second
8037
+ * expression of the broker's retention, in different units, in a different
8038
+ * addon, with an invariant the operator had to maintain by hand. The keep
8039
+ * bound is now derived from the one prebuffer ceiling and there is nothing
8040
+ * left to configure here.
8041
+ *
8042
+ * The key survives in the SHAPE so a config written before that record still
8043
+ * parses and can be migrated deliberately — `RecordingBandSchema` is not
8044
+ * strict, so simply deleting it would strip an operator's value in silence on
8045
+ * the next save (the failure D380 came one commit from shipping). Nothing
8046
+ * reads it: {@link stripRetiredBandPreBufferSec} removes it on load.
8047
+ */
8030
8048
  preBufferSec: number().min(0).optional(),
8031
8049
  postBufferSec: number().min(0).optional()
8032
8050
  });
8033
- ({
8034
- preBufferSec: 15,
8035
- postBufferSec: 30
8036
- }).postBufferSec * 1e3;
8051
+ ({ postBufferSec: 30 }).postBufferSec * 1e3;
8037
8052
  /**
8038
8053
  * Per-device retention overrides. Every field is optional; an unset or `0`
8039
8054
  * value inherits the node-wide recorder default. Only footage-lifetime limits
@@ -10610,12 +10625,30 @@ var BackupDestinationInfoSchema = object({
10610
10625
  lastSuccessAt: number().optional(),
10611
10626
  /** Newest-archive size from `manifests.json`, or undefined. */
10612
10627
  lastSuccessSizeBytes: number().optional(),
10613
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
10628
+ /**
10629
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
10630
+ * destination, comma-joined. Absent when no enabled schedule targets it
10631
+ * — a destination nothing is scheduled to write to must not advertise a
10632
+ * cadence (D384). This is never the `backup_destination_policies.cron`
10633
+ * column: that per-location cron has scheduled nothing since 2026-07-28
10634
+ * and reading it made a destination with a DISABLED schedule claim a
10635
+ * nightly run.
10636
+ */
10614
10637
  cron: string().optional(),
10615
- /** ms-epoch of next computed firing for this destination's cron, if any. */
10638
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
10616
10639
  nextRunAt: number().optional(),
10617
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
10618
- lastRunAt: number().optional()
10640
+ /**
10641
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
10642
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
10643
+ * newest archive that actually landed) and `lastError`.
10644
+ */
10645
+ lastAttemptAt: number().optional(),
10646
+ /**
10647
+ * Why the last attempt failed, verbatim. Absent when the last attempt
10648
+ * landed the archive. A destination that has never been written to has
10649
+ * neither this nor `lastAttemptAt`.
10650
+ */
10651
+ lastError: string().optional()
10619
10652
  });
10620
10653
  /**
10621
10654
  * Per-archive entry returned by `backup.listArchives({ destinationId })`.
@@ -10778,8 +10811,16 @@ var BackupScheduleSchema = object({
10778
10811
  retentionCount: number().int().min(1).max(1e3),
10779
10812
  /** Optional subset of source locations to include; omitted = all. */
10780
10813
  dataSources: array(string()).readonly().optional(),
10781
- /** ms-epoch of last successful run. */
10782
- lastRunAt: number().optional(),
10814
+ /**
10815
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
10816
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
10817
+ * "succeeded" — a run refused by every destination stamps it too.
10818
+ */
10819
+ lastAttemptAt: number().optional(),
10820
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
10821
+ lastSuccessAt: number().optional(),
10822
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
10823
+ lastError: string().optional(),
10783
10824
  /** ms-epoch of next computed firing (read-only, filled on list). */
10784
10825
  nextRunAt: number().optional()
10785
10826
  });
@@ -10828,14 +10869,7 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
10828
10869
  locationId: string(),
10829
10870
  enabled: boolean(),
10830
10871
  retentionCount: number().int().min(1).max(1e3),
10831
- label: string().optional(),
10832
- /**
10833
- * Per-destination cron expression. Empty string clears the
10834
- * schedule (manual-only). Validated server-side via croner;
10835
- * malformed expressions reject the upsert with an actionable
10836
- * message.
10837
- */
10838
- cron: string().optional()
10872
+ label: string().optional()
10839
10873
  }), _void(), {
10840
10874
  kind: "mutation",
10841
10875
  auth: "admin"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.81",
3
+ "version": "0.1.83",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",