@camstack/addon-tailscale 1.2.28 → 1.2.29

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.
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-CdQI1dFQ.js");
27
+ const require_dist = require("../dist-D7-pccbD.js");
28
28
  let node_child_process = require("node:child_process");
29
29
  let node_util = require("node:util");
30
30
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-B3EqlLnX.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-BBIgF6Kz.mjs";
2
2
  import { execFile, spawn } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as fs from "node:fs";
@@ -6629,7 +6629,7 @@ function method(input, output, options) {
6629
6629
  input,
6630
6630
  output,
6631
6631
  kind: options?.kind ?? "query",
6632
- auth: options?.auth ?? "protected",
6632
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6633
6633
  ...options?.access !== void 0 ? { access: options.access } : {},
6634
6634
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6635
6635
  timeoutMs: options?.timeoutMs
@@ -6649,7 +6649,7 @@ function systemMethod(input, output, options) {
6649
6649
  }
6650
6650
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6651
6651
  var VersionOutputSchema$1 = object({ version: string() });
6652
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6652
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6653
6653
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6654
6654
  DeviceType["Camera"] = "camera";
6655
6655
  DeviceType["Hub"] = "hub";
@@ -6970,7 +6970,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6970
6970
  }({});
6971
6971
  var StaticDirOutputSchema = object({ staticDir: string() });
6972
6972
  var VersionOutputSchema = object({ version: string() });
6973
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6973
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6974
6974
  /**
6975
6975
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6976
6976
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7618,24 +7618,6 @@ var RecordingRetentionSchema = object({
7618
7618
  maxSizeGb: number().min(0).optional()
7619
7619
  });
7620
7620
  /**
7621
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7622
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7623
- * previews at. Five graduated steps; absent on a config = `standard` (the
7624
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7625
- *
7626
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7627
- * Each window's index sidecar carries its own tile dims, so a camera whose
7628
- * preset changed over time renders every historical window at the dims it was
7629
- * written with.
7630
- */
7631
- var ScrubThumbnailPresetSchema = _enum([
7632
- "minimal",
7633
- "low",
7634
- "standard",
7635
- "high",
7636
- "max"
7637
- ]);
7638
- /**
7639
7621
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7640
7622
  *
7641
7623
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7643,7 +7625,11 @@ var ScrubThumbnailPresetSchema = _enum([
7643
7625
  * other field is a storage knob (profiles, segment length, retention, scrub).
7644
7626
  *
7645
7627
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7646
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7628
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7629
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7630
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7631
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7632
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7647
7633
  * A stale caller must fail loudly — silently stripping its legacy intent would
7648
7634
  * persist a band-less config, i.e. silently stop recording the camera.
7649
7635
  */
@@ -7666,14 +7652,7 @@ var RecordingConfigSchema = object({
7666
7652
  * "off" is the absence of a covering band, never a band value.
7667
7653
  */
7668
7654
  bands: array(RecordingBandSchema).default([]),
7669
- retention: RecordingRetentionSchema.optional(),
7670
- /**
7671
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7672
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7673
- * windows only — existing sheets are immutable, and each window's index
7674
- * carries its own tile dims so mixed-preset history renders correctly.
7675
- */
7676
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7655
+ retention: RecordingRetentionSchema.optional()
7677
7656
  }).strict();
