@camstack/addon-terminal 0.1.2 → 0.1.3

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
@@ -7507,16 +7507,23 @@ var StorageLocationDeclarationSchema = object({
7507
7507
  * Which node root the seeded `<id>:default` instance is placed under on a
7508
7508
  * FRESH install:
7509
7509
  * - `'data'` (default) — the node's data dir (`CAMSTACK_DATA` / boot dir),
7510
- * the appData volume. Right for small/durable data (backups, logs, models).
7510
+ * the appData volume. Right for small/durable data (logs, models).
7511
7511
  * - `'media'` — the dedicated media volume (`CAMSTACK_MEDIA_ROOT`) when that
7512
7512
  * env is set, else falls back to the data root. Right for bulky, hot media
7513
7513
  * (recordings, event media) that should stay off the appData disk.
7514
+ * - `'backup'` — the dedicated backup volume (`CAMSTACK_BACKUP_ROOT`, default
7515
+ * `/backups` in the image) so archives live on their own mount rather than
7516
+ * filling the appData disk. Falls back to the data root when unset.
7514
7517
  *
7515
7518
  * Only affects the seeded default's `basePath`; operators can repoint any
7516
7519
  * location afterwards, and a `defaultsTo` slot inherits its parent's root
7517
7520
  * regardless of this field. Absent (the common case) is treated as `'data'`.
7518
7521
  */
7519
- defaultRoot: _enum(["data", "media"]).optional()
7522
+ defaultRoot: _enum([
7523
+ "data",
7524
+ "media",
7525
+ "backup"
7526
+ ]).optional()
7520
7527
  });
