camstack 1.2.110 → 1.2.112

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.
@@ -15582,46 +15582,6 @@ var CameraSwitchGroupSchema = external_exports.object({
15582
15582
  /** Unix ms when the group was composed server-side. */
15583
15583
  fetchedAt: external_exports.number()
15584
15584
  });
15585
- var LogChannelLevelSchema = external_exports.enum([
15586
- "info",
15587
- "warn",
15588
- "error"
15589
- ]);
15590
- var LogChannelDescriptorSchema = external_exports.object({
15591
- /**
15592
- * Dotted `area.thing`, unique across the workspace. `area` is conventionally
15593
- * the addon's short name so an operator reading a channel list can tell who
15594
- * owns it without a second lookup.
15595
- */
15596
- name: external_exports.string().min(3).regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "a channel name is dotted lower-kebab, e.g. area.thing"),
15597
- /** One sentence: what the operator will SEE after arming it. */
15598
- description: external_exports.string().min(1),
15599
- /** The level its lines are emitted at. Never below `info`. */
15600
- defaultLevel: LogChannelLevelSchema,
15601
- /**
15602
- * Whether this channel can be narrowed to a camera.
15603
- *
15604
- * `true` is a PROMISE with two halves, and both must hold: the gate is
15605
- * consulted with the numeric device id, AND every line the channel admits
15606
- * carries `tags: { deviceId }` with that same numeric id. The second half is
15607
- * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
15608
- * keeps `deviceId` out of the stream labels for cardinality, so the tag in
15609
- * the body is the only way to filter.
15610
- *
15611
- * A channel whose lines carry the device only in `meta` (or not at all) is
15612
- * declared `false`. Declaring it `true` anyway would be a lie the UI repeats:
15613
- * the operator narrows to one camera, sees nothing, and concludes the code
15614
- * path was never taken.
15615
- */
15616
- perDevice: external_exports.boolean()
15617
- });
15618
- var LogChannelWindowSchema = external_exports.object({
15619
- channel: external_exports.string().min(1),
15620
- /** Epoch ms the window closes at. */
15621
- armedUntilMs: external_exports.number(),
15622
- /** `null` = every camera. A non-empty list narrows to those numeric ids. */
15623
- deviceIds: external_exports.array(external_exports.number().int()).readonly().nullable()
15624
- });
15625
15585
  var OpsLogDomainSchema = external_exports.enum(["recording", "events"]);