7678
7657
  /**
7679
7658
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7749,10 +7728,11 @@ var RelocateFootageInputSchema = object({
7749
7728
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7750
7729
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7751
7730
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7752
- var StorageMigrationMediaMoveInputSchema = object({
7731
+ var RelocateMediaInputSchema = object({
7753
7732
  toLocationId: string(),
7754
7733
  throttleMbps: number().min(1).max(1e3).optional()
7755
- }).extend({ leaseId: string().min(1) });
7734
+ });
7735
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7756
7736
  /** The independently selectable logical storage classes. `recordings`
7757
7737
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7758
7738
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8047,7 +8027,26 @@ var LabelDefinitionSchema = object({
8047
8027
  description: string().optional(),
8048
8028
  icon: string().optional()
8049
8029
  });
8050
- var ClassMapDefinitionSchema = object({
8030
+ /**
8031
+ * Wire schema for a per-model CATALOG classMap override
8032
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8033
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8034
+ * detection pipeline executor actually routes.
8035
+ *
8036
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8037
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8038
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8039
+ * enum) — the two used to share the name `ClassMapDefinition`/
8040
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8041
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8042
+ * are not: it is two different concepts colliding on a name. Keep this type
8043
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8044
+ * would either narrow every `ClassMapDefinition` consumer to the four
8045
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8046
+ * schema exists for (see the "rejects a classMap whose target is not a
8047
+ * detection macro" test in `model-catalog-schema.test.ts`).
8048
+ */
8049
+ var DetectionCatalogClassMapSchema = object({
8051
8050
  mapping: record(string(), _enum([
8052
8051
  "person",
8053
8052
  "vehicle",
@@ -8252,7 +8251,7 @@ var ModelCatalogEntrySchema = object({
8252
8251
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8253
8252
  * labels already ARE the CamStack macros (Scrypted identity map).
8254
8253
  */
8255
- classMap: ClassMapDefinitionSchema.optional()
8254
+ classMap: DetectionCatalogClassMapSchema.optional()
8256
8255
  });
8257
8256
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8258
8257
  format: literal("openvino"),
@@ -8282,7 +8281,7 @@ var ModelConvertMetadataSchema = object({
8282
8281
  "segmentation"
8283
8282
  ]),
8284
8283
  faceAlignment: boolean().optional(),
8285
- classMap: ClassMapDefinitionSchema.optional()
8284
+ classMap: DetectionCatalogClassMapSchema.optional()
8286
8285
  });
8287
8286
  var ConvertResultSchema = object({
8288
8287
  entry: ModelCatalogEntrySchema,
@@ -9145,7 +9144,7 @@ var AddonPageDeclarationSchema = object({
9145
9144
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9146
9145
  sectionLabel: string().optional()
9147
9146
  });
9148
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9147
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9149
9148
  var AddonHttpRouteSchema = object({
9150
9149
  method: _enum([
9151
9150
  "GET",
@@ -9380,7 +9379,7 @@ var WidgetMetadataSchema = object({
9380
9379
  defaultColumns: number().int().min(1).max(12).default(6),
9381
9380
  defaultRows: number().int().min(1).max(12).default(1)
9382
9381
  });
9383
- method(_void(), array(WidgetMetadataSchema).readonly());
9382
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9384
9383
  /**
9385
9384
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9386
9385
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10902,7 +10901,7 @@ var CustomModelDescriptorSchema = object({
10902
10901
  stepId: string(),
10903
10902
  entry: ModelCatalogEntrySchema
10904
10903
  });
10905
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10904
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10906
10905
  /**
10907
10906
  * Query filter for settings-store collections.
10908
10907
  */
@@ -10989,7 +10988,8 @@ method(object({
10989
10988
  }), _void(), { kind: "mutation" }), method(object({
10990
10989
  namespace: string().optional(),
10991
10990
  collection: string(),
10992
- filter: QueryFilterSchema.optional()
10991
+ filter: QueryFilterSchema.optional(),
10992
+ columns: array(string()).readonly().optional()
10993
10993
  }), array(SettingsRecordSchema).readonly()), method(object({
10994
10994
  namespace: string().optional(),
10995
10995
  collection: string(),
@@ -11052,46 +11052,87 @@ var EngineInfoSchema = object({
11052
11052
  kind: _enum(["relational", "vector"]),
11053
11053
  displayName: string()
11054
11054
  });
11055
- method(_void(), EngineInfoSchema), method(object({
11055
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11056
11056
  namespace: string().optional(),
11057
11057
  collection: string(),
11058
11058
  key: string()
11059
- }), unknown()), method(object({
11059
+ }), unknown(), { auth: "admin" }), method(object({
11060
11060
  namespace: string().optional(),
11061
11061
  collection: string(),
11062
11062
  key: string(),
11063
11063
  value: unknown()
11064
- }), _void(), { kind: "mutation" }), method(object({
11064
+ }), _void(), {
11065
+ kind: "mutation",
11066
+ auth: "admin"
11067
+ }), method(object({
11065
11068
  namespace: string().optional(),
11066
11069
  collection: string(),
11067
- filter: QueryFilterSchema.optional()
11068
- }), array(SettingsRecordSchema).readonly()), method(object({
11070
+ filter: QueryFilterSchema.optional(),
11071
+ /**
11072
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11073
+ *
11074
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11075
+ * was wrong — corrected 2026-08-26 after the hop map
11076
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11077
+ * There is **no Zod parse at all** between the door and the engine: the
11078
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11079
+ * field declared here reaches `SqliteSettingsBackend` either way.
11080
+ *
11081
+ * What actually lost `columns` was the THIRD declaration of this shape:
11082
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11083
+ * interface the engine destructures from. The field existed on both
11084
+ * schemas and the engine still never read it, because nothing checks a
11085
+ * registered provider against `InferProvider<cap>` —
11086
+ * `ProviderRegistration.provider` is typed `object`.
11087
+ *
11088
+ * It is declared here anyway, and must stay in step with
11089
+ * `settings-store.query`: a caller reading only the cap definitions has
11090
+ * to be able to see that this call carries a projection.
11091
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11092
+ */
11093
+ columns: array(string()).readonly().optional()
11094
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11069
11095
  namespace: string().optional(),
11070
11096
  collection: string(),
11071
11097
  record: SettingsRecordSchema
11072
- }), _void(), { kind: "mutation" }), method(object({
11098
+ }), _void(), {
11099
+ kind: "mutation",
11100
+ auth: "admin"
11101
+ }), method(object({
11073
11102
  namespace: string().optional(),
11074
11103
  collection: string(),
11075
11104
  id: string(),
11076
11105
  data: record(string(), unknown())
11077
- }), _void(), { kind: "mutation" }), method(object({
11106
+ }), _void(), {
11107
+ kind: "mutation",
11108
+ auth: "admin"
11109
+ }), method(object({
11078
11110
  namespace: string().optional(),
11079
11111
  collection: string(),
11080
11112
  key: string()
11081
- }), _void(), { kind: "mutation" }), method(object({
11113
+ }), _void(), {
11114
+ kind: "mutation",
11115
+ auth: "admin"
11116
+ }), method(object({
11082
11117
  namespace: string().optional(),
11083
11118
  collection: string(),
11084
11119
  filter: MutationFilterSchema
11085
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11120
+ }), object({ deleted: number().int() }), {
11121
+ kind: "mutation",
11122
+ auth: "admin"
11123
+ }), method(object({
11086
11124
  namespace: string().optional(),
11087
11125
  collection: string(),
11088
11126
  filter: MutationFilterSchema,
11089
11127
  data: record(string(), unknown())
11090
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11128
+ }), object({ updated: number().int() }), {
11129
+ kind: "mutation",
11130
+ auth: "admin"
11131
+ }), method(object({
11091
11132
  namespace: string().optional(),
11092
11133
  collection: string(),
11093
11134
  filter: QueryFilterSchema.optional()
11094
- }), number()), method(object({
11135
+ }), number(), { auth: "admin" }), method(object({
11095
11136
  namespace: string().optional(),
11096
11137
  collection: string(),
11097
11138
  field: string(),
@@ -11101,15 +11142,18 @@ method(_void(), EngineInfoSchema), method(object({
11101
11142
  }), array(object({
11102
11143
  bucket: number().int(),
11103
11144
  count: number().int()
11104
- })).readonly()), method(object({
11145
+ })).readonly(), { auth: "admin" }), method(object({
11105
11146
  namespace: string().optional(),
11106
11147
  collection: string()
11107
- }), boolean()), method(object({
11148
+ }), boolean(), { auth: "admin" }), method(object({
11108
11149
  namespace: string().optional(),
11109
11150
  collection: string(),
11110
11151
  columns: array(CollectionColumnSchema).readonly(),
11111
11152
  indexes: array(CollectionIndexSchema).readonly().optional()
11112
- }), _void(), { kind: "mutation" });
11153
+ }), _void(), {
11154
+ kind: "mutation",
11155
+ auth: "admin"
11156
+ });
11113
11157
  /**
11114
11158
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11115
11159
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12237,7 +12281,7 @@ method(object({
12237
12281
  crop: _instanceof(Uint8Array),
12238
12282
  width: number(),
12239
12283
  height: number()
12240
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12284
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12241
12285
  /**
12242
12286
  * filesystem-browse — per-node capability for browsing the node's local
12243
12287
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12530,19 +12574,22 @@ method(LlmGenerateBaseInputSchema.extend({
12530
12574
  runtime: ManagedRuntimeConfigSchema,
12531
12575
  /** The managed profile's timeout, threaded by the hub provider. */
12532
12576
  timeoutMs: number().int().positive().optional()
12533
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12577
+ }), LlmGenerateResultSchema, {
12578
+ kind: "mutation",
12579
+ auth: "admin"
12580
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12534
12581
  kind: "mutation",
12535
12582
  auth: "admin"
12536
12583
  }), method(object({}), _void(), {
12537
12584
  kind: "mutation",
12538
12585
  auth: "admin"
12539
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12586
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12540
12587
  kind: "mutation",
12541
12588
  auth: "admin"
12542
12589
  }), method(object({ file: string() }), _void(), {
12543
12590
  kind: "mutation",
12544
12591
  auth: "admin"
12545
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12592
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12546
12593
  /**
12547
12594
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12548
12595
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16032,7 +16079,7 @@ var OauthIntegrationDescriptorSchema = object({
16032
16079
  */
16033
16080
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16034
16081
  });
16035
- method(_void(), OauthIntegrationDescriptorSchema);
16082
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16036
16083
  /**
16037
16084
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16038
16085
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17227,6 +17274,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17227
17274
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17228
17275
  kind: "mutation",
17229
17276
  auth: "admin"
17277
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17278
+ kind: "mutation",
17279
+ auth: "admin"
17280
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17281
+ kind: "query",
17282
+ auth: "admin"
17283
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17284
+ kind: "mutation",
17285
+ auth: "admin"
17230
17286
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17231
17287
  kind: "query",
17232
17288
  auth: "admin"
@@ -17381,6 +17437,11 @@ object({
17381
17437
  "jpeg"
17382
17438
  ])
17383
17439
  });
17440
+ /**
17441
+ * Process-local frame identity. It is serializable so it can ride an in-process
17442
+ * capability call, but `registryId` deliberately prevents resolution in any
17443
+ * other process or execution group.
17444
+ */
17384
17445
  var FrameRefSchema = object({
17385
17446
  registryId: string().min(1),
17386
17447
  id: string().min(1),
@@ -19546,7 +19607,7 @@ method(object({
19546
19607
  * linking rather than produce an eternal token.
19547
19608
  */
19548
19609
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19549
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19610
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19550
19611
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19551
19612
  providerId: string().min(1),
19552
19613
  displayName: string().min(1),
@@ -19641,10 +19702,13 @@ var EvictResultSchema = object({
19641
19702
  /** True when the provider has nothing left it is willing to drop on this location. */
19642
19703
  exhausted: boolean()
19643
19704
  });
19644
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19705
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19645
19706
  locationId: string(),
19646
19707
  targetBytes: number().int().positive()
19647
- }), EvictResultSchema, { kind: "mutation" });
19708
+ }), EvictResultSchema, {
19709
+ kind: "mutation",
19710
+ auth: "admin"
19711
+ });
19648
19712
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19649
19713
  kind: "mutation",
19650
19714
  auth: "admin"
@@ -19704,26 +19768,50 @@ var ReadChunkInputSchema = object({
19704
19768
  length: number()
19705
19769
  });
19706
19770
  var EndDownloadInputSchema = object({ downloadId: string() });
19707
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19771
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19708
19772
  location: StorageLocationSchema,
19709
19773
  relativePath: string()
19710
- }), string()), method(object({
19774
+ }), string(), { auth: "admin" }), method(object({
19711
19775
  location: StorageLocationSchema,
19712
19776
  relativePath: string(),
19713
19777
  data: _instanceof(Uint8Array)
19714
- }), _void(), { kind: "mutation" }), method(object({
19778
+ }), _void(), {
19779
+ kind: "mutation",
19780
+ auth: "admin"
19781
+ }), method(object({
19715
19782
  location: StorageLocationSchema,
19716
19783
  relativePath: string()
19717
- }), _instanceof(Uint8Array)), method(object({
19784
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19718
19785
  location: StorageLocationSchema,
19719
19786
  relativePath: string()
19720
- }), boolean()), method(object({
19787
+ }), boolean(), { auth: "admin" }), method(object({
19721
19788
  location: StorageLocationSchema,
19722
19789
  prefix: string().optional()
19723
- }), array(string()).readonly()), method(object({
19790
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19724
19791
  location: StorageLocationSchema,
19725
19792
  relativePath: string()
19726
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
19793
+ }), _void(), {
19794
+ kind: "mutation",
19795
+ auth: "admin"
19796
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19797
+ kind: "mutation",
19798
+ auth: "admin"
19799
+ }), method(WriteChunkInputSchema, _void(), {
19800
+ kind: "mutation",
19801
+ auth: "admin"
19802
+ }), method(FinalizeUploadInputSchema, _void(), {
19803
+ kind: "mutation",
19804
+ auth: "admin"
19805
+ }), method(AbortUploadInputSchema, _void(), {
19806
+ kind: "mutation",
19807
+ auth: "admin"
19808
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19809
+ kind: "mutation",
19810
+ auth: "admin"
19811
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19812
+ kind: "mutation",
19813
+ auth: "admin"
19814
+ });
19727
19815
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19728
19816
  var ProfileSettingsSchemaBridge = unknown().nullable();
19729
19817
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -19981,7 +20069,8 @@ method(object({
19981
20069
  access: "create"
19982
20070
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
19983
20071
  kind: "mutation",
19984
- access: "view"
20072
+ access: "view",
20073
+ auth: "admin"
19985
20074
  }), method(object({
19986
20075
  /** Required — the user the assertion belongs to (verified). */
19987
20076
  userId: string(),
@@ -19989,10 +20078,12 @@ method(object({
19989
20078
  response: record(string(), unknown())
19990
20079
  }), object({ verified: boolean() }), {
19991
20080
  kind: "mutation",
19992
- access: "view"
20081
+ access: "view",
20082
+ auth: "admin"
19993
20083
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
19994
20084
  kind: "mutation",
19995
- access: "view"
20085
+ access: "view",
20086
+ auth: "admin"
19996
20087
  }), method(object({
19997
20088
  /** AuthenticationResponseJSON from the browser. */
19998
20089
  response: record(string(), unknown()) }), object({
@@ -20000,7 +20091,8 @@ response: record(string(), unknown()) }), object({
20000
20091
  userId: string().nullable()
20001
20092
  }), {
20002
20093
  kind: "mutation",
20003
- access: "view"
20094
+ access: "view",
20095
+ auth: "admin"
20004
20096
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20005
20097
  userId: string(),
20006
20098
  credentialId: string()
@@ -20172,7 +20264,19 @@ var VectorStatsResultSchema = object({
20172
20264
  /** False when the backend ranks approximately. */
20173
20265
  exact: boolean()
20174
20266
  });
20175
- method(VectorDeclareIndexInputSchema, _void(), { kind: "mutation" }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, { kind: "mutation" }), method(VectorQueryInputSchema, VectorQueryResultSchema), method(VectorGetInputSchema, VectorGetResultSchema), method(VectorDeleteInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorStatsInputSchema, VectorStatsResultSchema);
20267
+ method(VectorDeclareIndexInputSchema, _void(), {
20268
+ kind: "mutation",
20269
+ auth: "admin"
20270
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20271
+ kind: "mutation",
20272
+ auth: "admin"
20273
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20274
+ kind: "mutation",
20275
+ auth: "admin"
20276
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20277
+ kind: "mutation",
20278
+ auth: "admin"
20279
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20176
20280
  var ClipSchema = object({
20177
20281
  /** Opaque, provider-namespaced id. The default provider encodes the time
20178
20282
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21895,7 +21999,27 @@ var MediaFileLiteSchema$1 = object({
21895
21999
  sizeBytes: number(),
21896
22000
  timestamp: number()
21897
22001
  });
21898
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22002
+ method(object({
22003
+ /**
22004
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22005
+ *
22006
+ * Default `false`, the same inversion `listRecentFaces` and
22007
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22008
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22009
+ * on the live hub the same day: four identities cost 40,979 B with the
22010
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22011
+ * four times and the viewer holds at `staleTime: 30_000`.
22012
+ *
22013
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22014
+ * the `event-media` plane serves that key `immutable` with an ETag.
22015
+ *
22016
+ * **This is an INPUT field, so it does not reach the addon until the
22017
+ * next train** — the hub router validates cap inputs against its own
22018
+ * compiled Zod and strips a key it does not know. Until then the
22019
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22020
+ * is what ships, and the opt-in becomes reachable when the train lands.
22021
+ */
22022
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21899
22023
  kind: "mutation",
21900
22024
  auth: "admin"
21901
22025
  }), method(object({
@@ -24103,8 +24227,10 @@ var PlateInfoSchema = object({
24103
24227
  keyFrameMediaKey: string().optional(),
24104
24228
  base64: string().optional(),
24105
24229
  /**
24106
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24107
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24230
+ * Same crop as a data-plane URL, always present when the plate has a stored
24231
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24232
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24233
+ * left at its `true` default.
24108
24234
  */
24109
24235
  cropUrl: string().optional()
24110
24236
  });
@@ -24124,14 +24250,34 @@ var PlateClusterSchema = object({
24124
24250
  });
24125
24251
  method(object({
24126
24252
  deviceId: number().int().optional(),
24127
- limit: number().int().positive().optional()
24253
+ limit: number().int().positive().optional(),
24254
+ /**
24255
+ * Inline the base64 crop on every row. Default `true` — the existing
24256
+ * behaviour, kept so no caller breaks.
24257
+ *
24258
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24259
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24260
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24261
+ * metadata without them — and the browser then caches the images.
24262
+ *
24263
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24264
+ * plates were the one gallery list left without it.
24265
+ *
24266
+ * **This is an INPUT field, so it does not reach the addon until the
24267
+ * next train.** The hub router validates cap inputs against its own
24268
+ * compiled Zod and strips a key it does not know. Until the train
24269
+ * ships, sending `false` is harmless and keeps the crops inline.
24270
+ */
24271
+ includeCrops: boolean().optional()
24128
24272
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24129
24273
  deviceId: number().int(),
24130
24274
  trackId: string()
24131
24275
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24132
24276
  text: string().min(1),
24133
24277
  maxDistance: number().int().min(0).optional(),
24134
- limit: number().int().positive().optional()
24278
+ limit: number().int().positive().optional(),
24279
+ /** See `listPlates.includeCrops`. Default `true`. */
24280
+ includeCrops: boolean().optional()
24135
24281
  }), array(PlateInfoSchema).readonly()), method(object({
24136
24282
  maxDistance: number().int().min(0).optional(),
24137
24283
  minClusterSize: number().int().min(2).optional(),
@@ -24145,7 +24291,13 @@ method(object({
24145
24291
  }), method(object({ plateId: string() }), _void(), {
24146
24292
  kind: "mutation",
24147
24293
  auth: "admin"
24148
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24294
+ }), method(object({
24295
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24296
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24297
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24298
+ * INPUT field: stripped by the hub router until the train ships, which
24299
+ * resolves to `false` and is exactly the intended default. */
24300
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24149
24301
  kind: "mutation",
24150
24302
  auth: "admin"
24151
24303
  }), method(object({
@@ -29522,6 +29674,12 @@ Object.freeze({
29522
29674
  addonId: null,
29523
29675
  access: "create"
29524
29676
  },
29677
+ "pipelineAnalytics.cancelRelocateMedia": {
29678
+ capName: "pipeline-analytics",
29679
+ capScope: "device",
29680
+ addonId: null,
29681
+ access: "create"
29682
+ },
29525
29683
  "pipelineAnalytics.cancelStorageMigrationMove": {
29526
29684
  capName: "pipeline-analytics",
29527
29685
  capScope: "device",
@@ -29696,6 +29854,12 @@ Object.freeze({
29696
29854
  addonId: null,
29697
29855
  access: "view"
29698
29856
  },
29857
+ "pipelineAnalytics.listRelocateMediaJobs": {
29858
+ capName: "pipeline-analytics",
29859
+ capScope: "device",
29860
+ addonId: null,
29861
+ access: "view"
29862
+ },
29699
29863
  "pipelineAnalytics.listRetrainAnnotations": {
29700
29864
  capName: "pipeline-analytics",
29701
29865
  capScope: "device",
@@ -29774,6 +29938,12 @@ Object.freeze({
29774
29938
  addonId: null,
29775
29939
  access: "create"
29776
29940
  },
29941
+ "pipelineAnalytics.relocateMedia": {
29942
+ capName: "pipeline-analytics",
29943
+ capScope: "device",
29944
+ addonId: null,
29945
+ access: "create"
29946
+ },
29777
29947
  "pipelineAnalytics.restageRetrainTrack": {
29778
29948
  capName: "pipeline-analytics",
29779
29949
  capScope: "device",
@@ -6629,7 +6629,7 @@ function method(input, output, options) {
6629
6629
  input,
6630
6630
  output,
6631
6631
  kind: options?.kind ?? "query",
6632
- auth: options?.auth ?? "protected",
6632
+ ...options?.auth !== void 0 ? { auth: options.auth } : {},
6633
6633
  ...options?.access !== void 0 ? { access: options.access } : {},
6634
6634
  ...options?.caller !== void 0 ? { caller: options.caller } : {},
6635
6635
  timeoutMs: options?.timeoutMs
@@ -6649,7 +6649,7 @@ function systemMethod(input, output, options) {
6649
6649
  }
6650
6650
  var StaticDirOutputSchema$1 = object({ staticDir: string() });
6651
6651
  var VersionOutputSchema$1 = object({ version: string() });
6652
- method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6652
+ method(_void(), StaticDirOutputSchema$1, { auth: "admin" }), method(_void(), VersionOutputSchema$1, { auth: "admin" });
6653
6653
  var DeviceType = /* @__PURE__ */ function(DeviceType) {
6654
6654
  DeviceType["Camera"] = "camera";
6655
6655
  DeviceType["Hub"] = "hub";
@@ -6970,7 +6970,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
6970
6970
  }({});
6971
6971
  var StaticDirOutputSchema = object({ staticDir: string() });
6972
6972
  var VersionOutputSchema = object({ version: string() });
6973
- method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
6973
+ method(_void(), StaticDirOutputSchema, { auth: "admin" }), method(_void(), VersionOutputSchema, { auth: "admin" });
6974
6974
  /**
6975
6975
  * device-ops — device-scoped cap that unifies the per-IDevice operations
6976
6976
  * previously routed through the `.device-ops` Moleculer bridge service.
@@ -7618,24 +7618,6 @@ var RecordingRetentionSchema = object({
7618
7618
  maxSizeGb: number().min(0).optional()
7619
7619
  });
7620
7620
  /**
7621
- * Scrub-thumbnail fidelity preset — the single per-camera selector bundling the
7622
- * sprite tile RESOLUTION + JPEG QUALITY the recorder packs timeline-scrub
7623
- * previews at. Five graduated steps; absent on a config = `standard` (the
7624
- * shipped default, matching `sheet-geometry`/`sheet-composer`).
7625
- *
7626
- * Existing sheets are IMMUTABLE — a changed preset applies to NEW windows only.
7627
- * Each window's index sidecar carries its own tile dims, so a camera whose
7628
- * preset changed over time renders every historical window at the dims it was
7629
- * written with.
7630
- */
7631
- var ScrubThumbnailPresetSchema = _enum([
7632
- "minimal",
7633
- "low",
7634
- "standard",
7635
- "high",
7636
- "max"
7637
- ]);
7638
- /**
7639
7621
  * The full per-camera recording intent — the wire shape of a RecordingTarget.
7640
7622
  *
7641
7623
  * `bands` is the ONLY authored recording intent: what to record, when, and on
@@ -7643,7 +7625,11 @@ var ScrubThumbnailPresetSchema = _enum([
7643
7625
  * other field is a storage knob (profiles, segment length, retention, scrub).
7644
7626
  *
7645
7627
  * STRICT on purpose: the legacy authoring surface (`schedule`/`schedules`/
7646
- * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30.
7628
+ * `triggers`/`preBufferSec`/`postBufferSec`/`rules`) was retired 2026-07-30,
7629
+ * and `scrubThumbnails` — a five-step fidelity knob for a sprite tier that was
7630
+ * deleted on 2026-07-24 and had ZERO consumers in the recorder — on 2026-08-25
7631
+ * (D62: a switch that writes a store nobody reads is worse than no switch).
7632
+ * Stored rows keep loading: the READ schema is `.strip()` (config-store.ts).
7647
7633
  * A stale caller must fail loudly — silently stripping its legacy intent would
7648
7634
  * persist a band-less config, i.e. silently stop recording the camera.
7649
7635
  */
@@ -7666,14 +7652,7 @@ var RecordingConfigSchema = object({
7666
7652
  * "off" is the absence of a covering band, never a band value.
7667
7653
  */
7668
7654
  bands: array(RecordingBandSchema).default([]),
7669
- retention: RecordingRetentionSchema.optional(),
7670
- /**
7671
- * Per-camera scrub-thumbnail fidelity preset (resolution + JPEG quality for
7672
- * timeline-scrub sprite previews). Absent = `standard`. Applies to NEW
7673
- * windows only — existing sheets are immutable, and each window's index
7674
- * carries its own tile dims so mixed-preset history renders correctly.
7675
- */
7676
- scrubThumbnails: ScrubThumbnailPresetSchema.optional()
7655
+ retention: RecordingRetentionSchema.optional()
7677
7656
  }).strict();
7678
7657
  /**
7679
7658
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
@@ -7749,10 +7728,11 @@ var RelocateFootageInputSchema = object({
7749
7728
  * `RecordingConfig.enabled` or camera wrapper bindings. */
7750
7729
  var StorageMigrationLeaseInputSchema = object({ leaseId: string().min(1) });
7751
7730
  var StorageMigrationFootageMoveInputSchema = RelocateFootageInputSchema.extend({ leaseId: string().min(1) });
7752
- var StorageMigrationMediaMoveInputSchema = object({
7731
+ var RelocateMediaInputSchema = object({
7753
7732
  toLocationId: string(),
7754
7733
  throttleMbps: number().min(1).max(1e3).optional()
7755
- }).extend({ leaseId: string().min(1) });
7734
+ });
7735
+ var StorageMigrationMediaMoveInputSchema = RelocateMediaInputSchema.extend({ leaseId: string().min(1) });
7756
7736
  /** The independently selectable logical storage classes. `recordings`
7757
7737
  * encompasses the high and mid segment profiles; `recordingsLow` is low
7758
7738
  * segments; `eventMedia` is post-analysis blobs. */
@@ -8047,7 +8027,26 @@ var LabelDefinitionSchema = object({
8047
8027
  description: string().optional(),
8048
8028
  icon: string().optional()
8049
8029
  });
8050
- var ClassMapDefinitionSchema = object({
8030
+ /**
8031
+ * Wire schema for a per-model CATALOG classMap override
8032
+ * (`ModelCatalogEntry.classMap` / `ModelConvertMetadata.classMap`) —
8033
+ * restricted to {@link CLASS_MAP_MACRO_TARGETS}, the only macros the
8034
+ * detection pipeline executor actually routes.
8035
+ *
8036
+ * This is deliberately a DIFFERENT, narrower shape than the general-purpose
8037
+ * `ClassMapDefinition` interface above (e.g. `IDetectionAddon.getClassMap()`
8038
+ * and the audio `YAMNET_TO_MACRO` catalog both use macro targets outside this
8039
+ * enum) — the two used to share the name `ClassMapDefinition`/
8040
+ * `ClassMapDefinitionSchema`, which made the schema-type-twin guard
8041
+ * (`scripts/check-schema-type-twins.ts`) flag them as a duplicated shape. They
8042
+ * are not: it is two different concepts colliding on a name. Keep this type
8043
+ * under its own name rather than reusing `ClassMapDefinition` — reusing it
8044
+ * would either narrow every `ClassMapDefinition` consumer to the four
8045
+ * detection macros (breaking `YAMNET_TO_MACRO`) or drop the validation this
8046
+ * schema exists for (see the "rejects a classMap whose target is not a
8047
+ * detection macro" test in `model-catalog-schema.test.ts`).
8048
+ */
8049
+ var DetectionCatalogClassMapSchema = object({
8051
8050
  mapping: record(string(), _enum([
8052
8051
  "person",
8053
8052
  "vehicle",
@@ -8252,7 +8251,7 @@ var ModelCatalogEntrySchema = object({
8252
8251
  * applies (Frigate / COCO public catalog). Set on a custom model whose raw
8253
8252
  * labels already ARE the CamStack macros (Scrypted identity map).
8254
8253
  */
8255
- classMap: ClassMapDefinitionSchema.optional()
8254
+ classMap: DetectionCatalogClassMapSchema.optional()
8256
8255
  });
8257
8256
  var ConvertTargetSchema = discriminatedUnion("format", [object({
8258
8257
  format: literal("openvino"),
@@ -8282,7 +8281,7 @@ var ModelConvertMetadataSchema = object({
8282
8281
  "segmentation"
8283
8282
  ]),
8284
8283
  faceAlignment: boolean().optional(),
8285
- classMap: ClassMapDefinitionSchema.optional()
8284
+ classMap: DetectionCatalogClassMapSchema.optional()
8286
8285
  });
8287
8286
  var ConvertResultSchema = object({
8288
8287
  entry: ModelCatalogEntrySchema,
@@ -9145,7 +9144,7 @@ var AddonPageDeclarationSchema = object({
9145
9144
  /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
9146
9145
  sectionLabel: string().optional()
9147
9146
  });
9148
- method(_void(), array(AddonPageDeclarationSchema).readonly());
9147
+ method(_void(), array(AddonPageDeclarationSchema).readonly(), { auth: "admin" });
9149
9148
  var AddonHttpRouteSchema = object({
9150
9149
  method: _enum([
9151
9150
  "GET",
@@ -9380,7 +9379,7 @@ var WidgetMetadataSchema = object({
9380
9379
  defaultColumns: number().int().min(1).max(12).default(6),
9381
9380
  defaultRows: number().int().min(1).max(12).default(1)
9382
9381
  });
9383
- method(_void(), array(WidgetMetadataSchema).readonly());
9382
+ method(_void(), array(WidgetMetadataSchema).readonly(), { auth: "admin" });
9384
9383
  /**
9385
9384
  * `addon-widgets` — system-scoped singleton aggregator cap. Public-facing
9386
9385
  * surface that admin-ui consumes through `useAddonWidgetsListWidgets()`.
@@ -10902,7 +10901,7 @@ var CustomModelDescriptorSchema = object({
10902
10901
  stepId: string(),
10903
10902
  entry: ModelCatalogEntrySchema
10904
10903
  });
10905
- method(_void(), array(CustomModelDescriptorSchema).readonly());
10904
+ method(_void(), array(CustomModelDescriptorSchema).readonly(), { auth: "admin" });
10906
10905
  /**
10907
10906
  * Query filter for settings-store collections.
10908
10907
  */
@@ -10989,7 +10988,8 @@ method(object({
10989
10988
  }), _void(), { kind: "mutation" }), method(object({
10990
10989
  namespace: string().optional(),
10991
10990
  collection: string(),
10992
- filter: QueryFilterSchema.optional()
10991
+ filter: QueryFilterSchema.optional(),
10992
+ columns: array(string()).readonly().optional()
10993
10993
  }), array(SettingsRecordSchema).readonly()), method(object({
10994
10994
  namespace: string().optional(),
10995
10995
  collection: string(),
@@ -11052,46 +11052,87 @@ var EngineInfoSchema = object({
11052
11052
  kind: _enum(["relational", "vector"]),
11053
11053
  displayName: string()
11054
11054
  });
11055
- method(_void(), EngineInfoSchema), method(object({
11055
+ method(_void(), EngineInfoSchema, { auth: "admin" }), method(object({
11056
11056
  namespace: string().optional(),
11057
11057
  collection: string(),
11058
11058
  key: string()
11059
- }), unknown()), method(object({
11059
+ }), unknown(), { auth: "admin" }), method(object({
11060
11060
  namespace: string().optional(),
11061
11061
  collection: string(),
11062
11062
  key: string(),
11063
11063
  value: unknown()
11064
- }), _void(), { kind: "mutation" }), method(object({
11064
+ }), _void(), {
11065
+ kind: "mutation",
11066
+ auth: "admin"
11067
+ }), method(object({
11065
11068
  namespace: string().optional(),
11066
11069
  collection: string(),
11067
- filter: QueryFilterSchema.optional()
11068
- }), array(SettingsRecordSchema).readonly()), method(object({
11070
+ filter: QueryFilterSchema.optional(),
11071
+ /**
11072
+ * SQL-level column projection — MUST mirror `settings-store.query`.
11073
+ *
11074
+ * ⚠ An earlier version of this comment blamed Zod stripping, and that
11075
+ * was wrong — corrected 2026-08-26 after the hop map
11076
+ * (`docs/design/2026-08-26-mappa-hop-argomenti.md`) traced the path.
11077
+ * There is **no Zod parse at all** between the door and the engine: the
11078
+ * dispatcher forwards the payload verbatim and UDS carries it whole. A
11079
+ * field declared here reaches `SqliteSettingsBackend` either way.
11080
+ *
11081
+ * What actually lost `columns` was the THIRD declaration of this shape:
11082
+ * `SettingsQueryInput` in `interfaces/storage.ts`, a hand-written TS
11083
+ * interface the engine destructures from. The field existed on both
11084
+ * schemas and the engine still never read it, because nothing checks a
11085
+ * registered provider against `InferProvider<cap>` —
11086
+ * `ProviderRegistration.provider` is typed `object`.
11087
+ *
11088
+ * It is declared here anyway, and must stay in step with
11089
+ * `settings-store.query`: a caller reading only the cap definitions has
11090
+ * to be able to see that this call carries a projection.
11091
+ * `data-door-schema-parity.spec.ts` keeps the two aligned.
11092
+ */
11093
+ columns: array(string()).readonly().optional()
11094
+ }), array(SettingsRecordSchema).readonly(), { auth: "admin" }), method(object({
11069
11095
  namespace: string().optional(),
11070
11096
  collection: string(),
11071
11097
  record: SettingsRecordSchema
11072
- }), _void(), { kind: "mutation" }), method(object({
11098
+ }), _void(), {
11099
+ kind: "mutation",
11100
+ auth: "admin"
11101
+ }), method(object({
11073
11102
  namespace: string().optional(),
11074
11103
  collection: string(),
11075
11104
  id: string(),
11076
11105
  data: record(string(), unknown())
11077
- }), _void(), { kind: "mutation" }), method(object({
11106
+ }), _void(), {
11107
+ kind: "mutation",
11108
+ auth: "admin"
11109
+ }), method(object({
11078
11110
  namespace: string().optional(),
11079
11111
  collection: string(),
11080
11112
  key: string()
11081
- }), _void(), { kind: "mutation" }), method(object({
11113
+ }), _void(), {
11114
+ kind: "mutation",
11115
+ auth: "admin"
11116
+ }), method(object({
11082
11117
  namespace: string().optional(),
11083
11118
  collection: string(),
11084
11119
  filter: MutationFilterSchema
11085
- }), object({ deleted: number().int() }), { kind: "mutation" }), method(object({
11120
+ }), object({ deleted: number().int() }), {
11121
+ kind: "mutation",
11122
+ auth: "admin"
11123
+ }), method(object({
11086
11124
  namespace: string().optional(),
11087
11125
  collection: string(),
11088
11126
  filter: MutationFilterSchema,
11089
11127
  data: record(string(), unknown())
11090
- }), object({ updated: number().int() }), { kind: "mutation" }), method(object({
11128
+ }), object({ updated: number().int() }), {
11129
+ kind: "mutation",
11130
+ auth: "admin"
11131
+ }), method(object({
11091
11132
  namespace: string().optional(),
11092
11133
  collection: string(),
11093
11134
  filter: QueryFilterSchema.optional()
11094
- }), number()), method(object({
11135
+ }), number(), { auth: "admin" }), method(object({
11095
11136
  namespace: string().optional(),
11096
11137
  collection: string(),
11097
11138
  field: string(),
@@ -11101,15 +11142,18 @@ method(_void(), EngineInfoSchema), method(object({
11101
11142
  }), array(object({
11102
11143
  bucket: number().int(),
11103
11144
  count: number().int()
11104
- })).readonly()), method(object({
11145
+ })).readonly(), { auth: "admin" }), method(object({
11105
11146
  namespace: string().optional(),
11106
11147
  collection: string()
11107
- }), boolean()), method(object({
11148
+ }), boolean(), { auth: "admin" }), method(object({
11108
11149
  namespace: string().optional(),
11109
11150
  collection: string(),
11110
11151
  columns: array(CollectionColumnSchema).readonly(),
11111
11152
  indexes: array(CollectionIndexSchema).readonly().optional()
11112
- }), _void(), { kind: "mutation" });
11153
+ }), _void(), {
11154
+ kind: "mutation",
11155
+ auth: "admin"
11156
+ });
11113
11157
  /**
11114
11158
  * shm ring usage stats for a `frameSink: 'shm'` decoder session —
11115
11159
  * exposed via `decoder.getShmStats` so downstream consumers can
@@ -12237,7 +12281,7 @@ method(object({
12237
12281
  crop: _instanceof(Uint8Array),
12238
12282
  width: number(),
12239
12283
  height: number()
12240
- }), EmbeddingResultSchema), method(object({ text: string() }), EmbeddingResultSchema), method(_void(), EmbeddingInfoSchema);
12284
+ }), EmbeddingResultSchema, { auth: "admin" }), method(object({ text: string() }), EmbeddingResultSchema, { auth: "admin" }), method(_void(), EmbeddingInfoSchema, { auth: "admin" });
12241
12285
  /**
12242
12286
  * filesystem-browse — per-node capability for browsing the node's local
12243
12287
  * filesystem. Reads are unconfined (whole filesystem, from `/` down); WRITES
@@ -12530,19 +12574,22 @@ method(LlmGenerateBaseInputSchema.extend({
12530
12574
  runtime: ManagedRuntimeConfigSchema,
12531
12575
  /** The managed profile's timeout, threaded by the hub provider. */
12532
12576
  timeoutMs: number().int().positive().optional()
12533
- }), LlmGenerateResultSchema, { kind: "mutation" }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12577
+ }), LlmGenerateResultSchema, {
12578
+ kind: "mutation",
12579
+ auth: "admin"
12580
+ }), method(object({ runtime: ManagedRuntimeConfigSchema }), LlmRuntimeStatusSchema, {
12534
12581
  kind: "mutation",
12535
12582
  auth: "admin"
12536
12583
  }), method(object({}), _void(), {
12537
12584
  kind: "mutation",
12538
12585
  auth: "admin"
12539
- }), method(object({}), LlmRuntimeStatusSchema), method(object({ model: ManagedModelRefSchema }), _void(), {
12586
+ }), method(object({}), LlmRuntimeStatusSchema, { auth: "admin" }), method(object({ model: ManagedModelRefSchema }), _void(), {
12540
12587
  kind: "mutation",
12541
12588
  auth: "admin"
12542
12589
  }), method(object({ file: string() }), _void(), {
12543
12590
  kind: "mutation",
12544
12591
  auth: "admin"
12545
- }), method(object({}), array(LlmNodeModelSchema)), method(object({}), LlmRuntimeDiskUsageSchema);
12592
+ }), method(object({}), array(LlmNodeModelSchema), { auth: "admin" }), method(object({}), LlmRuntimeDiskUsageSchema, { auth: "admin" });
12546
12593
  /**
12547
12594
  * `llm` — consumer-facing LLM surface (spec §1-§3). Collection-mode: array
12548
12595
  * methods concat-fan across providers; single-row methods route to ONE
@@ -16032,7 +16079,7 @@ var OauthIntegrationDescriptorSchema = object({
16032
16079
  */
16033
16080
  refreshTokenTtlSec: union([number().int().positive(), literal("never")]).optional()
16034
16081
  });
16035
- method(_void(), OauthIntegrationDescriptorSchema);
16082
+ method(_void(), OauthIntegrationDescriptorSchema, { auth: "admin" });
16036
16083
  /**
16037
16084
  * pipeline-analytics — device-scoped wrapper cap. Refines raw
16038
16085
  * per-frame detections emitted by the pipeline runner into tracked
@@ -17227,6 +17274,15 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17227
17274
  }), method(object({ jobId: string() }), RelocateJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17228
17275
  kind: "mutation",
17229
17276
  auth: "admin"
17277
+ }), method(RelocateMediaInputSchema, object({ jobId: string() }), {
17278
+ kind: "mutation",
17279
+ auth: "admin"
17280
+ }), method(object({}), array(RelocateJobSchema).readonly(), {
17281
+ kind: "query",
17282
+ auth: "admin"
17283
+ }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
17284
+ kind: "mutation",
17285
+ auth: "admin"
17230
17286
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
17231
17287
  kind: "query",
17232
17288
  auth: "admin"
@@ -17381,6 +17437,11 @@ object({
17381
17437
  "jpeg"
17382
17438
  ])
17383
17439
  });
17440
+ /**
17441
+ * Process-local frame identity. It is serializable so it can ride an in-process
17442
+ * capability call, but `registryId` deliberately prevents resolution in any
17443
+ * other process or execution group.
17444
+ */
17384
17445
  var FrameRefSchema = object({
17385
17446
  registryId: string().min(1),
17386
17447
  id: string().min(1),
@@ -19546,7 +19607,7 @@ method(object({
19546
19607
  * linking rather than produce an eternal token.
19547
19608
  */
19548
19609
  ttlSec: union([number().int().positive(), literal("never")]).optional()
19549
- }), object({ token: string() })), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable());
19610
+ }), object({ token: string() }), { auth: "admin" }), method(object({ token: string() }), SsoBridgeClaimsSchema.nullable(), { auth: "admin" });
19550
19611
  var ProviderListEntrySchema = discriminatedUnion("shouldSaveDiskSpace", [object({
19551
19612
  providerId: string().min(1),
19552
19613
  displayName: string().min(1),
@@ -19641,10 +19702,13 @@ var EvictResultSchema = object({
19641
19702
  /** True when the provider has nothing left it is willing to drop on this location. */
19642
19703
  exhausted: boolean()
19643
19704
  });
19644
- method(object({ locationId: string() }), EvictableUsageSchema), method(object({
19705
+ method(object({ locationId: string() }), EvictableUsageSchema, { auth: "admin" }), method(object({
19645
19706
  locationId: string(),
19646
19707
  targetBytes: number().int().positive()
19647
- }), EvictResultSchema, { kind: "mutation" });
19708
+ }), EvictResultSchema, {
19709
+ kind: "mutation",
19710
+ auth: "admin"
19711
+ });
19648
19712
  method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin" }), method(StorageMigrationInputSchema, object({ jobId: string() }), {
19649
19713
  kind: "mutation",
19650
19714
  auth: "admin"
@@ -19704,26 +19768,50 @@ var ReadChunkInputSchema = object({
19704
19768
  length: number()
19705
19769
  });
19706
19770
  var EndDownloadInputSchema = object({ downloadId: string() });
19707
- method(_void(), ProviderInfoSchema), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19771
+ method(_void(), ProviderInfoSchema, { auth: "admin" }), method(object({ config: record(string(), unknown()) }), TestLocationResultSchema, { auth: "admin" }), method(object({
19708
19772
  location: StorageLocationSchema,
19709
19773
  relativePath: string()
19710
- }), string()), method(object({
19774
+ }), string(), { auth: "admin" }), method(object({
19711
19775
  location: StorageLocationSchema,
19712
19776
  relativePath: string(),
19713
19777
  data: _instanceof(Uint8Array)
19714
- }), _void(), { kind: "mutation" }), method(object({
19778
+ }), _void(), {
19779
+ kind: "mutation",
19780
+ auth: "admin"
19781
+ }), method(object({
19715
19782
  location: StorageLocationSchema,
19716
19783
  relativePath: string()
19717
- }), _instanceof(Uint8Array)), method(object({
19784
+ }), _instanceof(Uint8Array), { auth: "admin" }), method(object({
19718
19785
  location: StorageLocationSchema,
19719
19786
  relativePath: string()
19720
- }), boolean()), method(object({
19787
+ }), boolean(), { auth: "admin" }), method(object({
19721
19788
  location: StorageLocationSchema,
19722
19789
  prefix: string().optional()
19723
- }), array(string()).readonly()), method(object({
19790
+ }), array(string()).readonly(), { auth: "admin" }), method(object({
19724
19791
  location: StorageLocationSchema,
19725
19792
  relativePath: string()
19726
- }), _void(), { kind: "mutation" }), method(object({ location: StorageLocationSchema }), number().nullable()), method(BeginUploadInputSchema, BeginUploadResultSchema, { kind: "mutation" }), method(WriteChunkInputSchema, _void(), { kind: "mutation" }), method(FinalizeUploadInputSchema, _void(), { kind: "mutation" }), method(AbortUploadInputSchema, _void(), { kind: "mutation" }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, { kind: "mutation" }), method(ReadChunkInputSchema, _instanceof(Uint8Array)), method(EndDownloadInputSchema, _void(), { kind: "mutation" });
19793
+ }), _void(), {
19794
+ kind: "mutation",
19795
+ auth: "admin"
19796
+ }), method(object({ location: StorageLocationSchema }), number().nullable(), { auth: "admin" }), method(BeginUploadInputSchema, BeginUploadResultSchema, {
19797
+ kind: "mutation",
19798
+ auth: "admin"
19799
+ }), method(WriteChunkInputSchema, _void(), {
19800
+ kind: "mutation",
19801
+ auth: "admin"
19802
+ }), method(FinalizeUploadInputSchema, _void(), {
19803
+ kind: "mutation",
19804
+ auth: "admin"
19805
+ }), method(AbortUploadInputSchema, _void(), {
19806
+ kind: "mutation",
19807
+ auth: "admin"
19808
+ }), method(BeginDownloadInputSchema, BeginDownloadResultSchema, {
19809
+ kind: "mutation",
19810
+ auth: "admin"
19811
+ }), method(ReadChunkInputSchema, _instanceof(Uint8Array), { auth: "admin" }), method(EndDownloadInputSchema, _void(), {
19812
+ kind: "mutation",
19813
+ auth: "admin"
19814
+ });
19727
19815
  /** Profile-exported FormBuilder schema. Shape is ConfigUISchema at the UI. */
19728
19816
  var ProfileSettingsSchemaBridge = unknown().nullable();
19729
19817
  var ProfileSettingsBagSchema = record(string(), unknown());
@@ -19981,7 +20069,8 @@ method(object({
19981
20069
  access: "create"
19982
20070
  }), method(object({ userId: string().optional() }), object({ optionsJSON: record(string(), unknown()) }), {
19983
20071
  kind: "mutation",
19984
- access: "view"
20072
+ access: "view",
20073
+ auth: "admin"
19985
20074
  }), method(object({
19986
20075
  /** Required — the user the assertion belongs to (verified). */
19987
20076
  userId: string(),
@@ -19989,10 +20078,12 @@ method(object({
19989
20078
  response: record(string(), unknown())
19990
20079
  }), object({ verified: boolean() }), {
19991
20080
  kind: "mutation",
19992
- access: "view"
20081
+ access: "view",
20082
+ auth: "admin"
19993
20083
  }), method(object({}), object({ optionsJSON: record(string(), unknown()) }), {
19994
20084
  kind: "mutation",
19995
- access: "view"
20085
+ access: "view",
20086
+ auth: "admin"
19996
20087
  }), method(object({
19997
20088
  /** AuthenticationResponseJSON from the browser. */
19998
20089
  response: record(string(), unknown()) }), object({
@@ -20000,7 +20091,8 @@ response: record(string(), unknown()) }), object({
20000
20091
  userId: string().nullable()
20001
20092
  }), {
20002
20093
  kind: "mutation",
20003
- access: "view"
20094
+ access: "view",
20095
+ auth: "admin"
20004
20096
  }), method(object({ userId: string() }), array(PasskeySummarySchema), { auth: "admin" }), method(object({
20005
20097
  userId: string(),
20006
20098
  credentialId: string()
@@ -20172,7 +20264,19 @@ var VectorStatsResultSchema = object({
20172
20264
  /** False when the backend ranks approximately. */
20173
20265
  exact: boolean()
20174
20266
  });
20175
- method(VectorDeclareIndexInputSchema, _void(), { kind: "mutation" }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, { kind: "mutation" }), method(VectorQueryInputSchema, VectorQueryResultSchema), method(VectorGetInputSchema, VectorGetResultSchema), method(VectorDeleteInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, { kind: "mutation" }), method(VectorStatsInputSchema, VectorStatsResultSchema);
20267
+ method(VectorDeclareIndexInputSchema, _void(), {
20268
+ kind: "mutation",
20269
+ auth: "admin"
20270
+ }), method(VectorUpsertInputSchema, VectorUpsertResultSchema, {
20271
+ kind: "mutation",
20272
+ auth: "admin"
20273
+ }), method(VectorQueryInputSchema, VectorQueryResultSchema, { auth: "admin" }), method(VectorGetInputSchema, VectorGetResultSchema, { auth: "admin" }), method(VectorDeleteInputSchema, VectorDeleteResultSchema, {
20274
+ kind: "mutation",
20275
+ auth: "admin"
20276
+ }), method(VectorDeleteByFilterInputSchema, VectorDeleteResultSchema, {
20277
+ kind: "mutation",
20278
+ auth: "admin"
20279
+ }), method(VectorStatsInputSchema, VectorStatsResultSchema, { auth: "admin" });
20176
20280
  var ClipSchema = object({
20177
20281
  /** Opaque, provider-namespaced id. The default provider encodes the time
20178
20282
  * window so `getClipPlayback` is self-contained (no event re-query). */
@@ -21895,7 +21999,27 @@ var MediaFileLiteSchema$1 = object({
21895
21999
  sizeBytes: number(),
21896
22000
  timestamp: number()
21897
22001
  });
21898
- method(_void(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
22002
+ method(object({
22003
+ /**
22004
+ * Inline {@link IdentitySchema.coverBase64} on every row.
22005
+ *
22006
+ * Default `false`, the same inversion `listRecentFaces` and
22007
+ * `listPlates` took on 2026-08-25 (see `include-crops-default.ts` for
22008
+ * why the burden belongs on the caller that WANTS the bytes). Measured
22009
+ * on the live hub the same day: four identities cost 40,979 B with the
22010
+ * covers inline, ~10 KB of base64 per row, on a query this UI mounts
22011
+ * four times and the viewer holds at `staleTime: 30_000`.
22012
+ *
22013
+ * Nothing loses its avatar: `coverMediaKey` is already on every row and
22014
+ * the `event-media` plane serves that key `immutable` with an ETag.
22015
+ *
22016
+ * **This is an INPUT field, so it does not reach the addon until the
22017
+ * next train** — the hub router validates cap inputs against its own
22018
+ * compiled Zod and strips a key it does not know. Until then the
22019
+ * provider sees `undefined`, which resolves to `false`: the cheap shape
22020
+ * is what ships, and the opt-in becomes reachable when the train lands.
22021
+ */
22022
+ includeCrops: boolean().optional() }).optional(), array(IdentitySchema).readonly()), method(object({ name: string().min(1) }), IdentitySchema, {
21899
22023
  kind: "mutation",
21900
22024
  auth: "admin"
21901
22025
  }), method(object({
@@ -24103,8 +24227,10 @@ var PlateInfoSchema = object({
24103
24227
  keyFrameMediaKey: string().optional(),
24104
24228
  base64: string().optional(),
24105
24229
  /**
24106
- * Same crop as a data-plane URL. `getPlateByTrack` returns this and
24107
- * never inlines JPEG; `listPlates` still inlines for the admin-ui.
24230
+ * Same crop as a data-plane URL, always present when the plate has a stored
24231
+ * crop. `getPlateByTrack` returns this and never inlines JPEG; `listPlates`
24232
+ * and `searchPlates` inline the crop only when their `includeCrops` input is
24233
+ * left at its `true` default.
24108
24234
  */
24109
24235
  cropUrl: string().optional()
24110
24236
  });
@@ -24124,14 +24250,34 @@ var PlateClusterSchema = object({
24124
24250
  });
24125
24251
  method(object({
24126
24252
  deviceId: number().int().optional(),
24127
- limit: number().int().positive().optional()
24253
+ limit: number().int().positive().optional(),
24254
+ /**
24255
+ * Inline the base64 crop on every row. Default `true` — the existing
24256
+ * behaviour, kept so no caller breaks.
24257
+ *
24258
+ * Set `false` once the caller renders {@link PlateInfo.cropUrl}.
24259
+ * Measured on the live hub at the 500 rows the Plates view asks for:
24260
+ * 879,403 B and 27.7 s with the crops inline, against a few KiB of
24261
+ * metadata without them — and the browser then caches the images.
24262
+ *
24263
+ * This is the plate twin of `faceGallery.listRecentFaces`'s option;
24264
+ * plates were the one gallery list left without it.
24265
+ *
24266
+ * **This is an INPUT field, so it does not reach the addon until the
24267
+ * next train.** The hub router validates cap inputs against its own
24268
+ * compiled Zod and strips a key it does not know. Until the train
24269
+ * ships, sending `false` is harmless and keeps the crops inline.
24270
+ */
24271
+ includeCrops: boolean().optional()
24128
24272
  }).optional(), array(PlateInfoSchema).readonly()), method(object({
24129
24273
  deviceId: number().int(),
24130
24274
  trackId: string()
24131
24275
  }), PlateInfoSchema.nullable()), method(object({ plateId: string() }), array(MediaFileLiteSchema).readonly()), method(object({
24132
24276
  text: string().min(1),
24133
24277
  maxDistance: number().int().min(0).optional(),
24134
- limit: number().int().positive().optional()
24278
+ limit: number().int().positive().optional(),
24279
+ /** See `listPlates.includeCrops`. Default `true`. */
24280
+ includeCrops: boolean().optional()
24135
24281
  }), array(PlateInfoSchema).readonly()), method(object({
24136
24282
  maxDistance: number().int().min(0).optional(),
24137
24283
  minClusterSize: number().int().min(2).optional(),
@@ -24145,7 +24291,13 @@ method(object({
24145
24291
  }), method(object({ plateId: string() }), _void(), {
24146
24292
  kind: "mutation",
24147
24293
  auth: "admin"
24148
- }), method(_void(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24294
+ }), method(object({
24295
+ /** Inline {@link VehicleSchema.coverBase64} on every row. Default
24296
+ * `false` — the vehicle twin of `faceGallery.listIdentities`'s
24297
+ * option; `coverMediaKey` + the `event-media` plane carry the picture.
24298
+ * INPUT field: stripped by the hub router until the train ships, which
24299
+ * resolves to `false` and is exactly the intended default. */
24300
+ includeCrops: boolean().optional() }).optional(), array(VehicleSchema).readonly()), method(object({ name: string().min(1) }), VehicleSchema, {
24149
24301
  kind: "mutation",
24150
24302
  auth: "admin"
24151
24303
  }), method(object({
@@ -29522,6 +29674,12 @@ Object.freeze({
29522
29674
  addonId: null,
29523
29675
  access: "create"
29524
29676
  },
29677
+ "pipelineAnalytics.cancelRelocateMedia": {
29678
+ capName: "pipeline-analytics",
29679
+ capScope: "device",
29680
+ addonId: null,
29681
+ access: "create"
29682
+ },
29525
29683
  "pipelineAnalytics.cancelStorageMigrationMove": {
29526
29684
  capName: "pipeline-analytics",
29527
29685
  capScope: "device",
@@ -29696,6 +29854,12 @@ Object.freeze({
29696
29854
  addonId: null,
29697
29855
  access: "view"
29698
29856
  },
29857
+ "pipelineAnalytics.listRelocateMediaJobs": {
29858
+ capName: "pipeline-analytics",
29859
+ capScope: "device",
29860
+ addonId: null,
29861
+ access: "view"
29862
+ },
29699
29863
  "pipelineAnalytics.listRetrainAnnotations": {
29700
29864
  capName: "pipeline-analytics",
29701
29865
  capScope: "device",
@@ -29774,6 +29938,12 @@ Object.freeze({
29774
29938
  addonId: null,
29775
29939
  access: "create"
29776
29940
  },
29941
+ "pipelineAnalytics.relocateMedia": {
29942
+ capName: "pipeline-analytics",
29943
+ capScope: "device",
29944
+ addonId: null,
29945
+ access: "create"
29946
+ },
29777
29947
  "pipelineAnalytics.restageRetrainTrack": {
29778
29948
  capName: "pipeline-analytics",
29779
29949
  capScope: "device",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-CdQI1dFQ.js");
5
+ const require_dist = require("../dist-D7-pccbD.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_child_process = require("node:child_process");
8
8
  //#region src/ingress/tailscale-cli.ts
@@ -1,4 +1,4 @@
1
- import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-B3EqlLnX.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-BBIgF6Kz.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-tailscale",
3
- "version": "1.2.28",
3
+ "version": "1.2.29",
4
4
  "description": "Tailscale bundle for CamStack — joins the host to a tailnet (client) and exposes the hub via Serve/Funnel (ingress). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",