7521
7528
  var DecoderStatsSchema = object({
7522
7529
  inputFps: number(),
@@ -14528,11 +14535,53 @@ var LocationStatSchema = object({
14528
14535
  fileCount: number(),
14529
14536
  present: boolean()
14530
14537
  });
14538
+ /**
14539
+ * A backup schedule — the N:M "entry" that binds one cron cadence to a
14540
+ * SET of destination locations. Supersedes the per-location cron on
14541
+ * `BackupDestinationPolicy`: an operator creates a schedule, picks the
14542
+ * `backups` locations it should write to, and the orchestrator fans a
14543
+ * single archive out to all of them when the cron fires.
14544
+ *
14545
+ * `retentionCount` is per-schedule (D-decision 2026-07-28): every
14546
+ * location targeted by this schedule keeps this many archives from
14547
+ * this schedule's runs.
14548
+ *
14549
+ * `dataSources` optionally narrows which top-level state locations
14550
+ * (db, addons, tls, …) are archived; omitted = the orchestrator's
14551
+ * default full set.
14552
+ */
14553
+ var BackupScheduleSchema = object({
14554
+ /** Stable id. Generated by the orchestrator on first upsert if absent. */
14555
+ id: string(),
14556
+ /** Operator-facing display name. */
14557
+ label: string(),
14558
+ /** 5-field POSIX cron. Empty = disabled cadence (kept for editing). */
14559
+ cron: string(),
14560
+ /** Master on/off toggle for the whole schedule. */
14561
+ enabled: boolean(),
14562
+ /** `backups`-location ids this schedule writes to (fan-out set). */
14563
+ locationIds: array(string()).readonly(),
14564
+ /** Archives kept per targeted location for this schedule. */
14565
+ retentionCount: number().int().min(1).max(1e3),
14566
+ /** Optional subset of source locations to include; omitted = all. */
14567
+ dataSources: array(string()).readonly().optional(),
14568
+ /** ms-epoch of last successful run. */
14569
+ lastRunAt: number().optional(),
14570
+ /** ms-epoch of next computed firing (read-only, filled on list). */
14571
+ nextRunAt: number().optional()
14572
+ });
14531
14573
  method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }), method(object({
14532
14574
  /** Subset of registered `backup-destination` addon ids to write to. */
14533
14575
  destinations: array(string()).optional(),
14534
14576
  locations: array(string()).optional(),
14535
- label: string().optional()
14577
+ label: string().optional(),
14578
+ /**
14579
+ * Per-run retention override applied to every targeted
14580
+ * destination. Used by schedule-driven runs (per-entry
14581
+ * retention). Omitted = each destination's own policy
14582
+ * retention (manual runs).
14583
+ */
14584
+ retentionCount: number().int().min(1).max(1e3).optional()
14536
14585
  }).optional(), array(BackupEntrySchema).readonly(), {
14537
14586
  kind: "mutation",
14538
14587
  auth: "admin"
@@ -14581,7 +14630,21 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
14581
14630
  ok: boolean(),
14582
14631
  error: string().optional(),
14583
14632
  nextRuns: array(number()).readonly()
14584
- }));
14633
+ })), method(_void(), array(BackupScheduleSchema).readonly(), { auth: "admin" }), method(object({
14634
+ id: string().optional(),
14635
+ label: string(),
14636
+ cron: string(),
14637
+ enabled: boolean(),
14638
+ locationIds: array(string()).readonly(),
14639
+ retentionCount: number().int().min(1).max(1e3),
14640
+ dataSources: array(string()).readonly().optional()
14641
+ }), BackupScheduleSchema, {
14642
+ kind: "mutation",
14643
+ auth: "admin"
14644
+ }), method(object({ id: string() }), _void(), {
14645
+ kind: "mutation",
14646
+ auth: "admin"
14647
+ });
14585
14648
  /**
14586
14649
  * `broker` — unified pub/sub broker registry, system-scoped collection.
14587
14650
  *
@@ -21703,6 +21766,12 @@ Object.freeze({
21703
21766
  addonId: null,
21704
21767
  access: "delete"
21705
21768
  },
21769
+ "backup.deleteSchedule": {
21770
+ capName: "backup",
21771
+ capScope: "system",
21772
+ addonId: null,
21773
+ access: "delete"
21774
+ },
21706
21775
  "backup.getEntries": {
21707
21776
  capName: "backup",
21708
21777
  capScope: "system",
@@ -21733,6 +21802,12 @@ Object.freeze({
21733
21802
  addonId: null,
21734
21803
  access: "view"
21735
21804
  },
21805
+ "backup.listSchedules": {
21806
+ capName: "backup",
21807
+ capScope: "system",
21808
+ addonId: null,
21809
+ access: "view"
21810
+ },
21736
21811
  "backup.previewSchedule": {
21737
21812
  capName: "backup",
21738
21813
  capScope: "system",
@@ -21757,6 +21832,12 @@ Object.freeze({
21757
21832
  addonId: null,
21758
21833
  access: "create"
21759
21834
  },
21835
+ "backup.upsertSchedule": {
21836
+ capName: "backup",
21837
+ capScope: "system",
21838
+ addonId: null,
21839
+ access: "create"
21840
+ },
21760
21841
  "battery.wakeForStream": {
21761
21842
  capName: "battery",
21762
21843
  capScope: "device",
package/dist/addon.mjs CHANGED
@@ -7506,16 +7506,23 @@ var StorageLocationDeclarationSchema = object({
7506
7506
  * Which node root the seeded `<id>:default` instance is placed under on a
7507
7507
  * FRESH install:
7508
7508
  * - `'data'` (default) — the node's data dir (`CAMSTACK_DATA` / boot dir),
7509
- * the appData volume. Right for small/durable data (backups, logs, models).
7509
+ * the appData volume. Right for small/durable data (logs, models).
7510
7510
  * - `'media'` — the dedicated media volume (`CAMSTACK_MEDIA_ROOT`) when that
7511
7511
  * env is set, else falls back to the data root. Right for bulky, hot media
7512
7512
  * (recordings, event media) that should stay off the appData disk.
7513
+ * - `'backup'` — the dedicated backup volume (`CAMSTACK_BACKUP_ROOT`, default
7514
+ * `/backups` in the image) so archives live on their own mount rather than
7515
+ * filling the appData disk. Falls back to the data root when unset.
7513
7516
  *
7514
7517
  * Only affects the seeded default's `basePath`; operators can repoint any
7515
7518
  * location afterwards, and a `defaultsTo` slot inherits its parent's root
7516
7519
  * regardless of this field. Absent (the common case) is treated as `'data'`.
7517
7520
  */
7518
- defaultRoot: _enum(["data", "media"]).optional()
7521
+ defaultRoot: _enum([
7522
+ "data",
7523
+ "media",
7524
+ "backup"
7525
+ ]).optional()
7519
7526
  });
