camstack 1.2.10 → 1.2.11

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.
@@ -15687,16 +15687,23 @@ var StorageLocationDeclarationSchema = external_exports.object({
15687
15687
  * Which node root the seeded `<id>:default` instance is placed under on a
15688
15688
  * FRESH install:
15689
15689
  * - `'data'` (default) — the node's data dir (`CAMSTACK_DATA` / boot dir),
15690
- * the appData volume. Right for small/durable data (backups, logs, models).
15690
+ * the appData volume. Right for small/durable data (logs, models).
15691
15691
  * - `'media'` — the dedicated media volume (`CAMSTACK_MEDIA_ROOT`) when that
15692
15692
  * env is set, else falls back to the data root. Right for bulky, hot media
15693
15693
  * (recordings, event media) that should stay off the appData disk.
15694
+ * - `'backup'` — the dedicated backup volume (`CAMSTACK_BACKUP_ROOT`, default
15695
+ * `/backups` in the image) so archives live on their own mount rather than
15696
+ * filling the appData disk. Falls back to the data root when unset.
15694
15697
  *
15695
15698
  * Only affects the seeded default's `basePath`; operators can repoint any
15696
15699
  * location afterwards, and a `defaultsTo` slot inherits its parent's root
15697
15700
  * regardless of this field. Absent (the common case) is treated as `'data'`.
15698
15701
  */
15699
- defaultRoot: external_exports.enum(["data", "media"]).optional()
15702
+ defaultRoot: external_exports.enum([
15703
+ "data",
15704
+ "media",
15705
+ "backup"
15706
+ ]).optional()
15700
15707
  });
15701
15708
  var DecoderStatsSchema = external_exports.object({
15702
15709
  inputFps: external_exports.number(),
@@ -23868,6 +23875,26 @@ var LocationStatSchema = external_exports.object({
23868
23875
  fileCount: external_exports.number(),
23869
23876
  present: external_exports.boolean()
23870
23877
  });
23878
+ var BackupScheduleSchema = external_exports.object({
23879
+ /** Stable id. Generated by the orchestrator on first upsert if absent. */
23880
+ id: external_exports.string(),
23881
+ /** Operator-facing display name. */
23882
+ label: external_exports.string(),
23883
+ /** 5-field POSIX cron. Empty = disabled cadence (kept for editing). */
23884
+ cron: external_exports.string(),
23885
+ /** Master on/off toggle for the whole schedule. */
23886
+ enabled: external_exports.boolean(),
23887
+ /** `backups`-location ids this schedule writes to (fan-out set). */
23888
+ locationIds: external_exports.array(external_exports.string()).readonly(),
23889
+ /** Archives kept per targeted location for this schedule. */
23890
+ retentionCount: external_exports.number().int().min(1).max(1e3),
23891
+ /** Optional subset of source locations to include; omitted = all. */
23892
+ dataSources: external_exports.array(external_exports.string()).readonly().optional(),
23893
+ /** ms-epoch of last successful run. */
23894
+ lastRunAt: external_exports.number().optional(),
23895
+ /** ms-epoch of next computed firing (read-only, filled on list). */
23896
+ nextRunAt: external_exports.number().optional()
23897
+ });
23871
23898
  var backupCapability = {
23872
23899
  name: "backup",
23873
23900
  scope: "system",
@@ -23889,7 +23916,14 @@ var backupCapability = {
23889
23916
  /** Subset of registered `backup-destination` addon ids to write to. */
23890
23917
  destinations: external_exports.array(external_exports.string()).optional(),
23891
23918
  locations: external_exports.array(external_exports.string()).optional(),
23892
- label: external_exports.string().optional()
23919
+ label: external_exports.string().optional(),
23920
+ /**
23921
+ * Per-run retention override applied to every targeted
23922
+ * destination. Used by schedule-driven runs (per-entry
23923
+ * retention). Omitted = each destination's own policy
23924
+ * retention (manual runs).
23925
+ */
23926
+ retentionCount: external_exports.number().int().min(1).max(1e3).optional()
23893
23927
  }).optional(), external_exports.array(BackupEntrySchema).readonly(), {
23894
23928
  kind: "mutation",
23895
23929
  auth: "admin"
@@ -23976,7 +24010,36 @@ var backupCapability = {
23976
24010
  ok: external_exports.boolean(),
23977
24011
  error: external_exports.string().optional(),
23978
24012
  nextRuns: external_exports.array(external_exports.number()).readonly()
23979
- }))
24013
+ })),
24014
+ /**
24015
+ * List every backup schedule (the N:M entries), each with its
24016
+ * computed `nextRunAt`. Powers the Schedules section of the
24017
+ * admin-UI Backups page.
24018
+ */
24019
+ listSchedules: method(external_exports.void(), external_exports.array(BackupScheduleSchema).readonly(), { auth: "admin" }),
24020
+ /**
24021
+ * Create or replace a schedule. An empty / absent `id` mints a new
24022
+ * one; a present `id` replaces in place. `cron` is validated
24023
+ * server-side; `locationIds` must reference existing `backups`
24024
+ * locations (unknown ids are dropped with a warning).
24025
+ */
24026
+ upsertSchedule: method(external_exports.object({
24027
+ id: external_exports.string().optional(),
24028
+ label: external_exports.string(),
24029
+ cron: external_exports.string(),
24030
+ enabled: external_exports.boolean(),
24031
+ locationIds: external_exports.array(external_exports.string()).readonly(),
24032
+ retentionCount: external_exports.number().int().min(1).max(1e3),
24033
+ dataSources: external_exports.array(external_exports.string()).readonly().optional()
24034
+ }), BackupScheduleSchema, {
24035
+ kind: "mutation",
24036
+ auth: "admin"
24037
+ }),
24038
+ /** Delete a schedule by id. Does not touch the target locations. */
24039
+ deleteSchedule: method(external_exports.object({ id: external_exports.string() }), external_exports.void(), {
24040
+ kind: "mutation",
24041
+ auth: "admin"
24042
+ })
23980
24043
  }