15626
15586
  var OpsLogOpSchema = external_exports.enum([
15627
15587
  "prune",
@@ -16213,21 +16173,20 @@ var StorageLocationSchema = external_exports.object({
16213
16173
  * flag at upsert time, not here (the schema is provider-agnostic).
16214
16174
  */
16215
16175
  nodeId: external_exports.string().optional(),
16216
- isDefault: external_exports.boolean().default(false),
16217
16176
  isSystem: external_exports.boolean().default(false),
16218
16177
  /**
16219
- * Operator opt-in: whether consumers that BALANCE across several locations
16220
- * of a type may write here. Recordings reads it today; event media and
16221
- * backups are the next consumers, which is why the flag lives on the
16222
- * location rather than in any one addon's store — nothing has to be
16223
- * extended to add the next consumer.
16178
+ * THE write switch, and the only one (D383). `enabled: true` means every
16179
+ * consumer that chooses a write target for this type may write here, and all
16180
+ * enabled locations of a type are used TOGETHER; `false` means read-only —
16181
+ * still read, still played back, still age-swept, still drained, never
16182
+ * written.
16224
16183
  *
16225
- * OPTIONAL, and ABSENT MEANS ACTIVE. Every location persisted before the
16226
- * flag existed reads back with no flag and keeps working exactly as before;
16227
- * that is the whole compat story, and it is why no migration ships with it.
16228
- * A newly CREATED sibling is stamped `false` by the orchestrator (creating a
16229
- * disk must not silently start writing to it); the default of a type is
16230
- * always stamped `true`.
16184
+ * OPTIONAL only for the wire: an upsert that omits it means "leave what is
16185
+ * stored" on an update and "born inert unless it is the first location of its
16186
+ * type" on a create. On a PERSISTED row absence is legacy and it means
16187
+ * enabled — {@link isLocationEnabled} is the one place that says so, and the
16188
+ * orchestrator stamps every flagless row `true` once at hydrate so absence
16189
+ * stops existing rather than being re-derived on every read.
16231
16190
  */
16232
16191
  enabled: external_exports.boolean().optional(),
16233
16192
  /** COMPUTED at read time by the orchestrator (statfs of the backing volume
@@ -16240,6 +16199,7 @@ var StorageLocationSchema = external_exports.object({
16240
16199
  createdAt: external_exports.number(),
16241
16200
  updatedAt: external_exports.number()
16242
16201
  });
16202
+ var LegacyStorageLocationDefaultSchema = external_exports.object({ isDefault: external_exports.boolean().optional() });
16243
16203
  var StorageLocationRefSchema = external_exports.union([StorageLocationTypeSchema, external_exports.string().regex(/^[a-z][a-zA-Z0-9-]*:[a-zA-Z0-9-]+$/)]);
16244
16204
  var StorageAccessSchema = external_exports.enum(["local-path", "cap-mediated"]);
16245
16205
  var StorageLocationDeclarationSchema = external_exports.object({
@@ -16366,6 +16326,46 @@ var DecoderSessionConfigSchema = external_exports.object({
16366
16326
  */
16367
16327
  debug: external_exports.boolean().optional()
16368
16328
  });
16329
+ var LogChannelLevelSchema = external_exports.enum([
16330
+ "info",
16331
+ "warn",
16332
+ "error"
16333
+ ]);
16334
+ var LogChannelDescriptorSchema = external_exports.object({
16335
+ /**
16336
+ * Dotted `area.thing`, unique across the workspace. `area` is conventionally
16337
+ * the addon's short name so an operator reading a channel list can tell who
16338
+ * owns it without a second lookup.
16339
+ */
16340
+ name: external_exports.string().min(3).regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "a channel name is dotted lower-kebab, e.g. area.thing"),
16341
+ /** One sentence: what the operator will SEE after arming it. */
16342
+ description: external_exports.string().min(1),
16343
+ /** The level its lines are emitted at. Never below `info`. */
16344
+ defaultLevel: LogChannelLevelSchema,
16345
+ /**
16346
+ * Whether this channel can be narrowed to a camera.
16347
+ *
16348
+ * `true` is a PROMISE with two halves, and both must hold: the gate is
16349
+ * consulted with the numeric device id, AND every line the channel admits
16350
+ * carries `tags: { deviceId }` with that same numeric id. The second half is
16351
+ * what makes `| json | deviceId="617"` work in Loki — `loki-payload.ts`
16352
+ * keeps `deviceId` out of the stream labels for cardinality, so the tag in
16353
+ * the body is the only way to filter.
16354
+ *
16355
+ * A channel whose lines carry the device only in `meta` (or not at all) is
16356
+ * declared `false`. Declaring it `true` anyway would be a lie the UI repeats:
16357
+ * the operator narrows to one camera, sees nothing, and concludes the code
16358
+ * path was never taken.
16359
+ */
16360
+ perDevice: external_exports.boolean()
16361
+ });
16362
+ var LogChannelWindowSchema = external_exports.object({
16363
+ channel: external_exports.string().min(1),
16364
+ /** Epoch ms the window closes at. */
16365
+ armedUntilMs: external_exports.number(),
16366
+ /** `null` = every camera. A non-empty list narrows to those numeric ids. */
16367
+ deviceIds: external_exports.array(external_exports.number().int()).readonly().nullable()
16368
+ });
16369
16369
  var MODEL_FORMATS = [
16370
16370
  "onnx",
16371
16371
  "coreml",
@@ -17884,12 +17884,30 @@ var BackupDestinationInfoSchema = external_exports.object({
17884
17884
  lastSuccessAt: external_exports.number().optional(),
17885
17885
  /** Newest-archive size from `manifests.json`, or undefined. */
17886
17886
  lastSuccessSizeBytes: external_exports.number().optional(),
17887
- /** Per-destination cron expression. Empty = manual-only (no schedule). */
17887
+ /**
17888
+ * Cron cadence(s) of the ENABLED schedules that fan out to this
17889
+ * destination, comma-joined. Absent when no enabled schedule targets it
17890
+ * — a destination nothing is scheduled to write to must not advertise a
17891
+ * cadence (D384). This is never the `backup_destination_policies.cron`
17892
+ * column: that per-location cron has scheduled nothing since 2026-07-28
17893
+ * and reading it made a destination with a DISABLED schedule claim a
17894
+ * nightly run.
17895
+ */
17888
17896
  cron: external_exports.string().optional(),
17889
- /** ms-epoch of next computed firing for this destination's cron, if any. */
17897
+ /** ms-epoch of the next firing across those schedules (earliest), if any. */
17890
17898
  nextRunAt: external_exports.number().optional(),
17891
- /** ms-epoch of last successful scheduled run (mirrors policy.lastRunAt). */
17892
- lastRunAt: external_exports.number().optional()
17899
+ /**
17900
+ * ms-epoch of the last time a run ATTEMPTED to write here — success or
17901
+ * failure. Never a success stamp: pair it with `lastSuccessAt` (the
17902
+ * newest archive that actually landed) and `lastError`.
17903
+ */
17904
+ lastAttemptAt: external_exports.number().optional(),
17905
+ /**
17906
+ * Why the last attempt failed, verbatim. Absent when the last attempt
17907
+ * landed the archive. A destination that has never been written to has
17908
+ * neither this nor `lastAttemptAt`.
17909
+ */
17910
+ lastError: external_exports.string().optional()
17893
17911
  });
17894
17912
  var BackupArchiveEntrySchema = external_exports.object({
17895
17913
  id: external_exports.string(),
@@ -18011,8 +18029,16 @@ var BackupScheduleSchema = external_exports.object({
18011
18029
  retentionCount: external_exports.number().int().min(1).max(1e3),
18012
18030
  /** Optional subset of source locations to include; omitted = all. */
18013
18031
  dataSources: external_exports.array(external_exports.string()).readonly().optional(),
18014
- /** ms-epoch of last successful run. */
18015
- lastRunAt: external_exports.number().optional(),
18032
+ /**
18033
+ * ms-epoch of the last tick that FIRED this schedule. Stamped before the
18034
+ * archive runs (it is the dedupe anchor), so it says "attempted", never
18035
+ * "succeeded" — a run refused by every destination stamps it too.
18036
+ */
18037
+ lastAttemptAt: external_exports.number().optional(),
18038
+ /** ms-epoch of the last run of this schedule that landed at ≥1 destination. */
18039
+ lastSuccessAt: external_exports.number().optional(),
18040
+ /** Why the last fired run failed, verbatim. Absent when it succeeded. */
18041
+ lastError: external_exports.string().optional(),
18016
18042
  /** ms-epoch of next computed firing (read-only, filled on list). */
18017
18043
  nextRunAt: external_exports.number().optional()
18018
18044
  });
@@ -18135,14 +18161,7 @@ var backupCapability = {
18135
18161
  locationId: external_exports.string(),
18136
18162
  enabled: external_exports.boolean(),
18137
18163
  retentionCount: external_exports.number().int().min(1).max(1e3),
18138
- label: external_exports.string().optional(),
18139
- /**
18140
- * Per-destination cron expression. Empty string clears the
18141
- * schedule (manual-only). Validated server-side via croner;
18142
- * malformed expressions reject the upsert with an actionable
18143
- * message.
18144
- */
18145
- cron: external_exports.string().optional()
18164
+ label: external_exports.string().optional()
18146
18165
  }), external_exports.void(), {
18147
18166
  kind: "mutation",
18148
18167
  auth: "admin"
@@ -30090,7 +30109,6 @@ var storageCapability = {
30090
30109
  }), external_exports.instanceof(Uint8Array)),
30091
30110
  endDownload: method(external_exports.object({ downloadId: external_exports.string() }), external_exports.void(), { kind: "mutation" }),
30092
30111
  listLocations: method(external_exports.object({ type: StorageLocationTypeSchema.optional() }), external_exports.array(StorageLocationSchema).readonly()),
30093
- getDefaultLocation: method(external_exports.object({ type: StorageLocationTypeSchema }), StorageLocationSchema.nullable()),
30094
30112
  listLocationDeclarations: method(external_exports.void(), external_exports.array(StorageLocationDeclarationSchema).readonly()),
30095
30113
  upsertLocation: method(StorageLocationSchema.omit({
30096
30114
  createdAt: true,
@@ -44815,12 +44833,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
44815
44833
  addonId: null,
44816
44834
  access: "view"
44817
44835
  },
44818
- "storage.getDefaultLocation": {
44819
- capName: "storage",
44820
- capScope: "system",
44821
- addonId: null,
44822
- access: "view"
44823
- },
44824
44836
  "storage.list": {
44825
44837
  capName: "storage",
44826
44838
  capScope: "system",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-YK6NE5VI.js";
4
+ } from "./chunk-QYZZNV2H.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-YBWRBM2B.js");
41
+ await import("./launcher-4QDDQ4WQ.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-YBWRBM2B.js");
86
+ await import("./launcher-4QDDQ4WQ.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-6YJTDHZO.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-4GRRUEIR.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  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-YK6NE5VI.js";
8
+ } from "./chunk-QYZZNV2H.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,