7520
7527
  var DecoderStatsSchema = object({
7521
7528
  inputFps: number(),
@@ -14527,11 +14534,53 @@ var LocationStatSchema = object({
14527
14534
  fileCount: number(),
14528
14535
  present: boolean()
14529
14536
  });
14537
+ /**
14538
+ * A backup schedule — the N:M "entry" that binds one cron cadence to a
14539
+ * SET of destination locations. Supersedes the per-location cron on
14540
+ * `BackupDestinationPolicy`: an operator creates a schedule, picks the
14541
+ * `backups` locations it should write to, and the orchestrator fans a
14542
+ * single archive out to all of them when the cron fires.
14543
+ *
14544
+ * `retentionCount` is per-schedule (D-decision 2026-07-28): every
14545
+ * location targeted by this schedule keeps this many archives from
14546
+ * this schedule's runs.
14547
+ *
14548
+ * `dataSources` optionally narrows which top-level state locations
14549
+ * (db, addons, tls, …) are archived; omitted = the orchestrator's
14550
+ * default full set.
14551
+ */
14552
+ var BackupScheduleSchema = object({
14553
+ /** Stable id. Generated by the orchestrator on first upsert if absent. */
14554
+ id: string(),
14555
+ /** Operator-facing display name. */
14556
+ label: string(),
14557
+ /** 5-field POSIX cron. Empty = disabled cadence (kept for editing). */
14558
+ cron: string(),
14559
+ /** Master on/off toggle for the whole schedule. */
14560
+ enabled: boolean(),
14561
+ /** `backups`-location ids this schedule writes to (fan-out set). */
14562
+ locationIds: array(string()).readonly(),
14563
+ /** Archives kept per targeted location for this schedule. */
14564
+ retentionCount: number().int().min(1).max(1e3),
14565
+ /** Optional subset of source locations to include; omitted = all. */
14566
+ dataSources: array(string()).readonly().optional(),
14567
+ /** ms-epoch of last successful run. */
14568
+ lastRunAt: number().optional(),
14569
+ /** ms-epoch of next computed firing (read-only, filled on list). */
14570
+ nextRunAt: number().optional()
14571
+ });
14530
14572
  method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }), method(object({
14531
14573
  /** Subset of registered `backup-destination` addon ids to write to. */
14532
14574
  destinations: array(string()).optional(),
14533
14575
  locations: array(string()).optional(),
14534
- label: string().optional()
14576
+ label: string().optional(),
14577
+ /**
14578
+ * Per-run retention override applied to every targeted
14579
+ * destination. Used by schedule-driven runs (per-entry
14580
+ * retention). Omitted = each destination's own policy
14581
+ * retention (manual runs).
14582
+ */
14583
+ retentionCount: number().int().min(1).max(1e3).optional()
14535
14584
  }).optional(), array(BackupEntrySchema).readonly(), {
14536
14585
  kind: "mutation",
14537
14586
  auth: "admin"
@@ -14580,7 +14629,21 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
14580
14629
  ok: boolean(),
14581
14630
  error: string().optional(),
14582
14631
  nextRuns: array(number()).readonly()
14583
- }));
14632
+ })), method(_void(), array(BackupScheduleSchema).readonly(), { auth: "admin" }), method(object({
14633
+ id: string().optional(),
14634
+ label: string(),
14635
+ cron: string(),
14636
+ enabled: boolean(),
14637
+ locationIds: array(string()).readonly(),
14638
+ retentionCount: number().int().min(1).max(1e3),
14639
+ dataSources: array(string()).readonly().optional()
14640
+ }), BackupScheduleSchema, {
14641
+ kind: "mutation",
14642
+ auth: "admin"
14643
+ }), method(object({ id: string() }), _void(), {
14644
+ kind: "mutation",
14645
+ auth: "admin"
14646
+ });
14584
14647
  /**
14585
14648
  * `broker` — unified pub/sub broker registry, system-scoped collection.
14586
14649
  *
@@ -21702,6 +21765,12 @@ Object.freeze({
21702
21765
  addonId: null,
21703
21766
  access: "delete"
21704
21767
  },
21768
+ "backup.deleteSchedule": {
21769
+ capName: "backup",
21770
+ capScope: "system",
21771
+ addonId: null,
21772
+ access: "delete"
21773
+ },
21705
21774
  "backup.getEntries": {
21706
21775
  capName: "backup",
21707
21776
  capScope: "system",
@@ -21732,6 +21801,12 @@ Object.freeze({
21732
21801
  addonId: null,
21733
21802
  access: "view"
21734
21803
  },
21804
+ "backup.listSchedules": {
21805
+ capName: "backup",
21806
+ capScope: "system",
21807
+ addonId: null,
21808
+ access: "view"
21809
+ },
21735
21810
  "backup.previewSchedule": {
21736
21811
  capName: "backup",
21737
21812
  capScope: "system",
@@ -21756,6 +21831,12 @@ Object.freeze({
21756
21831
  addonId: null,
21757
21832
  access: "create"
21758
21833
  },
21834
+ "backup.upsertSchedule": {
21835
+ capName: "backup",
21836
+ capScope: "system",
21837
+ addonId: null,
21838
+ access: "create"
21839
+ },
21759
21840
  "battery.wakeForStream": {
21760
21841
  capName: "battery",
21761
21842
  capScope: "device",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-terminal",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Interactive terminal sessions (pty + xterm) as a CamStack addon",
5
5
  "keywords": [
6
6
  "camstack",