23981
24044
  };
23982
24045
  var BrokerStatusEnum = external_exports.enum([
@@ -32181,6 +32244,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32181
32244
  addonId: null,
32182
32245
  access: "delete"
32183
32246
  },
32247
+ "backup.deleteSchedule": {
32248
+ capName: "backup",
32249
+ capScope: "system",
32250
+ addonId: null,
32251
+ access: "delete"
32252
+ },
32184
32253
  "backup.getEntries": {
32185
32254
  capName: "backup",
32186
32255
  capScope: "system",
@@ -32211,6 +32280,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32211
32280
  addonId: null,
32212
32281
  access: "view"
32213
32282
  },
32283
+ "backup.listSchedules": {
32284
+ capName: "backup",
32285
+ capScope: "system",
32286
+ addonId: null,
32287
+ access: "view"
32288
+ },
32214
32289
  "backup.previewSchedule": {
32215
32290
  capName: "backup",
32216
32291
  capScope: "system",
@@ -32235,6 +32310,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32235
32310
  addonId: null,
32236
32311
  access: "create"
32237
32312
  },
32313
+ "backup.upsertSchedule": {
32314
+ capName: "backup",
32315
+ capScope: "system",
32316
+ addonId: null,
32317
+ access: "create"
32318
+ },
32238
32319
  "battery.wakeForStream": {
32239
32320
  capName: "battery",
32240
32321
  capScope: "device",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-BRUAXYPT.js";
4
+ } from "./chunk-TFRON3LI.js";
5
5
  import "./chunk-K3NQKI34.js";
6
6
 
7
7
  // src/cli.ts
@@ -1079,7 +1079,7 @@ function isUnknown(_value) {
1079
1079
  return true;
1080
1080
  }
1081
1081
  async function resolveServerInteractive(presetNamespace) {
1082
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-7CHGPGXE.js");
1082
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-GQWPB7TQ.js");
1083
1083
  if (presetNamespace) {
1084
1084
  const spinner4 = clack.spinner();
1085
1085
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-BRUAXYPT.js";
8
+ } from "./chunk-TFRON3LI.js";
9
9
  import "./chunk-K3NQKI34.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.10",
3
+ "version": "1.2.11",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",